/*! ******************************************************************************* * Load default values from eeprom * * \todo EEPROM management, until now values are fix ******************************************************************************/ void load_defauls(void) { uint8_t i; //! Set Time and date RTC_SetDay (BOOT_DD); RTC_SetMonth (BOOT_MM); RTC_SetYear (BOOT_YY); RTC_SetHour (BOOT_hh); RTC_SetMinute(BOOT_mm); RTC_SetSecond(0); //! m_reftemps (high and low) m_reftemp_mem[0] = DEG_2_UINT8 (BOOT_TEMP_H); m_reftemp_mem[1] = DEG_2_UINT8 (BOOT_TEMP_L); //! DOW times for (i=0; i<7; i++){ RTC_DowTimerSet(i, 0, BOOT_ON1); RTC_DowTimerSet(i, 1, BOOT_OFF1); RTC_DowTimerSet(i, 2, BOOT_ON2); RTC_DowTimerSet(i, 3, BOOT_OFF2); } //! motor speed m_speed = full; //! initial keystates m_key_action = false; m_state_keys = 0; m_state_keys_prev = 0; m_state_wheel = 0; m_state_wheel_prev = 0; //! serial number serialNumber = 0; // Zero = Not set ! }
/*! ******************************************************************************* * \brief menu Controller * * \returns true for controler restart ******************************************************************************/ bool menu_controller(bool new_state) { int8_t wheel = wheel_proccess(); //signed number bool ret = false; switch (menu_state) { case menu_startup: if (new_state) { menu_auto_update_timeout=2; } if (menu_auto_update_timeout==0) { menu_state = menu_version; ret=true; } break; case menu_version: if (new_state) { menu_auto_update_timeout=2; } if (menu_auto_update_timeout==0) { #if (DEBUG_SKIP_DATETIME_SETTING_AFTER_RESET) || (REMOTE_SETTING_ONLY) menu_state = menu_home; #else menu_state = menu_set_year; #endif ret=true; } break; #if (! REMOTE_SETTING_ONLY) case menu_set_year: if (wheel != 0) RTC_SetYear(RTC_GetYearYY()+wheel); if ( kb_events & KB_EVENT_PROG) { menu_state = menu_set_month; CTL_update_temp_auto(); ret=true; } break; case menu_set_month: if (wheel != 0) RTC_SetMonth(RTC_GetMonth()+wheel); if ( kb_events & KB_EVENT_PROG ) { menu_state = menu_set_day; CTL_update_temp_auto(); ret=true; } break; case menu_set_day: if (wheel != 0) RTC_SetDay(RTC_GetDay()+wheel); if ( kb_events & KB_EVENT_PROG ) { menu_state = menu_set_hour; CTL_update_temp_auto(); ret=true; } break; case menu_set_hour: if (wheel != 0) RTC_SetHour(RTC_GetHour()+wheel); if ( kb_events & KB_EVENT_PROG ) { menu_state = menu_set_minute; CTL_update_temp_auto(); ret=true; } break; case menu_set_minute: if (wheel != 0) { RTC_SetMinute(RTC_GetMinute()+wheel); RTC_SetSecond(0); } if ( kb_events & KB_EVENT_PROG ) { menu_state = menu_home; CTL_update_temp_auto(); ret=true; } break; #endif case menu_home_no_alter: // same as home screen, but without alternate contend case menu_home: // home screen case menu_home2: // alternate version, real temperature case menu_home3: // alternate version, valve pos case menu_home4: // alternate version, time #if MENU_SHOW_BATTERY case menu_home5: // alternate version, battery #endif if ( kb_events & KB_EVENT_C ) { menu_state++; // go to next alternate home screen #if MENU_SHOW_BATTERY if (menu_state > menu_home5) menu_state=menu_home; #else if (menu_state > menu_home4) menu_state=menu_home; #endif ret=true; } else { if (menu_locked) { if ( kb_events & ( KB_EVENT_WHEEL_PLUS | KB_EVENT_WHEEL_MINUS | KB_EVENT_PROG | KB_EVENT_AUTO | KB_EVENT_PROG_REWOKE | KB_EVENT_C_REWOKE | KB_EVENT_AUTO_REWOKE | KB_EVENT_PROG_LONG | KB_EVENT_C_LONG | KB_EVENT_AUTO_LONG )) { menu_auto_update_timeout=LONG_PRESS_THLD+1; menu_state=menu_lock; ret=true; } } else { // not locked if ((menu_state == menu_home) || (menu_state == menu_home_no_alter)) { if (wheel != 0) { CTL_temp_change_inc(wheel); menu_state = menu_home_no_alter; ret=true; } if ( kb_events & KB_EVENT_AUTO ) { CTL_change_mode(CTL_CHANGE_MODE); // change mode menu_state=menu_home_no_alter; ret=true; } else if ( kb_events & KB_EVENT_AUTO_REWOKE ) { CTL_change_mode(CTL_CHANGE_MODE_REWOKE); // change mode menu_state=menu_home_no_alter; ret=true; } } else { if ( kb_events & ( KB_EVENT_WHEEL_PLUS | KB_EVENT_WHEEL_MINUS | KB_EVENT_PROG | KB_EVENT_AUTO | KB_EVENT_PROG_REWOKE | KB_EVENT_C_REWOKE | KB_EVENT_AUTO_REWOKE | KB_EVENT_PROG_LONG | KB_EVENT_C_LONG | KB_EVENT_AUTO_LONG )) { menu_state = menu_home; ret = true; } } // TODO .... } } break; #if (! REMOTE_SETTING_ONLY) case menu_set_timmer_dow_start: if (new_state) menu_set_dow=((config.timer_mode==1)?RTC_GetDayOfWeek():0); menu_state = menu_set_timmer_dow; // do not use break here case menu_set_timmer_dow: if (wheel != 0) menu_set_dow=(menu_set_dow+wheel+8)%8; if ( kb_events & KB_EVENT_PROG ) { menu_state=menu_set_timmer; menu_set_slot=0; config.timer_mode = (menu_set_dow>0); eeprom_config_save((uint16_t)(&config.timer_mode)-(uint16_t)(&config)); // save value to eeprom // update hourbar menu_update_hourbar((config.timer_mode==1)?RTC_GetDayOfWeek():0); ret=true; } else if ( kb_events & KB_EVENT_AUTO ) { // exit without save menu_state=menu_home; ret=true; } break; case menu_set_timmer: if (new_state) { menu_set_time= RTC_DowTimerGet(menu_set_dow, menu_set_slot, &menu_set_mode); if (menu_set_time>24*60) menu_set_time=24*60; } if (wheel != 0) { menu_set_time=((menu_set_time/10+(24*6+1)+wheel)%(24*6+1))*10; } if ( kb_events & KB_EVENT_C ) { menu_set_mode=(menu_set_mode+5)%4; } else if ( kb_events & KB_EVENT_PROG ) { RTC_DowTimerSet(menu_set_dow, menu_set_slot, menu_set_time, menu_set_mode); if (++menu_set_slot>=RTC_TIMERS_PER_DOW) { if (menu_set_dow!=0) menu_set_dow=menu_set_dow%7+1; menu_state=menu_set_timmer_dow; } CTL_update_temp_auto(); menu_update_hourbar((config.timer_mode==1)?RTC_GetDayOfWeek():0); ret=true; } else if ( kb_events & KB_EVENT_AUTO ) { // exit without save menu_state=menu_home; ret=true; } break; #endif #if (! REMOTE_SETTING_ONLY) case menu_preset_temp0: case menu_preset_temp1: case menu_preset_temp2: case menu_preset_temp3: if (new_state) menu_set_temp=temperature_table[menu_state-menu_preset_temp0]; if (wheel != 0) { menu_set_temp+=wheel; if (menu_set_temp > TEMP_MAX+1) menu_set_temp = TEMP_MAX+1; if (menu_set_temp < TEMP_MIN-1) menu_set_temp = TEMP_MIN-1; } if ( kb_events & KB_EVENT_PROG ) { temperature_table[menu_state-menu_preset_temp0]=menu_set_temp; eeprom_config_save(menu_state+((temperature_table-config_raw)-menu_preset_temp0)); menu_state++; // menu_preset_temp3+1 == menu_home CTL_update_temp_auto(); ret=true; } else if ( kb_events & KB_EVENT_AUTO ) { // exit without save menu_state=menu_home; ret=true; } break; #endif default: case menu_lock: // "bloc" message if (menu_auto_update_timeout==0) { menu_state=menu_home; ret=true; } break; case menu_service1: // service menu case menu_service2: if (kb_events & KB_EVENT_AUTO) { menu_state=menu_home; ret=true; } else if (kb_events & KB_EVENT_C) { menu_state=menu_service_watch; ret=true; } else if (kb_events & KB_EVENT_PROG) { if (menu_state == menu_service2) { eeprom_config_save(service_idx); // save current value menu_state = menu_service1; } else { menu_state = menu_service2; } } else { if (menu_state == menu_service1) { // change index service_idx = (service_idx+wheel+CONFIG_RAW_SIZE)%CONFIG_RAW_SIZE; } else { // change value in RAM, to save press PROG int16_t min = (int16_t)config_min(service_idx); int16_t max_min_1 = (int16_t)(config_max(service_idx))-min+1; config_raw[service_idx] = (uint8_t) ( ((int16_t)(config_raw[service_idx])+(int16_t)wheel-min+max_min_1)%max_min_1+min); if (service_idx==0) LCD_Init(); } } break; case menu_service_watch: if (kb_events & KB_EVENT_AUTO) { menu_state=menu_home; ret=true; } else if (kb_events & KB_EVENT_C) { menu_state=menu_service1; ret=true; } else { service_watch_n=(service_watch_n+wheel+WATCH_N)%WATCH_N; if (wheel != 0) ret=true; } break; } if (events_common()) ret=true; if (ret && (service_idx<CONFIG_RAW_SIZE)) { // back config to default value config_raw[service_idx] = config_value(service_idx); service_idx = CONFIG_RAW_SIZE; } kb_events = 0; // clear unused keys return ret; }
int main(void) { RTC_STRUCT stClock; RTC_Init(&stClock); printf("---Default Time---\n"); RTC_PrintTime(&stClock); // Test boundary conditions (using leap years) // 1) Normal, non leap-year printf("---No leap year, Feb-March rollover ---\n"); RTC_SetMonth(&stClock, MONTH_FEBRUARY); RTC_SetDay(&stClock, 28); RTC_SetHour(&stClock, 23); RTC_SetMinute(&stClock, 59); RTC_SetSecond(&stClock, 59); RTC_PrintTime(&stClock); RTC_AddTime(&stClock, 750); RTC_PrintTime(&stClock); RTC_AddTime(&stClock, 750); RTC_PrintTime(&stClock); // 2) Leap year, 4/year modulo printf("---Leap year, Feb 29 test (4 yr)---\n"); RTC_SetMonth(&stClock, MONTH_FEBRUARY); RTC_SetYear(&stClock, 2008); RTC_SetDay(&stClock, 28); RTC_SetHour(&stClock, 23); RTC_SetMinute(&stClock, 59); RTC_SetSecond(&stClock, 59); RTC_PrintTime(&stClock); RTC_AddTime(&stClock, 750); RTC_PrintTime(&stClock); RTC_AddTime(&stClock, 750); RTC_PrintTime(&stClock); // Verify leap-year month rollover printf("---leap year, month rollover ---\n"); RTC_SetHour(&stClock, 23); RTC_SetMinute(&stClock, 59); RTC_SetSecond(&stClock, 59); RTC_PrintTime(&stClock); RTC_AddTime(&stClock, 750); RTC_PrintTime(&stClock); RTC_AddTime(&stClock, 750); RTC_PrintTime(&stClock); // 3) No leap year, 100/year modulo printf("---No Leap year, rollover test (100 yr)---\n"); RTC_SetMonth(&stClock, MONTH_FEBRUARY); RTC_SetYear(&stClock, 2100); RTC_SetDay(&stClock, 28); RTC_SetHour(&stClock, 23); RTC_SetMinute(&stClock, 59); RTC_SetSecond(&stClock, 59); RTC_PrintTime(&stClock); RTC_AddTime(&stClock, 750); RTC_PrintTime(&stClock); RTC_AddTime(&stClock, 750); RTC_PrintTime(&stClock); // 4) Leap year, 400/year modulo printf("---Leap year, Feb 29 test (400 yr)---\n"); RTC_SetMonth(&stClock, MONTH_FEBRUARY); RTC_SetYear(&stClock, 2000); RTC_SetDay(&stClock, 28); RTC_SetHour(&stClock, 23); RTC_SetMinute(&stClock, 59); RTC_SetSecond(&stClock, 59); RTC_PrintTime(&stClock); RTC_AddTime(&stClock, 750); RTC_PrintTime(&stClock); RTC_AddTime(&stClock, 750); RTC_PrintTime(&stClock); // 4) End of year test printf("---End of year---\n"); RTC_SetMonth(&stClock, MONTH_DECEMBER); RTC_SetYear(&stClock, 2009); RTC_SetDay(&stClock, 31); RTC_SetHour(&stClock, 23); RTC_SetMinute(&stClock, 59); RTC_SetSecond(&stClock, 59); RTC_PrintTime(&stClock); RTC_AddTime(&stClock, 750); RTC_PrintTime(&stClock); RTC_AddTime(&stClock, 750); RTC_PrintTime(&stClock); return 0; }