이전 포스트에서 설명한 state machine 은 현재 application의 상태를 상황에 맞게 active app state를 변경하여 해당 상태에 있을 경우 들어오는 이벤트, 메시지 처리, 이외 요청들을 처리하도록 만듭니다. 또한 원한다면 현재 상태(state)에서 다른 상태(state)로 전환을 할 수도 있습니다.
C언어에서는 몇가지 코딩의 제약이 있지만 간단하게 state machine을 만들 수 있으며 우리는 이것을 app state(혹은 app)이라고 편하게 부르도록 하겠습니다.
app state 들은 간략하게 다음의 필수 요건이 있습니다.
- app을 생성,삭제, 전환등을 할 controller 필요
- app은 이벤트를 받을 수 있음
- app끼리 전환 할 수 있음
- app은 하나만 동작 가능
우리는 먼저 app state을 관리할 app controller를 구현해 보도록 하겠습니다.
/*
* app.h
*
* Created on: Feb 17, 2021
* Author: soloungos
*/
#ifndef SRC_APP_APP_H_
#define SRC_APP_APP_H_
#include "main.h"
#include "msg.h"
#include "_typedef.h"
#include "app_first.h"
#include "app_second.h"
#include "app_third.h"
typedef enum
{
APP_first,
APP_second,
APP_third,
APP_COUNT,
APP_NONE,
}app_id_t;
typedef struct
{
app_id_t id;
app_id_t prev_id;
uint32_t flags;
void (*init)(void);
void (*start)(void);
void (*stop)(void);
void (*loop)(void);
void (*on_msg)(msg_t msg, uint32_t param1, uint32_t param2);
}app_t;
extern int app_init_app(app_t *app);
extern void app_process(void);
extern int app_set_msg(msg_t msg, uint32_t param1, uint32_t param2);
extern int app_start_app(app_id_t id);
extern int app_switch_app(app_id_t id);
extern app_t *app_get_current_app(void);
#endif /* SRC_APP_APP_H_ */
우리는 총 세개의 app state를 가정해 놓고 구현을 해보도록 하겠습니다.
app.h는 app state는 아니며 app state들을 관리하는 app controller의 헤더 파일입니다.
위의 app.h 에서 보듯 모든 app 은 다음과 같은 내장함수들을 가지고 있어야 합니다.
- init : app 생성시 실행되는 함수
- start : app 시작시(active) 실행되는 함수
- stop : app 정지시(switch) 실행되는 함수
- loop : app의 infinte 함수
- on_msg : 메시지 처리 함수
app.h에 extern 함수들은 다음과 같은 처리를 합니다.
- app_init_app - app 등록
- app_process - 현재 active app의 loop 실행, 메시지 큐에서 빼내어온 메시지 전달
- app_set_msg - 현재 active app 메시지 전달
- app_start_app - active app start
- app_switch_app - app state 전환
- app_get_current_app - 현재 active app id 전달
다음 포스트엔 app control 함수인 app.c를 구현해 보도록 하겠습니다.
'▶ C Application > App 만들기' 카테고리의 다른 글
App state machine 만들기 #5 app states switching (0) | 2023.11.15 |
---|---|
App state machine 만들기 #4 main.c (0) | 2023.11.15 |
App state machine 만들기 #3 app_first.c (0) | 2023.11.15 |
App state machine 만들기 #2 app.c (0) | 2023.11.15 |
App state machine 개요 (0) | 2023.11.14 |