From 56b5e9f23d2e363404fa68af4fd73f8dd21beea1 Mon Sep 17 00:00:00 2001 From: satt99 <39004890+satt99@users.noreply.github.com> Date: Mon, 9 Jul 2018 23:46:09 +0900 Subject: Add Comet46 keyboard (#3342) * Initial commit for Comet46 firmware * Update Comet46 README * Add readme to satt keymap of comet46 * Add default keymap for Comet46 * Fix broken link in readme * Delete redundant includes * Modify default keymap & fix LAYOUT macro * Modify satt keymap of Comet46 --- keyboards/comet46/keymaps/satt/action_pseudo_lut.c | 142 +++++++++++++ keyboards/comet46/keymaps/satt/action_pseudo_lut.h | 15 ++ keyboards/comet46/keymaps/satt/keymap.c | 220 +++++++++++++++++++++ keyboards/comet46/keymaps/satt/keymap_jis2us.h | 32 +++ keyboards/comet46/keymaps/satt/readme.md | 6 + keyboards/comet46/keymaps/satt/rules.mk | 26 +++ 6 files changed, 441 insertions(+) create mode 100644 keyboards/comet46/keymaps/satt/action_pseudo_lut.c create mode 100644 keyboards/comet46/keymaps/satt/action_pseudo_lut.h create mode 100644 keyboards/comet46/keymaps/satt/keymap.c create mode 100644 keyboards/comet46/keymaps/satt/keymap_jis2us.h create mode 100644 keyboards/comet46/keymaps/satt/readme.md create mode 100644 keyboards/comet46/keymaps/satt/rules.mk (limited to 'keyboards/comet46/keymaps/satt') diff --git a/keyboards/comet46/keymaps/satt/action_pseudo_lut.c b/keyboards/comet46/keymaps/satt/action_pseudo_lut.c new file mode 100644 index 0000000000..5664d4d2a5 --- /dev/null +++ b/keyboards/comet46/keymaps/satt/action_pseudo_lut.c @@ -0,0 +1,142 @@ +#include "quantum.h" +#include "action_pseudo_lut.h" + +static uint8_t send_key_shift_bit[SHIFT_BIT_SIZE]; + +/* + * Pseudo layout action. + * This action converts a keycode in order to output the character according to the keymap you specified + * still your keyboard layout recognized wrongly on your OS. + * Memo: Using other layer keymap to get keycode + */ +void action_pseudo_lut(keyrecord_t *record, uint8_t base_keymap_id, const uint16_t (*keymap)[2]) { + uint8_t prev_shift; + uint16_t keycode; + uint16_t pseudo_keycode; + + /* get keycode from keymap you specified */ + keycode = keymap_key_to_keycode(base_keymap_id, record->event.key); + + prev_shift = keyboard_report->mods & (MOD_BIT(KC_LSFT) | MOD_BIT(KC_RSFT)); + + if (record->event.pressed) { + /* when magic commands entered, keycode does not converted */ + if (IS_COMMAND()) { + if (prev_shift) { + add_shift_bit(keycode); + } + register_code(keycode); + return; + } + + if (prev_shift) { + pseudo_keycode = convert_keycode(keymap, keycode, true); + dprintf("pressed: %02X, converted: %04X\n", keycode, pseudo_keycode); + add_shift_bit(keycode); + + if (IS_LSFT(pseudo_keycode)) { + register_code(QK_LSFT ^ pseudo_keycode); + } else { + /* delete shift mod temporarily */ + del_mods(prev_shift); + send_keyboard_report(); + register_code(pseudo_keycode); + add_mods(prev_shift); + send_keyboard_report(); + } + } else { + pseudo_keycode = convert_keycode(keymap, keycode, false); + dprintf("pressed: %02X, converted: %04X\n", keycode, pseudo_keycode); + + if (IS_LSFT(pseudo_keycode)) { + add_weak_mods(MOD_BIT(KC_LSFT)); + send_keyboard_report(); + register_code(QK_LSFT ^ pseudo_keycode); + /* on Windows, prevent key repeat to avoid unintended output */ + unregister_code(QK_LSFT ^ pseudo_keycode); + del_weak_mods(MOD_BIT(KC_LSFT)); + send_keyboard_report(); + } else { + register_code(pseudo_keycode); + } + } + } else { + if (get_shift_bit(keycode)) { + del_shift_bit(keycode); + pseudo_keycode = convert_keycode(keymap, keycode, true); + } else { + pseudo_keycode = convert_keycode(keymap, keycode, false); + } + dprintf("released: %02X, converted: %04X\n", keycode, pseudo_keycode); + + if (IS_LSFT(pseudo_keycode)) { + unregister_code(QK_LSFT ^ pseudo_keycode); + } else { + unregister_code(pseudo_keycode); + } + } +} + +uint16_t convert_keycode(const uint16_t (*keymap)[2], uint16_t keycode, bool shift_modded) +{ + uint16_t pseudo_keycode; + + switch (keycode) { + case KC_A ... KC_CAPSLOCK: +#if defined(__AVR__) + if (shift_modded) { + pseudo_keycode = pgm_read_word(&keymap[keycode][1]); + } else { + pseudo_keycode = pgm_read_word(&keymap[keycode][0]); + } +#else + if (shift_modded) { + pseudo_keycode = keymap[keycode][1]; + } else { + pseudo_keycode = keymap[keycode][0]; + } +#endif + /* if undefined, use got keycode as it is */ + if (pseudo_keycode == 0x00) { + if (shift_modded) { + pseudo_keycode = S(keycode); + } else { + pseudo_keycode = keycode; + } + } + break; + default: + if (shift_modded) { + pseudo_keycode = S(keycode); + } else { + pseudo_keycode = keycode; + } + break; + } + return pseudo_keycode; +} + +uint8_t get_shift_bit(uint16_t keycode) { + if ((keycode >> 3) < SHIFT_BIT_SIZE) { + return send_key_shift_bit[keycode >> 3] & (1 << (keycode & 7)); + } else { + dprintf("get_shift_bit: Can't get shift bit. keycode: %02X\n", keycode); + return 0; + } +} + +void add_shift_bit(uint16_t keycode) { + if ((keycode >> 3) < SHIFT_BIT_SIZE) { + send_key_shift_bit[keycode >> 3] |= (1 << (keycode & 7)); + } else { + dprintf("add_shift_bit: Can't add shift bit. keycode: %02X\n", keycode); + } +} + +void del_shift_bit(uint16_t keycode) { + if ((keycode >> 3) < SHIFT_BIT_SIZE) { + send_key_shift_bit[keycode >> 3] &= ~(1 << (keycode & 7)); + } else { + dprintf("del_shift_bit: Can't delete shift bit. keycode: %02X\n", keycode); + } +} diff --git a/keyboards/comet46/keymaps/satt/action_pseudo_lut.h b/keyboards/comet46/keymaps/satt/action_pseudo_lut.h new file mode 100644 index 0000000000..681252440f --- /dev/null +++ b/keyboards/comet46/keymaps/satt/action_pseudo_lut.h @@ -0,0 +1,15 @@ +#ifndef ACTION_PSEUDO_LUT_H +#define ACTION_PSEUDO_LUT_H + +#define SHIFT_BIT_SIZE (0xE7 / 8 + 1) // 1bit per 1key + +#define IS_LSFT(kc) ((QK_LSFT & (kc)) == QK_LSFT) + +void action_pseudo_lut(keyrecord_t *, uint8_t, const uint16_t (*)[2]); +uint16_t convert_keycode(const uint16_t (*)[2], uint16_t, bool); + +uint8_t get_shift_bit(uint16_t); +void add_shift_bit(uint16_t); +void del_shift_bit(uint16_t); + +#endif diff --git a/keyboards/comet46/keymaps/satt/keymap.c b/keyboards/comet46/keymaps/satt/keymap.c new file mode 100644 index 0000000000..7e728e5d08 --- /dev/null +++ b/keyboards/comet46/keymaps/satt/keymap.c @@ -0,0 +1,220 @@ +// this is the style you want to emulate. +// This is the canonical layout file for the Quantum project. If you want to add another keyboard, + +#include QMK_KEYBOARD_H +#include "keymap_jis2us.h" +#include "action_pseudo_lut.h" + +// Each layer gets a name for readability, which is then used in the keymap matrix below. +// The underscores don't mean anything - you can have a layer called STUFF or any other name. +// Layer names don't all need to be of the same length, obviously, and you can also skip them +// entirely and just use numbers. +enum comet46_layers { + _QWERTY, + _LOWER, + _RAISE, + _PSEUDO_US, + _PSEUDO_US_LOWER, + _PSEUDO_US_RAISE, + _ADJUST +}; + +enum custom_keycodes { + QWERTY = SAFE_RANGE, + PSEUDO_US, +}; + +#define KC_LWR MO(_LOWER) +#define KC_RSE MO(_RAISE) +#define KC_P_LW MO(_PSEUDO_US_LOWER) +#define KC_P_RS MO(_PSEUDO_US_RAISE) +#define KC_QWRT QWERTY +#define KC_P_US PSEUDO_US +#define KC_SPCT CTL_T(KC_SPC) +#define KC_ENSF SFT_T(KC_ENT) +#define KC_SFTA SFT_T(KC_A) +#define KC_CTSF S(KC_LCTL) +#define KC_IMON ALT_T(KC_F13) +#define KC_IMOF GUI_T(KC_F14) +#define KC_SRO S(KC_RO) +#define KC_SYEN S(KC_JYEN) +#define KC_CAD LCA(KC_DEL) +#define KC_RST RESET + +#define LONGPRESS_DELAY 150 + +// Fillers to make layering more clear +#define KC_ KC_TRNS +#define KC_XXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { + + [_QWERTY] = LAYOUT_kc( + //,----+----+----+----+----+----+ +----+----+----+----+----+----. + ESC , Q , W , E , R , T , Y , U , I , O , P ,DEL , + //|----+----+----+----+----+----+----+ +----+----+----+----+----+----+----| + TAB ,SFTA, S , D , F , G ,LPRN, RPRN, H , J , K , L ,SCLN,BSPC, + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + CTSF, Z , X , C , V , B ,LBRC, RBRC, N , M ,COMM,DOT ,SLSH,QUOT, + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + IMOF,LWR ,SPCT, ENSF,RSE ,IMON + // +----+----+---/ \---+----+----+ + ), + + [_LOWER] = LAYOUT_kc( + //,----+----+----+----+----+----+ +----+----+----+----+----+----. + ,EXLM, AT ,HASH,DLR ,PERC, CIRC,AMPR,ASTR,LPRN,RPRN, , + //|----+----+----+----+----+----+----+ +----+----+----+----+----+----+----| + , F1 , F2 , F3 , F4 , F5 , F6 , GRV ,BSLS,MINS,EQL ,LBRC,RBRC, , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + , F7 , F8 , F9 , F10, F11, F12, TILD,PIPE,UNDS,PLUS,LCBR,RCBR, , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + , , , , , + // +----+----+---/ \---+----+----+ + ), + + [_RAISE] = LAYOUT_kc( + //,----+----+----+----+----+----+ +----+----+----+----+----+----. + , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 , , + //|----+----+----+----+----+----+----+ +----+----+----+----+----+----+----| + , , , , , , , XXXX,LEFT,DOWN, UP ,RGHT,END , , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + , , , , , , , HOME,XXXX,XXXX,XXXX,XXXX,XXXX, , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + , , , , , + // +----+----+---/ \---+----+----+ + ), + + [_PSEUDO_US] = LAYOUT_kc( + //,----+----+----+----+----+----+ +----+----+----+----+----+----. + ESC , Q , W , E , R , T , Y , U , I , O , P ,DEL , + //|----+----+----+----+----+----+----+ +----+----+----+----+----+----+----| + TAB ,SFTA, S , D , F , G ,ASTR, LPRN, H , J , K , L ,FN0 ,BSPC, + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + CTSF, Z , X , C , V , B ,FN0 , FN0 , N , M ,COMM,DOT ,SLSH,FN0 , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + IMOF,P_LW,SPCT, ENSF,P_RS,IMON + // +----+----+---/ \---+----+----+ + ), + + + [_PSEUDO_US_LOWER] = LAYOUT_kc( + //,----+----+----+----+----+----+ +----+----+----+----+----+----. + ,EXLM,LBRC,HASH,DLR ,PERC, EQL ,CIRC, DQT,ASTR,LPRN, , + //|----+----+----+----+----+----+----+ +----+----+----+----+----+----+----| + , F1 , F2 , F3 , F4 , F5 , F6 , LCBR,JYEN,MINS,UNDS,RBRC,BSLS, , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + , F7 , F8 , F9 , F10, F11, F12, PLUS,SYEN,SRO ,COLN,RCBR,PIPE, , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + , , , , , + // +----+----+---/ \---+----+----+ + ), + + [_PSEUDO_US_RAISE] = LAYOUT_kc( + //,----+----+----+----+----+----+ +----+----+----+----+----+----. + , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 0 , , + //|----+----+----+----+----+----+----+ +----+----+----+----+----+----+----| + , , , , , , GRV, XXXX,LEFT,DOWN, UP ,RGHT,END , , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + , , , , , , , HOME,XXXX,XXXX,XXXX,XXXX,XXXX, , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + , , , , , + // +----+----+---/ \---+----+----+ + ), + + [_ADJUST] = LAYOUT_kc( + //,----+----+----+----+----+----+ +----+----+----+----+----+----. + , , , , , , , , , , , , + //|----+----+----+----+----+----+----+ +----+----+----+----+----+----+----| + , , , , , ,CAD , QWRT, , , , , , , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + , , , , , ,RST , P_US, , , , , , , + //|----+----+----+----+----+----+----| |----+----+----+----+----+----+----| + , , , , , + // +----+----+---/ \---+----+----+ + ) + +}; + + +/* + * user defined action function + */ +enum function_id { + PSEUDO_US_FUNCTION, +}; + +void action_function(keyrecord_t *record, uint8_t id, uint8_t opt) { + switch (id) + { + case PSEUDO_US_FUNCTION: + action_pseudo_lut(record, _QWERTY, keymap_jis2us); + break; + } +} + +/* + * Fn action definition + */ +const uint16_t PROGMEM fn_actions[] = { + [0] = ACTION_FUNCTION(PSEUDO_US_FUNCTION), +}; + +void matrix_scan_user(void) { + uint8_t layer = biton32(layer_state); + switch (layer) { + case _LOWER: + set_led_red; + break; + case _RAISE: + set_led_blue; + break; + case _PSEUDO_US_LOWER: + set_led_yellow; + break; + case _PSEUDO_US_RAISE: + set_led_cyan; + break; + case _ADJUST: + set_led_magenta; + break; + default: + set_led_green; + break; + } +}; + +uint32_t layer_state_set_user(uint32_t state) { + switch (biton32(state)) { + case _PSEUDO_US: + return update_tri_layer_state(state, _PSEUDO_US_RAISE, _PSEUDO_US_LOWER, _ADJUST); + break; + case _PSEUDO_US_LOWER: + return update_tri_layer_state(state, _PSEUDO_US_RAISE, _PSEUDO_US_LOWER, _ADJUST); + break; + case _PSEUDO_US_RAISE: + return update_tri_layer_state(state, _PSEUDO_US_RAISE, _PSEUDO_US_LOWER, _ADJUST); + break; + default: + return update_tri_layer_state(state, _RAISE, _LOWER, _ADJUST); + break; + } +} + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + switch (keycode) { + case QWERTY: + if (record->event.pressed) { + set_single_persistent_default_layer(_QWERTY); + } + return false; + break; + case PSEUDO_US: + if (record->event.pressed) { + set_single_persistent_default_layer(_PSEUDO_US); + } + return false; + break; + } + return true; +} diff --git a/keyboards/comet46/keymaps/satt/keymap_jis2us.h b/keyboards/comet46/keymaps/satt/keymap_jis2us.h new file mode 100644 index 0000000000..cf2bd4f0e8 --- /dev/null +++ b/keyboards/comet46/keymaps/satt/keymap_jis2us.h @@ -0,0 +1,32 @@ +#ifndef KEYMAP_JIS2US_H +#define KEYMAP_JIS2US_H + +/* keymap for convert from JIS to US */ +const uint16_t PROGMEM keymap_jis2us[][2] = { + [KC_A ... KC_CAPS] = { 0x00, 0x00 }, /* default value */ + + [KC_1] = { KC_1, KC_EXLM }, /* 1 and ! -> 1 and ! */ + [KC_2] = { KC_2, KC_LBRC }, /* 2 and " -> 2 and @ */ + [KC_3] = { KC_3, KC_HASH }, /* 3 and # -> 3 and # */ + [KC_4] = { KC_4, KC_DLR }, /* 4 and $ -> 4 and $ */ + [KC_5] = { KC_5, KC_PERC }, /* 5 and % -> 5 and % */ + [KC_6] = { KC_6, KC_EQL }, /* 6 and & -> 6 and ^ */ + [KC_7] = { KC_7, KC_CIRC }, /* 7 and ' -> 7 and & */ + [KC_8] = { KC_8, KC_DQT }, /* 8 and ( -> 8 and * */ + [KC_9] = { KC_9, KC_ASTR }, /* 9 and ) -> 9 and ( */ + [KC_0] = { KC_0, KC_LPRN }, /* 0 and (no assign) -> 0 and ) */ + [KC_MINS] = { KC_MINS, S(KC_RO) }, /* - and = -> - and _ */ + [KC_EQL] = { KC_UNDS, KC_COLN }, /* ^ and ~ -> = and + */ + [KC_LBRC] = { KC_RBRC, KC_RCBR }, /* @ and ` -> [ and { */ + [KC_RBRC] = { KC_BSLS, KC_PIPE }, /* [ and { -> ] and } */ + [KC_BSLS] = { KC_JYEN, S(KC_JYEN) }, /* ] and } -> / and | */ + [KC_NUHS] = { KC_NUHS, S(KC_NUHS) }, /* (no assign) */ + [KC_SCLN] = { KC_SCLN, KC_QUOT }, /* ; and + -> ; and : */ + [KC_QUOT] = { KC_AMPR, KC_AT }, /* : and * -> ' and " */ + [KC_GRV] = { KC_LCBR, KC_PLUS }, /* (no assign) -> ` and ~ */ + [KC_COMM] = { KC_COMM, KC_LT }, /* , and < -> , and < */ + [KC_DOT] = { KC_DOT, KC_GT }, /* . and > -> . and > */ + [KC_SLSH] = { KC_SLSH, KC_QUES }, /* / and ? -> / and ? */ +}; + +#endif diff --git a/keyboards/comet46/keymaps/satt/readme.md b/keyboards/comet46/keymaps/satt/readme.md new file mode 100644 index 0000000000..33bbad3264 --- /dev/null +++ b/keyboards/comet46/keymaps/satt/readme.md @@ -0,0 +1,6 @@ +## Pseudo US Layout + +On a Japanese Windows environment, ANSI keyboards may be recognized wrongly as a JIS keyboard. +By using this code, you can use your ANSI keyboard under a JIS keyboard environment without changing the settings and registry of your environment. + +Original code by [Shela](https://github.com/qmk/qmk_firmware/tree/master/keyboards/hhkb/keymaps/shela) diff --git a/keyboards/comet46/keymaps/satt/rules.mk b/keyboards/comet46/keymaps/satt/rules.mk new file mode 100644 index 0000000000..08af2e70a4 --- /dev/null +++ b/keyboards/comet46/keymaps/satt/rules.mk @@ -0,0 +1,26 @@ +SRC += action_pseudo_lut.c + +# Build Options +# change to "no" to disable the options, or define them in the Makefile in +# the appropriate keymap folder that will get included automatically +# +BOOTMAGIC_ENABLE = no # Virtual DIP switch configuration(+1000) +MOUSEKEY_ENABLE = no # Mouse keys(+4700) +EXTRAKEY_ENABLE = no # Audio control and System control(+450) +CONSOLE_ENABLE = no # Console for debug(+400) +COMMAND_ENABLE = no # Commands for debug and configuration +NKRO_ENABLE = no # Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +MIDI_ENABLE = no # MIDI controls +AUDIO_ENABLE = no # Audio output on port C6 +UNICODE_ENABLE = no # Unicode +BLUETOOTH_ENABLE = no # Enable Bluetooth with the Adafruit EZ-Key HID +RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight. Do not enable this with audio at the same time. +ONEHAND_ENABLE = no # Enable one-hand typing + +# Do not enable SLEEP_LED_ENABLE. it uses the same timer as BACKLIGHT_ENABLE +SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend + +ifndef QUANTUM_DIR + include ../../../../Makefile +endif -- cgit v1.2.3