使用有限状态机(FSM)可以使代码结构更清晰,特别是处理复杂的状态和过渡时。以下是如何根据你提供的步骤,用有限状态机来实现自动校准和中断触发逻辑的示例代码。
状态定义
- IDLE: 空闲状态,等待数据输入。
- CALIBRATING: 进行基准值更新。
- ACT_THRESHOLD_EXCEEDED: 超过自校准阈值,暂停基准值更新。
- PERMANENT_STRESS: 检测到永久/半永久性应力改变。
- INTERRUPT_TRIGGERED: 中断已触发状态。
状态转移条件
这段代码展示了如何使用有限状态机来管理传感器的自动校准和中断触发逻辑。你可以根据实际需求对具体逻辑进行调整和扩展。
- IDLE -> CALIBRATING: 启动自动校准。
- CALIBRATING -> ACT_THRESHOLD_EXCEEDED: 读值超过自校准阈值。
- ACT_THRESHOLD_EXCEEDED -> PERMANENT_STRESS: 超过自校准阈值且时间超过设定值。
- PERMANENT_STRESS -> CALIBRATING: 基准值更新。
- ANY -> INTERRUPT_TRIGGERED: 读值超过中断触发阈值并超过预设采样数。
- INTERRUPT_TRIGGERED -> IDLE: 读值恢复正常。
#include <stdio.h> #include <stdlib.h> #include <stdbool.h> #include <time.h>#define CAL_PERIOD 4 // 基准值更新周期 (秒) #define CAL_RESET 10 // 基准值停止更新时间 (秒) #define ACT_THRESHOLD 5 // 自校准阈值 #define LIFT_DELAY 2 // 延迟时间 (秒) #define SAMPLE_THRESHOLD 3 // 触发中断的预设采样数typedef enum {IDLE,CALIBRATING,ACT_THRESHOLD_EXCEEDED,PERMANENT_STRESS,INTERRUPT_TRIGGERED } State;typedef struct {int value; // 传感器当前值int baseline; // 基准值int act; // 自动校准阈值int interrupt_threshold; // 中断触发阈值time_t last_update; // 上次基准值更新的时间State state; // 当前状态int consecutive_samples; // 连续超过阈值的样本计数 } Sensor;void update_baseline(Sensor *sensor) {// 更新基准值的逻辑sensor->baseline = sensor->value; // 简单示例,实际可能需要更复杂的逻辑sensor->last_update = time(NULL);sensor->act = sensor->baseline + ACT_THRESHOLD;sensor->interrupt_threshold = sensor->baseline + ACT_THRESHOLD * 2; }void fsm_update(Sensor *sensor) {time_t current_time = time(NULL);switch (sensor->state) {case IDLE:if (sensor->value < sensor->act) {sensor->state = CALIBRATING;update_baseline(sensor);}break;case CALIBRATING:if (sensor->value > sensor->act) {sensor->state = ACT_THRESHOLD_EXCEEDED;sensor->last_update = current_time;} else if (current_time - sensor->last_update > CAL_PERIOD) {update_baseline(sensor);}break;case ACT_THRESHOLD_EXCEEDED:if (sensor->value <= sensor->act) {sensor->state = CALIBRATING;} else if (current_time - sensor->last_update > CAL_RESET) {sensor->state = PERMANENT_STRESS;}break;case PERMANENT_STRESS:update_baseline(sensor);sensor->state = CALIBRATING;break;case INTERRUPT_TRIGGERED:if (sensor->value < sensor->interrupt_threshold) {sensor->state = IDLE;}break;}if (sensor->value > sensor->interrupt_threshold) {sensor->consecutive_samples++;if (sensor->consecutive_samples >= SAMPLE_THRESHOLD) {sensor->state = INTERRUPT_TRIGGERED;}} else {sensor->consecutive_samples = 0;} }int main() {Sensor sensor = {0};sensor.baseline = 0;sensor.act = ACT_THRESHOLD;sensor.interrupt_threshold = ACT_THRESHOLD * 2;sensor.state = IDLE;sensor.last_update = time(NULL);// 模拟数据输入int values[] = {1, 2, 3, 6, 8, 9, 3, 4, 5};int num_values = sizeof(values) / sizeof(values[0]);for (int i = 0; i < num_values; i++) {sensor.value = values[i];fsm_update(&sensor);printf("Value: %d, State: %d\n", sensor.value, sensor.state);}return 0; }
代码说明
- State:定义不同状态。
- Sensor:包含传感器当前值、基准值、自动校准阈值、中断阈值、上次更新基准值时间、当前状态和连续超过阈值的样本计数。
- update_baseline:更新基准值并调整阈值。
- fsm_update:根据当前状态和传感器值更新状态。
- main:模拟数据输入,更新传感器状态并输出结果。