r2g.c 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. /*
  2. Copyright 2019 @foostan
  3. Copyright 2020 Drashna Jaelre <@drashna>
  4. Copyright 2021 Elliot Powell @e11i0t23
  5. This program is free software: you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published by
  7. the Free Software Foundation, either version 2 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  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 "r2g.h"
  17. #ifdef RGB_MATRIX_ENABLE
  18. // Logical Layout
  19. // Columns
  20. // Left
  21. // 0 1 2 3 4 5
  22. // ROWS
  23. // 25 24 19 18 11 10 0
  24. // 03 02 01
  25. // 26 23 20 17 12 09 1
  26. // 04 05 06
  27. // 27 22 21 16 13 08 2
  28. //
  29. // 15 14 07 3
  30. //
  31. // Right
  32. // 0 1 2 3 4 5
  33. // ROWS
  34. // 25 24 19 18 11 10 4
  35. // 03 02 01
  36. // 26 23 20 17 12 09 5
  37. // 04 05 06
  38. // 27 22 21 16 13 08 6
  39. //
  40. // 15 14 07 7
  41. //
  42. // Physical Layout
  43. // Columns
  44. // 0 1 2 3 4 5 6 7 8 9 10 11 12 13
  45. // ROWS
  46. // 25 24 19 18 11 10 10 11 18 19 24 25 0
  47. // 03 02 01 01 02 03
  48. // 26 23 20 17 12 09 09 12 17 20 23 26 1
  49. // 04 04
  50. // 27 22 21 16 13 08 08 13 16 21 22 27 2
  51. // 05 06 06 05
  52. // 15 14 07 07 14 15 3
  53. led_config_t g_led_config = { {
  54. { 24, 23, 18, 17, 10, 9 },
  55. { 25, 22, 19, 16, 11, 8 },
  56. { 26, 21, 20, 15, 12, 7 },
  57. { NO_LED, NO_LED, NO_LED, 14, 13, 6 },
  58. { 51, 50, 45, 44, 37, 36 },
  59. { 52, 49, 46, 43, 38, 35 },
  60. { 53, 48, 47, 42, 39, 34 },
  61. { NO_LED, NO_LED, NO_LED, 41, 40, 33 }
  62. }, {
  63. { 85, 16 }, { 50, 13 }, { 16, 20 }, { 16, 38 }, { 50, 48 }, { 85, 52 }, { 95, 63 },
  64. { 85, 39 }, { 85, 21 }, { 85, 4 }, { 68, 2 }, { 68, 19 }, { 68, 37 }, { 80, 58 },
  65. { 60, 55 }, { 50, 35 }, { 50, 13 }, { 50, 0 }, { 33, 3 }, { 33, 20 }, { 33, 37 },
  66. { 16, 42 }, { 16, 24 }, { 16, 7 }, { 0, 7 }, { 0, 24 }, { 0, 41 }, { 139, 16 },
  67. { 174, 13 }, { 208, 20 }, { 208, 38 }, { 174, 48 }, { 139, 52 }, { 129, 63 }, { 139, 39 },
  68. { 139, 21 }, { 139, 4 }, { 156, 2 }, { 156, 19 }, { 156, 37 }, { 144, 58 }, { 164, 55 },
  69. { 174, 35 }, { 174, 13 }, { 174, 0 }, { 191, 3 }, { 191, 20 }, { 191, 37 }, { 208, 42 },
  70. { 208, 24 }, { 208, 7 }, { 224, 7 }, { 224, 24 }, { 224, 41 }
  71. }, {
  72. 2, 2, 2, 2, 2, 2, 1,
  73. 4, 4, 4, 4, 4, 4, 1,
  74. 1, 4, 4, 4, 4, 4, 4,
  75. 4, 4, 4, 1, 1, 1, 2,
  76. 2, 2, 2, 2, 2, 1, 4,
  77. 4, 4, 4, 4, 4, 1, 1,
  78. 4, 4, 4, 4, 4, 4, 4,
  79. 4, 4, 1, 1, 1
  80. } };
  81. #endif
  82. #ifdef OLED_ENABLE
  83. oled_rotation_t oled_init_kb(oled_rotation_t rotation) {
  84. if (!is_keyboard_master()) {
  85. return OLED_ROTATION_180; // flips the display 180 degrees if offhand
  86. }
  87. return rotation;
  88. }
  89. enum Layers{
  90. L_BASE, L_LOWER, L_RAISE, L_ADJUST
  91. };
  92. void oled_render_layer_state_r2g(void) {
  93. oled_write_P(PSTR("Layer: "), false);
  94. switch (get_highest_layer(layer_state)) {
  95. case L_BASE:
  96. oled_write_ln_P(PSTR("Default"), false);
  97. break;
  98. case L_LOWER:
  99. oled_write_ln_P(PSTR("Lower"), false);
  100. break;
  101. case L_RAISE:
  102. oled_write_ln_P(PSTR("Raise"), false);
  103. break;
  104. case L_ADJUST:
  105. oled_write_ln_P(PSTR("Adjust"), false);
  106. break;
  107. }
  108. }
  109. //char keylog_str_r2g[24] = {};
  110. const char code_to_name_r2g[60] = {
  111. ' ', ' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f',
  112. 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',
  113. 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
  114. '1', '2', '3', '4', '5', '6', '7', '8', '9', '0',
  115. 'R', 'E', 'B', 'T', '_', '-', '=', '[', ']', '\\',
  116. '#', ';', '\'', '`', ',', '.', '/', ' ', ' ', ' '};
  117. char key_name_r2g = ' ';
  118. uint16_t last_keycode_r2g;
  119. uint8_t last_row_r2g;
  120. uint8_t last_col_r2g;
  121. void set_keylog_r2g(uint16_t keycode, keyrecord_t *record) {
  122. key_name_r2g = ' ';
  123. last_keycode_r2g = keycode;
  124. if ((keycode >= QK_MOD_TAP && keycode <= QK_MOD_TAP_MAX) ||
  125. (keycode >= QK_LAYER_TAP && keycode <= QK_LAYER_TAP_MAX)) { last_keycode_r2g = keycode & 0xFF; }
  126. if (keycode < 60) {
  127. key_name_r2g = code_to_name_r2g[keycode];
  128. }
  129. last_row_r2g = record->event.key.row;
  130. last_col_r2g = record->event.key.col;
  131. }
  132. const char *depad_str(const char *depad_str, char depad_char) {
  133. while (*depad_str == depad_char) ++depad_str;
  134. return depad_str;
  135. }
  136. void oled_render_keylog_r2g(void) {
  137. //oled_write(keylog_str_r2g, false);
  138. const char *last_row_r2g_str = get_u8_str(last_row_r2g, ' ');
  139. oled_write(depad_str(last_row_r2g_str, ' '), false);
  140. oled_write_P(PSTR("x"), false);
  141. const char *last_col_r2g_str = get_u8_str(last_col_r2g, ' ');
  142. oled_write(depad_str(last_col_r2g_str, ' '), false);
  143. oled_write_P(PSTR(", k"), false);
  144. const char *last_keycode_r2g_str = get_u16_str(last_keycode_r2g, ' ');
  145. oled_write(depad_str(last_keycode_r2g_str, ' '), false);
  146. oled_write_P(PSTR(":"), false);
  147. oled_write_char(key_name_r2g, false);
  148. }
  149. void render_bootmagic_status_r2g(bool status) {
  150. /* Show Ctrl-Gui Swap options */
  151. static const char PROGMEM logo[][2][3] = {
  152. {{0x97, 0x98, 0}, {0xb7, 0xb8, 0}},
  153. {{0x95, 0x96, 0}, {0xb5, 0xb6, 0}},
  154. };
  155. if (status) {
  156. oled_write_ln_P(logo[0][0], false);
  157. oled_write_ln_P(logo[0][1], false);
  158. } else {
  159. oled_write_ln_P(logo[1][0], false);
  160. oled_write_ln_P(logo[1][1], false);
  161. }
  162. }
  163. void oled_render_logo_r2g(void) {
  164. static const char PROGMEM mb_logo[] = {
  165. 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  166. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  167. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x0f, 0x0f,
  168. 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  169. 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  170. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  171. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  172. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  173. 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x83, 0x83, 0x83, 0x83, 0x83, 0xff, 0xff,
  174. 0x83, 0x83, 0x83, 0x83, 0xff, 0xff, 0x83, 0x83, 0x83, 0x83, 0x83, 0xff, 0xff, 0x83, 0x83, 0x83,
  175. 0x83, 0xff, 0xff, 0x83, 0x83, 0x83, 0x83, 0x83, 0xff, 0xff, 0xff, 0xff, 0x82, 0x82, 0x82, 0x82,
  176. 0x82, 0xff, 0xff, 0x83, 0x83, 0x83, 0x83, 0xff, 0xff, 0x83, 0x83, 0x83, 0x83, 0x83, 0xff, 0xff,
  177. 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xfc, 0xfc, 0xfc,
  178. 0x9c, 0x9c, 0xfc, 0xfc, 0xf8, 0xf8, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x78, 0x7c, 0x3c,
  179. 0x9c, 0xfc, 0xfc, 0xf8, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xf0, 0xf8, 0xf8, 0x3c, 0x3c,
  180. 0x9c, 0xbc, 0xfc, 0xb8, 0xb8, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  181. 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x41, 0x41, 0x41, 0x41, 0x41, 0xff, 0xff,
  182. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x41, 0x41, 0x41, 0x41, 0x41, 0xff, 0xff, 0xff, 0xff, 0xff,
  183. 0xff, 0xff, 0xff, 0x41, 0x41, 0x41, 0x41, 0x41, 0xff, 0xff, 0xff, 0xff, 0x41, 0x41, 0x41, 0x41,
  184. 0x41, 0xff, 0xff, 0x7f, 0x7f, 0x7f, 0x7f, 0xff, 0xff, 0x41, 0x41, 0x41, 0x41, 0x41, 0xff, 0xff,
  185. 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0x3f,
  186. 0x03, 0x07, 0x0f, 0x3f, 0x3f, 0x3e, 0x38, 0x20, 0x00, 0x00, 0x00, 0x00, 0x38, 0x3c, 0x3e, 0x3f,
  187. 0x3f, 0x3f, 0x3b, 0x39, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x0f, 0x1f, 0x3f, 0x3c, 0x38,
  188. 0x3b, 0x3b, 0x3f, 0x1f, 0x1f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  189. 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xff, 0xff,
  190. 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff,
  191. 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0,
  192. 0xf0, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xff, 0xff,
  193. 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  194. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  195. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
  196. 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  197. };
  198. oled_write_raw_P(mb_logo, sizeof(mb_logo));
  199. //oled_set_cursor(oled_max_chars()/2,oled_max_lines()/2);
  200. //oled_write_P(PSTR("R2G"), false);
  201. }
  202. bool oled_task_kb(void) {
  203. if (!oled_task_user()) { return false; }
  204. if (is_keyboard_master()) {
  205. oled_render_layer_state_r2g();
  206. oled_render_keylog_r2g();
  207. } else {
  208. oled_render_logo_r2g();
  209. }
  210. return false;
  211. }
  212. bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
  213. if (record->event.pressed) {
  214. set_keylog_r2g(keycode, record);
  215. }
  216. return process_record_user(keycode, record);
  217. }
  218. #endif // OLED_ENABLE