summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSnipeye <Snipeye@gmail.com>2018-12-05 19:31:21 -0700
committerDrashna Jaelre <drashna@live.com>2018-12-05 18:31:21 -0800
commit57678238a9f7023b3e0ba03bd9a61f6a7c309f9d (patch)
treec4f5aee61f4ca84a5f355d42c13b82bcd6fc35ea
parent8ad561c8f091a4baf167ad4d7c90c02383905e38 (diff)
Keyboard: Fixing spelling, updating code, finalizing keymap for Dichotomy (#4539)
* Fixing spelling, updating code, finalizing keymap for Dichotomy * Fixing requested changes in PR * Further PR-requested changes for convention * Making macros functionable, removing unecessary defs * Fixing keymap to properly use previously-changed macros
-rw-r--r--keyboards/dichotemy/dichotemy.h67
-rw-r--r--keyboards/dichotemy/keymaps/default/keymap.c394
-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-xkeyboards/dichotomy/dichotomy.h46
-rw-r--r--keyboards/dichotomy/info.json (renamed from keyboards/dichotemy/info.json)2
-rwxr-xr-xkeyboards/dichotomy/keymaps/default/keymap.c506
-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.
+ }
+ }
+ }
+ returnV