/* ---------------------------------------------------------------------------- * main() * ---------------------------------------------------------------------------- * Copyright (c) 2012 Ben Blazak * Released under The MIT License (MIT) (see "license.md") * Project located at * ------------------------------------------------------------------------- */ #include #include // -------------------------------------------------------------------- // hardware // -------------------------------------------------------------------- #define KBD_DEBUG // comment out to disable the debug interface completely #include "./keyboard/controller.c" #include "./keyboard/keyboard.h" // -------------------------------------------------------------------- // types and forward declarations // -------------------------------------------------------------------- #define array_length(x) (sizeof(x) / sizeof((x)[0])) typedef uint8_t u8; typedef uint16_t u16; typedef u8 keycode; typedef u16 media_keycode; typedef u8 layer; typedef void (*keyfunc)(void); #include "./main.h" // ---------------------------------------------------------------------------- // layout data // ---------------------------------------------------------------------------- #include "./keyboard/layout.c" // defines: // #define KB_Layers #{Layers.size} // static const keycode PROGMEM _kb_layout[KB_LAYERS][KB_ROWS][KB_COLUMNS]; // static const keyfunc PROGMEM _kb_layout_press[KB_LAYERS][KB_ROWS][KB_COLUMNS]; // static const keyfunc PROGMEM _kb_layout_release[KB_LAYERS][KB_ROWS][KB_COLUMNS]; // ---------------------------------------------------------------------------- // globals // ---------------------------------------------------------------------------- static bool _kb_is_pressed[KB_ROWS][KB_COLUMNS]; static bool (*kb_is_pressed)[KB_ROWS][KB_COLUMNS] = &_kb_is_pressed; static bool _kb_was_pressed[KB_ROWS][KB_COLUMNS]; static bool (*kb_was_pressed)[KB_ROWS][KB_COLUMNS] = &_kb_was_pressed; static layer layers_pressed[KB_ROWS][KB_COLUMNS]; static u8 current_row; static u8 current_col; static layer current_layer; static keycode current_keycode; static bool current_is_pressed; static bool layers_active[KB_LAYERS]; static layer layers_top = 0; static bool layer_sticky_on; static bool layer_sticky[KB_LAYERS]; static bool layer_sticky_done; static u8 mod_sticky; static bool mod_sticky_done; static const keyfunc _kb_layer_funcs[] = { // TODO ugh &kbfun_layer_press_release, &kbfun_layer_sticky, &kbfun_shift_layer_press_release, &kbfun_control_layer_press_release, &kbfun_alt_layer_press_release, &kbfun_win_layer_press_release, }; // ---------------------------------------------------------------------------- int main() { // initialize init_hw(); init_layers(); init_sticky(); // never return main_key_loop(); return 0; } // -------------------------------------------------------------------------------------- void main_key_loop() { for (;;) { // swap `kb_is_pressed` and `kb_was_pressed`, then update bool (*temp)[KB_ROWS][KB_COLUMNS] = kb_was_pressed; kb_was_pressed = kb_is_pressed; kb_is_pressed = temp; kb_update_matrix(*kb_is_pressed); // - execute key functions when their key changes state // - keep track of which layers the keys were on when they were pressed // (so they can be released using the function from that layer) for (u8 row=0; row 0 && l < KB_LAYERS; l--) { if (layers_active[l]) { return l; } } } // the base layer is always active return 0; } // enable a layer void layer_enable(layer l) { if (l >= KB_LAYERS) { return; } layers_active[l] = true; if (l > layers_top) { layers_top = l; } } // disable a layer void layer_disable(layer l) { // base layer stays always on if (l >= KB_LAYERS || l == 0) { return; } layers_active[l] = false; if (l == layers_top) { layers_top = highest_active_layer(1); } } bool is_layer_keyfunc(keyfunc f) { for (int i=0; i