1use core::convert::TryInto;
2
3use heapless::LinearMap;
4use state_governor::{create_states, state::State, Governor};
5
6create_states! {IDLE, RUN, FINISH}
7
8static mut GOVERNOR: Governor<3> = Governor::<3> {
9 states: LinearMap::new(),
10 current_state: Some(State::unknown()),
11 previous_state: Some(State::unknown()),
12 transition_function: None,
13};
14
15fn state_changer() {
16 unsafe {
17 match GOVERNOR.get_current_state().id().try_into() {
18 Ok(StateEnum::IDLE) => {
19 GOVERNOR.change_state_to(StateEnum::RUN as u8);
20 }
21 Ok(StateEnum::RUN) => {
22 GOVERNOR.change_state_to(StateEnum::FINISH as u8);
23 }
24 Ok(StateEnum::FINISH) => {}
25 Err(_) => {}
26 }
27 }
28}
29
30fn state_handler() {
31 unsafe {
32 match GOVERNOR.get_current_state().id().try_into() {
33 Ok(StateEnum::RUN) => {
34 println!(
35 "State handler: {}",
36 GOVERNOR
37 .get_current_state()
38 .name()
39 .iter()
40 .collect::<String>()
41 .trim()
42 )
43 }
44 Ok(StateEnum::IDLE) => {
45 println!(
46 "State handler: {}",
47 GOVERNOR
48 .get_current_state()
49 .name()
50 .iter()
51 .collect::<String>()
52 .trim()
53 )
54 }
55 Ok(StateEnum::FINISH) => {
56 println!(
57 "State handler: {}",
58 GOVERNOR
59 .get_current_state()
60 .name()
61 .iter()
62 .collect::<String>()
63 .trim()
64 )
65 }
66 _ => {}
67 }
68 }
69}
70
71fn main() {
72 unsafe {
73 GOVERNOR.add_state(State::from(StateEnum::RUN));
74 GOVERNOR.add_state(State::from(StateEnum::IDLE));
75 GOVERNOR.add_state(State::from(StateEnum::FINISH));
76 GOVERNOR.change_state_to(StateEnum::IDLE as u8);
77 loop {
78 state_handler();
79 if GOVERNOR.get_current_state().id() == StateEnum::FINISH as u8 {
80 break;
81 }
82 state_changer();
83 }
84 }
85}