detect_jumps/
detect_jumps.rs

1// SPDX-License-Identifier: MIT OR Apache-2.0
2// Copyright 2024-2025 René Ladan <rene0+codeberg@freedom.nl>
3
4use msf60_utils::MSFUtils;
5
6fn main() {
7    let mut msf = MSFUtils::default();
8    const MSGS: [&str; 2] = [
9        "4 00000000.00000000 0010.0100 0.0100 01.0010 101 10.0000 000.0010 01313330",
10        "4 20000000.00000000 0010.0100 0.0100 01.0010 101 10.0001 000.1000 01313130",
11    ];
12    for msg in MSGS {
13        for m in msg.chars() {
14            match m {
15                '0' => {
16                    msf.set_current_bit_a(Some(false));
17                    msf.set_current_bit_b(Some(false));
18                }
19                '1' => {
20                    msf.set_current_bit_a(Some(true));
21                    msf.set_current_bit_b(Some(false));
22                }
23                '2' => {
24                    msf.set_current_bit_a(Some(false));
25                    msf.set_current_bit_b(Some(true));
26                }
27                '3' => {
28                    msf.set_current_bit_a(Some(true));
29                    msf.set_current_bit_b(Some(true));
30                }
31                '4' => msf.force_past_new_minute(),
32                '_' => {
33                    msf.set_current_bit_a(None);
34                    msf.set_current_bit_b(None);
35                }
36                _ => continue,
37                // skip increasing the second counter, as this character is only syntactic sugar
38            }
39            // 0111.1110 train seen?
40            if msf.end_of_minute_marker_present() {
41                let fm = msf.is_first_minute();
42                // cache because decode_time() clears this on a successful decode
43                msf.decode_time(true, false);
44                let rdt = msf.get_radio_datetime();
45                println!(
46                    "Date/time={:?}-{:?}-{:?} {:?}:{:?} {:?} DUT1={:?}",
47                    rdt.get_year(),
48                    rdt.get_month(),
49                    rdt.get_day(),
50                    rdt.get_hour(),
51                    rdt.get_minute(),
52                    rdt.get_weekday(),
53                    rdt.get_dut1()
54                );
55                if !fm {
56                    println!(
57                        "Jumps={} {} {} {} {} {} {}",
58                        rdt.get_jump_year(),
59                        rdt.get_jump_month(),
60                        rdt.get_jump_day(),
61                        rdt.get_jump_hour(),
62                        rdt.get_jump_minute(),
63                        rdt.get_jump_weekday(),
64                        rdt.get_jump_dut1()
65                    );
66                }
67                msf.force_new_minute();
68            }
69            if !msf.increase_second() {
70                println!("Bad increase_second at second {}", msf.get_second());
71            }
72        }
73    }
74}