最近一直在写MCU代码,写了个状态机的框架,很简单。
定义状态:
enum watch_state_t {
WATCH_INIT, //开机检测
WATCH_IDLE, //开机后没戴也没充电,(120秒后进入sleep)
WATCH_WEAR, //戴着
WATCH_CHARGE, //充电
WATCH_SLEEP, //休眠省电
};
typedef void (*state_callback_t)(void);
切换状态:
static enum watch_state_t work_state;
state_callback_t state_exit_callback = NULL;
static void clear_callback(void) {
state_exit_callback = NULL;
}
void enter_next_state(enum watch_state_t state) {
if(state == work_state) return;
work_state = state;
if (state_exit_callback)
state_exit_callback();
clear_callback();
switch (state) {
case WATCH_INIT:
watch_init_init();
break;
case WATCH_IDLE:
watch_idle_init();
break;
case WATCH_WEAR:
watch_wear_init();
break;
case WATCH_CHARGE:
watch_charge_init();
break;
case WATCH_SLEEP:
watch_sleep_init();
break;
default:
break;
}
}
定义一个状态:
//一个文件一个状态,非常容易理解
static void timer_1s_func(void *arg) {
co_printf("1s\r\n");
}
static void state_exit(void) {//退出状态时,释放资源
os_timer_stop(&user_timer_1s);
os_timer_destroy(&user_timer_1s);
}
void watch_wear_init(void) {
co_printf("wear\r\n");
// init timer
os_timer_init(&user_timer_1s, timer_1s_func, NULL);
os_timer_start(&user_timer_1s, 1000, 1);
// state init
state_exit_callback = state_exit;
}
转换各种状态
enter_next_state(WATCH_CHARGE);//进入充电状态
enter_next_state(WATCH_SLEEP); //休眠息屏状态
enter_next_state(WATCH_WEAR); //佩戴状态