diff --git a/keymap/keymap.c b/keymap/keymap.c index 5c691f9..8f9f59d 100644 --- a/keymap/keymap.c +++ b/keymap/keymap.c @@ -8,6 +8,8 @@ #define _UL _UNB_W_LAY #define _U2 _UNB_W_LAY_2 #define _TT _TEAMS_LAYER +#define _PL _POM_LAYER +#define _P2 _POM_LAYER2 enum alt_keycodes { U_T_AUTO = SAFE_RANGE, //USB Extra Port Toggle Auto Detect / Always Active @@ -25,6 +27,13 @@ enum ashe_keycodes { AD_UASH, // Æ: Upper-case ash AD_LASH, // æ: Lower-case ash AD_TEAM, // Teams push-to-talk macro + + // Pomodoro + ADP_PAU, // Pause + ADP_NEW, // New + ADP_CCL, // Cancel + ADP_DEL, // Delete all + ADP_HID, // Show / Hide }; const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { @@ -84,7 +93,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, TG(_TT), _______, _______, _______, _______, _______, _______, _______, _______, _______, \ _______, AD_UASH, AD_LASH, _______, _______, _______, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ - _______, _______, _______, _______, _______, _______, _______, _______, _______ \ + _______, _______, OSL(_PL), _______, _______, _______, _______, _______, _______ \ ), [_TALI_LAYER] = LAYOUT( XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ @@ -107,6 +116,21 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, \ _______, _______, _______, _______, _______, _______, _______, _______, _______ \ ), + [_POM_LAYER] = LAYOUT_65_ansi_blocker( + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, OSL(_P2), ADP_CCL, ADP_HID, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, ADP_NEW, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \ + ), + [_POM_LAYER2] = LAYOUT_65_ansi_blocker( + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, ADP_DEL, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, \ + XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX \ + ), + }; #ifdef _______ @@ -253,7 +277,35 @@ const uint8_t PROGMEM ledmap[][DRIVER_LED_TOTAL][3] = { C_PRIM, C_PRIM, C_PRIM, C_PRIM, C_PRIM, C_PRIM, C_PRIM, C_PRIM, C_PRIM, C_PRIM, C_PRIM, C_PRIM, C_PRIM, C_PRIM, C_PRIM, C_PRIM, C_PRIM, C_PRIM, C_PRIM - } + }, + [_POM_LAYER] = { + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, C_RED, C_RED, C_SECO, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, C_GRN, _______, _______, _______, _______, _______, + //UnderGlow + C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, + C_ORNG, C_ORNG, + C_ORNG, C_ORNG, + C_ORNG, C_ORNG, + C_ORNG, C_ORNG, + C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG + }, + [_POM_LAYER2] = { + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, C_RED, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, + //UnderGlow (67) + C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, + C_ORNG, C_ORNG, + C_ORNG, C_ORNG, + C_ORNG, C_ORNG, + C_ORNG, C_ORNG, + C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG, C_ORNG + }, }; #undef _______ @@ -267,6 +319,8 @@ void matrix_init_user(void) { debug_matrix=false; debug_keyboard=false; //rgb_enabled_flag = true; // Initially, keyboard RGB is enabled. Change to false config.h initializes RGB disabled. + + debug_enable=true; }; void keyboard_post_init_user(void) { @@ -356,6 +410,41 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { unregister_code(KC_LSHIFT); return false; + // Pomodoro new, play / payse + case ADP_NEW: + if (!record->event.pressed) return false; + if (current_pom_state == RUNNING) + current_pom_state = PAUSED; + else if (current_pom_state == PAUSED) + current_pom_state = RUNNING; + else if (current_pom_state == STOPPED) { + current_pom_state = RUNNING; + pom_current_secs = 0; + pom_second_start = 0; + } + return false; + + // Pomodoro cancel + case ADP_CCL: + if (!record->event.pressed) return false; + current_pom_state = STOPPED; + pom_current_secs = 0; + pom_second_start = 0; + return false; + + // Pomodoro delete + case ADP_DEL: + if (!record->event.pressed) return false; + current_pom_state = STOPPED; + poms_completed = 0; + return false; + + // Show / hide + case ADP_HID: + if (!record->event.pressed) return false; + pom_visible = !pom_visible; + return false; + case U_T_AUTO: if (record->event.pressed && MODS_SHIFT && MODS_CTRL) { TOGGLE_FLAG_AND_PRINT(usb_extra_manual, "USB extra port manual mode"); @@ -428,22 +517,135 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { return true; } -void set_layer_color(int layer) { - for (int i = 0; i < DRIVER_LED_TOTAL; i++) { +uint8_t hsv_buf[DRIVER_LED_TOTAL][4]; + +void hsv_matrix_set_color(int index, const uint8_t hsv_color[3]) { + if (index >= DRIVER_LED_TOTAL) + return; + + hsv_buf[index][0] = hsv_color[0]; + hsv_buf[index][1] = hsv_color[1]; + hsv_buf[index][2] = hsv_color[2]; + hsv_buf[index][3] = 1; +} + +void write_hsv_matrix(void) { + for(int i = 0; i < DRIVER_LED_TOTAL; i++) { + if (!hsv_buf[i][3]) continue; + HSV hsv = { - .h = pgm_read_byte(&ledmap[layer][i][0]), - .s = pgm_read_byte(&ledmap[layer][i][1]), - .v = pgm_read_byte(&ledmap[layer][i][2]), + .h = pgm_read_byte(&hsv_buf[i][0]), + .s = pgm_read_byte(&hsv_buf[i][1]), + .v = pgm_read_byte(&hsv_buf[i][2]), }; - if (hsv.h || hsv.s || hsv.v) { - RGB rgb = hsv_to_rgb(hsv); - float f = (float)rgb_matrix_config.hsv.v / UINT8_MAX; - rgb_matrix_set_color(i, f * rgb.r, f * rgb.g, f * rgb.b); - } else if (layer == _GAME_LAYER) { + + RGB rgb = hsv_to_rgb(hsv); + float f = (float)rgb_matrix_config.hsv.v / UINT8_MAX; + rgb_matrix_set_color(i, f * rgb.r, f * rgb.g, f * rgb.b); + + hsv_buf[i][0] = 0; + hsv_buf[i][1] = 0; + hsv_buf[i][2] = 0; + hsv_buf[i][3] = 0; + } +} + +void set_layer_color(int layer) { + for (int i = 0; i < DRIVER_LED_TOTAL; i++) { + if(ledmap[layer][i][0] || ledmap[layer][i][1] || ledmap[layer][i][2]) { + hsv_matrix_set_color(i, ledmap[layer][i]); + } else if ( + layer == _GAME_LAYER || + layer == _POM_LAYER || + layer == _POM_LAYER2 + ) { // Allow lights to be blanked - rgb_matrix_set_color(i, 0, 0, 0); + hsv_matrix_set_color(i, (uint8_t[3]) {0, 0, 0}); + } + } +} + +#define POM_CURRENT_INDEX 68 +#define POM_LIGHT_COUNT 9 +#define POM_COMPLETE_INDEX POM_CURRENT_INDEX + POM_LIGHT_COUNT + 1 +#define POM_DURATION 1500 /* 25 * 60 */ + +void draw_pom(void) { + static bool blink_on; + static short last_pos; + + const uint8_t complete_hsv[3] = {HSV_TEAL}; + const uint8_t current_hsv[3] = {HSV_GOLDENROD}; + const uint8_t hidden_hsv[3] = C_MODI; + + // Clear row + if (pom_visible) { + if (current_pom_state != STOPPED) { + for(int i = POM_CURRENT_INDEX; i < POM_CURRENT_INDEX + POM_LIGHT_COUNT; i++) + hsv_matrix_set_color(i, (uint8_t[3]){0, 0, 0}); + } + + for(int i = POM_COMPLETE_INDEX; i < POM_COMPLETE_INDEX + 3; i++) + hsv_matrix_set_color(i, (uint8_t[3]){0, 0, 0}); + } + + // Draw completed + if (pom_visible) { + for(int i = POM_COMPLETE_INDEX; i < POM_COMPLETE_INDEX + poms_completed && i < POM_COMPLETE_INDEX + 3; i++ ) { + hsv_matrix_set_color(i, complete_hsv); + } + } else if (poms_completed > 0 && poms_completed <= 3) { + const short completed_position = POM_COMPLETE_INDEX + poms_completed - 1; + hsv_matrix_set_color(completed_position, hidden_hsv); + } + + if (current_pom_state == STOPPED) + return; + + const short current_pos = POM_CURRENT_INDEX + (short)((float)pom_current_secs / POM_DURATION * POM_LIGHT_COUNT); + + if(last_pos != current_pos) { + last_pos = current_pos; + blink_on = true; + } else if (pom_second_start == 0) { + blink_on = !blink_on; + } + + // Current solid + if (pom_visible) { + for(int i = POM_CURRENT_INDEX; i < current_pos; i++) { + hsv_matrix_set_color(i, current_hsv); } } + + // Current blinking + if (blink_on) { + if (pom_visible) { + hsv_matrix_set_color(current_pos, current_hsv); + } else { + hsv_matrix_set_color(current_pos, hidden_hsv); + } + } +} + +void count_pom(void) { + // Start ms counter + if(pom_second_start == 0) + pom_second_start = timer_read32(); + + // Check if second completed + if (timer_elapsed32(pom_second_start) > 1000) { + pom_second_start = 0; + pom_current_secs++; + } + + // Check if pom completed + if (pom_current_secs >= POM_DURATION) { + poms_completed++; + current_pom_state = STOPPED; + pom_current_secs = 0; + pom_second_start = 0; + } } void rgb_matrix_indicators_user(void) { @@ -452,7 +654,17 @@ void rgb_matrix_indicators_user(void) { rgb_matrix_get_flags() == LED_FLAG_UNDERGLOW) { return; } + set_layer_color(get_highest_layer(layer_state)); + + if(current_pom_state == RUNNING) + count_pom(); + + if(current_pom_state != STOPPED || poms_completed > 0){ + draw_pom(); + } + + write_hsv_matrix(); } const uint16_t NUMPAD_CODES[] = { diff --git a/keymap/keymap.h b/keymap/keymap.h index 3bcf6eb..ac5c30b 100644 --- a/keymap/keymap.h +++ b/keymap/keymap.h @@ -8,6 +8,10 @@ #define C_TAL2 {HSV_YELLOW} #define C_TAL3 {HSV_GREEN} +#define C_RED {HSV_RED} +#define C_GRN {HSV_GREEN} +#define C_ORNG {HSV_ORANGE} + enum layout_names { _TYPING_LAYER=0, _TEAMS_LAYER, @@ -19,10 +23,24 @@ enum layout_names { _TALI_LAYER, _TALI_LAYER2, _TALI_LAYER3, + _POM_LAYER, + _POM_LAYER2, }; extern bool g_suspend_state; extern rgb_config_t rgb_matrix_config; bool disable_layer_color; +enum pom_state { + STOPPED, + RUNNING, + PAUSED +}; + +enum pom_state current_pom_state; +bool pom_visible; +short poms_completed; +short pom_current_secs; +uint32_t pom_second_start; + void send_alt_code(int); \ No newline at end of file