diff --git a/keyboards/betalupi_ergodox/features/beta_rawhid.c b/keyboards/betalupi_ergodox/features/beta_rawhid.c index d74901f..6e72605 100644 --- a/keyboards/betalupi_ergodox/features/beta_rawhid.c +++ b/keyboards/betalupi_ergodox/features/beta_rawhid.c @@ -102,6 +102,17 @@ void _hid_send_state(_hid_send_state_args args) { } +void hid_send_special_char(uint16_t char_id) { + uint8_t packet[RAW_EPSIZE] = { + CMD_SPECIAL_CHAR, + (char_id >> 0) & 0xFF, + (char_id >> 8) & 0xFF + }; + + raw_hid_send(packet, RAW_EPSIZE); +} + + #ifdef BETA_ENABLE_SPELLCHECK void hid_send_word() { uint8_t packet[RAW_EPSIZE] = { diff --git a/keyboards/betalupi_ergodox/features/beta_rawhid.h b/keyboards/betalupi_ergodox/features/beta_rawhid.h index f5bf86d..1f32b96 100644 --- a/keyboards/betalupi_ergodox/features/beta_rawhid.h +++ b/keyboards/betalupi_ergodox/features/beta_rawhid.h @@ -19,6 +19,8 @@ void _hid_send_state(_hid_send_state_args args); ) +void hid_send_special_char(uint16_t char_utf_8); + #ifdef BETA_ENABLE_SPELLCHECK void hid_send_word(void); #endif diff --git a/keyboards/betalupi_ergodox/features/rawhid_commands.h b/keyboards/betalupi_ergodox/features/rawhid_commands.h index db1a41d..751fba4 100644 --- a/keyboards/betalupi_ergodox/features/rawhid_commands.h +++ b/keyboards/betalupi_ergodox/features/rawhid_commands.h @@ -1,5 +1,8 @@ #pragma once + + + // Sent by host when connection is initiated. // // Packet structure: @@ -7,6 +10,9 @@ // # of Bytes: | 1 | #define CMD_HELLO 0x00 + + + // Sent periodically by host to test connection. // Keyboard should ignore this command. // @@ -15,6 +21,9 @@ // # of Bytes: | 1 | #define CMD_RUTHERE 0x01 + + + // Send keyboard state to host. // // Packet structure: @@ -40,23 +49,7 @@ #define CMD_SEND_STATE 0x02 -// Sent by keyboard to host when a complete word is typed. -// Host checks if this is a known word. -// If it is not, host responds with the same CMD (see below). -// -// Packet structure (sent by keyboard): -// Data: | cmd | word length | keycodes | -// # of Bytes: | 1 | 1 | ? | -// -// word length: number of bytes in `keycodes` block -// -// -// Packet structure (sent by host): -// Data: | cmd | typo? | -// # of Bytes: | 1 | 1 | -// -// typo: If this is 0x01, the word we got was a typo. -#define CMD_SPELLCHECK_WORD 0x04 + // Animation data. Sent by host. // @@ -76,3 +69,38 @@ // Minimum height is 0, maximum is 250. #define CMD_ANIM_DATA_fft 0x00 + + + +// Sent by keyboard to host when a complete word is typed. +// Host checks if this is a known word. +// If it is not, host responds with the same CMD (see below). +// +// Packet structure (sent by keyboard): +// Data: | cmd | word length | keycodes | +// # of Bytes: | 1 | 1 | ? | +// +// word length: number of bytes in `keycodes` block +// +// +// Packet structure (sent by host): +// Data: | cmd | typo? | +// # of Bytes: | 1 | 1 | +// +// typo: If this is 0x01, the word we got was a typo. +#define CMD_SPELLCHECK_WORD 0x04 + + + + +// Sent by host when a "special char" key is pressed. +// Handled by host interface. +// +// Packet structure: +// Data: | cmd | character | +// # of Bytes: | 1 | 2 | +// +// character: +// uint16_t, character id +// +#define CMD_SPECIAL_CHAR 0x05 \ No newline at end of file diff --git a/keyboards/betalupi_ergodox/keymaps/default/keymap.c b/keyboards/betalupi_ergodox/keymaps/default/keymap.c index 0a0a108..432ee54 100644 --- a/keyboards/betalupi_ergodox/keymaps/default/keymap.c +++ b/keyboards/betalupi_ergodox/keymaps/default/keymap.c @@ -15,6 +15,15 @@ #include "secrets.h" +// Send a special character. +// Returns false if character was caught, true otherwise. +bool send_special_character(uint16_t keycode) { + if ( (keycode > M_SPECIAL_TOP) && (keycode < M_SPECIAL_BOTTОM) ) { + hid_send_special_char(keycode - M_SPECIAL_TOP - 1); + return false; + } + return true; +} LEADER_EXTERNS(); @@ -29,6 +38,22 @@ void matrix_scan_user(void) { SEND_STRING(SECRET_EMAIL); } + SEQ_TWO_KEYS(KC_S, KC_H) { + send_special_character(M_SC_SHRUG); + } + + SEQ_THREE_KEYS(KC_Y, KC_A, KC_E) { + send_special_character(M_SC_YAE); + } + + SEQ_FOUR_KEYS(KC_L, KC_Y, KC_U, KC_S) { + send_special_character(M_SC_LYUS); + } + + SEQ_FOUR_KEYS(KC_B, KC_Y, KC_U, KC_S) { + send_special_character(M_SC_BYUS); + } + //SEQ_ONE_KEY(KC_F) {} // //SEQ_TWO_KEYS(KC_A, KC_S) { @@ -48,6 +73,11 @@ bool process_record_user(uint16_t keycode, keyrecord_t *record) { if (!process_spellcheck(keycode, record)) { return false; } #endif + // Handle special chars + if (record->event.pressed) { + if (!send_special_character(keycode)) { return false; } + } + // Handle macros switch (keycode) { case M_RESETWM: diff --git a/keyboards/betalupi_ergodox/keymaps/default/keymap.h b/keyboards/betalupi_ergodox/keymaps/default/keymap.h index 9ad7505..ca70931 100644 --- a/keyboards/betalupi_ergodox/keymaps/default/keymap.h +++ b/keyboards/betalupi_ergodox/keymaps/default/keymap.h @@ -17,6 +17,7 @@ extern rgb_config_t rgb_matrix_config; #define LC_PINK LC_HSV(243, 222, 234) #define LC_CYAN LC_HSV(134, 255, 213) #define LC_ORANGE LC_HSV( 14, 255, 255) +#define LC_WHITE LC_HSV( 0, 0, 150) #define LC_RU_B LC_HSV( 0, 0, 165) #define LC_RU_G LC_HSV(153, 255, 153) @@ -26,7 +27,33 @@ extern rgb_config_t rgb_matrix_config; // (Must be done before keymaps are loaded) enum custom_keycodes { M_SHUTDOWN = BETA_SAFE_RANGE, + + // Macros M_RESETWM, M_RU_CTRL, - M_RU_ALT + M_RU_ALT, + + // Special characters. + // M_SPECIAL_TOP and M_SPECIAL_BOTTOM are + // bounds used to parse these. Only special + // characters should be between them. + // + // Also, characters here should be in the same + // order as they are in the host inteface. + M_SPECIAL_TOP, + M_SC_GRAVE, + M_SC_TILD, + M_SC_QUOT, + M_SC_LBR, + M_SC_RBR, + M_SC_LCBR, + M_SC_RCBR, + M_SC_LKVCH, + M_SC_RKVCH, + + M_SC_LYUS, + M_SC_BYUS, + M_SC_YAE, + M_SC_SHRUG, + M_SPECIAL_BOTTОM }; diff --git a/keyboards/betalupi_ergodox/keymaps/default/layers/definitions/main.h b/keyboards/betalupi_ergodox/keymaps/default/layers/definitions/main.h index 0815d0d..b8671c4 100644 --- a/keyboards/betalupi_ergodox/keymaps/default/layers/definitions/main.h +++ b/keyboards/betalupi_ergodox/keymaps/default/layers/definitions/main.h @@ -24,11 +24,11 @@ KC_NO, KC_Y, KC_U, KC_I, KC_O, KC_NO, KC_LEAD,\ KC_H, KC_J, KC_K, MO(LAYER_SYMBOLS), KC_L, KC_NO,\ KC_NO, KC_N, KC_M, KC_P, KC_DOT, KC_COMMA, TT(LAYER_FKEYS),\ - KC_RIGHT, KC_NO, TO(LAYER_KEYBOARD), TO(LAYER_RUSSIAN), LGUI(KC_SPACE),\ + KC_RIGHT, KC_NO, TO(LAYER_KEYBOARD), KC_NO, LGUI(KC_SPACE),\ \ KC_LNG1, KC_LNG2,\ KC_LNG3,\ - KC_NO, KC_RSHIFT, KC_ENTER\ + TO(LAYER_RUSSIAN), KC_RSHIFT, KC_ENTER\ ) BETA_LAYER_MAGIC_MACRO diff --git a/keyboards/betalupi_ergodox/keymaps/default/layers/definitions/russian.h b/keyboards/betalupi_ergodox/keymaps/default/layers/definitions/russian.h index 75fd67c..8043551 100644 --- a/keyboards/betalupi_ergodox/keymaps/default/layers/definitions/russian.h +++ b/keyboards/betalupi_ergodox/keymaps/default/layers/definitions/russian.h @@ -24,11 +24,11 @@ RU_SOFT, RU_U, RU_YU, RU_I, RU_O, RU_SHCH, KC_NO,\ RU_HA, RU_ZHE, RU_KA, MO(LAYER_SYMBOLS_RU), RU_EL, KC_NO,\ RU_HARD, RU_EN, RU_EM, RU_PE, RU_YERU, RU_SHTI, KC_TRANSPARENT,\ - KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, TO(LAYER_MAIN), KC_TRANSPARENT,\ + KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT,\ \ KC_TRANSPARENT, KC_TRANSPARENT,\ KC_TRANSPARENT,\ - KC_TRANSPARENT, KC_TRANSPARENT, KC_TRANSPARENT\ + TO(LAYER_MAIN), KC_TRANSPARENT, KC_TRANSPARENT\ ) BETA_LAYER_MAGIC_MACRO diff --git a/keyboards/betalupi_ergodox/keymaps/default/layers/definitions/symbols_ru.h b/keyboards/betalupi_ergodox/keymaps/default/layers/definitions/symbols_ru.h index 7b097cb..f5f2bbf 100644 --- a/keyboards/betalupi_ergodox/keymaps/default/layers/definitions/symbols_ru.h +++ b/keyboards/betalupi_ergodox/keymaps/default/layers/definitions/symbols_ru.h @@ -10,14 +10,14 @@ #ifdef BETA_LAYER_KEYS #define BETA_LAYER_CONTEXT_DATA LAYOUT_ergodox(\ KC_NO, RU_EXLM, RU_DQUO, RU_NUM, RU_SCLN, RU_PERC, KC_NO,\ - KC_NO, KC_NO, RU_LPRN, RU_RPRN, RU_QUES, KC_NO, KC_NO,\ - KC_NO, KC_NO, KC_NO, RU_COMM, RU_DOT, RU_DQUO,\ - KC_NO, KC_NO, KC_NO, KC_NO, RU_EXLM, KC_NO, KC_NO,\ - KC_NO, KC_NO, KC_NO, KC_NO, KC_NO,\ + KC_NO, M_SC_GRAVE, RU_LPRN, RU_RPRN, RU_QUES, M_SC_LCBR, KC_NO,\ + KC_NO, M_SC_TILD, M_SC_QUOT, RU_COMM, RU_DOT, RU_DQUO,\ + KC_NO, KC_NO, M_SC_LBR, M_SC_RBR, RU_EXLM, M_SC_RCBR, KC_NO,\ + KC_NO, KC_NO, KC_NO, M_SC_LKVCH, M_SC_RKVCH,\ \ - KC_NO, KC_NO,\ - KC_NO,\ - KC_NO, KC_NO, KC_NO,\ + KC_NO, KC_NO,\ + KC_NO,\ + KC_NO, KC_NO, KC_NO,\ \ \ KC_NO, RU_COLN, RU_QUES, RU_ASTR, RU_LPRN, RU_RPRN, KC_NO,\ @@ -38,10 +38,10 @@ #ifdef BETA_LAYER_LEDS #define BETA_LAYER_CONTEXT_DATA LEDS_ergodox(\ LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \ - LC_OFF, LC_CYAN, LC_CYAN, LC_PINK, LC_OFF, \ - LC_OFF, LC_OFF, LC_PINK, LC_PINK, LC_PINK, \ - LC_OFF, LC_OFF, LC_OFF, LC_PINK, LC_OFF, \ - LC_OFF, LC_OFF, LC_OFF, LC_OFF, \ + LC_WHITE, LC_CYAN, LC_CYAN, LC_PINK, LC_WHITE, \ + LC_WHITE, LC_WHITE, LC_PINK, LC_PINK, LC_PINK, \ + LC_OFF, LC_WHITE, LC_WHITE, LC_PINK, LC_WHITE, \ + LC_OFF, LC_OFF, LC_WHITE, LC_WHITE, \ \ LC_OFF, LC_OFF, LC_OFF, LC_OFF, LC_OFF, \ LC_OFF, LC_OFF, LC_CYAN, LC_OFF, LC_CYAN, \