|
|
|
|
@ -19,6 +19,7 @@ |
|
|
|
|
uint8_t reportBuffer[2]; /* buffer for HID reports */ |
|
|
|
|
|
|
|
|
|
static uint8_t next_key=0, prev_key=0xFF; |
|
|
|
|
static uint8_t sec[SECLEN]=SECRET; |
|
|
|
|
|
|
|
|
|
uint32_t get_cnt(){ |
|
|
|
|
void* p=(void*)eeprom_read_word(CNTPOS_PTR); |
|
|
|
|
@ -65,14 +66,50 @@ void buildReport(uint8_t mod, uint8_t key){ |
|
|
|
|
reportBuffer[1] = key; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void main_fsm(){ |
|
|
|
|
static uint8_t device_state=0; |
|
|
|
|
static uint8_t prev_btn=0; |
|
|
|
|
switch(device_state){ |
|
|
|
|
case DEV_STATE_RESET: |
|
|
|
|
{ |
|
|
|
|
uint32_t cnt; |
|
|
|
|
if( eeprom_read_word(CNTPOS_PTR)==ERROR ){
|
|
|
|
|
writeToBuffer(USB_KEY_E);
|
|
|
|
|
writeToBuffer(USB_KEY_R);
|
|
|
|
|
writeToBuffer(USB_KEY_R);
|
|
|
|
|
writeToBuffer(USB_KEY_O);
|
|
|
|
|
writeToBuffer(USB_KEY_R); |
|
|
|
|
}else{ |
|
|
|
|
cnt = get_cnt(); |
|
|
|
|
buffer_unum(get_otp_from_cnt(cnt,8,sec,SECLEN)); |
|
|
|
|
} |
|
|
|
|
device_state=DEV_STATE_SENT; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
case DEV_STATE_SENT: |
|
|
|
|
if( prev_btn!=0 && ((PIN_BTN)&(1<<PBTN))==0 ){ |
|
|
|
|
writeToBuffer(USB_KEY_ENTER); |
|
|
|
|
inc_cnt(); |
|
|
|
|
device_state=DEV_STATE_CONFIRMED; |
|
|
|
|
_delay_ms(100); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case DEV_STATE_CONFIRMED: |
|
|
|
|
default: |
|
|
|
|
if( prev_btn!=0 && ((PIN_BTN)&(1<<PBTN))==0 ){ |
|
|
|
|
device_state=DEV_STATE_RESET; |
|
|
|
|
_delay_ms(100); |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
prev_btn=(PIN_BTN)&(1<<PBTN); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int main(void){ |
|
|
|
|
#ifdef CALIB |
|
|
|
|
uint8_t calibrationValue; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
uint8_t sec[SECLEN]=SECRET; |
|
|
|
|
uint32_t cnt; |
|
|
|
|
|
|
|
|
|
#ifdef CALIB |
|
|
|
|
/* oszillator calibration */ |
|
|
|
|
@ -92,23 +129,21 @@ int main(void){ |
|
|
|
|
|
|
|
|
|
writeToBuffer(USB_KEY_NOP); |
|
|
|
|
|
|
|
|
|
if( eeprom_read_word(CNTPOS_PTR)==ERROR ){
|
|
|
|
|
writeToBuffer(USB_KEY_E);
|
|
|
|
|
writeToBuffer(USB_KEY_R);
|
|
|
|
|
writeToBuffer(USB_KEY_R);
|
|
|
|
|
writeToBuffer(USB_KEY_O);
|
|
|
|
|
writeToBuffer(USB_KEY_R); |
|
|
|
|
}else{ |
|
|
|
|
cnt = get_cnt(); |
|
|
|
|
buffer_unum(get_otp_from_cnt(792,8,sec,SECLEN)); |
|
|
|
|
//inc_cnt();
|
|
|
|
|
} |
|
|
|
|
/*Set button to input*/ |
|
|
|
|
DDR_BTN &= ~(1<<PBTN); |
|
|
|
|
/*internal pull-up on*/ |
|
|
|
|
PORT_BTN |= 1<<PBTN; |
|
|
|
|
|
|
|
|
|
usbInit(); |
|
|
|
|
sei(); |
|
|
|
|
for(;;){ |
|
|
|
|
wdt_reset(); |
|
|
|
|
usbPoll(); |
|
|
|
|
|
|
|
|
|
/* Main FSM*/ |
|
|
|
|
main_fsm(); |
|
|
|
|
|
|
|
|
|
/* Send Keystrokes, if asked to */ |
|
|
|
|
if(usbInterruptIsReady()){ |
|
|
|
|
if(!buff_empty || next_key!=0){ |
|
|
|
|
if(next_key==0){ |
|
|
|
|
|