/* * main() */ int main(void) { kb_init(); // does controller initialization too kb_led_state_power_on(); usb_init(); while (!usb_configured()); kb_led_delay_usb_init(); // give the OS time to load drivers, etc. kb_led_state_ready(); for (;;) { // swap `main_kb_is_pressed` and `main_kb_was_pressed`, then update bool (*temp)[KB_ROWS][KB_COLUMNS] = main_kb_was_pressed; main_kb_was_pressed = main_kb_is_pressed; main_kb_is_pressed = temp; kb_update_matrix(*main_kb_is_pressed); // this loop is responsible to // - "execute" keys when they change 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) // // note // - everything else is the key function's responsibility // - see the keyboard layout file ("keyboard/ergodox/layout/*.c") for // which key is assigned which function (per layer) // - see "lib/key-functions/public/*.c" for the function definitions #define row main_loop_row #define col main_loop_col #define layer main_arg_layer #define is_pressed main_arg_is_pressed #define was_pressed main_arg_was_pressed for (row=0; row<KB_ROWS; row++) { for (col=0; col<KB_COLUMNS; col++) { is_pressed = (*main_kb_is_pressed)[row][col]; was_pressed = (*main_kb_was_pressed)[row][col]; if (is_pressed != was_pressed) { if (is_pressed) { layer = main_layers_peek(0); main_layers_pressed[row][col] = layer; main_arg_trans_key_pressed = false; } else { layer = main_layers_pressed[row][col]; main_arg_trans_key_pressed = main_kb_was_transparent[row][col]; } // set remaining vars, and "execute" key main_arg_row = row; main_arg_col = col; main_arg_layer_offset = 0; main_exec_key(); main_kb_was_transparent[row][col] = main_arg_trans_key_pressed; } } } #undef row #undef col #undef layer #undef is_pressed #undef was_pressed // send the USB report (even if nothing's changed) usb_keyboard_send(); usb_extra_consumer_send(); _delay_ms(MAKEFILE_DEBOUNCE_TIME); // update LEDs /*if (keyboard_leds & (1<<0)) { kb_led_num_on(); }*/ /*else { kb_led_num_off(); }*/ if (keyboard_leds & (1<<1)) { kb_led_caps_on(); } else { kb_led_caps_off(); } if (keyboard_leds & (1<<2)) { kb_led_scroll_on(); } else { kb_led_scroll_off(); } if (keyboard_leds & (1<<3)) { kb_led_compose_on(); } else { kb_led_compose_off(); } if (keyboard_leds & (1<<4)) { kb_led_kana_on(); } else { kb_led_kana_off(); } if (layers_head != 0) { kb_led_num_on(); } else { kb_led_num_off(); } } return 0; }
int main(void) { kb_init(); // does controller initialization too kb_led_state_power_on(); usb_init(); while (!usb_configured()); kb_led_delay_usb_init(); // give the OS time to load drivers, etc. kb_led_state_ready(); for (;;) { static uint8_t current_layer = 0; // 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); // call the appropriate function for each key, then send the usb report // if necessary // - everything else is the key function's responsibility; see the // keyboard layout file ("keyboard/ergodox/layout/*.c") for which key // is assigned which function (per layer), and "lib/key-functions.c" // for their definitions for (uint8_t row=0; row<KB_ROWS; row++) { for (uint8_t col=0; col<KB_COLUMNS; col++) { bool is_pressed = (*kb_is_pressed)[row][col]; bool was_pressed = (*kb_was_pressed)[row][col]; if (is_pressed != was_pressed) { if (is_pressed) { kbfun_funptr_t press_function = kb_layout_press_get(current_layer, row, col); if (press_function) { (*press_function)( kb_layout_get(current_layer, row, col), ¤t_layer, &row, &col ); } } else { kbfun_funptr_t release_function = kb_layout_release_get(current_layer, row, col); if (release_function) { (*release_function)( kb_layout_get(current_layer, row, col), ¤t_layer, &row, &col ); } } usb_keyboard_send(); _delay_ms(KB_DEBOUNCE_TIME); } } } // update LEDs if (keyboard_leds & (1<<0)) { kb_led_num_on(); } else { kb_led_num_off(); } if (keyboard_leds & (1<<1)) { kb_led_caps_on(); } else { kb_led_caps_off(); } if (keyboard_leds & (1<<2)) { kb_led_scroll_on(); } else { kb_led_scroll_off(); } if (keyboard_leds & (1<<3)) { kb_led_compose_on(); } else { kb_led_compose_off(); } if (keyboard_leds & (1<<4)) { kb_led_kana_on(); } else { kb_led_kana_off(); } } return 0; }