int main (void) { board_init(); //Board definition and selection sysclk_init(); //System clock init usart_init_rs232(USART_SERIAL_RFID, &usart_options_RFID); //UART init usart_init_rs232(USART_SERIAL_Monitor, &usart_options_Monitor); gfx_mono_init(); //LCD init PORTE.OUTSET=PIN4_bm; //LCD Back light on //RTC Init sysclk_enable_module(SYSCLK_PORT_GEN, SYSCLK_RTC); while (RTC32.SYNCCTRL & RTC32_SYNCBUSY_bm); if (rtc_vbat_system_check(false) != VBAT_STATUS_OK) rtc_init(); PORTE.DIRCLR=PIN5_bm; while(1) { if(Receive()) { card_no=Check(); if(card_no) { PORTR.OUTCLR=PIN0_bm; gfx_mono_draw_string("Card Detected",0,0,&sysfont); gfx_mono_draw_string("Welcome",0,10,&sysfont); gfx_mono_draw_string(names[card_no-1],55,10,&sysfont); rtc_timestamp=rtc_get_time(); calendar_timestamp_to_date_tz(rtc_timestamp,5,30,&get_date); gfx_mono_draw_string(display_time(get_date,arr),0,20,&sysfont); delay_s(1); gfx_mono_init(); PORTR.OUTSET=PIN0_bm; } else { PORTR.OUTCLR=PIN1_bm; gfx_mono_draw_string("Invalid Card",0,0,&sysfont); delay_s(1); gfx_mono_init(); PORTR.OUTSET=PIN1_bm; } } } }
/** * \brief Initialize RTC32 and VBAT * * This function checks the RTC32 and VBAT systems' status, initializing them if * necessary. If the status is OK, only the RTC32 is reset. * * To ensure that WDT resets occur with correct timing, the RTC32 is reset to * the last time which was read out from it. */ static void main_init_rtc32(void) { /* RTC32 clock must be enabled after sysclk_init() to check VBAT */ sysclk_enable_module(SYSCLK_PORT_GEN, SYSCLK_RTC); while (RTC32.SYNCCTRL & RTC32_SYNCBUSY_bm) { /* Wait for synchronization */ } /* Initialize the RTC32 and VBAT if its status is not OK */ if (rtc_vbat_system_check(false) != VBAT_STATUS_OK) { rtc_init(); /* Otherwise, just ensure the RTC32 is enabled with correct period */ } else { RTC32.CTRL = ~RTC32_ENABLE_bm; while (RTC32.SYNCCTRL & RTC32_SYNCBUSY_bm) { } RTC32.PER = 0xffffffff; RTC32.CTRL = RTC32_ENABLE_bm; } /* Reset the time */ rtc_set_time(classb_last_wdt_reset); }
/** * \brief Main function. * * Initializes the board and reads out the production date stored in EEPROM and * set timezone from EEPROM if it is set. If it is not set it will open the * timezone selector to select the local timezone. It then runs the menu system * in an infinite while loop. */ int main(void) { uint8_t menu_status; struct keyboard_event input; uint32_t rtc_timestamp; sysclk_init(); board_init(); pmic_init(); gfx_mono_init(); touch_init(); adc_sensors_init(); // Enable display backlight gpio_set_pin_high(NHD_C12832A1Z_BACKLIGHT); // Workaround for known issue: Enable RTC32 sysclk sysclk_enable_module(SYSCLK_PORT_GEN, SYSCLK_RTC); while (RTC32.SYNCCTRL & RTC32_SYNCBUSY_bm) { // Wait for RTC32 sysclk to become stable } // If we have battery power and RTC is running, don't initialize RTC32 if (rtc_vbat_system_check(false) != VBAT_STATUS_OK) { rtc_init(); // Set current time to after production date rtc_timestamp = production_date_get_timestamp() + 1; rtc_set_time(rtc_timestamp); } // Get current time rtc_timestamp = rtc_get_time(); // Make sure RTC has not been set to a too early date . if (rtc_timestamp < FIRST_POSSIBLE_TIMESTAMP) { // Set time to 01.01.2011 00:00:00 rtc_set_time(FIRST_POSSIBLE_TIMESTAMP); } // Initialize USB CDC class cdc_start(); cpu_irq_enable(); // Display a splash screen showing button functions button_splash(); // Set timezone from EEPROM or to a default value timezone_init(); /* Main loop. Read keyboard status and pass input to menu system. * When an element has been selected in the menu, it will return the * index of the element that should be run. This can be an application * or another menu. */ while (true) { // (re)initialize menu system gfx_mono_menu_init(&main_menu); do { do { keyboard_get_key_state(&input); // Wait for key release } while (input.type != KEYBOARD_RELEASE); // Send key to menu system menu_status = gfx_mono_menu_process_key(&main_menu, input.keycode); // Wait for something useful to happen in the menu system } while (menu_status == GFX_MONO_MENU_EVENT_IDLE); switch (menu_status) { case 0: ntc_sensor_application(); break; case 1: lightsensor_application(); break; case 2: production_date_application(); break; case 3: date_time_application(); break; case 4: // Toggle LCD Backlight gpio_toggle_pin(NHD_C12832A1Z_BACKLIGHT); break; case GFX_MONO_MENU_EVENT_EXIT: // Fall trough to default and show button splash default: button_splash(); break; }; } }