#状态机 #状态 #fsm #模式 #架构 #行为 #数据结构

simple_statemachine

通过简单易读的领域特定语言定义状态机

1个稳定版本

1.0.0 2023年3月26日

#22 in #fsm

MIT 许可证

59KB
613 代码行

简单状态机

此Rust包定义了 statemachine!() 宏。该宏接受一个参数,即状态机的定义,该定义在一个简单易读的领域特定语言中进行描述。

状态机宏支持守卫、触发器的行为、状态进入和退出。事件可以携带负载,例如用于实现通信系统。

完整文档可在docs.rs上找到。

用法

将其添加到您的Cargo.toml中

[dependencies]
simple-statemachine = "1.0"

示例

此示例实现了具有用于将交通灯切换到“行走”状态的按钮的简单交通灯的人行道部分。

use std::thread;
use std::time::Duration;
use simple_statemachine::statemachine;

statemachine!{
   Name TrafficLightStatemachine
   InitialState DontWalk

   DontWalk {
       ButtonPressed ==set_button_to_pressed=> DontWalk
       TimerFired[check_button_is_pressed] ==switch_to_walk=> Walk
       TimerFired => DontWalk
   }
   Walk {
       OnEntry set_button_to_not_pressed
       TimerFired ==switch_to_dont_walk=> DontWalk
   }
}

struct LightSwitch{
    button_pressed:bool
}
impl TrafficLightStatemachineHandler for LightSwitch{
    fn check_button_is_pressed(&self) -> bool {
        self.button_pressed
    }
    fn set_button_to_pressed(&mut self) {
        self.button_pressed=true;
    }
    fn set_button_to_not_pressed(&mut self) {
        self.button_pressed=false;
    }
    fn switch_to_walk(&mut self) {
        println!("Switching \"Don't Walk\" off");
        println!("Switching \"Walk\" on");
    }
    fn switch_to_dont_walk(&mut self) {
        println!("Switching \"Walk\" off");
        println!("Switching \"Don't Walk\" on");
    }
}

依赖项

~280–730KB
~17K SLoC