state->birth_month = (state->birth_month % 12) + 1;
break;
case PAGE_DAY:
- state->birth_day = state->birth_day + 1;
+ state->birth_day = (state->birth_day % watch_utility_days_in_month(state->birth_month, state->birth_year)) + 1;
break;
default:
break;
}
- if (state->birth_day == 0 || state->birth_day > days_in_month(state->birth_month, state->birth_year))
- state->birth_day = 1;
}
void day_one_face_setup(uint8_t watch_face_index, void ** context_ptr) {
date_time.unit.month = (date_time.unit.month % 12) + 1;
break;
case 2:
- date_time.unit.day = date_time.unit.day + 1;
-
- /* Check for leap years */
- int8_t days = days_in_month[date_time.unit.month - 1];
- if (date_time.unit.month == 2 && _is_leap(date_time.unit.year))
- days++;
-
- if (date_time.unit.day > days)
- date_time.unit.day = 1;
+ date_time.unit.day = (date_time.unit.day % watch_utility_days_in_month(date_time.unit.month, date_time.unit.year + WATCH_RTC_REFERENCE_YEAR)) + 1;
break;
case 3:
date_time.unit.hour = (date_time.unit.hour + 1) % 24;
state->birth_date.bit.month = (state->birth_date.bit.month % 12) + 1;
break;
case TIME_LEFT_FACE_SETTINGS_STATE + 2: // birth day
- state->birth_date.bit.day++;
+ state->birth_date.bit.day = (state->birth_date.bit.day % watch_utility_days_in_month(state->birth_date.bit.month, state->birth_date.bit.year)) + 1;
break;
case TIME_LEFT_FACE_SETTINGS_STATE + 3: // target year
state->target_date.bit.year++;
state->target_date.bit.month = (state->target_date.bit.month % 12) + 1;
break;
case TIME_LEFT_FACE_SETTINGS_STATE + 5: // target day
- state->target_date.bit.day++;
+ state->target_date.bit.day = (state->target_date.bit.day % watch_utility_days_in_month(state->target_date.bit.month, state->birth_date.bit.year)) + 1;
break;
}
- if (state->birth_date.bit.day > days_in_month(state->birth_date.bit.month, state->birth_date.bit.year))
- state->birth_date.bit.day = 1;
- if (state->target_date.bit.day > days_in_month(state->target_date.bit.month, state->birth_date.bit.year))
- state->target_date.bit.day = 1;
}
static void _initiate_setting(time_left_state_t *state) {
date_time_settings.unit.month = (date_time_settings.unit.month % 12) + 1;
break;
case 5: // day
- date_time_settings.unit.day = date_time_settings.unit.day + 1;
+ date_time_settings.unit.day = (date_time_settings.unit.day % watch_utility_days_in_month(date_time_settings.unit.month, date_time_settings.unit.year + WATCH_RTC_REFERENCE_YEAR)) + 1;
break;
case 6: // time zone
movement_set_timezone_index(movement_get_timezone_index() + 1);
if (movement_get_timezone_index() >= NUM_ZONE_NAMES) movement_set_timezone_index(0);
break;
}
- if (date_time_settings.unit.day > days_in_month(date_time_settings.unit.month, date_time_settings.unit.year + WATCH_RTC_REFERENCE_YEAR))
- date_time_settings.unit.day = 1;
if (current_page != 2) // Do not set time when we are at seconds, it was already set previously
watch_rtc_set_date_time(date_time_settings);
//TODO: Do not update whole RTC, just what we are changing
date_time.unit.month = (date_time.unit.month % 12) + 1;
break;
case 3: { // day
- date_time.unit.day = date_time.unit.day + 1;
+ date_time.unit.day = (date_time.unit.day % watch_utility_days_in_month(date_time.unit.month, date_time.unit.year + WATCH_RTC_REFERENCE_YEAR)) + 1;
break;
case 4: // hour
date_time.unit.hour = (date_time.unit.hour + 1) % 24;
break;
}
}
- if (date_time.unit.day > days_in_month(date_time.unit.month, date_time.unit.year + WATCH_RTC_REFERENCE_YEAR))
- date_time.unit.day = 1;
movement_set_local_date_time(date_time);
}
new += seconds;
return new;
}
+
+uint8_t watch_utility_days_in_month(uint8_t month, uint16_t year) {
+ static const uint8_t days_in_month[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
+ uint8_t days = days_in_month[month - 1];
+ if (month == 2 && is_leap(year))
+ days += 1;
+ return days;
+}
* @param month The month of the date (1-12)
* @param year The year of the date (ex. 2022)
*/
-uint8_t days_in_month(uint8_t month, uint16_t year);
+uint8_t watch_utility_days_in_month(uint8_t month, uint16_t year);
#endif