void main( void ) { init_uart(); while(1) { print_menu(); switch(read_uart()) { case '1': write_eeprom(1); break; case '2': read_eeprom(1); break; case '3': clear_eeprom(); break; case '4': write_eeprom(0); read_eeprom(0); break; default: writeln_uart("wrong input\r\n"); break; } } }
/* configure hardware, init timer, setup LED, button... */ void SetupHardware() { char init; /* Disable watchdog if enabled by bootloader/fuses */ MCUSR &= ~(1 << WDRF); wdt_disable(); /* Disable clock division */ clock_prescale_set(clock_div_1); /* reset eeprom */ eeprom_read(ADDR_INIT, &init, 1); if(init != 42) clear_eeprom(); /* init LED */ LED_DDR |= (1 << LED); /* init button */ BUTTON_DDR &= ~(1 << BUTTON); /*enable pullup*/ PORTE |=(1<<BUTTON); /* init timer */ timer_init(); /* init seed */ srand(get_seed()); /* init nonce */ update_nonce(); /* Hardware Initialization */ USB_Init(); /* init i2c */ #ifdef RTC rtc_init(); #endif }
int main() { unsigned long T_LED = 0L; // time of last digit update unsigned long T_time = 0L; // timer int i = 00, j = 00; U8 beep_delay = 0; int show_time_delay = 0; U8 counter_enabled = 0; key_state = 0; work_hours = (work_hours_t*)EEPROM_START_ADDR; keys_scan_buffer[0] = keys_scan_buffer[1] = keys_scan_buffer[2] = keys_scan_buffer[3] = 0; Global_time = 0L; // global time in ms ADC_value = 0; // value of last ADC measurement LED_delay = 1; // one digit emitting time // Configure clocking CLK_CKDIVR = 0; // F_HSI = 16MHz, f_CPU = 16MHz // Configure pins CFG_GCR |= 1; // disable SWIM LED_init(); // Configure Timer1 // prescaler = f_{in}/f_{tim1} - 1 // set Timer1 to 1MHz: 1/1 - 1 = 15 TIM1_PSCRH = 0; TIM1_PSCRL = 15; // LSB should be written last as it updates prescaler // auto-reload each 1ms: TIM_ARR = 1000 = 0x03E8 TIM1_ARRH = 0x03; TIM1_ARRL = 0xE8; // interrupts: update TIM1_IER = TIM_IER_UIE; // auto-reload + interrupt on overflow + enable TIM1_CR1 = TIM_CR1_APRE | TIM_CR1_URS | TIM_CR1_CEN; // configure ADC BEEP_CSR = 0x1e; // Configure BEEP _asm("rim"); // enable interrupts display_int(i); show_next_digit(); // show zero // Loop do { U8 *test = (U8*)0x4010; U8 result; if(((unsigned int)(Global_time - T_time) > DIGIT_PER) || (T_time > Global_time)) // set next timer value { T_time = Global_time; if(i && counter_enabled == 2) { PA_ODR |= (1<<2); // Relay is on i--; if(!i) { counter_enabled = 0; } } else { PA_ODR &= ~(1<<2); // Relay is off } if((i % 100) > 59) { i -= 40; } if(counter_enabled == 1) { if(j) { j--; if(!j) { i++; } if((j % 100) > 59) { j -= 40; } } if(!j) { counter_enabled = 2; add_minutes_to_eeprom(i/100); } } if(counter_enabled == 1) { display_int(-j); } else { display_int(i); } //if(i > 9999) i = -1200; // check ADC value to light up DPs proportionaly // values less than 206 == 0 } if((U8)(Global_time - T_LED) > LED_delay) { T_LED = Global_time; show_next_digit(); if(beep_delay) { beep_delay--; if(!beep_delay) { BEEP_CSR = 0x1e; // Configure BEEP } } if(show_time_delay) { show_time_delay--; if(!show_time_delay) { i = 0; // Stop show time } } } result = scan_keys(); if(result & KEY_0_PRESSED) // Start { if(counter_enabled == 1 && j < 859) // 859 - wait 3 sec from 1-st start press { BEEP_CSR = 0xbe; beep_delay = 200; counter_enabled = 2; add_minutes_to_eeprom(i/100); i++; j = 0; } if(!counter_enabled) { BEEP_CSR = 0xbe; beep_delay = 10; if(show_time_delay == 0 && i>0) { counter_enabled = 1; j = 901; // 6 minutes pre time } else { // Show Time i = work_hours->minutes + (int)(work_hours->hours_L) * 100 + (int)(work_hours->hours_H) * 10000; show_time_delay = 2450; } } } else { if(result && show_time_delay) { i = 0; show_time_delay = 0; } if(!counter_enabled) { if(result & KEY_3_PRESSED) { i+=100; display_int(i); BEEP_CSR = 0xbe; beep_delay = 10; } if(result & KEY_2_PRESSED) { if(i >= 100) { i-=100; display_int(i); } BEEP_CSR = 0xbe; beep_delay = 10; } } } if(result & KEY_1_PRESSED) //Stop { counter_enabled = 0; j = i = 0; display_int(i); BEEP_CSR = 0xbe; beep_delay = 40; show_time_delay = 0; } if((result & KEY_PRESSED) == KEY_PRESSED && Global_time < 1000) { BEEP_CSR = 0xbe; beep_delay = 40; clear_eeprom(); } } while(1); }
/** Event handler for the library USB Control Request reception event. */ void EVENT_USB_Device_ControlRequest(void) { static uint8_t success = 1; uint8_t bmRequestType = USB_ControlRequest.bmRequestType; uint8_t bRequest = USB_ControlRequest.bRequest; //uint8_t wValue = USB_ControlRequest.wValue; char data[51]; HID_Device_ProcessControlRequest(&Keyboard_HID_Interface); if (bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_VENDOR | REQREC_DEVICE)) { char lock; uint16_t wLength = USB_ControlRequest.wLength; char pw[32]; success = 1; /* default */ eeprom_read(ADDR_LOCK, &lock, 1); if(lock == 0 || lock == 255) lock = 0; else { if(bRequest != OPENKUBUS_GET_NONCE && bRequest != OPENKUBUS_SET_TIMESTAMP && bRequest != OPENKUBUS_RESET) { success = 0; return; } } // read data if(wLength) { Endpoint_ClearSETUP(); Endpoint_Read_Control_Stream_LE(data, MIN(sizeof(data), wLength)); Endpoint_ClearIN(); } switch(bRequest) { case OPENKUBUS_SET_LOCK: lock = 1; eeprom_write(ADDR_LOCK, &lock, 1); break; case OPENKUBUS_SET_OWNER: if(wLength) eeprom_write(ADDR_OWNER, data, wLength); else success = 0; break; case OPENKUBUS_SET_COMPANY: if(wLength) eeprom_write(ADDR_COMPANY, data, wLength); else success = 0; break; case OPENKUBUS_SET_DESCRIPTION: if(wLength) eeprom_write(ADDR_DESCRIPTION, data, wLength); else success = 0; break; case OPENKUBUS_SET_ID: if(wLength == 4) eeprom_write(ADDR_ID, data, wLength); else success = 0; break; case OPENKUBUS_SET_TIMESTAMP: if(wLength == 16) { aes256_ctx_t ctx; memset(&ctx, 0, sizeof(aes256_ctx_t)); eeprom_read(ADDR_SEED, pw, sizeof(pw)); aes256_init(pw, &ctx); aes256_dec(data, &ctx); if(strncmp(nonce, data, sizeof(nonce)) == 0) { set_timestamp(array2int((uint8_t *)&data[12])); update_nonce(); } else success = 0; } else success = 0; break; case OPENKUBUS_RESET: if(wLength == 16) { aes256_ctx_t ctx; memset(&ctx, 0, sizeof(aes256_ctx_t)); memcpy_P(pw, MASTER_PASSWORD, sizeof(pw)); aes256_init(pw, &ctx); aes256_dec(data, &ctx); if(strncmp(nonce, data, sizeof(nonce)) == 0) { clear_eeprom(); wdt_enable(WDTO_15MS); while(1); } else success = 0; } else success = 0; break; case OPENKUBUS_SET_SEED: if(wLength == LEN_SEED) eeprom_write(ADDR_SEED, data, LEN_SEED); else success = 0; break; case OPENKUBUS_SET_COUNTER: if(wLength == LEN_COUNTER) eeprom_write(ADDR_COUNTER, data, LEN_COUNTER); else success = 0; break; default: success = 0; break; } } else if (bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_VENDOR | REQREC_DEVICE)) { uint8_t length = 0; uint8_t i; uint32_t temp32 = 0; char c; switch(bRequest) { case OPENKUBUS_GET_SUCCESS: data[length++] = success; break; case OPENKUBUS_GET_NONCE: for(i = 0; i < sizeof(nonce); i++) data[length++] = nonce[i]; break; case OPENKUBUS_GET_TEMPERATURE: #ifdef RTC data[length++] = rtc_get_temperature(); #else data[length++] = 0xFF; #endif break; case OPENKUBUS_GET_ID: for(i = 0; i < LEN_ID; i++) { eeprom_read(ADDR_ID+i, &c, 1); data[length++] = c; } break; case OPENKUBUS_GET_TIME: temp32 = get_timestamp(); data[length++] = temp32 >> 24; data[length++] = temp32 >> 16; data[length++] = temp32 >> 8; data[length++] = temp32; break; case OPENKUBUS_GET_SERIAL: for(i = 0x0e; i <= 0x18; i++) data[length++] = boot_signature_byte_get(i); break; case OPENKUBUS_GET_DESCRIPTION: for(i = 0; i < LEN_DESCRIPTION; i++) { eeprom_read(ADDR_DESCRIPTION+i, &c, 1); data[length++] = c; if(c == 0) break; } break; case OPENKUBUS_GET_COMPANY: for(i = 0; i < LEN_COMPANY; i++) { eeprom_read(ADDR_COMPANY+i, &c, 1); data[length++] = c; if(c == 0) break; } break; case OPENKUBUS_GET_OWNER: for(i = 0; i < LEN_OWNER; i++) { eeprom_read(ADDR_OWNER+i, &c, 1); data[length++] = c; if(c == 0) break; } break; default: data[length++] = 0; } // send data Endpoint_ClearSETUP(); Endpoint_Write_Control_Stream_LE(data, length); Endpoint_ClearOUT(); }