C의 app 만들기 - 1 : app manager

"C에서 Android의 Activity 구현하기"

"app은 이제껏 우리가 만든 패턴들의 집합체 입니다."

그렇습니다. 여태 우리는 완성된 applicationframework를 만들기 위해 계속해서 패턴들을 학습해 오고 있었습니다. 이런 패턴들의 총아인 app을 구현해 보도록 하겠습니다.

Android Java API, C# API 등 자원이 풍부한 Application 플랫폼들은 한결 같이 화면 단위 컨트롤들을 가지고 있습니다. 예를 들어 Android 에선 Activity가 생성이 되면, 레이아웃을 통해 화면에 디스플레이도 할 수 있고 각종 메시지(버튼 및 터치 포함)도 받을 수 있도록 되어 있습니다. 하나의 application에서 Activity가 없다는 것은 상상 할 수 없을 것입니다. 

Android를 모르시는 분은 C#을 예를 들어 보도록 하겠습니다. dll이나 console application 아니라면 대부분의 C# 프로그램은 Form 컨트롤을 가지고 있습니다. 눈에 보이는 대부분의 프로그램은 Form에서 시작합니다. 이 Form에 다른 컨트롤을 올려놓기도 하고 메시지를 받기도 합니다.

우리는 firmware 수준에서 이러한 기능을 하는 app(제가 임의로 명명한 것입니다. 여러분들이 원하는 이름으로 해도 됩니다)이라는 것을 만들어 보도록 하겠습니다. 아마 app은 구조적인 firmware application을 구성하는데 많은 도움이 될 것입니다. 여러분 firmware에 GUI 인터페이스(화면)가 있다면 app은 화면단위로 구성하는 것이 좋을 것입니다. 

구조를 잡기전에 app에 대한 아래의 특징을 살펴보도록 하겠습니다.

- app을 control 할 수 있는 app manager 존재

- 복수의 app을 생성 할 수 있음

- 각각의 peripheral에서 보내는 메시지 수신

- key message 수신

- 다른 app으로 스위치 가능

- 한번에 하나의 app만 동작, 동시에 동작하지 못함(추후 동시성을 갖추도록 확장 할 수는 있음)

위와 같은 특성이 있습니다. main.c 에서 app을 start해주고 그 후론 알아서 app끼리 switch하도록 하면 됩니다. 충분히 이해가 되었으면 합니다. 

이번 시간에는 먼저 app manager 의 header를 보면서 구조를 이해해 보도록 하겠습니다. 

app_id_t eum은 총4개의 앱을 생성하다록 고정되어 있습니다. app이 더 필요하다면 여기에서 id값을 늘리면 됩니다. 

app_t는 하나의 app에서 구성되어야 할 interface 입니다.  위의 id 4개를 만들었으니 우리는 app_t interface 4개를 실제적으로 구현해야 합니다.

app_manager_t는 app manager입니다. app manager는 app의 생성을 돕고, app start, switch, message 처러와 같은 기능을 돕습니다. 또한 현재 app의 상태도 알려줍니다.

app manager 의 일부 코드를 보겠습니다.  this는 app manager의 본체입니다. 7개의 함수를 구현해야 합니다. 그 중 get_app의 내부 함수를 제외하고 나머지의 static 함수를 this에 assign해 줍니다.

이전에 만들었던 message, key들을 include하고 있습니다. 왜냐하면 app manager에서 사용하기 때문입니다. 헤더에서 선언한 app_manager_t 구조체를 구체적으로 구현하고 있습니다. 

setup_app_manager : app_manager(this)를 리턴합니다.

get_current_app : 현재 사용중인 app을 리턴합니다. 

get_current_app_id : 현재 사용중인 app의 id를 리턴합니다.

계속해서 나머지 구현 부분을 보도록 하겠습니다. 기본적으로 error가 날 수 있는 부분은 미리 처리를 해주어야 합니다. 그렇지 않으면 나중에 알 수 없는 에러로 고생합니다. 

create_app : app을 만들어 app manager에 등록하는 함수입니다. 등록하는 순간 app의 on_create를 실행 시켜줍니다. 

start_app : 등록된 앱 중에 entry가 될 앱의 id를 넣어주는 곳입니다. app의 처음 시작 점인 셈이지요.

switch_app : app끼리 서로 switching 해주는 함수입니다. 현재 app의 on_stop을 해주고 새로운 app의 start를 해줍니다. 이후 변경된 app에서 message나 key처리를 받게 되겠지요.

on_message_app : 현재 app에 메시를 전달하는 함수입니다. 외부에서 메세지가 발생하면 이곳에 넣어주면 됩니다. 그럼 현재 app에 전달 되겠지요. 그럼 app에서 처리해 주면 됩니다.

on_click_app : 현재 app에 key 메시지를 전달하는 함수입니다.


아무리 쉬워도 남의 코드는 이해하기 어렵습니다. 여려번 보고 이해한는 방법 밖에는 없지요. 다음 장에 main에서 어어떻게 호출하고 사용하지는 이해해 보도록 하겠습니다. 그리고 실제 app도 구현해보도록 하겠습니다.










'▶ 이전글 > C Pattern' 카테고리의 다른 글

C 언어에서 this 구현2  (0) 2018.01.27
C의 app 만들기 - 2 : main에서 실제 사용하기  (0) 2018.01.25
Builder 패턴  (0) 2018.01.17
facade 패턴  (0) 2018.01.11
Message 기반 만들기  (0) 2018.01.11