get_set_datetime/
get_set_datetime.rs

1// SPDX-License-Identifier: MIT OR Apache-2.0
2// Copyright 2024 René Ladan <rene0+codeberg@freedom.nl>
3
4use radio_datetime_utils::RadioDateTimeUtils;
5
6fn main() {
7    let mut dcf77 = RadioDateTimeUtils::new(7);
8
9    // set date of now, leave out extra checks, do not compare to previous non-existing value:
10
11    // day must be set *after* year, month, and weekday because set_day() checks if its argument
12    // is within the current month which could be 28 or 29 for February depending on the year and
13    // day-of-week for 00 years.
14
15    dcf77.set_year(Some(24), true, false);
16    // year is clipped to century
17    dcf77.set_month(Some(1), true, false);
18    dcf77.set_day(Some(25), true, false);
19    println!("Day-of-month: {:?}", dcf77.get_day());
20    dcf77.set_weekday(Some(4), true, false);
21    dcf77.set_day(Some(25), true, false);
22    dcf77.set_hour(Some(22), true, false);
23    dcf77.set_minute(Some(34), true, false);
24    // seconds are not present in RadioDateTimeUtils
25
26    // Show the date and time:
27    println!(
28        "Initial: date={:?}-{:?}-{:?} weekday={:?} time={:?}:{:?} jumped={}",
29        dcf77.get_year(),
30        dcf77.get_month(),
31        dcf77.get_day(),
32        dcf77.get_weekday(),
33        dcf77.get_hour(),
34        dcf77.get_minute(),
35        dcf77.get_jump_minute()
36    );
37
38    // Going to the next minute without telling radio_datetime_utils about it
39    // causes it to think the minute jumped:
40    dcf77.set_minute(Some(35), true, true);
41    println!(
42        "Minute={:?}, jumped={}",
43        dcf77.get_minute(),
44        dcf77.get_jump_minute()
45    );
46    // Advance the time by one minute and show new (predicted) datetime:
47    // add_minute() wants DST to be defined and leaves jump values untouched
48    dcf77.set_dst(Some(false), Some(false), false);
49    println!("add_minute()={}", dcf77.add_minute());
50    println!(
51        "After add_minute(): date={:?}-{:?}-{:?} weekday={:?} time={:?}:{:?} jumped={}",
52        dcf77.get_year(),
53        dcf77.get_month(),
54        dcf77.get_day(),
55        dcf77.get_weekday(),
56        dcf77.get_hour(),
57        dcf77.get_minute(),
58        dcf77.get_jump_minute()
59    );
60
61    // "Formally" set the minute:
62    dcf77.set_minute(Some(36), true, true);
63    println!(
64        "Minute={:?}, jumped={}",
65        dcf77.get_minute(),
66        dcf77.get_jump_minute()
67    );
68
69    // Setting an illegal value leaves it untouched:
70    dcf77.set_month(Some(14), true, false);
71    println!("Month={:?}", dcf77.get_month());
72    dcf77.set_year(None, true, false);
73    println!("Year={:?}", dcf77.get_year());
74
75    // New century
76    let mut msf = RadioDateTimeUtils::new(0);
77    msf.set_year(Some(99), true, false);
78    msf.set_month(Some(12), true, false);
79    msf.set_weekday(Some(5), true, false); // Friday
80    msf.set_day(Some(31), true, false);
81    msf.set_hour(Some(23), true, false);
82    msf.set_minute(Some(59), true, false);
83    println!(
84        "Old century: date={:?}-{:?}-{:?} weekday={:?} time={:?}-{:?} {:?}",
85        msf.get_year(),
86        msf.get_month(),
87        msf.get_day(),
88        msf.get_weekday(),
89        msf.get_hour(),
90        msf.get_minute(),
91        msf.get_dst()
92    );
93
94    // add_minute() wants DST to be defined.
95    // announcements are honored because we omit calling bump_minutes_running() here
96    msf.set_dst(Some(false), Some(true), false);
97    println!("add_minute()={}", msf.add_minute());
98    msf.set_dst(Some(true), Some(true), false);
99    println!(
100        "New century: date={:?}-{:?}-{:?} weekday={:?} time={:?}-{:?} {:?}",
101        msf.get_year(),
102        msf.get_month(),
103        msf.get_day(),
104        msf.get_weekday(),
105        msf.get_hour(),
106        msf.get_minute(),
107        msf.get_dst()
108    );
109
110    // Setting the value twice with set_XXX() does not set the jumped flag the second time:
111    msf.set_hour(Some(2), true, true);
112    println!("Hour={:?} jumped={:?}", msf.get_hour(), msf.get_jump_hour());
113    msf.set_hour(Some(2), true, true);
114    println!("Hour={:?} jumped={:?}", msf.get_hour(), msf.get_jump_hour());
115
116    // WWVB (the legacy AM version) transmits the date as year, is-leap-year, day-in-year, it
117    // omits the day-of-week.
118    let mut wwvb = RadioDateTimeUtils::new(0); // pick 0 (-1 is invalid)
119    wwvb.set_year(Some(24), true, false); // year is 0-99
120    wwvb.set_month_day(Some(60), Some(true), true, true, false);
121    wwvb.set_utc_offset(-300, true);
122    // leap day:
123    println!(
124        "WWVB: date={:?}-{:?}-{:?}",
125        wwvb.get_year(),
126        wwvb.get_month(),
127        wwvb.get_day()
128    );
129
130    wwvb.reset();
131    println!(" Reset WWVB: {:#?}", wwvb)
132}