m65.c (7202B)
1 // Copyright 2020-2023 alin m elena (@alinelena) 2 // SPDX-License-Identifier: GPL-2.0-or-later 3 4 #include QMK_KEYBOARD_H 5 6 // let us assume we start with both layers off 7 static bool toggle_lwr = false; 8 static bool toggle_rse = false; 9 10 #if defined(RGBLIGHT_ENABLE) 11 12 const rgblight_segment_t PROGMEM my_qwerty_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, RGBLIGHT_LED_COUNT, HSV_OFF}); 13 const rgblight_segment_t PROGMEM my_lwr_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, RGBLIGHT_LED_COUNT, HSV_AZURE}); 14 const rgblight_segment_t PROGMEM my_rse_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, RGBLIGHT_LED_COUNT, HSV_CORAL}); 15 const rgblight_segment_t PROGMEM my_adj_layer[] = RGBLIGHT_LAYER_SEGMENTS({0, RGBLIGHT_LED_COUNT, HSV_RED}); 16 17 const rgblight_segment_t* const PROGMEM my_rgb_layers[] = RGBLIGHT_LAYERS_LIST(my_qwerty_layer, my_lwr_layer, my_rse_layer, my_adj_layer); 18 19 #endif 20 21 #if defined(OLED_ENABLE) 22 static uint32_t oled_logo_timer = 0; 23 static bool clear_logo = true; 24 static const char PROGMEM m65_logo[] = {0x92, 0x92, 0x93, 0x94, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8A, 0x8B, 0x8C, 0x8D, 0x8E, 0x8F, 0x90, 0x92, 0x92, 0x93, 0x94, 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA, 0xAB, 0xAC, 0xAD, 0xAE, 0xAF, 0xB0, 0xB2, 0x92, 0xB3, 0xB4, 0xC0, 0xC1, 0xC2, 0xC3, 0xC4, 0xC5, 0xC6, 0xC7, 0xC8, 0xC9, 0xCA, 0xCB, 0xCC, 0xCD, 0xCE, 0xCF, 0xD0, 0}; 25 #endif 26 27 #if defined(RGBLIGHT_ENABLE) 28 29 void set_rgb_layers(layer_state_t state) { 30 rgblight_set_layer_state(0, layer_state_cmp(state, _QW)); 31 rgblight_set_layer_state(1, layer_state_cmp(state, _LWR)); 32 rgblight_set_layer_state(2, layer_state_cmp(state, _RSE)); 33 rgblight_set_layer_state(3, layer_state_cmp(state, _ADJ)); 34 } 35 36 void set_default_rgb_layers(layer_state_t state) { 37 rgblight_set_layer_state(0, layer_state_cmp(state, _QW)); 38 } 39 40 const rgblight_segment_t* const* my_rgb(void) { 41 return my_rgb_layers; 42 } 43 44 #endif 45 46 void set_led_toggle(const uint8_t layer, const bool state) { 47 switch (layer) { 48 case _LWR: 49 toggle_lwr = state; 50 break; 51 case _RSE: 52 toggle_rse = state; 53 break; 54 default: 55 break; 56 } 57 } 58 59 void toggle_leds(const bool toggle_lwr, const bool toggle_rse) { 60 led_lwr(toggle_lwr); 61 led_rse(toggle_rse); 62 if (layer_state_is(_ADJ)) { 63 led_lwr(true); 64 led_rse(true); 65 } 66 } 67 68 #if defined(OLED_ENABLE) 69 70 void init_timer(void) { 71 oled_logo_timer = timer_read32(); 72 }; 73 74 void user_oled_magic(void) { 75 // Host Keyboard Layer Status 76 oled_write_P(PSTR("Layer: "), false); 77 78 switch (get_highest_layer(layer_state)) { 79 case _QW: 80 oled_write_P(PSTR("Default\n"), false); 81 break; 82 case _LWR: 83 oled_write_P(PSTR("Lower\n"), false); 84 break; 85 case _RSE: 86 oled_write_P(PSTR("Raise\n"), false); 87 break; 88 case _ADJ: 89 oled_write_P(PSTR("ADJ\n"), false); 90 break; 91 default: 92 // Or use the write_ln shortcut over adding '\n' to the end of your string 93 oled_write_ln_P(PSTR("Undefined"), false); 94 } 95 96 // Host Keyboard LED Status 97 led_t led_state = host_keyboard_led_state(); 98 oled_write_P(led_state.num_lock ? PSTR("Lower ") : PSTR(" "), false); 99 oled_write_P(led_state.scroll_lock ? PSTR("Raise ") : PSTR(" "), false); 100 oled_write_P(led_state.caps_lock ? PSTR("CapsLock ") : PSTR(" "), false); 101 102 # if defined(UNICODE_COMMON_ENABLE) 103 oled_write_P(PSTR("\nunicode: "), false); 104 switch (get_unicode_input_mode()) { 105 case UNICODE_MODE_LINUX: 106 oled_write_P(PSTR("Linux"), false); 107 break; 108 case UNICODE_MODE_MACOS: 109 oled_write_P(PSTR("apple"), false); 110 break; 111 case UNICODE_MODE_WINDOWS: 112 oled_write_P(PSTR("windows"), false); 113 break; 114 case UNICODE_MODE_WINCOMPOSE: 115 oled_write_P(PSTR("windows c"), false); 116 break; 117 case UNICODE_MODE_BSD: 118 oled_write_P(PSTR("bsd"), false); 119 break; 120 case UNICODE_MODE_EMACS: 121 oled_write_P(PSTR("emacs"), false); 122 break; 123 default: 124 oled_write_ln_P(PSTR("not supported"), false); 125 } 126 # endif 127 128 # if defined(WPM_ENABLE) 129 oled_write_P(PSTR("\nwpm: "), false); 130 uint8_t wpm = get_current_wpm(); 131 oled_write_P(wpm != 0 ? get_u8_str(wpm, ' ') : PSTR(" "), false); 132 # endif 133 } 134 135 void render_logo(void) { 136 oled_write_P(m65_logo, false); 137 } 138 139 void clear_screen(void) { 140 if (clear_logo) { 141 for (uint8_t i = 0; i < OLED_DISPLAY_HEIGHT; ++i) { 142 for (uint8_t j = 0; j < OLED_DISPLAY_WIDTH; ++j) { 143 oled_write_raw_byte(0x0, i * OLED_DISPLAY_WIDTH + j); 144 } 145 } 146 clear_logo = false; 147 } 148 } 149 150 oled_rotation_t oled_init_user(oled_rotation_t rotation) { 151 return OLED_ROTATION_180; 152 } 153 154 # define SHOW_LOGO 5000 155 bool oled_task_kb(void) { 156 if (!oled_task_user()) { 157 return false; 158 } 159 if ((timer_elapsed32(oled_logo_timer) < SHOW_LOGO)) { 160 render_logo(); 161 } else { 162 clear_screen(); 163 user_oled_magic(); 164 } 165 return false; 166 } 167 168 #endif 169 170 void housekeeping_task_kb(void) { 171 toggle_leds(toggle_lwr, toggle_rse); 172 } 173 174 bool process_record_kb(uint16_t keycode, keyrecord_t* record) { 175 #if defined(CONSOLE_ENABLE) 176 uprintf("KL: kc: 0x%04X, col: %2u, row: %2u, pressed: %u, time: %5u, int: %u, count: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed, record->event.time, record->tap.interrupted, record->tap.count); 177 #endif 178 179 switch (keycode) { 180 case (TT(_LWR)): 181 if (!record->event.pressed && record->tap.count == TAPPING_TOGGLE) { 182 // This runs before the TT() handler toggles the layer state, so the current layer state is the opposite of the final one after toggle. 183 set_led_toggle(_LWR, !layer_state_is(_LWR)); 184 } 185 return true; 186 break; 187 case (TT(_RSE)): 188 if (record->event.pressed && record->tap.count == TAPPING_TOGGLE) { 189 set_led_toggle(_RSE, !layer_state_is(_RSE)); 190 } 191 return true; 192 break; 193 default: 194 return true; 195 } 196 return process_record_user(keycode, record); 197 } 198 199 layer_state_t layer_state_set_kb(layer_state_t state) { 200 state = layer_state_set_user(state); 201 202 #if defined(RGBLIGHT_ENABLE) 203 204 set_rgb_layers(state); 205 206 #endif 207 208 return update_tri_layer_state(state, _LWR, _RSE, _ADJ); 209 } 210 211 #if defined(RGBLIGHT_ENABLE) 212 213 layer_state_t default_layer_state_set_kb(layer_state_t state) { 214 state = default_layer_state_set_user(state); 215 216 set_default_rgb_layers(state); 217 218 return state; 219 } 220 221 #endif 222 223 void keyboard_post_init_kb(void) { 224 init_lwr_rse_led(); 225 226 #if defined(RGBLIGHT_ENABLE) 227 // Enable the LED layers 228 rgblight_layers = my_rgb(); 229 #endif 230 231 #if defined(OLED_ENABLE) 232 init_timer(); 233 #endif 234 235 #if defined(CONSOLE_ENABLE) 236 debug_enable = true; 237 debug_matrix = true; 238 debug_keyboard = true; 239 #endif 240 241 keyboard_post_init_user(); 242 }