Leap Years Now Handled Dynamically
This commit is contained in:
@@ -26,8 +26,9 @@
|
||||
#include <string.h>
|
||||
#include "day_one_face.h"
|
||||
#include "watch.h"
|
||||
#include "watch_utility.h"
|
||||
|
||||
static const uint8_t days_in_month[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
|
||||
static const uint8_t days_in_month[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
|
||||
|
||||
static uint32_t _day_one_face_juliandaynum(uint16_t year, uint16_t month, uint16_t day) {
|
||||
// from here: https://en.wikipedia.org/wiki/Julian_day#Julian_day_number_calculation
|
||||
@@ -66,13 +67,12 @@ static void _day_one_face_increment(day_one_state_t *state) {
|
||||
break;
|
||||
case PAGE_DAY:
|
||||
state->birth_day = state->birth_day + 1;
|
||||
if (state->birth_day == 0 || state->birth_day > days_in_month[state->birth_month - 1]) {
|
||||
state->birth_day = 1;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (state->birth_day == 0 || state->birth_day > (days_in_month[state->birth_month - 1] + (is_leap(state->birth_year) && state->birth_month == 2)))
|
||||
state->birth_day = 1;
|
||||
}
|
||||
|
||||
void day_one_face_setup(movement_settings_t *settings, uint8_t watch_face_index, void ** context_ptr) {
|
||||
|
||||
@@ -27,6 +27,7 @@
|
||||
#include "time_left_face.h"
|
||||
#include "watch.h"
|
||||
#include "watch_private_display.h"
|
||||
#include "watch_utility.h"
|
||||
|
||||
const char _state_titles[][3] = {{'D', 'L', ' '}, {'D', 'L', ' '}, {'D', 'A', ' '}, {'D', 'A', ' '}, {'Y', 'R', 'b'}, {'M', 'O', 'b'}, {'D', 'A', 'b'},
|
||||
{'Y', 'R', 'd'}, {'M', 'O', 'd'}, {'D', 'A', 'd'}};
|
||||
@@ -158,8 +159,7 @@ static void _draw(time_left_state_t *state, uint8_t subsecond) {
|
||||
/// @brief handle short or long pressing the alarm button
|
||||
static void _handle_alarm_button(time_left_state_t *state) {
|
||||
|
||||
const uint8_t days_in_month[12] = {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
|
||||
uint32_t tmp_day;
|
||||
const uint8_t days_in_month[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
|
||||
switch (state->current_page) {
|
||||
case TIME_LEFT_FACE_SETTINGS_STATE: // birth year
|
||||
state->birth_date.bit.year++;
|
||||
@@ -169,14 +169,7 @@ static void _handle_alarm_button(time_left_state_t *state) {
|
||||
state->birth_date.bit.month = (state->birth_date.bit.month % 12) + 1;
|
||||
break;
|
||||
case TIME_LEFT_FACE_SETTINGS_STATE + 2: // birth day
|
||||
tmp_day = state->birth_date.bit.day; // use a temporary variable to avoid messing up the months
|
||||
tmp_day++;
|
||||
// handle February 29th on a leap year
|
||||
if (((tmp_day > days_in_month[state->birth_date.bit.month - 1]) && (state->birth_date.bit.month != 2 || (state->birth_date.bit.year % 4) != 0))
|
||||
|| (state->birth_date.bit.month == 2 && (state->birth_date.bit.year % 4) == 0 && tmp_day > 29)) {
|
||||
tmp_day = 1;
|
||||
}
|
||||
state->birth_date.bit.day = tmp_day;
|
||||
state->birth_date.bit.day++;
|
||||
break;
|
||||
case TIME_LEFT_FACE_SETTINGS_STATE + 3: // target year
|
||||
state->target_date.bit.year++;
|
||||
@@ -186,16 +179,13 @@ static void _handle_alarm_button(time_left_state_t *state) {
|
||||
state->target_date.bit.month = (state->target_date.bit.month % 12) + 1;
|
||||
break;
|
||||
case TIME_LEFT_FACE_SETTINGS_STATE + 5: // target day
|
||||
tmp_day = state->target_date.bit.day;
|
||||
tmp_day++;
|
||||
// handle February 29th on a leap year
|
||||
if (((tmp_day > days_in_month[state->target_date.bit.month - 1]) && (state->target_date.bit.month != 2 || (state->target_date.bit.year % 4) != 0))
|
||||
|| (state->target_date.bit.month == 2 && (state->target_date.bit.year % 4) == 0 && tmp_day > 29)) {
|
||||
tmp_day = 1;
|
||||
}
|
||||
state->target_date.bit.day = tmp_day;
|
||||
state->target_date.bit.day++;
|
||||
break;
|
||||
}
|
||||
if (state->birth_date.bit.day > (days_in_month[state->birth_date.bit.month - 1] + (is_leap(state->birth_date.bit.year) && state->birth_date.bit.month == 2)))
|
||||
state->birth_date.bit.day = 1;
|
||||
if (state->target_date.bit.day > (days_in_month[state->target_date.bit.month - 1] + (is_leap(state->target_date.bit.year) && state->target_date.bit.month == 2)))
|
||||
state->target_date.bit.day = 1;
|
||||
}
|
||||
|
||||
static void _initiate_setting(time_left_state_t *state) {
|
||||
|
||||
Reference in New Issue
Block a user