App state machine 만들기 #1 app.h

이전 포스트에서 설명한 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를 구현해 보도록 하겠습니다.