+static
+void counter_init(void) {
+#if !SIMPLE_COUNTER
+ eeprom_busy_wait();
+ if (eeprom_read_byte(&reset_counter_ee) == 0) {
+ counter_reset();
+ }
+ percnt_init(0);
+#endif
+}
+
+static
+void token_generate(void) {
+ counter_inc();
+ eeprom_busy_wait();
+ eeprom_read_block(secret, secret_ee, 32);
+ eeprom_busy_wait();
+#if SIMPLE_COUNTER
+ hotp(token, secret, eeprom_read_word(&secret_length_ee), eeprom_read_dword(&counter_ee), eeprom_read_byte(&digits_ee));
+#else
+ hotp(token, secret, eeprom_read_word(&secret_length_ee), percnt_get(0), eeprom_read_byte(&digits_ee));
+#endif
+ memory_clean();
+}
+
+
+static
+void buildReport(uchar send_key) {
+ keyboard_report.modifier = 0;
+
+ switch (send_key) {
+ case 'A' ... 'Z':
+ keyboard_report.modifier = MOD_SHIFT_LEFT;
+ keyboard_report.keycode[0] = KEY_A + (send_key-'A');
+ break;
+ case 'a' ... 'z':
+ keyboard_report.keycode[0] = KEY_A + (send_key-'a');
+ break;
+ case '1' ... '9':
+ keyboard_report.keycode[0] = KEY_1 + (send_key-'1');
+ break;
+ case '0':
+ keyboard_report.keycode[0] = KEY_0;
+ break;
+ default:
+ keyboard_report.keycode[0] = 0;
+ }
+}
+
+static
+int8_t button_get_debounced(volatile uint8_t debounce_count) {
+ uint8_t v;
+ v = PINB & _BV(BUTTON_PIN);
+ while (debounce_count-- && v == (PINB & _BV(BUTTON_PIN))) {
+ ;
+ }
+ if (debounce_count) {
+ return -1;
+ }
+ return v ? 0 : 1;