aboutsummaryrefslogtreecommitdiffstats
path: root/keyboards/mitosis
diff options
context:
space:
mode:
Diffstat (limited to 'keyboards/mitosis')
-rw-r--r--keyboards/mitosis/keymaps/mjt/config.h74
-rw-r--r--keyboards/mitosis/keymaps/mjt/keymap.c329
-rw-r--r--keyboards/mitosis/readme.md37
-rw-r--r--keyboards/mitosis/rules.mk4
4 files changed, 419 insertions, 25 deletions
diff --git a/keyboards/mitosis/keymaps/mjt/config.h b/keyboards/mitosis/keymaps/mjt/config.h
new file mode 100644
index 000000000..2209a9e0d
--- /dev/null
+++ b/keyboards/mitosis/keymaps/mjt/config.h
@@ -0,0 +1,74 @@
+#ifndef CONFIG_H
+#define CONFIG_H
+
+#include "config_common.h"
+
+/* USB Device descriptor parameter */
+
+#define VENDOR_ID 0xFEEB
+#define PRODUCT_ID 0x6060
+#define DEVICE_VER 0x0001
+#define MANUFACTURER MJT
+#define PRODUCT Mitosis
+#define DESCRIPTION q.m.k. keyboard firmware for Mitosis
+
+/* key matrix size */
+#define MATRIX_ROWS 5
+#define MATRIX_COLS 10
+
+// fix iPhone power adapter issue
+#define USB_MAX_POWER_CONSUMPTION 50
+// #define CATERINA_BOOTLOADER
+
+/* define if matrix has ghost */
+//#define MATRIX_HAS_GHOST
+
+/* number of backlight levels */
+//#define BACKLIGHT_LEVELS 3
+
+#define ONESHOT_TIMEOUT 500
+
+
+/* key combination for command */
+#define IS_COMMAND() ( \
+ keyboard_report->mods == (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)) \
+)
+
+/*
+ * Feature disable options
+ * These options are also useful to firmware size reduction.
+ */
+
+#define PREVENT_STUCK_MODIFIERS
+
+/* disable debug print */
+//#define NO_DEBUG
+
+/* disable print */
+//#define NO_PRINT
+
+/* disable action features */
+//#define NO_ACTION_LAYER
+//#define NO_ACTION_TAPPING
+//#define NO_ACTION_ONESHOT
+//#define NO_ACTION_MACRO
+//#define NO_ACTION_FUNCTION
+
+//UART settings for communication with the RF microcontroller
+#define SERIAL_UART_BAUD 1000000
+#define SERIAL_UART_DATA UDR1
+#define SERIAL_UART_UBRR (F_CPU / (16UL * SERIAL_UART_BAUD) - 1)
+#define SERIAL_UART_TXD_READY (UCSR1A & _BV(UDRE1))
+#define SERIAL_UART_RXD_PRESENT (UCSR1A & _BV(RXC1))
+#define SERIAL_UART_INIT() do { \
+ /* baud rate */ \
+ UBRR1L = SERIAL_UART_UBRR; \
+ /* baud rate */ \
+ UBRR1H = SERIAL_UART_UBRR >> 8; \
+ /* enable TX and RX */ \
+ UCSR1B = _BV(TXEN1) | _BV(RXEN1); \
+ /* 8-bit data */ \
+ UCSR1C = _BV(UCSZ11) | _BV(UCSZ10); \
+ } while(0)
+
+#endif
diff --git a/keyboards/mitosis/keymaps/mjt/keymap.c b/keyboards/mitosis/keymaps/mjt/keymap.c
new file mode 100644
index 000000000..01443d5f4
--- /dev/null
+++ b/keyboards/mitosis/keymaps/mjt/keymap.c
@@ -0,0 +1,329 @@
+// 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 "mitosis.h"
+#ifdef AUDIO_ENABLE
+ #include "audio.h"
+#endif
+#include "eeconfig.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 mitosis_layers
+{
+ _QWERTY,
+ _SHIFTED,
+ _FUNCTIONPC,
+ _FUNCTIONMAC,
+ _FUNCSHIFT,
+ _ADJUST
+};
+
+enum mitosis_keycodes
+{
+ FNKEY = SAFE_RANGE,
+ SHIFT,
+ MACSLEEP,
+ FNMAC,
+ FNPC,
+ DYNAMIC_MACRO_RANGE,
+};
+
+
+// Macro definitions for readability
+enum mitosis_macros
+{
+ VOLU,
+ VOLD,
+ ESCM
+};
+
+
+#include "dynamic_macro.h"
+
+#define LONGPRESS_DELAY 150
+#define LAYER_TOGGLE_DELAY 900
+
+// Fillers to make layering more clear
+#define _______ KC_TRNS
+#define __MOD__ KC_TRNS
+#define XXXXXXX KC_NO
+
+const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
+ [_QWERTY] = { /* QWERTY adapted to this crazy thing */
+ {KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P },
+ {KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN },
+ {SFT_T(KC_Z), KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, SFT_T(KC_SLSH) },
+ {XXXXXXX, KC_LCTL, M(ESCM), KC_TAB, KC_QUOT, KC_LEFT, KC_DOWN, KC_UP, KC_RIGHT, XXXXXXX },
+ {XXXXXXX, KC_LALT, KC_LGUI, KC_SPC, SHIFT, FNKEY, KC_BSPC, KC_ENT, MO(_ADJUST), XXXXXXX }
+ },
+
+
+ [_SHIFTED] = { /* Shifted Layer, layered so that tri_layer can be used, or selectively
+ able to modify individual key's shifted behaviour */
+ {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______ },
+ {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______ },
+ {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______ },
+ {XXXXXXX, __MOD__, KC_DEL, _______, _______, _______, _______, _______, _______, XXXXXXX },
+ {XXXXXXX, __MOD__, __MOD__, _______, __MOD__, __MOD__, _______, _______, KC_NO, XXXXXXX }
+ },
+
+
+ [_FUNCTIONPC] = { /* Function Layer mimicks planck's raise layer somewhat */
+ {KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0 },
+ {LCTL(KC_A), LCTL(KC_S), _______, LCTL(KC_F),_______, _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC },
+ {LCTL(KC_Z), LCTL(KC_X), LCTL(KC_C), LCTL(KC_V),_______, _______, KC_BSLS, _______, _______, KC_QUOT },
+ {XXXXXXX, __MOD__, KC_DEL, _______, KC_GRV, KC_HOME, KC_PGDN, KC_PGUP, KC_END, XXXXXXX },
+ {XXXXXXX, __MOD__, __MOD__, _______, __MOD__, __MOD__, _______, KC_PSCR, KC_NO, XXXXXXX }
+ },
+
+ [_FUNCTIONMAC] = { /* Function Layer mimicks planck's raise layer somewhat */
+ {KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0 },
+ {LGUI(KC_A), LGUI(KC_S), _______, LGUI(KC_F),_______, _______, KC_MINS, KC_EQL, KC_LBRC, KC_RBRC },
+ {LGUI(KC_Z), LGUI(KC_X), LGUI(KC_C), LGUI(KC_V),_______, _______, KC_BSLS, _______, _______, KC_QUOT },
+ {XXXXXXX, __MOD__, KC_DEL, _______, KC_GRV, KC_HOME, KC_PGDN, KC_PGUP, KC_END, XXXXXXX },
+ {XXXXXXX, __MOD__, __MOD__, _______, __MOD__, __MOD__, _______, KC_PSCR, KC_NO, XXXXXXX }
+ },
+
+ [_FUNCSHIFT] = { /* Function Shifted Layer mimicks planck's lower layer somewhat */
+ {_______, _______, _______, _______, _______, _______, _______, _______, _______, _______ },
+ {KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, _______, _______, KC_LCBR, KC_RCBR },
+ {KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, _______, _______, _______, _______ },
+ {XXXXXXX, __MOD__, KC_DEL, _______, KC_TILD, _______, _______, _______, _______, XXXXXXX },
+ {XXXXXXX, __MOD__, __MOD__, _______, __MOD__, __MOD__, _______, _______, _______, XXXXXXX }
+ },
+
+
+ [_ADJUST] = { /* Adjust layer for fancy stuff and macros */
+ {RESET, FNPC, _______, _______, _______, _______, DYN_REC_START1, DYN_REC_START2, _______, _______ },
+ {FNMAC, _______, AU_ON, AU_OFF, _______, _______, _______, _______, MACSLEEP, _______ },
+ {MUV_DE, MUV_IN, MU_ON, MU_OFF, _______, _______, KC_MUTE, KC_MPRV, KC_MNXT, KC_MPLY },
+ {XXXXXXX, __MOD__, _______, _______, _______, _______, DYN_MACRO_PLAY1, DYN_MACRO_PLAY2, _______, XXXXXXX },
+ {XXXXXXX, __MOD__, __MOD__, _______, __MOD__, __MOD__, _______, _______, __MOD__, XXXXXXX }
+ }
+
+};
+
+#ifdef AUDIO_ENABLE
+
+float tone_startup[][2] = SONG(STARTUP_SOUND);
+float tone_qwerty[][2] = SONG(QWERTY_SOUND);
+float tone_dyn_macro_rec[][2] = SONG(DVORAK_SOUND);
+float tone_dyn_macro_play[][2] = SONG(COLEMAK_SOUND);
+float tone_fnpc[][2] = SONG(PLOVER_SOUND);
+float tone_fnmac[][2] = SONG(PLOVER_GOODBYE_SOUND);
+float music_scale[][2] = SONG(MUSIC_SCALE_SOUND);
+
+float tone_goodbye[][2] = SONG(GOODBYE_SOUND);
+#endif
+
+const uint16_t PROGMEM fn_actions[] = {
+
+};
+static uint16_t function_layer = _FUNCTIONMAC;
+static uint16_t key_timer;
+
+void persistent_function_layer_set(uint16_t new_function_layer) {
+ // eeconfig_update_function_layer(new_function_layer);
+ function_layer = new_function_layer;
+ // should clear layers to avoid getting stuck.
+}
+
+const macro_t *action_get_macro(keyrecord_t *record, uint8_t id, uint8_t opt)
+{
+ // MACRODOWN only works in this function
+ switch(id) {
+
+ //switch multiplexing for media, short tap for volume up, long press for play/pause
+ case VOLU:
+ if (record->event.pressed) {
+ key_timer = timer_read(); // if the key is being pressed, we start the timer.
+ } else { // this means the key was just released, so we can figure out how long it was pressed for (tap or "held down").
+ if (timer_elapsed(key_timer) > LONGPRESS_DELAY) { // LONGPRESS_DELAY being 150ms, the threshhold we pick for counting something as a tap.
+ return MACRO(T(MPLY), END);
+ } else {
+ return MACRO(T(VOLU), END);
+ }
+ }
+ break;
+
+ //switch multiplexing for media, short tap for volume down, long press for next track
+ case VOLD:
+ if (record->event.pressed) {
+ key_timer = timer_read();
+ } else {
+ if (timer_elapsed(key_timer) > LONGPRESS_DELAY) {
+ return MACRO(T(MNXT), END);
+ } else {
+ return MACRO(T(VOLD), END);
+ }
+ }
+ break;
+
+ //switch multiplexing for escape, short tap for escape, long press for context menu
+ case ESCM:
+ if (record->event.pressed) {
+ key_timer = timer_read();
+ } else {
+ if (timer_elapsed(key_timer) > LONGPRESS_DELAY) {
+ return MACRO(T(APP), END);
+ } else {
+ return MACRO(T(ESC), END);
+ }
+ }
+ break;
+ }
+ return MACRO_NONE;
+};
+
+static bool singular_key = false;
+
+bool process_record_user(uint16_t keycode, keyrecord_t *record) {
+ uint16_t macro_kc = (keycode == MO(_ADJUST) ? DYN_REC_STOP : keycode);
+ if (!process_record_dynamic_macro(macro_kc, record)) {
+ return false;
+ }
+ uint8_t layer;
+ layer = biton32(layer_state); // get the current layer
+
+ //custom layer handling for tri_layer,
+ switch (keycode) {
+ case MACSLEEP:
+ if (record->event.pressed) {
+ // ACTION_MODS_KEY(MOD_LCTL | MOD_LSFT, KC_POWER);
+ register_code(KC_RSFT);
+ register_code(KC_RCTL);
+ register_code(KC_POWER);
+ unregister_code(KC_POWER);
+ unregister_code(KC_RCTL);
+ unregister_code(KC_RSFT);
+ }
+ return false;
+ break;
+ case FNKEY:
+ if (record->event.pressed) {
+ key_timer = timer_read();
+ singular_key = true;
+ // layer_on(_FUNCTION);
+ layer_on(function_layer);
+ } else {
+ if (timer_elapsed(key_timer) < LAYER_TOGGLE_DELAY || !singular_key) {
+ layer_off(function_layer);
+ }
+ }
+ update_tri_layer(function_layer, _SHIFTED, _FUNCSHIFT);
+ return false;
+ break;
+ //SHIFT is handled as LSHIFT in the general case
+ case SHIFT:
+ if (record->event.pressed) {
+ key_timer = timer_read();
+ singular_key = true;
+ layer_on(_SHIFTED);
+ register_code(KC_LSFT);
+ } else {
+ if (timer_elapsed(key_timer) < LAYER_TOGGLE_DELAY || !singular_key) {
+ layer_off(_SHIFTED);
+ unregister_code(KC_LSFT);
+ }
+ }
+ update_tri_layer(function_layer, _SHIFTED, _FUNCSHIFT);
+ return false;
+ break;
+ case FNPC:
+ if (record->event.pressed) {
+ persistent_function_layer_set(_FUNCTIONPC);
+ #ifdef AUDIO_ENABLE
+ PLAY_NOTE_ARRAY(tone_fnpc, false, 0);
+ #endif
+ }
+ return false;
+ break;
+ case FNMAC:
+ if (record->event.pressed) {
+ persistent_function_layer_set(_FUNCTIONMAC);
+ #ifdef AUDIO_ENABLE
+ PLAY_NOTE_ARRAY(tone_fnmac, false, 0);
+ #endif
+ }
+ return false;
+ break;
+ //If any other key was pressed during the layer mod hold period,
+ //then the layer mod was used momentarily, and should block latching
+ default:
+ singular_key = false;
+ break;
+ }
+
+ //FUNCSHIFT has been shifted by the SHIFT handling, some keys need to be excluded
+ if (layer == _FUNCSHIFT) {
+ //F1-F12 should be sent as unshifted keycodes,
+ //and ] needs to be unshifted or it is sent as }
+ if ( (keycode >= KC_F1 && keycode <= KC_F12)
+ || keycode == KC_RBRC ) {
+ if (record->event.pressed) {
+ unregister_mods(MOD_LSFT);
+ } else {
+ register_mods(MOD_LSFT);
+ }
+ }
+ }
+
+ return true;
+};
+
+#ifdef AUDIO_ENABLE
+
+void startup_user()
+{
+ _delay_ms(20); // gets rid of tick
+ PLAY_NOTE_ARRAY(tone_startup, false, 0);
+}
+
+void shutdown_user()
+{
+ PLAY_NOTE_ARRAY(tone_goodbye, false, 0);
+ _delay_ms(150);
+ stop_all_notes();
+}
+
+void music_on_user(void)
+{
+ music_scale_user();
+}
+
+void music_scale_user(void)
+{
+ PLAY_NOTE_ARRAY(music_scale, false, 0);
+}
+
+#endif
+
+void matrix_scan_user(void) {
+ uint8_t layer = biton32(layer_state);
+
+ switch (layer) {
+ case _QWERTY:
+ set_led_off;
+ break;
+ case _FUNCTIONMAC:
+ set_led_blue;
+ break;
+ case _FUNCTIONPC:
+ set_led_cyan;
+ break;
+ case _SHIFTED:
+ set_led_red;
+ break;
+ case _FUNCSHIFT:
+ set_led_green;
+ break;
+ case _ADJUST:
+ set_led_white;
+ break;
+ default:
+ break;
+ }
+};
diff --git a/keyboards/mitosis/readme.md b/keyboards/mitosis/readme.md
index 70755e32a..ef1eb0d83 100644
--- a/keyboards/mitosis/readme.md
+++ b/keyboards/mitosis/readme.md
@@ -1,33 +1,24 @@
-Mitosis Keyboard Firmware
-======================
+Mitosis
+=======
-These configuration files were based off the Atreus keyboard. It assumes a Pro Micro is being used, however retains the 'make upload' feature from the Atreus branch. This keyboard uses a completely different 'matrix scan' system to other keyboards, it relies on an external nRF51822 microcontroller maintaining a matrix of keystates received from the keyboard halves. The matrix.c file contains the code to poll the external microcontroller for the key matrix. As long as this file is not changed, all other QMK features are supported.
-
-Build log of the keyboard can be found [here](https://www.reddit.com/r/MechanicalKeyboards/comments/66588f/wireless_split_qmk_mitosis/)
+A wireless split compact keyboard.
-Hardware design files can be found [here](https://github.com/reversebias/mitosis-hardware)
-
-Firmware for the nordic MCUs can be found [here](https://github.com/reversebias/mitosis)
+Keyboard Maintainer: [@reversebias](https://github.com/reversebias]
+Hardware Supported: Mitosis PCB
+Hardware Availability: https://www.reddit.com/r/MechanicalKeyboards/comments/66588f/wireless_split_qmk_mitosis/
-## Quantum MK Firmware
+Make example for this keyboard (after setting up your build environment):
-For the full Quantum feature list, see [the parent readme](/).
+ make mitosis-default
-## Building
+See [build environment setup](https://docs.qmk.fm/build_environment_setup.html) then the [make instructions](https://docs.qmk.fm/make_instructions.html) for more information.
-Download or clone the whole firmware and navigate to the keyboards/atreus folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use `make dfu` to program your PCB once you hit the reset button.
+## Mitosis Notes
-Depending on which keymap you would like to use, you will have to compile slightly differently.
-
-### Default
-To build with the default keymap, simply run `make default`.
+These configuration files were based off the Atreus keyboard. It assumes a Pro Micro is being used, however retains the 'make upload' feature from the Atreus branch. This keyboard uses a completely different 'matrix scan' system to other keyboards, it relies on an external nRF51822 microcontroller maintaining a matrix of keystates received from the keyboard halves. The matrix.c file contains the code to poll the external microcontroller for the key matrix. As long as this file is not changed, all other QMK features are supported.
-### Other Keymaps
-Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create file named `<name>.c` and see keymap document (you can find in top readme.md) and existent keymap files.
+Build log of the keyboard can be found [here](https://www.reddit.com/r/MechanicalKeyboards/comments/66588f/wireless_split_qmk_mitosis/)
-To build the firmware binary hex file with a keymap just do `make` with a keymap like this:
+Hardware design files can be found [here](https://github.com/reversebias/mitosis-hardware)
-```
-$ make [default|jack|<name>]
-```
-Keymaps follow the format **__\<name\>.c__** and are stored in the `keymaps` folder.
+Firmware for the nordic MCUs can be found [here](https://github.com/reversebias/mitosis)
diff --git a/keyboards/mitosis/rules.mk b/keyboards/mitosis/rules.mk
index 04fa552f8..903edb109 100644
--- a/keyboards/mitosis/rules.mk
+++ b/keyboards/mitosis/rules.mk
@@ -77,5 +77,5 @@ UNICODE_ENABLE = YES # Unicode
USB = /dev/ttyACM0
-upload: build
- $(MITOSIS_UPLOAD_COMMAND)
+# upload: build
+# $(MITOSIS_UPLOAD_COMMAND)