diff options
-rw-r--r-- | keyboards/dichotemy/dichotemy.h | 67 | ||||
-rw-r--r-- | keyboards/dichotemy/keymaps/default/keymap.c | 394 | ||||
-rwxr-xr-x[-rw-r--r--] | keyboards/dichotomy/config.h (renamed from keyboards/dichotemy/config.h) | 8 | ||||
-rwxr-xr-x[-rw-r--r--] | keyboards/dichotomy/dichotomy.c (renamed from keyboards/dichotemy/dichotemy.c) | 27 | ||||
-rwxr-xr-x | keyboards/dichotomy/dichotomy.h | 46 | ||||
-rw-r--r-- | keyboards/dichotomy/info.json (renamed from keyboards/dichotemy/info.json) | 2 | ||||
-rwxr-xr-x | keyboards/dichotomy/keymaps/default/keymap.c | 506 | ||||
-rwxr-xr-x[-rw-r--r--] | keyboards/dichotomy/matrix.c (renamed from keyboards/dichotemy/matrix.c) | 78 | ||||
-rwxr-xr-x[-rw-r--r--] | keyboards/dichotomy/readme.md (renamed from keyboards/dichotemy/readme.md) | 2 | ||||
-rwxr-xr-x[-rw-r--r--] | keyboards/dichotomy/rules.mk (renamed from keyboards/dichotemy/rules.mk) | 16 |
10 files changed, 651 insertions, 495 deletions
diff --git a/keyboards/dichotemy/dichotemy.h b/keyboards/dichotemy/dichotemy.h deleted file mode 100644 index 1d617d91c9..0000000000 --- a/keyboards/dichotemy/dichotemy.h +++ /dev/null @@ -1,67 +0,0 @@ -#ifndef DICHOTEMY_H -#define DICHOTEMY_H - -#include "quantum.h" -#include "matrix.h" -#include "backlight.h" -#include <stddef.h> - -#define red_led_off PORTF |= (1<<5) -#define red_led_on PORTF &= ~(1<<5) -#define blu_led_off PORTF |= (1<<4) -#define blu_led_on PORTF &= ~(1<<4) -#define grn_led_off PORTD |= (1<<1) -#define grn_led_on PORTD &= ~(1<<1) - -#define set_led_off red_led_off; grn_led_off; blu_led_off -#define set_led_red red_led_on; grn_led_off; blu_led_off -#define set_led_blue red_led_off; grn_led_off; blu_led_on -#define set_led_green red_led_off; grn_led_on; blu_led_off -#define set_led_yellow red_led_on; grn_led_on; blu_led_off -#define set_led_magenta red_led_on; grn_led_off; blu_led_on -#define set_led_cyan red_led_off; grn_led_on; blu_led_on -#define set_led_white red_led_on; grn_led_on; blu_led_on - -/* -#define LED_B 5 -#define LED_R 6 -#define LED_G 7 - -#define all_leds_off PORTF &= ~(1<<LED_B) & ~(1<<LED_R) & ~(1<<LED_G) - -#define red_led_on PORTF |= (1<<LED_R) -#define red_led_off PORTF &= ~(1<<LED_R) -#define grn_led_on PORTF |= (1<<LED_G) -#define grn_led_off PORTF &= ~(1<<LED_G) -#define blu_led_on PORTF |= (1<<LED_B) -#define blu_led_off PORTF &= ~(1<<LED_B) - -#define set_led_off PORTF &= ~(1<<LED_B) & ~(1<<LED_R) & ~(1<<LED_G) -#define set_led_red PORTF = PORTF & ~(1<<LED_B) & ~(1<<LED_G) | (1<<LED_R) -#define set_led_blue PORTF = PORTF & ~(1<<LED_G) & ~(1<<LED_R) | (1<<LED_B) -#define set_led_green PORTF = PORTF & ~(1<<LED_B) & ~(1<<LED_R) | (1<<LED_G) -#define set_led_yellow PORTF = PORTF & ~(1<<LED_B) | (1<<LED_R) | (1<<LED_G) -#define set_led_magenta PORTF = PORTF & ~(1<<LED_G) | (1<<LED_R) | (1<<LED_B) -#define set_led_cyan PORTF = PORTF & ~(1<<LED_R) | (1<<LED_B) | (1<<LED_G) -#define set_led_white PORTF |= (1<<LED_B) | (1<<LED_R) | (1<<LED_G) -*/ - -// This a shortcut to help you visually see your layout. -// The first section contains all of the arguements -// The second converts the arguments into a two-dimensional array -#define LAYOUT( \ - k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, \ - k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, \ - k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, \ - k33, k34, k35, k36, k37, k38, \ - k43, k44, k45, k46, k47, k48 \ -) \ -{ \ - { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B }, \ - { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B }, \ - { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B }, \ - { KC_NO, KC_NO, KC_NO, k33, k34, k35, k36, k37, k38, KC_NO, KC_NO, KC_NO }, \ - { KC_NO, KC_NO, KC_NO, k43, k44, k45, k46, k47, k48, KC_NO, KC_NO, KC_NO } \ -} - -#endif diff --git a/keyboards/dichotemy/keymaps/default/keymap.c b/keyboards/dichotemy/keymaps/default/keymap.c deleted file mode 100644 index 8742116f15..0000000000 --- a/keyboards/dichotemy/keymaps/default/keymap.c +++ /dev/null @@ -1,394 +0,0 @@ -// 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 "pointing_device.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 dichotemy_layers -{ - _BS, - _SF, - _NM, - _NS, - _MS -}; - -#define LONGPRESS_COUNT 4 - -enum dichotemy_keycodes -{ - CK_1G = SAFE_RANGE, - CK_BSPE, - CK_QE, - CK_TE, //these 4 CK_XXXX keys are special "alternate long-press" keys controlled with unique timers. Make sure you understand them before you mess with them. - NS_HYPH, - NS_EQU, - NUMKEY, - SFTKEY, - MOUSE, - MS_BTN1, - MS_BTN2 - //MS_BTN3 -}; - -// Macro definitions for readability -enum dichotemy_macros -{ - VOLU, - VOLD, - ESCM -}; - -#define LONGPRESS_DELAY 150 -#define MAX_TOGGLE_LENGTH 300 -#define TAPPING_TOGGLE 1 - -// Fillers to make layering more clear -#define _______ KC_TRNS -#define XXXXXXX KC_NO - -const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { - - [_BS] = LAYOUT( /* Base layout, nearly qwerty but with modifications because it's not a full keyboard. Obviously. */ - CK_TE, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, - NUMKEY, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, CK_QE, - SFTKEY, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, MOUSE, - KC_LCTL, KC_LALT, KC_LGUI, KC_RGUI, KC_RALT, KC_RCTL, - KC_LBRC, KC_LPRN, KC_QUOT, KC_SPC, KC_RPRN, KC_RBRC - ), - - [_SF] = LAYOUT( /* Shifted layout, small changes (because angle brackets have been moved to thumb cluster buttons) */ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, NS_HYPH, KC_UNDS, _______, _______, - _______, _______, _______, _______, _______, _______, - _______, KC_LABK, _______, _______, KC_RABK, _______ - ), - - [_NM] = LAYOUT( /* Number layout, basically the main function layer */ - _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______, - _______, CK_1G, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, CK_BSPE, - _______, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, _______, - _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______ - ), - - [_NS] = LAYOUT( /* Shifted number/function layout, for per-key control. Only active when shift is held, and number is toggled or held */ - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PLUS, NS_EQU, _______, - _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______, - _______, _______, _______, _______, _______, _______ - ), - - [_MS] = LAYOUT( /* Mouse layer, including buttons for clicking. */ - _______, _______, _______, _______, _______, _______, KC_VOLU, KC_HOME, KC_PGUP, _______, _______, _______, - _______, _______, _______, _______, _______, _______, _______, MS_BTN1, MS_BTN2, _______, _______, _______, - _______, _______, _______, _______, _______, _______, KC_VOLD, KC_END, KC_PGDN, _______, _______, _______, - _______, _______, _______, _______, KC_UP, _______, - _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT - ) - -}; - - -const uint16_t PROGMEM fn_actions[] = { - -}; - -static uint16_t special_timers[LONGPRESS_COUNT] = {0xFFFF,0xFFFF,0xFFFF,0xFFFF}; -static bool special_key_states[LONGPRESS_COUNT] = {0,0,0,0}; - -static uint16_t shift_timer; -static uint16_t num_timer; -static uint16_t mouse_timer; - -static bool shift_singular_key = false; -static bool number_singular_key = false; -static bool mouse_singular_key = false; - -static bool shift_held = false; -static bool shift_suspended = false; -report_mouse_t currentReport = {}; - -bool process_record_user(uint16_t keycode, keyrecord_t *record) { - - //uint8_t layer; - //layer = biton32(layer_state); // get the current layer //Or don't, I didn't use it. - - //custom layer handling for tri_layer, - switch (keycode) { - case NUMKEY: - if (record->event.pressed) { - num_timer = timer_read(); - number_singular_key = true; - layer_invert(_NM); - } else { - if (timer_elapsed(num_timer) < MAX_TOGGLE_LENGTH && number_singular_key) { - //do nothing, the layer has already been inverted - } else { - layer_invert(_NM); - } - } - update_tri_layer(_NM, _SF, _NS); - return false; - break; - //SHIFT is handled as LSHIFT in the general case - 'toggle' shoudl activate caps, while the layer is only active when shift is held. - case SFTKEY: - if (record->event.pressed) { - shift_held = true; - shift_suspended = false; - shift_timer = timer_read(); - shift_singular_key = true; - layer_on(_SF); - register_code(KC_LSFT); - } else { - shift_held = false; - if (timer_elapsed(shift_timer) < MAX_TOGGLE_LENGTH && shift_singular_key) { - //this was basically a toggle, so activate/deactivate caps lock. - SEND_STRING(SS_TAP(X_CAPSLOCK)); - } - layer_off(_SF); - unregister_code(KC_LSFT); - } - update_tri_layer(_NM, _SF, _NS); - return false; - break; - //MOUSE layer needs to be handled the same way as NUMKEY, but differently from shift - case MOUSE: - if (record->event.pressed) { - mouse_timer = timer_read(); - mouse_singular_key = true; - layer_invert(_MS); - } else { - if (timer_elapsed(mouse_timer) < MAX_TOGGLE_LENGTH && number_singular_key){ - //do nothing, it was a toggle (and it's already been toggled) - } else { - layer_invert(_MS); - } - } - return false; - break; - //Custom macros for strange keys with different long-tap behavior - case CK_1G: - if (shift_held && shift_suspended){ - register_code(KC_LSFT); - shift_suspended = false; - } - shift_singular_key = false; - number_singular_key = false; - mouse_singular_key = false; - if (record->event.pressed) { - special_timers[CK_1G-SAFE_RANGE] = timer_read(); - } else { - if (special_key_states[CK_1G-SAFE_RANGE]){ - //key was activated after longpress_delay, need to close those keycodes - special_key_states[CK_1G-SAFE_RANGE] = 0; - unregister_code(KC_GRAVE); - } else { - //key was not activated, return macro activating proper, pre-long-tap key - SEND_STRING(SS_TAP(X_1)); - } - special_timers[CK_1G-SAFE_RANGE] = 0xFFFF; - } - break; - case CK_BSPE: - if (shift_held && shift_suspended){ - register_code(KC_LSFT); - shift_suspended = false; - } - shift_singular_key = false; - number_singular_key = false; - mouse_singular_key = false; - if (record->event.pressed) { - special_timers[CK_BSPE-SAFE_RANGE] = timer_read(); - } else { - if (special_key_states[CK_BSPE-SAFE_RANGE]){ - //key was activated after longpress_delay, need to close those keycodes - special_key_states[CK_BSPE-SAFE_RANGE] = 0; - unregister_code(KC_ENTER); - } else { - //key was not activated, return macro activating proper, pre-long-tap key - SEND_STRING(SS_TAP(X_BSLASH)); - } - special_timers[CK_BSPE-SAFE_RANGE] = 0xFFFF; - } - break; - case CK_QE: - if (shift_held && shift_suspended){ - register_code(KC_LSFT); - shift_suspended = false; - } - shift_singular_key = false; - number_singular_key = false; - mouse_singular_key = false; - if (record->event.pressed) { - special_timers[CK_QE-SAFE_RANGE] = timer_read(); - } else { - if (special_key_states[CK_QE-SAFE_RANGE]){ - //key was activated after longpress_delay, need to close those keycodes - special_key_states[CK_QE-SAFE_RANGE] = 0; - unregister_code(KC_ENTER); - } else { - //key was not activated, return macro activating proper, pre-long-tap key - SEND_STRING(SS_TAP(X_QUOTE)); - } - special_timers[CK_QE-SAFE_RANGE] = 0xFFFF; - } - break; - case CK_TE: - if (shift_held && shift_suspended){ - register_code(KC_LSFT); - shift_suspended = false; - } - if (record->event.pressed) { - special_timers[CK_TE-SAFE_RANGE] = timer_read(); - } else { - if (special_key_states[CK_TE-SAFE_RANGE]){ - //key was activated after longpress_delay, need to close those keycodes - special_key_states[CK_TE-SAFE_RANGE] = 0; - unregister_code(KC_ENTER); - } else { - //key was not activated, return macro activating proper, pre-long-tap key - SEND_STRING(SS_TAP(X_TAB)); - } - special_timers[CK_TE-SAFE_RANGE] = 0xFFFF; - } - break; - //No-shift keys, they unregister the KC_LSFT code so they can send - //unshifted values - but they don't change the bool. if any other - //key is pressed and the bool is set, KC_LSFT is registered again. - case NS_HYPH: - if (record->event.pressed) { - shift_suspended = true; - unregister_code(KC_LSFT); - register_code(KC_MINS); - } else { - unregister_code(KC_MINS); - if (shift_held && shift_suspended){ - register_code(KC_LSFT); - shift_suspended = false; - } - } - break; - case NS_EQU: - if (record->event.pressed) { - shift_suspended = true; - unregister_code(KC_LSFT); - register_code(KC_EQUAL); - } else { - unregister_code(KC_EQUAL); - if (shift_held && shift_suspended){ - register_code(KC_LSFT); - shift_suspended = false; - } - } - break; - - //mouse buttons, for 1-3, to update the mouse report: - case MS_BTN1: - currentReport = pointing_device_get_report(); - if (record->event.pressed) { - if (shift_held && shift_suspended){ - register_code(KC_LSFT); - shift_suspended = false; - } - //update mouse report here - currentReport.buttons |= MOUSE_BTN1; //MOUSE_BTN1 is a const defined in report.h - } else { - //update mouse report here - currentReport.buttons &= ~MOUSE_BTN1; - } - pointing_device_set_report(currentReport); - break; - case MS_BTN2: - currentReport = pointing_device_get_report(); - if (record->event.pressed) { - if (shift_held && shift_suspended){ - register_code(KC_LSFT); - shift_suspended = false; - } - //update mouse report here - currentReport.buttons |= MOUSE_BTN2; //MOUSE_BTN2 is a const defined in report.h - } else { - //update mouse report here - } - pointing_device_set_report(currentReport); - break; - //there is a case for button 3, but that's handled in dichotemy.c, and this is being - //disabled to avoid any conflict. - /*case MS_BTN3: - currentReport = pointing_device_get_report(); - if (record->event.pressed) { - if (shift_held && shift_suspended){ - register_code(KC_LSFT); - shift_suspended = false; - } - //update mouse report here - currentReport.buttons |= MOUSE_BTN3; //MOUSE_BTN2 is a const defined in report.h - } else { - //update mouse report here - } - pointing_device_set_report(currentReport); - break;*/ - - //If any other key was pressed during the layer mod hold period, - //then the layer mod was used momentarily, and should block latching - //Additionally, if NS_ keys are in use, then shift may be held (but is - //disabled for the unshifted keycodes to be send. Check the bool and - //register shift as necessary. - default: - if (shift_held){ - register_code(KC_LSFT); - } - shift_singular_key = false; - number_singular_key = false; - mouse_singular_key = false; - break; - } - return true; -}; - -void matrix_scan_user(void) { - uint8_t layer = biton32(layer_state); - for (uint8_t i = 0; i<LONGPRESS_COUNT; i++){ - if (timer_elapsed(special_timers[i]) >= LONGPRESS_DELAY && !special_key_states[i]){ - switch (i + SAFE_RANGE){ - case CK_1G: - register_code(KC_GRAVE); - break; - case CK_BSPE: - register_code(KC_ENTER); - break; - case CK_QE: - register_code(KC_ENTER); - break; - case CK_TE: - register_code(KC_ESCAPE); - break; - } - special_key_states[i] = 1; - } - } - switch (layer) { - case _BS: - set_led_off; - break; - case _NM: - set_led_blue; - break; - case _SF: - set_led_red; - break; - case _NS: - set_led_green; - break; - default: - break; - } -}; - diff --git a/keyboards/dichotemy/config.h b/keyboards/dichotomy/config.h index 1d92cf74e5..f0847ec52c 100644..100755 --- a/keyboards/dichotemy/config.h +++ b/keyboards/dichotomy/config.h @@ -24,10 +24,10 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. #define VENDOR_ID 0xFEED #define PRODUCT_ID 0xACC7 -#define DEVICE_VER 0x0001 -#define MANUFACTURER unknown -#define PRODUCT Dichotemy -#define DESCRIPTION q.m.k. keyboard firmware for Dichotemy +#define DEVICE_VER 0x0002 +#define MANUFACTURER Broekhuijsen +#define PRODUCT Dichotomy +#define DESCRIPTION q.m.k. keyboard firmware for Dichotomy /* key matrix size */ #define MATRIX_ROWS 5 diff --git a/keyboards/dichotemy/dichotemy.c b/keyboards/dichotomy/dichotomy.c index 080c2654cd..41e12090cb 100644..100755 --- a/keyboards/dichotemy/dichotemy.c +++ b/keyboards/dichotomy/dichotomy.c @@ -1,13 +1,11 @@ -#include "dichotemy.h" -#include "pointing_device.h" -#include "report.h" +#include "dichotomy.h" void uart_init(void) { SERIAL_UART_INIT(); } void pointing_device_task(void){ - report_mouse_t currentReport = {}; + /*report_mouse_t currentReport = {}; SERIAL_UART_INIT(); uint32_t timeout = 0; @@ -25,28 +23,31 @@ void pointing_device_task(void){ while(!SERIAL_UART_RXD_PRESENT){ timeout++; if (timeout > 10000){ + xprintf("\r\nTIMED OUT"); break; } - } + } + xprintf("\r\nGOT DATA for %d",i); uart_data[i] = SERIAL_UART_DATA; } - //check for the end packet, bits 1-4 are movement and scroll - //but bit 5 has bits 0-3 for the scroll button state + //check for the end packet, bytes 1-4 are movement and scroll + //but byte 5 has bits 0-3 for the scroll button state //(1000 if pressed, 0000 if not) and bits 4-7 are always 1 //We can use this to verify the report sent properly. if (uart_data[4] == 0x0F || uart_data[4] == 0x8F) { + xprintf("\r\nREQUESTED MOUSE, RECEIVED %i, %i, %i, %i, %i",uart_data[0],uart_data[1],uart_data[2],uart_data[3],uart_data[4]); currentReport = pointing_device_get_report(); //shifting and transferring the info to the mouse report varaible //mouseReport.x = 127 max -127 min - currentReport.x = uart_data[0]; + currentReport.x = (int8_t) uart_data[0]; //mouseReport.y = 127 max -127 min - currentReport.y = uart_data[1]; + currentReport.y = (int8_t) uart_data[1]; //mouseReport.v = 127 max -127 min (scroll vertical) - currentReport.v = uart_data[2]; + currentReport.v = (int8_t) uart_data[2]; //mouseReport.h = 127 max -127 min (scroll horizontal) - currentReport.h = uart_data[3]; + currentReport.h = (int8_t) uart_data[3]; //mouseReport.buttons = 0x31 max (bitmask for mouse buttons 1-5) 0x00 min //mouse buttons 1 and 2 are handled by the keymap, but not 3 if (uart_data[4] == 0x0F) { //then 3 is not pressed @@ -55,7 +56,9 @@ void pointing_device_task(void){ currentReport.buttons |= MOUSE_BTN3; } pointing_device_set_report(currentReport); - } + } else { + xprintf("\r\nRequested packet, data 4 was %d",uart_data[4]); + }*/ pointing_device_send(); } diff --git a/keyboards/dichotomy/dichotomy.h b/keyboards/dichotomy/dichotomy.h new file mode 100755 index 0000000000..030209ff01 --- /dev/null +++ b/keyboards/dichotomy/dichotomy.h @@ -0,0 +1,46 @@ +#ifndef DICHOTOMY_H +#define DICHOTOMY_H + +#include QMK_KEYBOARD_H +#include "report.h" +#include "pointing_device.h" +#include "quantum.h" +#include "matrix.h" +#include "backlight.h" +#include <stddef.h> + +#define red_led_off() PORTF |= (1<<6) +#define red_led_on() PORTF &= ~(1<<6) +#define blu_led_off() PORTF |= (1<<5) +#define blu_led_on() PORTF &= ~(1<<5) +#define grn_led_off() PORTD |= (1<<1) +#define grn_led_on() PORTD &= ~(1<<1) + +#define set_led_off() red_led_off(); grn_led_off(); blu_led_off() +#define set_led_red() red_led_on(); grn_led_off(); blu_led_off() +#define set_led_blue() red_led_off(); grn_led_off(); blu_led_on() +#define set_led_green() red_led_off(); grn_led_on(); blu_led_off() +#define set_led_yellow() red_led_on(); grn_led_on(); blu_led_off() +#define set_led_magenta() red_led_on(); grn_led_off(); blu_led_on() +#define set_led_cyan() red_led_off(); grn_led_on(); blu_led_on() +#define set_led_white() red_led_on(); grn_led_on(); blu_led_on() + +// This a shortcut to help you visually see your layout. +// The first section contains all of the arguements +// The second converts the arguments into a two-dimensional array +#define LAYOUT( \ + k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B, \ + k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, \ + k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, \ + k33, k34, k35, k36, k37, k38, \ + k42, k43, k44, k45, k46, k47, k48, k49 \ +) \ +{ \ + { k00, k01, k02, k03, k04, k05, k06, k07, k08, k09, k0A, k0B }, \ + { k10, k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B }, \ + { k20, k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B }, \ + { KC_NO, KC_NO, KC_NO, k33, k34, k35, k36, k37, k38, KC_NO, KC_NO, KC_NO }, \ + { KC_NO, KC_NO, k42, k43, k44, k45, k46, k47, k48, k49, KC_NO, KC_NO } \ +} + +#endif diff --git a/keyboards/dichotemy/info.json b/keyboards/dichotomy/info.json index fc4390cdd7..aeb00edce7 100644 --- a/keyboards/dichotemy/info.json +++ b/keyboards/dichotomy/info.json @@ -1,5 +1,5 @@ { - "keyboard_name": "Dichotemy", + "keyboard_name": "Dichotomy", "url": "", "maintainer": "qmk", "width": 13, diff --git a/keyboards/dichotomy/keymaps/default/keymap.c b/keyboards/dichotomy/keymaps/default/keymap.c new file mode 100755 index 0000000000..e44bd21d9e --- /dev/null +++ b/keyboards/dichotomy/keymaps/default/keymap.c @@ -0,0 +1,506 @@ +// 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 "dichotomy.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 dichotomy_layers { + _BS, + _SF, + _NM, + _NS, + _MS +}; + +#define LONGPRESS_COUNT 4 + +enum dichotomy_keycodes +{ + CK_1G = SAFE_RANGE, + CK_BSPE, + CK_QE, + CK_TE, //these 4 CK_XXXX keys are special "alternate long-press" keys controlled with unique timers. Make sure you understand them before you mess with them. + NS_HYPH, + NS_EQU, + NUMKEY, + SFTKEY, + MOUKEY, + MS_BTN1, + MS_BTN2, + MS_BTN3 +}; + +#define CUSTOM_LONGPRESS 150 +#define CUSTOM_TOGGLE_TIME 300 + +#define RED_BRIGHTNESS 3 +#define GREEN_BRIGHTNESS 2 +#define BLUE_BRIGHTNESS 2 + +// Fillers to make layering more clear +#define _______ KC_TRNS +#define XXXXXXX KC_NO + +const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { +[_BS] = LAYOUT( /* Base layout, nearly qwerty but with modifications because it's not a full keyboard. Obviously. */ + CK_TE, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_BSPC, + NUMKEY, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, CK_QE, + SFTKEY, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, MOUKEY, + KC_LCTL, KC_LALT, KC_LGUI, KC_RGUI, KC_RALT, KC_RCTL, + MS_BTN3, KC_LBRC, KC_LPRN, KC_SPC, KC_SPC, KC_RPRN, KC_RBRC, MS_BTN3 +), + +[_SF] = LAYOUT( /* Shifted layout, small changes (because angle brackets have been moved to thumb cluster buttons) */ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, NS_HYPH, KC_UNDS, _______, _______, + _______, _______, _______, _______, _______, _______, + _______, _______, KC_LABK, _______, _______, KC_RABK, _______, _______ +), + +[_NM] = LAYOUT( /* Number layout, basically the main function layer */ + _______, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, _______, + _______, CK_1G, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, CK_BSPE, + _______, KC_F11, KC_F12, KC_F13, KC_F14, KC_F15, KC_F16, KC_F17, KC_F18, KC_F19, KC_F20, _______, + _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______ +), + +[_NS] = LAYOUT( /* Shifted number/function layout, for per-key control. Only active when shift is held, and number is toggled or held */ + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_PLUS, NS_EQU, _______, + _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, _______ +), + +[_MS] = LAYOUT( /* Mouse layer, including buttons for clicking. */ + _______, _______, _______, _______, _______, _______, KC_VOLU, KC_HOME, KC_PGUP, _______, _______, _______, + _______, _______, _______, _______, _______, _______, _______, MS_BTN1, MS_BTN2, _______, _______, _______, + _______, _______, _______, _______, _______, _______, KC_VOLD, KC_END, KC_PGDN, _______, _______, _______, + _______, _______, _______, _______, KC_UP, _______, + _______, _______, _______, _______, KC_LEFT, KC_DOWN, KC_RGHT, _______ +) + +}; + + +const uint16_t PROGMEM fn_actions[] = { + +}; + +static uint16_t special_timers[LONGPRESS_COUNT] = {0xFFFF,0xFFFF,0xFFFF,0xFFFF}; +static bool special_key_states[LONGPRESS_COUNT] = {0,0,0,0}; +static bool special_key_pressed[LONGPRESS_COUNT] = {0,0,0,0}; + +static uint16_t shift_timer; +static uint16_t num_timer; +static uint16_t mouse_timer; + +static uint8_t red_timer; +static uint8_t green_timer; +static uint8_t blue_timer; + +static bool shift_singular_key = false; +static bool number_singular_key = false; +static bool mouse_singular_key = false; +static bool capsLED = false; +static bool shiftLED = false; +static bool numLED = false; +static bool mouseLED = false; + +static bool shift_held = false; +static bool shift_suspended = false; +report_mouse_t currentReport = {}; + +bool process_record_user(uint16_t keycode, keyrecord_t *record) { + //uint8_t layer; + //layer = biton32(layer_state); // get the current layer //Or don't, I didn't use it. + bool returnVal = true; //this is to determine if more key processing is needed. + + //custom layer handling for tri_layer, + switch (keycode) { + case NUMKEY: + if (record->event.pressed) { + num_timer = timer_read(); + number_singular_key = true; + layer_invert(_NM); + numLED = !numLED; + } else { + if (timer_elapsed(num_timer) < CUSTOM_TOGGLE_TIME && number_singular_key) { + //do nothing, the layer has already been inverted + } else { + layer_invert(_NM); + numLED = !numLED; + } + } + update_tri_layer(_NM, _SF, _NS); + returnVal = false; + break; + //SHIFT is handled as LSHIFT in the general case - 'toggle' shoudl activate caps, while the layer is only active when shift is held. + case SFTKEY: + if (record->event.pressed) { + shift_held = true; + shiftLED = true; + shift_suspended = false; + shift_timer = timer_read(); + shift_singular_key = true; + layer_on(_SF); + register_code(KC_LSFT); + } else { + shift_held = false; + shiftLED = false; + if (timer_elapsed(shift_timer) < CUSTOM_TOGGLE_TIME && shift_singular_key) { + //this was basically a toggle, so activate/deactivate caps lock. + SEND_STRING(SS_TAP(X_CAPSLOCK)); + capsLED = !capsLED; + } + layer_off(_SF); + unregister_code(KC_LSFT); + } + update_tri_layer(_NM, _SF, _NS); + returnVal = false; + break; + //MOUSE layer needs to be handled the same way as NUMKEY, but differently from shift + case MOUKEY: + if (record->event.pressed) { + mouse_timer = timer_read(); + mouse_singular_key = true; + layer_invert(_MS); + mouseLED = !mouseLED; + } else { + if (timer_elapsed(mouse_timer) < CUSTOM_TOGGLE_TIME && mouse_singular_key){ + //do nothing, it was a toggle (and it's already been toggled) + } else { + layer_invert(_MS); + mouseLED = !mouseLED; + } + } + returnVal = false; + break; + //Custom macros for strange keys with different long-tap behavior + case CK_1G: + if (shift_held && shift_suspended){ + register_code(KC_LSFT); + shift_suspended = false; + } + if (record->event.pressed) { + special_timers[CK_1G-SAFE_RANGE] = timer_read(); + special_key_pressed[CK_1G-SAFE_RANGE] = 1; + } else { + if (special_key_states[CK_1G-SAFE_RANGE]){ + //key was activated after custom_longpress, need to close those keycodes + special_key_states[CK_1G-SAFE_RANGE] = 0; + unregister_code(KC_GRAVE); + } else { + if (special_key_pressed[CK_1G-SAFE_RANGE]){ + //key was not activated, return macro activating proper, pre-long-tap key + SEND_STRING(SS_TAP(X_1)); + special_key_pressed[CK_1G-SAFE_RANGE] = 0; + } else { + //the short key was already sent, because another key was pressed. + //Do nothing. + } + + } + } + returnVal = false; + break; + case CK_BSPE: + if (shift_held && shift_suspended){ + register_code(KC_LSFT); + shift_suspended = false; + } + if (record->event.pressed) { + special_timers[CK_BSPE-SAFE_RANGE] = timer_read(); + special_key_pressed[CK_BSPE-SAFE_RANGE] = 1; + } else { + if (special_key_states[CK_BSPE-SAFE_RANGE]){ + //key was activated after custom_longpress, need to close those keycodes + special_key_states[CK_BSPE-SAFE_RANGE] = 0; + unregister_code(KC_ENTER); + } else { + if (special_key_pressed[CK_BSPE-SAFE_RANGE]){ + //key was not activated, return macro activating proper, pre-long-tap key + SEND_STRING(SS_TAP(X_BSLASH)); + special_key_pressed[CK_BSPE-SAFE_RANGE] = 0; + } else { + //the short key was already sent, because another key was pressed. + //Do nothing. + } + } + } + returnVal = false; + break; + case CK_QE: + if (shift_held && shift_suspended){ + register_code(KC_LSFT); + shift_suspended = false; + } + if (record->event.pressed) { + special_timers[CK_QE-SAFE_RANGE] = timer_read(); + special_key_pressed[CK_QE-SAFE_RANGE] = 1; + } else { + if (special_key_states[CK_QE-SAFE_RANGE]){ + //key was activated after custom_longpress, need to close those keycodes + special_key_states[CK_QE-SAFE_RANGE] = 0; + unregister_code(KC_ENTER); + } else { + if (special_key_pressed[CK_QE-SAFE_RANGE]){ + //the long-press key was not activated, return macro activating proper, pre-long-tap key + SEND_STRING(SS_TAP(X_QUOTE)); + special_key_pressed[CK_QE-SAFE_RANGE] = 0; + } else { + //the short key was already sent, because another key was pressed. + //Do nothing. + } + } + } + returnVal = false; + break; + case CK_TE: + if (shift_held && shift_suspended){ + register_code(KC_LSFT); + shift_suspended = false; + } + if (record->event.pressed) { + special_timers[CK_TE-SAFE_RANGE] = timer_read(); + special_key_pressed[CK_TE-SAFE_RANGE] = 1; + } else { + if (special_key_states[CK_TE-SAFE_RANGE]){ + //key was activated after custom_longpress, need to close those keycodes + special_key_states[CK_TE-SAFE_RANGE] = 0; + unregister_code(KC_ESCAPE); + } else { + if (special_key_pressed[CK_TE-SAFE_RANGE]){ + //the long-press key was not activated, return macro activating proper, pre-long-tap key + SEND_STRING(SS_TAP(X_TAB)); + special_key_pressed[CK_TE-SAFE_RANGE] = 0; + } else { + //the short key was already sent, because another key was pressed. + //Do nothing. + } + } + } + returnVal = false; + break; + //No-shift keys, they unregister the KC_LSFT code so they can send + //unshifted values - but they don't change the bool. if any other + //key is pressed and the bool is set, KC_LSFT is registered again. + case NS_HYPH: + if (record->event.pressed) { + shift_suspended = true; + unregister_code(KC_LSFT); + register_code(KC_MINS); + } else { + unregister_code(KC_MINS); + if (shift_held && shift_suspended){ + register_code(KC_LSFT); + shift_suspended = false; + } + } + returnVal = false; + break; + case NS_EQU: + if (record->event.pressed) { + shift_suspended = true; + unregister_code(KC_LSFT); + register_code(KC_EQUAL); + } else { + unregister_code(KC_EQUAL); + if (shift_held && shift_suspended){ + register_code(KC_LSFT); + shift_su |