decode_datetime_logfile/
decode_datetime_logfile.rs

1// SPDX-License-Identifier: MIT OR Apache-2.0
2// Copyright 2024-2025 René Ladan <rene0+codeberg@freedom.nl>
3
4use radio_datetime_utils::{DST_ANNOUNCED, DST_PROCESSED, DST_SUMMER};
5
6use msf60_utils::MSFUtils;
7
8// quick and dirty parsing function
9fn parse_dst(dst: Option<u8>) -> String {
10    if dst.is_none() {
11        return String::from("*");
12    }
13    let mut res = String::from("");
14    let s_dst = dst.unwrap();
15    if s_dst & DST_ANNOUNCED != 0 {
16        res += "announced ";
17    }
18    if s_dst & DST_PROCESSED != 0 {
19        res += "processed ";
20    }
21    if s_dst & DST_SUMMER != 0 {
22        res += "summer";
23    }
24    res
25}
26
27fn str_weekday(day: Option<u8>) -> String {
28    String::from(match day {
29        Some(0) => "Sunday",
30        Some(1) => "Monday",
31        Some(2) => "Tuesday",
32        Some(3) => "Wednesday",
33        Some(4) => "Thursday",
34        Some(5) => "Friday",
35        Some(6) => "Saturday",
36        Some(7) => "?",
37        None => "None",
38        _ => "<panic>",
39    })
40}
41
42fn main() {
43    let mut msf = MSFUtils::default();
44
45    const MSG: &str = "4 00000000.22000000 0010.0100 0.0100 01.0010 101 10.0000 000.0010 01313330";
46    for m in MSG.chars() {
47        match m {
48            '0' => {
49                msf.set_current_bit_a(Some(false));
50                msf.set_current_bit_b(Some(false));
51            }
52            '1' => {
53                msf.set_current_bit_a(Some(true));
54                msf.set_current_bit_b(Some(false));
55            }
56            '2' => {
57                msf.set_current_bit_a(Some(false));
58                msf.set_current_bit_b(Some(true));
59            }
60            '3' => {
61                msf.set_current_bit_a(Some(true));
62                msf.set_current_bit_b(Some(true));
63            }
64            '4' => msf.force_past_new_minute(),
65            '_' => {
66                msf.set_current_bit_a(None);
67                msf.set_current_bit_b(None);
68            }
69            _ => continue,
70            // also skip increasing the second counter, as this character is only syntactic sugar
71        }
72        // 0111.1110 train seen?
73        if msf.end_of_minute_marker_present() {
74            msf.decode_time(true, false);
75            let rdt = msf.get_radio_datetime();
76            println!("DUT1={:?}", rdt.get_dut1());
77            println!(
78                "Parities={:?} {:?} {:?} {:?}",
79                msf.get_parity_1(),
80                msf.get_parity_2(),
81                msf.get_parity_3(),
82                msf.get_parity_4()
83            );
84            println!(
85                "Date/time={:?}-{:?}-{:?} {:?}:{:?} {} {}",
86                rdt.get_year(),
87                rdt.get_month(),
88                rdt.get_day(),
89                rdt.get_hour(),
90                rdt.get_minute(),
91                str_weekday(rdt.get_weekday()),
92                parse_dst(rdt.get_dst())
93            );
94            msf.force_new_minute();
95        }
96        if !msf.increase_second() {
97            println!("Bad increase_second at second {}", msf.get_second());
98        }
99    }
100    println!("Before reset: {:#?}", msf);
101    msf.reset();
102    println!("After reset: {:#?}", msf);
103}