플리퍼 제로에는 BT, CLI, DESKTOP, DIALOGS, GUI 등 여러 서비스가 있습니다.
GUI 애플리케이션을 개발하기 위해서는 GUI 서비스를 가져와서 이용을 해야 합니다. GUI 서비스 자체는 로우레벨이라 그냥 사용하기에는 너무 불편하여 GUI 라이브러리를 같이 이용해야 합니다.
GUI 라이브러리을 이용하면 이전 글에서 설명했던 Scene, View 개념을 이용하여 쉽게 GUI 애플리케이션을 개발할 수 있습니다.
#include <gui/gui.h>
#include <gui/scene_manager.h>
#include <gui/view_dispatcher.h>
typedef struct {
ViewDispatcher* view_dispatcher;
SceneManager* scene_manager;
} App;
void (*const app_scene_on_enter_handlers[])(void*) = {
};
void (*const app_scene_on_exit_handlers[])(void*) = {
};
bool (*const app_scene_on_event_handlers[])(void*, SceneManagerEvent) = {
};
const SceneManagerHandlers app_scene_event_handlers = {
.on_enter_handlers = app_scene_on_enter_handlers,
.on_exit_handlers = app_scene_on_exit_handlers,
.on_event_handlers = app_scene_on_event_handlers,
.scene_num = 0,
};
bool app_custom_callback(void* context, uint32_t custom_event) {
App* app = context;
return scene_manager_handle_custom_event(app->scene_manager, custom_event);
}
bool app_back_event_callback(void* context) {
App* app = context;
return scene_manager_handle_back_event(app->scene_manager);
}
App* app_alloc() {
App* app = malloc(sizeof(App));
app->view_dispatcher = view_dispatcher_alloc();
app->scene_manager = scene_manager_alloc(&app_scene_event_handlers, app);
view_dispatcher_enable_queue(app->view_dispatcher);
view_dispatcher_set_event_callback_context(app->view_dispatcher, app);
view_dispatcher_set_custom_event_callback(app->view_dispatcher, app_custom_callback);
view_dispatcher_set_navigation_event_callback(app->view_dispatcher, app_back_event_callback);
return app;
}
void app_free(App* app) {
scene_manager_free(app->scene_manager);
view_dispatcher_free(app->view_dispatcher);
free(app);
}
int32_t my_first_app_app(void* p) {
UNUSED(p);
Gui* gui = furi_record_open(RECORD_GUI);
App* app = app_alloc();
view_dispatcher_attach_to_gui(app->view_dispatcher, gui, ViewDispatcherTypeFullscreen);
// scene_manager_next_scene(scene_manager, AppSceneMain); 추후 사용
view_dispatcher_run(app->view_dispatcher);
app_free(app);
furi_record_close(RECORD_GUI);
return 0;
}
https://gist.github.com/blluv/db1fc66360f63f2c6dd28e80beb056bf
furi_record_open
GUI 서비스를 가져옵니다
view_dispatcher_enable_queue
view_dispatcher의 이벤트 큐를 생성합니다 view_dispatcher_run을 쓰기 위해서는 필수적으로 들어가야 합니다. (왜 view_dispatcher_alloc할 때 안하는지는 의문..)
view_dispatcher_set_event_callback_context
view_dispatcher 이벤트 콜백의 context를 설정합니다. 아무 값이나 들어가도 상관은 없지만 일반적으로 앱의 모든(?) 요소가 있는 App struct를 넣습니다. (이 context는 scene 콜백의 context도 설정해줍니다.)
view_dispatcher_set_custom_event_callback
view_dispatcher가 custom event를 받았을 때 실행할 callback 함수를 설정합니다.
scene_manager_handle_custom_event
커스텀 이벤트를 scene의 on_event에서 받을 수 있게 해줍니다.
view_dispatcher_set_navigation_event_callback
view_dispatcher가 백 버튼 이벤트를 받았을 때 실행할 callback 함수를 설정합니다. (콜백 함수가 false를 리턴했을 경우 view_dispatcher 종료)
scene_manager_handle_back_event
위의 설명을 지금은 이해 못하셔도 상관 없습니다..!
GUI1 최종코드
https://gist.github.com/blluv/db1fc66360f63f2c6dd28e80beb056bf