/* this function must be called after reading from RTC or after setting the input vars by the user */ void gui_date_adjust(void) { uint16_t ydn; uint16_t year; //uint16_t cdn; //uint32_t minutes_since_2000; if ( gui_data.month == 0 ) gui_data.month++; if ( gui_data.day == 0 ) gui_data.day++; year = 2000+gui_data.year_t*10 + gui_data.year_o; ydn = get_year_day_number(year, gui_data.month, gui_data.day); //cdn = to_century_day_number(year, ydn); //minutes_since_2000 = to_minutes(cdn, gui_data.h, gui_data.mt*10+gui_data.mo); // maybe adjust time by +/- 1h based on argument given to gui_date_adjust... but then it should be renamed also gui_data.month = get_month_by_year_day_number(year, ydn); gui_data.day = get_day_by_year_day_number(year, ydn); gui_data.weekday = get_weekday_by_year_day_number(year, ydn); /* 0 = Sunday */ /* adjust the weekday so that 0 will be Monday */ gui_data.weekday += 6; if ( gui_data.weekday >= 7 ) gui_data.weekday -= 7; if ( gui_data.day != gui_data.last_day ) { gui_data.uptime++; gui_data.last_day = gui_data.day; } }
/* Prototype: uint8_t get_day_by_year_day_number(uint16_t y, uint16_t ydn) Description: Get the day within month from year and day number within a year. "R. A. Stone" Algorithm Arguments: y year, e.g. 2011 for year 2011 ydn year day number (1st of Jan has the number 1) Result: The day within a month: 1 for the first day of a month. See also: get_year_day_number() */ uint8_t get_day_by_year_day_number(uint16_t y, uint16_t ydn) { uint8_t m; uint16_t tmp; m = get_month_by_year_day_number(y, ydn); m += 2; ydn = corrected_year_day_number(y, ydn); tmp = 611; tmp *= m; tmp /= 20; ydn -= tmp; return ydn; }