keymap.c 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. /* Copyright 2020 tominabox1
  2. *
  3. * This program is free software: you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License as published by
  5. * the Free Software Foundation, either version 2 of the License, or
  6. * (at your option) any later version.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  15. */
  16. #include QMK_KEYBOARD_H
  17. const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
  18. [0] = LAYOUT(
  19. KC_Q, KC_W, KC_E, KC_R, KC_T, KC_MPLY, KC_Y, KC_U, KC_I, KC_O, KC_P,
  20. KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN,
  21. KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH,
  22. KC_LCTL, KC_ENT, KC_SPC, KC_RALT
  23. ),
  24. [1] = LAYOUT(
  25. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  26. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  27. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  28. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
  29. ),
  30. [2] = LAYOUT(
  31. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  32. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  33. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
  34. KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
  35. ),
  36. };
  37. void encoder_update_user(uint8_t index, bool clockwise) {
  38. if (index == 0) {
  39. if (clockwise) {
  40. tap_code(KC_MNXT);
  41. } else {
  42. tap_code(KC_MPRV);
  43. }
  44. }
  45. }
  46. #ifdef OLED_DRIVER_ENABLE //Special thanks to Sickbabies for this great OLED widget!
  47. oled_rotation_t oled_init_user(oled_rotation_t rotation) {
  48. return OLED_ROTATION_90; // rotates for proper orientation
  49. }
  50. void render_lechiffre_logo(void) {
  51. static const char PROGMEM lechiffre_logo[] = {
  52. // 'lechiffre_logo', 32x20px
  53. 0x00, 0x3e, 0x20, 0x20, 0x00, 0x18, 0x2c, 0xa8, 0x80, 0x00, 0x1c, 0x22, 0x22, 0x00, 0x3e, 0x08,
  54. 0x30, 0x00, 0x34, 0x00, 0x3c, 0x0a, 0x00, 0xbc, 0x8a, 0x00, 0x38, 0x08, 0x00, 0x18, 0x2c, 0x28,
  55. 0x00, 0xb6, 0xb6, 0x00, 0xdb, 0xdb, 0x00, 0x6d, 0x6d, 0x00, 0xdb, 0xdb, 0x00, 0xdb, 0xdb, 0x00,
  56. 0x00, 0xdb, 0xdb, 0x00, 0xdb, 0xdb, 0x00, 0x6d, 0x6d, 0x00, 0xdb, 0xdb, 0x00, 0xb6, 0xb6, 0x00,
  57. 0x00, 0x01, 0x01, 0x00, 0x00, 0x00, 0x06, 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00,
  58. 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x00, 0x00, 0x00, 0x01, 0x01, 0x00
  59. };
  60. oled_write_raw_P(lechiffre_logo, sizeof(lechiffre_logo));
  61. }
  62. // static void render_layer_status(void) {
  63. // oled_write_P(PSTR("-----"), false);
  64. // switch (get_highest_layer(layer_state)) {
  65. // case _BASE:
  66. // oled_write_ln_P(PSTR("BASE"), false);
  67. // break;
  68. // case _NUM_SYM:
  69. // oled_write_ln_P(PSTR(" SYM"), false);
  70. // break;
  71. // case _NAV:
  72. // oled_write_ln_P(PSTR(" NAV"), false);
  73. // break;
  74. // default:
  75. // oled_write_ln_P(PSTR("?????"), false);
  76. // }
  77. // }
  78. # define KEYLOG_LEN 11
  79. char keylog_str[KEYLOG_LEN] = {};
  80. uint8_t keylogs_str_idx = 0;
  81. uint16_t log_timer = 0;
  82. const char code_to_name[60] = {
  83. ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
  84. 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
  85. 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
  86. '1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
  87. 'R', 'E', 'B', 'T', '_', '-', '=', '[', ']', '\\',
  88. '#', ';', '\'', '`', ',', '.', '/', ' ', ' ', ' '};
  89. void add_keylog(uint16_t keycode) {
  90. if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) || (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) {
  91. keycode = keycode & 0xFF;
  92. }
  93. for (uint8_t i = KEYLOG_LEN - 1; i > 0; i--) {
  94. keylog_str[i] = keylog_str[i - 1];
  95. }
  96. if (keycode < 60) {
  97. keylog_str[0] = code_to_name[keycode];
  98. }
  99. keylog_str[KEYLOG_LEN - 1] = 0;
  100. log_timer = timer_read();
  101. }
  102. void update_log(void) {
  103. if (timer_elapsed(log_timer) > 750) {
  104. add_keylog(0);
  105. }
  106. }
  107. //Text only renders
  108. void render_keylogger_status(void) {
  109. oled_write_P(PSTR("-----"), false);
  110. oled_write(keylog_str, false);
  111. }
  112. void render_keylock_status(led_t led_state) {
  113. oled_write_P(PSTR("-----"), false);
  114. oled_write_P(PSTR("C"), led_state.caps_lock);
  115. oled_write_P(PSTR(" "), false);
  116. oled_write_P(PSTR("N"), led_state.num_lock);
  117. oled_write_P(PSTR(" "), false);
  118. oled_write_P(PSTR("S"), led_state.scroll_lock);
  119. //oled_write_ln_P(PSTR(" "), false);
  120. }
  121. void render_mod_status(uint8_t modifiers) {
  122. oled_write_P(PSTR("-----"), false);
  123. oled_write_ln_P(PSTR("SHFT"), (modifiers & MOD_MASK_SHIFT));
  124. oled_write_ln_P(PSTR("ALT"), (modifiers & MOD_MASK_ALT));
  125. oled_write_ln_P(PSTR("CTRL"), (modifiers & MOD_MASK_CTRL));
  126. oled_write_ln_P(PSTR("GUI"), (modifiers & MOD_MASK_GUI));
  127. }
  128. void oled_task_user(void) {
  129. render_lechiffre_logo();
  130. oled_set_cursor(0,3);
  131. // render_layer_status(); // Renders the current keyboard state (layer, lock, caps, scroll, etc)
  132. render_mod_status(get_mods()|get_oneshot_mods());
  133. render_keylock_status(host_keyboard_led_state());
  134. render_keylogger_status();
  135. }
  136. bool process_record_user(uint16_t keycode, keyrecord_t *record) {
  137. if (record->event.pressed) {
  138. add_keylog(keycode);
  139. }
  140. return true;
  141. }
  142. #endif