diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 8f011c5c..96633aaa 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -62,6 +62,8 @@ target_sources(app PRIVATE src/ui/notification/zsw_popup_notifcation.c) target_sources(app PRIVATE src/ui/popup/zsw_popup_window.c) target_sources(app PRIVATE src/ui/utils/zsw_ui_utils.c) +target_sources(app PRIVATE src/ui/watchfaces/zsw_watchface_dropdown_ui.c) + target_sources_ifdef(CONFIG_SPI_FLASH_LOADER app PRIVATE src/filesystem/zsw_rtt_flash_loader.c) target_sources_ifdef(CONFIG_FILE_SYSTEM_LITTLEFS app PRIVATE src/filesystem/zsw_filesystem.c) target_sources_ifdef(CONFIG_FILE_SYSTEM_LITTLEFS app PRIVATE src/filesystem/zsw_lvgl_spi_decoder.c) diff --git a/app/src/applications/watchface/watchface_app.c b/app/src/applications/watchface/watchface_app.c index aeb58f96..2755c1af 100644 --- a/app/src/applications/watchface/watchface_app.c +++ b/app/src/applications/watchface/watchface_app.c @@ -40,6 +40,7 @@ #include "sensors/zsw_environment_sensor.h" #include "sensors/zsw_pressure_sensor.h" #include "managers/zsw_notification_manager.h" +#include "ui/watchfaces/zsw_watchface_dropdown_ui.h" LOG_MODULE_REGISTER(watcface_app, LOG_LEVEL_WRN); @@ -106,11 +107,13 @@ static struct k_work_sync canel_work_sync; static K_WORK_DEFINE(update_ui_work, update_ui_from_event); static ble_comm_cb_data_t last_data_update; static ble_comm_weather_t last_weather_data; +static ble_comm_music_info_t last_music_info; static struct battery_sample_event last_batt_evt = {.percent = 100, .mV = 4300}; static bool running; static bool is_connected; static bool is_suspended; +static lv_obj_t *watchface_root_screen; static watchface_ui_api_t *watchfaces[MAX_WATCHFACES]; static uint8_t num_watchfaces; @@ -137,13 +140,19 @@ void watchface_app_register_ui(watchface_ui_api_t *ui_api) num_watchfaces++; } -void watchface_app_start(lv_group_t *group, watchface_app_evt_listener evt_cb) +void watchface_app_start(lv_obj_t *root_screen, lv_group_t *group, watchface_app_evt_listener evt_cb) { __ASSERT(num_watchfaces > 0, "Must enable at least one watchface."); int err = settings_load_subtree_direct(ZSW_SETTINGS_WATCHFACE, settings_load_handler, &watchface_settings); if (err != 0) { LOG_ERR("Failed loading watchface settings"); } + + if (watchface_settings.watchface_index >= num_watchfaces) { + watchface_settings.watchface_index = 0; + } + + watchface_root_screen = root_screen; watchface_evt_cb = evt_cb; general_work_item.type = OPEN_WATCHFACE; __ASSERT(0 <= k_work_schedule(&general_work_item.work, K_MSEC(100)), "FAIL schedule"); @@ -157,6 +166,7 @@ void watchface_app_stop(void) k_work_cancel_delayable_sync(&date_work.work, &canel_work_sync); k_work_cancel_delayable_sync(&general_work_item.work, &canel_work_sync); watchfaces[watchface_settings.watchface_index]->remove(); + zsw_watchface_dropdown_ui_remove(); } void watchface_change(int index) @@ -238,11 +248,13 @@ static void general_work(struct k_work *item) case OPEN_WATCHFACE: { running = true; is_suspended = false; - if (watchface_settings.watchface_index >= num_watchfaces) { - watchface_settings.watchface_index = 0; - } - watchfaces[watchface_settings.watchface_index]->show(watchface_evt_cb, &watchface_settings); + // Dropdown + watchfaces[watchface_settings.watchface_index]->show(watchface_root_screen, watchface_evt_cb, &watchface_settings); refresh_ui(); + zsw_watchface_dropdown_ui_add(watchface_root_screen, watchface_evt_cb); + if (strlen(last_music_info.track_name) > 0) { + zsw_watchface_dropdown_ui_set_music_info(last_music_info.track_name, last_music_info.artist); + } __ASSERT(0 <= k_work_schedule(&clock_work.work, K_NO_WAIT), "FAIL clock_work"); __ASSERT(0 <= k_work_schedule(&update_work.work, K_SECONDS(1)), "FAIL update_work"); @@ -341,6 +353,9 @@ static void update_ui_from_event(struct k_work *item) last_data_update.data.weather.weather_code); } else if (last_data_update.type == BLE_COMM_DATA_TYPE_SET_TIME) { k_work_reschedule(&date_work.work, K_NO_WAIT); + } else if (last_data_update.type == BLE_COMM_DATA_TYPE_MUSIC_INFO) { + zsw_watchface_dropdown_ui_set_music_info(last_data_update.data.music_info.track_name, + last_data_update.data.music_info.artist); } return; } @@ -352,7 +367,13 @@ static void zbus_ble_comm_data_callback(const struct zbus_channel *chan) // TODO getting this callback again before workqueue has ran will // cause previous to be lost. memcpy(&last_data_update, &event->data, sizeof(ble_comm_cb_data_t)); - memcpy(&last_weather_data, &last_data_update.data.weather, sizeof(last_data_update.data.weather)); + if (event->data.type == BLE_COMM_DATA_TYPE_WEATHER) { + memcpy(&last_weather_data, &last_data_update.data.weather, sizeof(last_data_update.data.weather)); + } + if (event->data.type == BLE_COMM_DATA_TYPE_MUSIC_INFO) { + memcpy(&last_music_info, &last_data_update.data.music_info, sizeof(last_data_update.data.music_info)); + printk("Got music info: %s %s\n", last_music_info.track_name, last_music_info.artist); + } if (running && !is_suspended) { k_work_submit(&update_ui_work); } diff --git a/app/src/applications/watchface/watchface_app.h b/app/src/applications/watchface/watchface_app.h index aeeec987..f5909667 100644 --- a/app/src/applications/watchface/watchface_app.h +++ b/app/src/applications/watchface/watchface_app.h @@ -24,16 +24,33 @@ // UI need to be initialized after watchface_app #define WATCHFACE_UI_INIT_PRIO 99 -typedef enum watchface_app_evt_t { +typedef enum watchface_app_evt_type_t { + WATCHFACE_APP_EVENT_OPEN_APP, + WATCHFACE_APP_EVENT_SET_BRIGHTNESS, + WATCHFACE_APP_EVENT_RESTART, + WATCHFACE_APP_EVENT_SHUTDOWN, +} watchface_app_evt_type_t; + +typedef enum watchface_app_evt_open_app_t { WATCHFACE_APP_EVT_CLICK_BATT, WATCHFACE_APP_EVT_CLICK_STEP, WATCHFACE_APP_EVT_CLICK_WEATHER, + WATCHFACE_APP_EVT_CLICK_MUSIC, + WATCHFACE_APP_EVT_CLICK_SETTINGS +} watchface_app_evt_open_app_t; + +typedef struct watchface_app_evt_t { + watchface_app_evt_type_t type; + union watchface_app_evt_data_t { + watchface_app_evt_open_app_t app; + uint16_t brightness; + } data; } watchface_app_evt_t; typedef void(*watchface_app_evt_listener)(watchface_app_evt_t); typedef struct watchface_ui_api_t { - void (*show)(watchface_app_evt_listener, zsw_settings_watchface_t *settings); + void (*show)(lv_obj_t *root_screen, watchface_app_evt_listener, zsw_settings_watchface_t *settings); void (*remove)(void); void (*set_battery_percent)(int32_t percent, int32_t battery); void (*set_hrm)(int32_t bpm, int32_t oxygen); @@ -49,7 +66,7 @@ typedef struct watchface_ui_api_t { const char *name; } watchface_ui_api_t; -void watchface_app_start(lv_group_t *group, watchface_app_evt_listener evt_cb); +void watchface_app_start(lv_obj_t *root_screen, lv_group_t *group, watchface_app_evt_listener evt_cb); void watchface_app_stop(void); void watchface_change(int index); int watchface_app_get_current_face(void); diff --git a/app/src/images/fonts/ui_font_iconfont34.c b/app/src/images/fonts/ui_font_iconfont34.c new file mode 100644 index 00000000..55ad7d30 --- /dev/null +++ b/app/src/images/fonts/ui_font_iconfont34.c @@ -0,0 +1,858 @@ +/******************************************************************************* + * Size: 34 px + * Bpp: 4 + * Opts: --bpp 4 --size 34 --font D:\projects\SquareLine_Projects\OV_Watch\AllFont\assets\iconfont.ttf -o D:\projects\SquareLine_Projects\OV_Watch\AllFont\assets\ui_font_iconfont34.c --format lvgl -r 0xE65C -r 0xE65A -r 0xE619 -r 0xE633 -r 0xE762 -r 0xE652 -r 0xE706 -r 0xE788 -r 0xE603 -r 0xE986 -r 0xE607 -r 0xE62C -r 0xE600 -r 0xE67A -r 0xE7A0 --no-compress --no-prefilter + ******************************************************************************/ + +#ifndef UI_FONT_ICONFONT34 +#define UI_FONT_ICONFONT34 1 +#endif + +#if defined(LV_LVGL_H_INCLUDE_SIMPLE) +#include "lvgl.h" +#else +#include "lvgl/lvgl.h" +#endif + +#if UI_FONT_ICONFONT34 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+E600 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, + 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6e, 0xfb, 0x10, 0x0, 0x1, + 0xcf, 0xd6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3e, 0xff, 0xff, 0xe9, 0x66, 0x9f, 0xff, + 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xff, 0xaf, 0xff, 0xff, 0xff, 0xfa, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0xc, 0xff, + 0x90, 0x3, 0xaf, 0xff, 0xfa, 0x20, 0x1a, 0xff, + 0xb0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfc, 0x0, + 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0xdf, 0x80, + 0x0, 0x0, 0x0, 0x0, 0xa, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0x80, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xfb, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf7, 0x0, 0x0, 0x5, 0x77, + 0x40, 0x0, 0x0, 0x9f, 0xf3, 0x0, 0x0, 0x0, + 0x2, 0xef, 0xf1, 0x0, 0x5, 0xef, 0xff, 0xfe, + 0x50, 0x0, 0x2f, 0xfd, 0x20, 0x0, 0x2, 0x8f, + 0xff, 0x50, 0x0, 0x7f, 0xfe, 0xbb, 0xff, 0xf6, + 0x0, 0x7, 0xff, 0xe7, 0x10, 0x3f, 0xff, 0xf6, + 0x0, 0x2, 0xff, 0x90, 0x0, 0x1b, 0xff, 0x10, + 0x0, 0x7f, 0xff, 0xf1, 0x6f, 0xfa, 0x20, 0x0, + 0x9, 0xfc, 0x0, 0x0, 0x0, 0xdf, 0x80, 0x0, + 0x2, 0xbf, 0xf5, 0x8f, 0xf3, 0x0, 0x0, 0xd, + 0xf6, 0x0, 0x0, 0x0, 0x8f, 0xc0, 0x0, 0x0, + 0x4f, 0xf6, 0x8f, 0xf2, 0x0, 0x0, 0xe, 0xf5, + 0x0, 0x0, 0x0, 0x6f, 0xd0, 0x0, 0x0, 0x4f, + 0xf6, 0x7f, 0xf4, 0x0, 0x0, 0xc, 0xf8, 0x0, + 0x0, 0x0, 0x5f, 0xa0, 0x0, 0x0, 0x5f, 0xf6, + 0x5f, 0xff, 0x80, 0x0, 0x7, 0xfe, 0x20, 0x0, + 0x0, 0x2, 0x0, 0x0, 0x8, 0xff, 0xf4, 0x1b, + 0xff, 0xfc, 0x0, 0x0, 0xdf, 0xe6, 0x21, 0x0, + 0x0, 0x0, 0x1, 0xdf, 0xff, 0xb0, 0x0, 0x2b, + 0xff, 0xa0, 0x0, 0x2e, 0xff, 0xff, 0xb0, 0x0, + 0x0, 0xb, 0xff, 0xb1, 0x0, 0x0, 0x0, 0xbf, + 0xf3, 0x0, 0x1, 0x8e, 0xff, 0xb0, 0x0, 0x0, + 0x4f, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xf9, + 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0xaf, + 0xf1, 0x0, 0x0, 0x0, 0x0, 0xb, 0xfc, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, 0xa0, + 0x0, 0x0, 0x0, 0x0, 0x9, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, 0x80, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xfd, 0x10, 0x0, 0x15, + 0x88, 0x51, 0x0, 0x1, 0xef, 0x90, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xe6, 0x8, 0xff, 0xff, + 0xff, 0x80, 0x7f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8, 0xff, 0xff, 0x93, 0x0, 0x3a, 0xff, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x17, 0xc5, 0x0, 0x0, 0x0, 0x6c, 0x70, + 0x0, 0x0, 0x0, 0x0, + + /* U+E603 "" */ + 0x0, 0x0, 0x0, 0x4, 0x77, 0x63, 0x0, 0x0, + 0x0, 0x0, 0x36, 0x77, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2a, 0xff, 0xff, 0xff, 0xe8, 0x0, + 0x0, 0x7e, 0xff, 0xff, 0xff, 0xa2, 0x0, 0x0, + 0x0, 0x6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd2, + 0x2d, 0xff, 0xff, 0xff, 0xff, 0xff, 0x60, 0x0, + 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, + 0x4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x40, + 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, + 0x5f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf5, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfa, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xef, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, + 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, + 0xcf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfb, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf7, + 0x2f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf1, + 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfd, 0x0, + 0x0, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd1, 0x0, + 0x0, 0x1, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x10, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xaf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfb, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0xff, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xdf, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1c, 0xff, + 0xfe, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x59, + 0x71, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+E607 "" */ + 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, + 0xe3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2, 0xff, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2, 0xfe, 0x9f, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xe0, 0x7f, + 0xf9, 0x0, 0x0, 0x7b, 0x0, 0x0, 0x2, 0xfe, + 0x0, 0x5f, 0xfb, 0x0, 0x1f, 0xfc, 0x10, 0x0, + 0x2f, 0xe0, 0x0, 0x5f, 0xfc, 0x0, 0x3e, 0xfd, + 0x10, 0x2, 0xfe, 0x0, 0x1d, 0xff, 0x40, 0x0, + 0x2d, 0xfe, 0x20, 0x2f, 0xe0, 0x2d, 0xfe, 0x30, + 0x0, 0x0, 0x1c, 0xff, 0x42, 0xfe, 0x3e, 0xfd, + 0x20, 0x0, 0x0, 0x0, 0xb, 0xff, 0x7f, 0xff, + 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0xa, 0xff, + 0xff, 0xfb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xfa, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xb0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0xff, 0xc1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xaf, 0xf8, 0xff, 0xef, + 0xd2, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xf4, 0x2f, + 0xe2, 0xef, 0xe3, 0x0, 0x0, 0x1, 0xcf, 0xe3, + 0x2, 0xfe, 0x1, 0xdf, 0xf4, 0x0, 0x1, 0xdf, + 0xe2, 0x0, 0x2f, 0xe0, 0x0, 0xbf, 0xf5, 0x1, + 0xef, 0xd2, 0x0, 0x2, 0xfe, 0x0, 0x5, 0xff, + 0xb0, 0x8, 0xc1, 0x0, 0x0, 0x2f, 0xe0, 0x7, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x2, 0xfe, + 0x8, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xea, 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x2, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0xfe, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2d, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+E619 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x55, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0x66, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xf6, 0x0, 0x6f, 0xc0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0x60, 0x0, 0x6, 0xfc, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xf6, 0x0, 0x0, + 0x0, 0x6f, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xbf, 0x60, 0x0, 0x0, 0x0, 0x7, 0xfb, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xb, 0xf7, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7f, 0xb0, 0x0, 0x0, + 0x0, 0x0, 0xbf, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xfb, 0x0, 0x0, 0x0, 0xb, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, + 0xb0, 0x0, 0x0, 0xbf, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8, 0xfb, 0x0, 0xb, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xb0, 0x5f, 0x80, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xf5, 0x6f, 0x63, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x36, 0xf6, 0x1e, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xe1, 0x0, 0x6f, 0x90, 0x0, 0x1, + 0x89, 0x99, 0x97, 0x10, 0x0, 0x0, 0x55, 0x0, + 0x0, 0x1f, 0x80, 0x0, 0xc, 0xff, 0xff, 0xff, + 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x80, + 0x0, 0xe, 0xa0, 0x0, 0xc, 0xc0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0x80, 0x0, 0xe, 0xa0, + 0x0, 0xc, 0xc0, 0x0, 0x6, 0xf0, 0x0, 0x0, + 0x1f, 0x80, 0x0, 0xe, 0xa0, 0x0, 0xc, 0xc0, + 0x0, 0x8, 0xf1, 0x0, 0x0, 0x1f, 0x80, 0x0, + 0xe, 0xa0, 0x0, 0xc, 0xc0, 0x0, 0x8, 0xf1, + 0x0, 0x0, 0x1f, 0x80, 0x0, 0xe, 0xa0, 0x0, + 0xc, 0xc0, 0x0, 0x8, 0xf1, 0x0, 0x0, 0x1f, + 0x80, 0x0, 0xe, 0xa0, 0x0, 0xc, 0xc0, 0x0, + 0x8, 0xf1, 0x0, 0x0, 0xf, 0xa0, 0x0, 0xe, + 0xa0, 0x0, 0xc, 0xc0, 0x0, 0xa, 0xf0, 0x0, + 0x0, 0x9, 0xfb, 0xaa, 0xaf, 0xa0, 0x0, 0xc, + 0xfa, 0xaa, 0xbf, 0x90, 0x0, 0x0, 0x0, 0x9e, + 0xff, 0xff, 0x30, 0x0, 0x3, 0xff, 0xff, 0xe9, + 0x0, 0x0, + + /* U+E62C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xf, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, + 0xb1, 0x0, 0x2f, 0xf9, 0x0, 0x3, 0x82, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5, 0xff, 0xf6, 0x0, + 0x2f, 0xf9, 0x0, 0xd, 0xff, 0x60, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0xff, 0xd1, 0x0, 0x2f, 0xf9, + 0x0, 0xa, 0xff, 0xf7, 0x0, 0x0, 0x0, 0x6, + 0xff, 0xf8, 0x0, 0x0, 0x2f, 0xf9, 0x0, 0x0, + 0x8f, 0xff, 0x60, 0x0, 0x0, 0x2f, 0xff, 0x50, + 0x0, 0x0, 0x2f, 0xf9, 0x0, 0x0, 0x5, 0xff, + 0xf3, 0x0, 0x0, 0xcf, 0xf7, 0x0, 0x0, 0x0, + 0x2f, 0xf9, 0x0, 0x0, 0x0, 0x7f, 0xfc, 0x0, + 0x4, 0xff, 0xc0, 0x0, 0x0, 0x0, 0x2f, 0xf9, + 0x0, 0x0, 0x0, 0xc, 0xff, 0x40, 0xb, 0xff, + 0x30, 0x0, 0x0, 0x0, 0x2f, 0xf9, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xb0, 0x1f, 0xfc, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0xcf, 0xf1, 0x4f, 0xf7, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf4, + 0x7f, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x4f, 0xf7, 0x9f, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x2f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xf8, 0x9f, 0xf2, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xf9, 0x8f, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x2f, 0xf9, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf8, + 0x6f, 0xf5, 0x0, 0x0, 0x0, 0x0, 0xc, 0xe4, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xf6, 0x3f, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9f, 0xf3, 0xe, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xff, 0xe0, 0x8, 0xff, 0x70, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x80, + 0x1, 0xff, 0xf2, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x2f, 0xff, 0x10, 0x0, 0x7f, + 0xfd, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1, 0xdf, 0xf7, 0x0, 0x0, 0xc, 0xff, 0xd1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1d, 0xff, + 0xc0, 0x0, 0x0, 0x1, 0xdf, 0xfe, 0x60, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xef, 0xfd, 0x10, 0x0, + 0x0, 0x0, 0x1c, 0xff, 0xfd, 0x72, 0x0, 0x0, + 0x27, 0xdf, 0xff, 0xc1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xff, 0xff, 0xfe, 0xef, 0xff, 0xff, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xaf, 0xff, 0xff, 0xff, 0xff, 0xfa, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x69, + 0xcd, 0xdc, 0x96, 0x10, 0x0, 0x0, 0x0, 0x0, + + /* U+E633 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xff, 0xff, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, + 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4a, 0xff, 0xff, 0xff, 0xe7, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xfc, 0x63, 0x11, + 0x25, 0xaf, 0xff, 0xd2, 0x0, 0x0, 0x0, 0x0, + 0xaf, 0xfc, 0x30, 0x0, 0x0, 0x0, 0x1, 0xaf, + 0xfe, 0x20, 0x0, 0x0, 0xa, 0xff, 0x90, 0x0, + 0x0, 0x1, 0x0, 0x0, 0x6, 0xff, 0xe1, 0x0, + 0x0, 0x5f, 0xf8, 0x0, 0x0, 0x0, 0x6, 0x0, + 0x0, 0x0, 0x4f, 0xfa, 0x0, 0x1, 0xef, 0xb0, + 0x0, 0x0, 0x0, 0x28, 0x0, 0x0, 0x0, 0x7, + 0xff, 0x40, 0x8, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x4a, 0x0, 0x0, 0x0, 0x0, 0xcf, 0xc0, 0xe, + 0xf8, 0x0, 0x0, 0x0, 0x0, 0x7c, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xf2, 0x3f, 0xf3, 0x0, 0x0, + 0x0, 0x0, 0x9e, 0x0, 0x0, 0x0, 0x0, 0xe, + 0xf7, 0x6f, 0xf0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0x0, 0x0, 0x0, 0x0, 0xb, 0xfa, 0x8f, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0x20, 0x0, 0x0, + 0x0, 0x8, 0xfc, 0x8f, 0xc0, 0x0, 0x0, 0x0, + 0x0, 0xff, 0x30, 0x0, 0x0, 0x0, 0x8, 0xfc, + 0x7f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x57, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xfb, 0x6f, 0xf0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xfa, 0x2f, 0xf3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xf6, 0xd, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf2, 0x7, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, + 0xb0, 0x0, 0xef, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x8, 0xff, 0x40, 0x0, 0x5f, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xfa, 0x0, 0x0, 0xa, 0xff, 0xa0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xd1, 0x0, + 0x0, 0x0, 0xbf, 0xfd, 0x40, 0x0, 0x0, 0x0, + 0x2, 0xbf, 0xfd, 0x20, 0x0, 0x0, 0x0, 0x9, + 0xff, 0xfd, 0x84, 0x32, 0x47, 0xbf, 0xff, 0xb1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3c, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xe6, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x39, 0xdf, 0xff, 0xfe, 0xa5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x11, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+E652 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x78, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7, 0xff, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5f, 0xff, 0xf5, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xa9, + 0xff, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xd, 0xfd, 0x0, 0xdf, 0xd0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9f, 0xf2, 0x0, 0x2f, 0xf9, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, + 0x60, 0x0, 0x6, 0xff, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xd, 0xfa, 0x0, 0x0, + 0x0, 0xbf, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xf1, 0x0, 0x0, 0x0, 0x1f, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0xff, 0x70, 0x0, 0x0, 0x0, 0x7, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xfd, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xdf, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5f, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xd0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xd, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xfe, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x9, 0xfb, 0x1, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x58, 0x0, 0x0, 0x0, 0x0, + 0xc, 0xf6, 0xc, 0xf6, 0x0, 0x0, 0x1a, 0xff, + 0xf9, 0x10, 0x0, 0x6c, 0xda, 0x20, 0xf, 0xf3, + 0x2f, 0xf2, 0x0, 0x0, 0xdf, 0xc9, 0xcf, 0xd0, + 0x5, 0xfe, 0xcf, 0xc0, 0x1f, 0xf0, 0x6f, 0xc0, + 0x0, 0x7, 0xfa, 0x0, 0xb, 0xf7, 0xb, 0xf3, + 0xd, 0xf0, 0x2f, 0xf0, 0x7f, 0xb0, 0x0, 0xc, + 0xf2, 0x0, 0x3, 0xfc, 0xa, 0xe0, 0xd, 0xf0, + 0x1f, 0xf0, 0x6f, 0xd0, 0x0, 0xf, 0xf0, 0x0, + 0x0, 0xff, 0x0, 0x0, 0x4f, 0xa0, 0xf, 0xf3, + 0x3f, 0xf1, 0x0, 0xf, 0xe0, 0x0, 0x0, 0xff, + 0x0, 0x1, 0xef, 0x10, 0xc, 0xf8, 0xd, 0xf8, + 0x0, 0xd, 0xf0, 0x0, 0x1, 0xfd, 0x0, 0x1d, + 0xf4, 0x0, 0x6, 0xfe, 0x16, 0xfa, 0x0, 0x9, + 0xf6, 0x0, 0x6, 0xf9, 0x2, 0xdf, 0x50, 0x0, + 0x0, 0xef, 0xb0, 0x41, 0x0, 0x2, 0xff, 0x62, + 0x6f, 0xf2, 0xd, 0xfb, 0x77, 0x60, 0x0, 0x4f, + 0xf9, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0x50, + 0xe, 0xff, 0xff, 0xf2, 0x0, 0x8, 0xff, 0xc2, + 0x0, 0x0, 0x1, 0x69, 0x51, 0x0, 0x1, 0x33, + 0x33, 0x20, 0x0, 0x0, 0x7f, 0xff, 0xb7, 0x55, + 0x7b, 0xff, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x3, 0xdf, 0xff, 0xff, 0xff, 0xfd, + 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x4, 0x9d, 0xee, 0xc9, 0x40, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, + + /* U+E65A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x49, + 0x61, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x28, 0xef, + 0xff, 0xfa, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xcf, 0xff, + 0xd8, 0xbf, 0xff, 0xe9, 0x30, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0xaf, 0xff, 0xfa, + 0x40, 0x0, 0x17, 0xdf, 0xff, 0xd7, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x7d, 0xff, 0xfc, 0x60, + 0x0, 0x0, 0x0, 0x0, 0x28, 0xef, 0xff, 0xb5, + 0x0, 0x0, 0x0, 0x5b, 0xff, 0xfe, 0x82, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4a, 0xff, + 0xff, 0xa4, 0x0, 0x9f, 0xff, 0xb4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6d, 0xff, 0xf6, 0x5, 0xff, 0xff, 0x93, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4b, 0xff, 0xff, 0x30, 0x0, 0x6c, 0xff, 0xff, + 0x81, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19, + 0xff, 0xff, 0xff, 0x20, 0x0, 0x0, 0x2, 0x9f, + 0xff, 0xfa, 0x30, 0x0, 0x0, 0x0, 0x4, 0xbf, + 0xff, 0xf8, 0x1e, 0xf1, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xff, 0xff, 0xd7, 0x10, 0x1, 0x7e, 0xff, + 0xff, 0xf3, 0x0, 0xef, 0x10, 0x0, 0x0, 0x0, + 0x4, 0xfc, 0x28, 0xef, 0xff, 0xab, 0xff, 0xfd, + 0x71, 0xdf, 0x30, 0xe, 0xf1, 0x0, 0x0, 0x0, + 0x0, 0x4f, 0xc0, 0x0, 0x5b, 0xff, 0xff, 0xa4, + 0x0, 0xd, 0xf3, 0x0, 0xef, 0x10, 0x0, 0x0, + 0x0, 0x4, 0xfc, 0x0, 0x0, 0x1, 0x77, 0x10, + 0x0, 0x0, 0xdf, 0x30, 0xe, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x4f, 0xc0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xd, 0xf3, 0x0, 0xef, 0x10, 0x0, + 0x0, 0x0, 0x4, 0xfc, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xdf, 0x30, 0xe, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x6f, 0xf0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xf, 0xf4, 0x6, 0xff, 0xc1, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x47, 0xff, 0xff, + 0xd0, 0x0, 0x0, 0x0, 0xf, 0xf7, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xf0, 0xff, 0x52, + 0xdf, 0x60, 0x0, 0x0, 0x0, 0x5f, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x1, 0x9f, 0xf4, 0x1f, 0xe0, + 0x8, 0xf7, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, + 0x95, 0x21, 0x12, 0x59, 0xff, 0xf5, 0x0, 0xef, + 0x86, 0xef, 0x40, 0x0, 0x0, 0x0, 0x0, 0x3c, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xb3, 0x0, 0x5, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0x7b, 0xde, 0xed, 0xb7, 0x30, 0x0, 0x0, + 0x3, 0x9a, 0x60, 0x0, + + /* U+E65C "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x11, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0xef, + 0xff, 0xa3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7f, 0xf9, 0x66, 0x9e, 0xf7, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xa1, 0x0, 0x0, 0x9, 0xf7, + 0x0, 0x0, 0x0, 0x0, 0x1f, 0xb0, 0x0, 0x0, + 0x0, 0x9, 0xf3, 0x0, 0x0, 0x0, 0x8, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0xe, 0xa0, 0x0, 0x0, + 0x0, 0xdb, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9e, + 0x0, 0x0, 0x0, 0xe, 0x80, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xf0, 0x0, 0x0, 0x0, 0xf8, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x17, 0x0, 0x0, 0x0, + 0xf, 0x80, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xfe, 0x52, 0xfb, 0x88, 0x88, 0x88, + 0x88, 0x88, 0x88, 0x88, 0x88, 0xde, 0x2f, 0x40, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, + 0xe2, 0xf4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8e, 0x2f, 0x40, 0x0, 0x0, 0x6, + 0xfc, 0x0, 0x0, 0x0, 0x8, 0xe2, 0xf4, 0x0, + 0x0, 0x0, 0xcf, 0xf3, 0x0, 0x0, 0x0, 0x8e, + 0x2f, 0x40, 0x0, 0x0, 0x5, 0xfb, 0x0, 0x0, + 0x0, 0x8, 0xe2, 0xf4, 0x0, 0x0, 0x0, 0xf, + 0x60, 0x0, 0x0, 0x0, 0x8e, 0x2f, 0x40, 0x0, + 0x0, 0x0, 0xf6, 0x0, 0x0, 0x0, 0x8, 0xe2, + 0xf4, 0x0, 0x0, 0x0, 0xf, 0x60, 0x0, 0x0, + 0x0, 0x8e, 0x2f, 0x40, 0x0, 0x0, 0x0, 0x51, + 0x0, 0x0, 0x0, 0x8, 0xe2, 0xf4, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8e, 0x2f, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x9, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xfb, 0x2, 0x77, 0x77, 0x77, + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x10, + + /* U+E67A "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5, 0xcc, + 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x50, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x6f, 0x40, + 0x0, 0x0, 0x1, 0x33, 0x10, 0x0, 0x0, 0x5, + 0xf6, 0x0, 0x0, 0x0, 0x3, 0xff, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4f, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x9f, 0xf8, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, 0xf9, 0x0, + 0x0, 0x0, 0x0, 0xa, 0x90, 0x0, 0x1, 0x7b, + 0xdd, 0xb6, 0x10, 0x0, 0xa, 0x90, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, 0xff, 0xff, + 0xff, 0xf6, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xf7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x90, + 0x0, 0x0, 0x0, 0x11, 0x11, 0x0, 0xe, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xd0, 0x0, + 0x11, 0x11, 0xef, 0xff, 0x10, 0x1f, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, 0xff, + 0xfe, 0xef, 0xff, 0x10, 0x1f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xf0, 0x1, 0xff, 0xfe, + 0x89, 0x99, 0x10, 0xf, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xf0, 0x1, 0x99, 0x98, 0x0, + 0x0, 0x0, 0xd, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0xdf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xef, 0xff, 0xff, 0xff, 0xfd, 0x20, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x4, 0x30, 0x0, 0x19, + 0xef, 0xff, 0xfe, 0x80, 0x0, 0x3, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x4f, 0xe3, 0x0, 0x0, 0x3, + 0x54, 0x20, 0x0, 0x0, 0x3f, 0xf3, 0x0, 0x0, + 0x0, 0x3, 0xff, 0xf9, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9f, 0xff, 0x30, 0x0, 0x0, + 0x0, 0xbf, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xa, 0xfb, 0x0, 0x0, 0x0, 0x0, + 0x6, 0x0, 0x0, 0x0, 0x6, 0xee, 0x40, 0x0, + 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x6, 0xff, 0x50, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6, 0xff, 0x50, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x6, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, + + /* U+E706 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, + 0x0, 0x0, 0x9e, 0xea, 0x10, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, + 0xd, 0xff, 0xff, 0xe3, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x9f, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x8, + 0x0, 0x0, 0x0, 0x0, 0xff, 0x0, 0xdf, 0xff, + 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0xbf, 0xb0, + 0x0, 0x0, 0x0, 0x11, 0x0, 0xef, 0xff, 0xff, + 0xff, 0x10, 0x0, 0x0, 0x0, 0x2e, 0xfb, 0x0, + 0x0, 0x5a, 0xdf, 0x70, 0xff, 0xff, 0xff, 0xff, + 0x10, 0x0, 0x0, 0x0, 0x2, 0xef, 0x50, 0x4e, + 0xff, 0xff, 0x70, 0xff, 0xff, 0xff, 0xff, 0x10, + 0x0, 0x0, 0x0, 0x0, 0x26, 0x7, 0xff, 0xff, + 0xff, 0x70, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x5f, 0xff, 0xff, 0xff, + 0x70, 0xff, 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x0, 0x2, 0xff, 0xff, 0xff, 0xff, 0x70, + 0xff, 0xf4, 0x2e, 0xff, 0x10, 0x0, 0x0, 0x0, + 0x0, 0xa, 0xff, 0xff, 0xff, 0xff, 0x70, 0xff, + 0xf2, 0xe, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0xf, 0xff, 0xff, 0xff, 0xff, 0x70, 0xff, 0xf2, + 0xe, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, 0x4f, + 0xff, 0xff, 0xff, 0xff, 0x70, 0xff, 0xf2, 0xe, + 0xff, 0x10, 0x0, 0x1f, 0xff, 0xe0, 0x6f, 0xff, + 0xff, 0xff, 0xff, 0x70, 0xff, 0xf2, 0xe, 0xff, + 0x10, 0x0, 0x2f, 0xff, 0xe0, 0x6f, 0xff, 0xff, + 0xff, 0xff, 0x70, 0xff, 0xf2, 0xe, 0xff, 0x10, + 0x0, 0x1, 0x11, 0x10, 0x5f, 0xff, 0xff, 0xff, + 0xfc, 0x3, 0xff, 0xf2, 0xe, 0xff, 0x50, 0x0, + 0x0, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xff, 0xf1, + 0x3f, 0xff, 0xf2, 0xe, 0xff, 0xf5, 0x0, 0x0, + 0x0, 0x0, 0xc, 0xff, 0xff, 0xff, 0x70, 0xef, + 0xff, 0xf2, 0xe, 0xff, 0xff, 0x10, 0x0, 0x0, + 0x0, 0x4, 0xff, 0xff, 0xff, 0x16, 0xff, 0xff, + 0xa0, 0x8, 0xff, 0xff, 0x90, 0x0, 0x0, 0x0, + 0x0, 0xaf, 0xff, 0xfd, 0xb, 0xff, 0xfa, 0x0, + 0x0, 0x7f, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x2, + 0xb, 0xff, 0xfb, 0xe, 0xff, 0xf3, 0x0, 0x0, + 0xf, 0xff, 0xf1, 0x0, 0x0, 0x0, 0xcf, 0x30, + 0x9f, 0xfa, 0xe, 0xff, 0xf2, 0x0, 0x0, 0xf, + 0xff, 0xf1, 0x0, 0x0, 0xc, 0xfe, 0x20, 0x3, + 0xab, 0xc, 0xff, 0xf7, 0x0, 0x0, 0x4f, 0xff, + 0xf0, 0x0, 0x0, 0xbf, 0xe2, 0x0, 0x0, 0x0, + 0x8, 0xff, 0xff, 0x50, 0x3, 0xef, 0xff, 0xb0, + 0x0, 0x0, 0x3d, 0x20, 0x0, 0x0, 0x0, 0x1, + 0xff, 0xff, 0xfe, 0xdf, 0xff, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6f, + 0xff, 0xff, 0xff, 0xff, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, + 0xff, 0xff, 0xff, 0xa0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, + 0xff, 0xc5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x31, + 0x0, 0x0, 0x0, + + /* U+E762 "" */ + 0x0, 0x0, 0x0, 0x1, 0x21, 0x0, 0x0, 0x0, + 0x0, 0x12, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x18, 0xef, 0xff, 0xe9, 0x30, 0x5, 0xbf, 0xff, + 0xfc, 0x60, 0x0, 0x0, 0x0, 0x5, 0xff, 0xea, + 0x89, 0xdf, 0xf8, 0xbf, 0xfc, 0x98, 0xbf, 0xfd, + 0x20, 0x0, 0x0, 0x7f, 0xe5, 0x0, 0x0, 0x3, + 0xdf, 0xfa, 0x10, 0x0, 0x1, 0x8f, 0xf2, 0x0, + 0x4, 0xfd, 0x10, 0x0, 0x0, 0x0, 0x9, 0x60, + 0x0, 0x0, 0x0, 0x4, 0xfd, 0x0, 0xd, 0xf2, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x7f, 0x70, 0x3f, 0xa0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xe, 0xd0, 0x7f, 0x40, 0x0, 0x0, 0x20, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0xf2, + 0x9f, 0x20, 0x0, 0x8, 0xf9, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x7, 0xf4, 0x9f, 0x20, + 0x0, 0xe, 0xff, 0x30, 0x0, 0x3f, 0xb0, 0x0, + 0x0, 0x0, 0x7, 0xf4, 0x7f, 0x40, 0x0, 0x5f, + 0xaf, 0xb0, 0x0, 0xbf, 0xf8, 0x0, 0x0, 0x0, + 0x9, 0xf2, 0x3f, 0xfa, 0xaa, 0xef, 0x1a, 0xf4, + 0x1, 0xfc, 0xdf, 0xba, 0xa6, 0x0, 0xe, 0xd0, + 0xf, 0xff, 0xff, 0xfb, 0x2, 0xfc, 0x8, 0xf5, + 0x2e, 0xff, 0xfc, 0x0, 0x7f, 0x70, 0x4, 0xfe, + 0x10, 0x0, 0x0, 0x9f, 0x5e, 0xe0, 0x0, 0x0, + 0x0, 0x3, 0xfd, 0x0, 0x0, 0x8f, 0xc1, 0x0, + 0x0, 0x1f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x3f, + 0xf3, 0x0, 0x0, 0x8, 0xfc, 0x10, 0x0, 0x7, + 0xff, 0x20, 0x0, 0x0, 0x3, 0xff, 0x40, 0x0, + 0x0, 0x0, 0x8f, 0xc1, 0x0, 0x0, 0x85, 0x0, + 0x0, 0x0, 0x3f, 0xf4, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xfc, 0x10, 0x0, 0x0, 0x0, 0x0, 0x3, + 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, 0x0, 0x8f, + 0xc1, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xf4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x8, 0xfc, 0x10, + 0x0, 0x0, 0x4, 0xff, 0x40, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xc1, 0x0, 0x0, + 0x4f, 0xf3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x8, 0xfd, 0x20, 0x6, 0xff, 0x30, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x8f, 0xfe, 0xef, 0xe3, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, + 0xad, 0xc8, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+E788 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x6, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x18, 0xef, 0xc0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x29, 0xff, 0xff, 0x50, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3b, 0xff, 0xff, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x5c, 0xff, 0xff, 0xff, 0xf6, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x6d, 0xff, 0xff, 0xff, + 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, + 0x8e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x80, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x8f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf9, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xfa, 0xbf, + 0xff, 0xff, 0xff, 0xff, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x2f, 0xf2, 0xb, 0xff, 0xff, 0xff, + 0xff, 0xb0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0xa0, 0x0, 0xbf, 0xff, 0xff, 0xff, 0x30, 0x0, + 0x0, 0x0, 0x0, 0x1, 0xff, 0x20, 0x0, 0xb, + 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x7, 0xfa, 0x0, 0x0, 0x0, 0xbf, 0xff, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xf2, 0x0, + 0x0, 0x0, 0xb, 0xff, 0xd0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x6f, 0xa0, 0x0, 0x0, 0x0, 0x4, + 0xff, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, 0xdf, + 0x20, 0x0, 0x0, 0x4, 0xcf, 0xfe, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x4, 0xfa, 0x0, 0x0, 0x4, + 0xcf, 0xff, 0x92, 0x0, 0x0, 0x0, 0x0, 0x0, + 0xb, 0xf2, 0x0, 0x4, 0xcf, 0xfe, 0x71, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x90, 0x4, + 0xcf, 0xfd, 0x60, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0xaf, 0x24, 0xcf, 0xfb, 0x40, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xfd, + 0xcf, 0xfa, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x9, 0xff, 0xf9, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x1f, 0xe7, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, + + /* U+E7A0 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x47, 0x99, 0x84, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x8, 0xef, 0xfe, 0xef, 0xff, 0x81, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3e, 0xfa, 0x40, 0x0, + 0x3, 0x9f, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x4f, 0xd3, 0x0, 0x0, 0x0, 0x0, 0x2c, 0xf5, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0xc1, 0x0, 0x6, + 0xe9, 0x10, 0x0, 0xb, 0xf4, 0x0, 0x0, 0x0, + 0xd, 0xe1, 0x0, 0x4c, 0xff, 0xff, 0x70, 0x0, + 0xc, 0xe1, 0x0, 0x0, 0x7, 0xf4, 0x0, 0x6, + 0xef, 0xff, 0xfa, 0x20, 0x0, 0x2f, 0x90, 0x0, + 0x0, 0xea, 0x0, 0x9, 0x81, 0x9f, 0xc3, 0x5e, + 0x0, 0x0, 0x8f, 0x10, 0x0, 0x4f, 0x30, 0x0, + 0xaf, 0xe5, 0x14, 0xcf, 0xf0, 0x0, 0x1, 0xf6, + 0x0, 0x9, 0xe0, 0x0, 0xa, 0xff, 0xf2, 0xff, + 0xff, 0x0, 0x0, 0xc, 0xa0, 0x0, 0xca, 0x0, + 0x0, 0xaf, 0xff, 0x2f, 0xff, 0xf0, 0x0, 0x0, + 0x9d, 0x0, 0xd, 0x80, 0x0, 0x5, 0xff, 0xf2, + 0xff, 0xfa, 0x0, 0x0, 0x6, 0xf0, 0x0, 0xf8, + 0x0, 0x0, 0x1, 0x9f, 0x2f, 0xc3, 0x0, 0x0, + 0x0, 0x6f, 0x0, 0x5f, 0x40, 0x0, 0x0, 0x0, + 0x31, 0x40, 0x0, 0x0, 0x0, 0x6, 0xf0, 0xc, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x9e, 0x4, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0xc, 0x50, 0x0, 0x0, 0x0, 0xc, 0xb0, + 0xaf, 0x40, 0x0, 0x0, 0x0, 0x0, 0xa4, 0x0, + 0x0, 0x0, 0x2, 0xf6, 0x2, 0xbf, 0xc4, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9f, + 0x10, 0x0, 0x3c, 0xe0, 0x0, 0x0, 0x0, 0xe6, + 0x0, 0x0, 0x0, 0x3f, 0x90, 0x0, 0x0, 0x7e, + 0x0, 0x0, 0x0, 0x4, 0x10, 0x0, 0x0, 0xd, + 0xf1, 0x0, 0x0, 0x7, 0xe0, 0x0, 0x0, 0x4, + 0x96, 0x0, 0x0, 0x1c, 0xf5, 0x0, 0x0, 0x0, + 0x7e, 0x0, 0x0, 0x4, 0x91, 0x68, 0x0, 0x1d, + 0xf6, 0x0, 0x0, 0x0, 0x7, 0xe0, 0x0, 0x0, + 0xa0, 0x70, 0xb0, 0x5, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x7f, 0xdd, 0xdc, 0xa, 0x1b, 0x2b, 0x0, + 0x5f, 0x10, 0x0, 0x0, 0x0, 0x3, 0xaa, 0xac, + 0xf2, 0x49, 0x5, 0x80, 0x5, 0xf1, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x3f, 0x20, 0x5a, 0x70, + 0x0, 0x5f, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x3, 0xf2, 0x0, 0x0, 0x0, 0x5, 0xf1, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0x20, 0x0, + 0x0, 0x0, 0x5f, 0x10, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x3, 0xf6, 0x44, 0x44, 0x44, 0x48, 0xf1, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x22, 0x22, 0x22, 0x22, 0x22, + 0x10, 0x0, 0x0, 0x0, + + /* U+E986 "" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x5, 0x91, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, + 0xf9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x24, 0x0, 0xd, 0xff, 0x10, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xef, + 0x70, 0x7, 0xff, 0x70, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0xef, 0xd0, 0x1, 0xff, + 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x70, + 0x0, 0x8f, 0xf4, 0x0, 0xcf, 0xf0, 0x5, 0x30, + 0x0, 0x0, 0x0, 0x8f, 0xf2, 0x0, 0x3f, 0xf9, + 0x0, 0x8f, 0xf4, 0x3f, 0xf8, 0x0, 0x0, 0x0, + 0x4f, 0xf8, 0x0, 0xf, 0xfc, 0x0, 0x4f, 0xf7, + 0x8f, 0xff, 0xc1, 0x0, 0x0, 0xf, 0xfe, 0x0, + 0xb, 0xff, 0x0, 0x2f, 0xf9, 0xaf, 0xff, 0xfe, + 0x30, 0x0, 0xb, 0xff, 0x20, 0xa, 0xff, 0x20, + 0xf, 0xfa, 0xbf, 0xff, 0xff, 0xf6, 0x0, 0x9, + 0xff, 0x40, 0x9, 0xff, 0x30, 0xf, 0xfb, 0xcf, + 0xf4, 0xdf, 0xff, 0x90, 0x9, 0xff, 0x30, 0x8, + 0xff, 0x30, 0xf, 0xfb, 0xaf, 0xf1, 0x9, 0xff, + 0xfb, 0x1a, 0xff, 0x20, 0x9, 0xff, 0x20, 0xf, + 0xfb, 0x8f, 0xf3, 0x0, 0x5f, 0xff, 0xef, 0xff, + 0x0, 0xb, 0xff, 0x10, 0x1f, 0xfa, 0x4f, 0xf4, + 0x0, 0x2, 0xdf, 0xff, 0xfd, 0x0, 0xd, 0xfe, + 0x0, 0x3f, 0xf8, 0xb, 0xf2, 0x0, 0x0, 0x9, + 0xff, 0xf8, 0x0, 0x1f, 0xfa, 0x0, 0x6f, 0xf5, + 0x0, 0x10, 0x0, 0x0, 0x0, 0x5f, 0xe1, 0x0, + 0x5f, 0xf7, 0x0, 0xaf, 0xf2, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x1, 0x0, 0x0, 0xbf, 0xf1, 0x0, + 0xef, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x1, 0xff, 0xb0, 0x4, 0xff, 0x90, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xbe, + 0x30, 0xa, 0xff, 0x40, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xfd, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0xc, 0xf5, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x10, 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 544, .box_w = 30, .box_h = 28, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 420, .adv_w = 544, .box_w = 32, .box_h = 27, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 852, .adv_w = 544, .box_w = 19, .box_h = 30, .ofs_x = 8, .ofs_y = -2}, + {.bitmap_index = 1137, .adv_w = 544, .box_w = 26, .box_h = 26, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 1475, .adv_w = 544, .box_w = 28, .box_h = 28, .ofs_x = 3, .ofs_y = -1}, + {.bitmap_index = 1867, .adv_w = 544, .box_w = 26, .box_h = 29, .ofs_x = 4, .ofs_y = -2}, + {.bitmap_index = 2244, .adv_w = 544, .box_w = 28, .box_h = 30, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 2664, .adv_w = 544, .box_w = 33, .box_h = 23, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 3044, .adv_w = 544, .box_w = 21, .box_h = 25, .ofs_x = 6, .ofs_y = 1}, + {.bitmap_index = 3307, .adv_w = 544, .box_w = 30, .box_h = 31, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 3772, .adv_w = 544, .box_w = 30, .box_h = 29, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 4207, .adv_w = 544, .box_w = 28, .box_h = 25, .ofs_x = 3, .ofs_y = 0}, + {.bitmap_index = 4557, .adv_w = 544, .box_w = 26, .box_h = 26, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 4895, .adv_w = 544, .box_w = 25, .box_h = 31, .ofs_x = 5, .ofs_y = -3}, + {.bitmap_index = 5283, .adv_w = 544, .box_w = 26, .box_h = 23, .ofs_x = 4, .ofs_y = 1} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_0[] = { + 0x0, 0x3, 0x7, 0x19, 0x2c, 0x33, 0x52, 0x5a, + 0x5c, 0x7a, 0x106, 0x162, 0x188, 0x1a0, 0x386 +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = +{ + { + .range_start = 58880, .range_length = 903, .glyph_id_start = 1, + .unicode_list = unicode_list_0, .glyph_id_ofs_list = NULL, .list_length = 15, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + + + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LV_VERSION_CHECK(8, 0, 0) +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = NULL, + .kern_scale = 0, + .cmap_num = 1, + .bpp = 4, + .kern_classes = 0, + .bitmap_format = 0, +#if LV_VERSION_CHECK(8, 0, 0) + .cache = &cache +#endif +}; + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LV_VERSION_CHECK(8, 0, 0) +const lv_font_t ui_font_iconfont34 = { +#else +lv_font_t ui_font_iconfont34 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 32, /*The maximum line height required by the font*/ + .base_line = 3, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = 0, + .underline_thickness = 0, +#endif + .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +}; + + + +#endif /*#if UI_FONT_ICONFONT34*/ + diff --git a/app/src/main.c b/app/src/main.c index 9aef3b36..bbda7557 100644 --- a/app/src/main.c +++ b/app/src/main.c @@ -108,6 +108,8 @@ static lv_indev_drv_t enc_drv; static lv_indev_t *enc_indev; static uint8_t last_pressed; +static lv_obj_t *root_screen; + static bool pending_not_open; static bool is_buttons_for_lvgl = false; @@ -203,8 +205,10 @@ static void run_init_work(struct k_work *item) { lv_indev_t *touch_indev; + root_screen = lv_scr_act(); + zsw_coredump_init(); - lv_obj_set_style_bg_color(lv_scr_act(), zsw_color_dark_gray(), LV_PART_MAIN | LV_STATE_DEFAULT); + lv_obj_set_style_bg_color(root_screen, zsw_color_dark_gray(), LV_PART_MAIN | LV_STATE_DEFAULT); zsw_display_control_init(); zsw_display_control_sleep_ctrl(true); print_retention_ram(); @@ -243,9 +247,9 @@ static void run_init_work(struct k_work *item) watch_state = WATCHFACE_STATE; - lv_obj_add_event_cb(lv_scr_act(), on_lvgl_screen_gesture_event_callback, LV_EVENT_GESTURE, NULL); + lv_obj_add_event_cb(root_screen, on_lvgl_screen_gesture_event_callback, LV_EVENT_GESTURE, NULL); - watchface_app_start(input_group, on_watchface_app_event_callback); + watchface_app_start(root_screen, input_group, on_watchface_app_event_callback); #ifdef CONFIG_SPI_FLASH_LOADER if (NUM_RAW_FS_FILES != zsw_filesytem_get_num_rawfs_files()) { @@ -357,7 +361,7 @@ static void open_application_manager_page(void *app_name) watchface_app_stop(); is_buttons_for_lvgl = true; watch_state = APPLICATION_MANAGER_STATE; - zsw_app_manager_show(on_application_manager_close, lv_scr_act(), input_group, (char *)app_name); + zsw_app_manager_show(on_application_manager_close, root_screen, input_group, (char *)app_name); } static void close_popup_notification(lv_timer_t *timer) @@ -393,7 +397,7 @@ static void on_application_manager_close(void) { zsw_app_manager_delete(); watch_state = WATCHFACE_STATE; - watchface_app_start(input_group, on_watchface_app_event_callback); + watchface_app_start(root_screen, input_group, on_watchface_app_event_callback); lv_async_call(async_turn_off_buttons_allocation, NULL); } @@ -431,11 +435,10 @@ static void handle_screen_gesture(lv_dir_t event_code) break; } case LV_DIR_TOP: { - open_application_manager_page("Settings"); + open_application_manager_page(NULL); break; } case LV_DIR_BOTTOM: { - open_application_manager_page(NULL); break; } default: @@ -504,15 +507,34 @@ static void enocoder_read(struct _lv_indev_drv_t *indev_drv, lv_indev_data_t *da static void on_watchface_app_event_callback(watchface_app_evt_t evt) { if (watch_state == WATCHFACE_STATE && !zsw_notification_popup_is_shown()) { - switch (evt) { - case WATCHFACE_APP_EVT_CLICK_BATT: - open_application_manager_page("Battery"); + switch (evt.type) { + case WATCHFACE_APP_EVENT_OPEN_APP: + switch (evt.data.app) { + case WATCHFACE_APP_EVT_CLICK_BATT: + open_application_manager_page("Battery"); + break; + case WATCHFACE_APP_EVT_CLICK_STEP: + break; + case WATCHFACE_APP_EVT_CLICK_WEATHER: + break; + case WATCHFACE_APP_EVT_CLICK_MUSIC: + open_application_manager_page("Music"); + break; + case WATCHFACE_APP_EVT_CLICK_SETTINGS: + open_application_manager_page("Settings"); + break; + default: + break; + } break; - case WATCHFACE_APP_EVT_CLICK_STEP: + case WATCHFACE_APP_EVENT_SET_BRIGHTNESS: + zsw_display_control_set_brightness(evt.data.brightness); break; - case WATCHFACE_APP_EVT_CLICK_WEATHER: + case WATCHFACE_APP_EVENT_RESTART: + sys_reboot(SYS_REBOOT_COLD); break; - default: + case WATCHFACE_APP_EVENT_SHUTDOWN: + // TODO enter nPM1300 ship mode or hibernate break; } } @@ -572,7 +594,7 @@ static void on_zbus_ble_data_callback(const struct zbus_channel *chan) zsw_app_manager_set_index(0); is_buttons_for_lvgl = false; watch_state = WATCHFACE_STATE; - watchface_app_start(input_group, on_watchface_app_event_callback); + watchface_app_start(root_screen, input_group, on_watchface_app_event_callback); } } else { // TODO: Can we rework it with triggering input events? diff --git a/app/src/ui/watchfaces/0_digital/zsw_watchface_digital_ui.c b/app/src/ui/watchfaces/0_digital/zsw_watchface_digital_ui.c index cd0ae054..ce084374 100644 --- a/app/src/ui/watchfaces/0_digital/zsw_watchface_digital_ui.c +++ b/app/src/ui/watchfaces/0_digital/zsw_watchface_digital_ui.c @@ -79,11 +79,11 @@ static int last_day_of_week = -1; static watchface_app_evt_listener ui_evt_cb; -static void watchface_show(watchface_app_evt_listener evt_cb, zsw_settings_watchface_t *settings) +static void watchface_show(lv_obj_t *parent, watchface_app_evt_listener evt_cb, zsw_settings_watchface_t *settings) { ui_evt_cb = evt_cb; - lv_obj_clear_flag(lv_scr_act(), LV_OBJ_FLAG_SCROLLABLE); - root_page = lv_obj_create(lv_scr_act()); + lv_obj_clear_flag(parent, LV_OBJ_FLAG_SCROLLABLE); + root_page = lv_obj_create(parent); watchface_ui_invalidate_cached(); lv_obj_clear_flag(root_page, LV_OBJ_FLAG_SCROLLABLE); @@ -644,10 +644,13 @@ static const void *watchface_get_preview_img(void) static void arc_event_pressed(lv_event_t *e) { + watchface_app_evt_t evt = {.type = WATCHFACE_APP_EVENT_OPEN_APP}; if (lv_event_get_target(e) == ui_battery_arc) { - ui_evt_cb(WATCHFACE_APP_EVT_CLICK_BATT); + evt.data.app = WATCHFACE_APP_EVT_CLICK_BATT; + ui_evt_cb(evt); } else if (lv_event_get_target(e) == ui_step_arc) { - ui_evt_cb(WATCHFACE_APP_EVT_CLICK_STEP); + evt.data.app = WATCHFACE_APP_EVT_CLICK_STEP; + ui_evt_cb(evt); } } diff --git a/app/src/ui/watchfaces/107_2_dial/zsw_watchface_107_2_dial_ui.c b/app/src/ui/watchfaces/107_2_dial/zsw_watchface_107_2_dial_ui.c index ecda5f80..07a38e30 100644 --- a/app/src/ui/watchfaces/107_2_dial/zsw_watchface_107_2_dial_ui.c +++ b/app/src/ui/watchfaces/107_2_dial/zsw_watchface_107_2_dial_ui.c @@ -296,12 +296,12 @@ static void watchface_107_2_dial_set_watch_env_sensors(int temperature, int humi } -void watchface_107_2_dial_show(watchface_app_evt_listener evt_cb, zsw_settings_watchface_t *settings) +void watchface_107_2_dial_show(lv_obj_t *parent, watchface_app_evt_listener evt_cb, zsw_settings_watchface_t *settings) { ui_107_2_dial_evt_cb = evt_cb; - lv_obj_clear_flag(lv_scr_act(), LV_OBJ_FLAG_SCROLLABLE); - face_107_2_dial = lv_obj_create(lv_scr_act()); + lv_obj_clear_flag(parent, LV_OBJ_FLAG_SCROLLABLE); + face_107_2_dial = lv_obj_create(parent); watchface_107_2_dial_invalidate_cached(); lv_obj_clear_flag(face_107_2_dial, LV_OBJ_FLAG_SCROLLABLE); diff --git a/app/src/ui/watchfaces/116_2_dial/zsw_watchface_116_2_dial_ui.c b/app/src/ui/watchfaces/116_2_dial/zsw_watchface_116_2_dial_ui.c index 007b1de1..16865ddd 100644 --- a/app/src/ui/watchfaces/116_2_dial/zsw_watchface_116_2_dial_ui.c +++ b/app/src/ui/watchfaces/116_2_dial/zsw_watchface_116_2_dial_ui.c @@ -321,12 +321,12 @@ static void watchface_116_2_dial_set_watch_env_sensors(int temperature, int humi } -void watchface_116_2_dial_show(watchface_app_evt_listener evt_cb, zsw_settings_watchface_t *settings) +void watchface_116_2_dial_show(lv_obj_t *parent, watchface_app_evt_listener evt_cb, zsw_settings_watchface_t *settings) { ui_116_2_dial_evt_cb = evt_cb; - lv_obj_clear_flag(lv_scr_act(), LV_OBJ_FLAG_SCROLLABLE); - face_116_2_dial = lv_obj_create(lv_scr_act()); + lv_obj_clear_flag(parent, LV_OBJ_FLAG_SCROLLABLE); + face_116_2_dial = lv_obj_create(parent); watchface_116_2_dial_invalidate_cached(); lv_obj_clear_flag(face_116_2_dial, LV_OBJ_FLAG_SCROLLABLE); diff --git a/app/src/ui/watchfaces/66_2_dial/zsw_watchface_66_2_dial_ui.c b/app/src/ui/watchfaces/66_2_dial/zsw_watchface_66_2_dial_ui.c index 5a44e31c..7bc534e7 100644 --- a/app/src/ui/watchfaces/66_2_dial/zsw_watchface_66_2_dial_ui.c +++ b/app/src/ui/watchfaces/66_2_dial/zsw_watchface_66_2_dial_ui.c @@ -353,12 +353,12 @@ static void watchface_66_2_dial_set_watch_env_sensors(int temperature, int humid } -void watchface_66_2_dial_show(watchface_app_evt_listener evt_cb, zsw_settings_watchface_t *settings) +void watchface_66_2_dial_show(lv_obj_t *parent, watchface_app_evt_listener evt_cb, zsw_settings_watchface_t *settings) { ui_66_2_dial_evt_cb = evt_cb; - lv_obj_clear_flag(lv_scr_act(), LV_OBJ_FLAG_SCROLLABLE); - face_66_2_dial = lv_obj_create(lv_scr_act()); + lv_obj_clear_flag(parent, LV_OBJ_FLAG_SCROLLABLE); + face_66_2_dial = lv_obj_create(parent); watchface_66_2_dial_invalidate_cached(); lv_obj_clear_flag(face_66_2_dial, LV_OBJ_FLAG_SCROLLABLE); diff --git a/app/src/ui/watchfaces/70_2_dial/zsw_watchface_70_2_dial_ui.c b/app/src/ui/watchfaces/70_2_dial/zsw_watchface_70_2_dial_ui.c index 1557c765..404329df 100644 --- a/app/src/ui/watchfaces/70_2_dial/zsw_watchface_70_2_dial_ui.c +++ b/app/src/ui/watchfaces/70_2_dial/zsw_watchface_70_2_dial_ui.c @@ -271,12 +271,12 @@ static void watchface_70_2_dial_set_watch_env_sensors(int temperature, int humid } -void watchface_70_2_dial_show(watchface_app_evt_listener evt_cb, zsw_settings_watchface_t *settings) +void watchface_70_2_dial_show(lv_obj_t *parent, watchface_app_evt_listener evt_cb, zsw_settings_watchface_t *settings) { ui_70_2_dial_evt_cb = evt_cb; - lv_obj_clear_flag(lv_scr_act(), LV_OBJ_FLAG_SCROLLABLE); - face_70_2_dial = lv_obj_create(lv_scr_act()); + lv_obj_clear_flag(parent, LV_OBJ_FLAG_SCROLLABLE); + face_70_2_dial = lv_obj_create(parent); watchface_70_2_dial_invalidate_cached(); lv_obj_clear_flag(face_70_2_dial, LV_OBJ_FLAG_SCROLLABLE); diff --git a/app/src/ui/watchfaces/73_2_dial/zsw_watchface_73_2_dial_ui.c b/app/src/ui/watchfaces/73_2_dial/zsw_watchface_73_2_dial_ui.c index f75a430c..4648c27a 100644 --- a/app/src/ui/watchfaces/73_2_dial/zsw_watchface_73_2_dial_ui.c +++ b/app/src/ui/watchfaces/73_2_dial/zsw_watchface_73_2_dial_ui.c @@ -436,12 +436,12 @@ static void watchface_73_2_dial_set_watch_env_sensors(int temperature, int humid } -void watchface_73_2_dial_show(watchface_app_evt_listener evt_cb, zsw_settings_watchface_t *settings) +void watchface_73_2_dial_show(lv_obj_t *parent, watchface_app_evt_listener evt_cb, zsw_settings_watchface_t *settings) { ui_73_2_dial_evt_cb = evt_cb; - lv_obj_clear_flag(lv_scr_act(), LV_OBJ_FLAG_SCROLLABLE); - face_73_2_dial = lv_obj_create(lv_scr_act()); + lv_obj_clear_flag(parent, LV_OBJ_FLAG_SCROLLABLE); + face_73_2_dial = lv_obj_create(parent); watchface_73_2_dial_invalidate_cached(); lv_obj_clear_flag(face_73_2_dial, LV_OBJ_FLAG_SCROLLABLE); diff --git a/app/src/ui/watchfaces/75_2_dial/zsw_watchface_75_2_dial_ui.c b/app/src/ui/watchfaces/75_2_dial/zsw_watchface_75_2_dial_ui.c index 1ef151f8..1867cab5 100644 --- a/app/src/ui/watchfaces/75_2_dial/zsw_watchface_75_2_dial_ui.c +++ b/app/src/ui/watchfaces/75_2_dial/zsw_watchface_75_2_dial_ui.c @@ -208,12 +208,12 @@ static void watchface_75_2_dial_set_watch_env_sensors(int temperature, int humid } -void watchface_75_2_dial_show(watchface_app_evt_listener evt_cb, zsw_settings_watchface_t *settings) +void watchface_75_2_dial_show(lv_obj_t *parent, watchface_app_evt_listener evt_cb, zsw_settings_watchface_t *settings) { ui_75_2_dial_evt_cb = evt_cb; - lv_obj_clear_flag(lv_scr_act(), LV_OBJ_FLAG_SCROLLABLE); - face_75_2_dial = lv_obj_create(lv_scr_act()); + lv_obj_clear_flag(parent, LV_OBJ_FLAG_SCROLLABLE); + face_75_2_dial = lv_obj_create(parent); watchface_75_2_dial_invalidate_cached(); lv_obj_clear_flag(face_75_2_dial, LV_OBJ_FLAG_SCROLLABLE); diff --git a/app/src/ui/watchfaces/79_2_dial/zsw_watchface_79_2_dial_ui.c b/app/src/ui/watchfaces/79_2_dial/zsw_watchface_79_2_dial_ui.c index 7952132e..5ced8bd5 100644 --- a/app/src/ui/watchfaces/79_2_dial/zsw_watchface_79_2_dial_ui.c +++ b/app/src/ui/watchfaces/79_2_dial/zsw_watchface_79_2_dial_ui.c @@ -357,12 +357,12 @@ static void watchface_79_2_dial_set_watch_env_sensors(int temperature, int humid } -void watchface_79_2_dial_show(watchface_app_evt_listener evt_cb, zsw_settings_watchface_t *settings) +void watchface_79_2_dial_show(lv_obj_t *parent, watchface_app_evt_listener evt_cb, zsw_settings_watchface_t *settings) { ui_79_2_dial_evt_cb = evt_cb; - lv_obj_clear_flag(lv_scr_act(), LV_OBJ_FLAG_SCROLLABLE); - face_79_2_dial = lv_obj_create(lv_scr_act()); + lv_obj_clear_flag(parent, LV_OBJ_FLAG_SCROLLABLE); + face_79_2_dial = lv_obj_create(parent); watchface_79_2_dial_invalidate_cached(); lv_obj_clear_flag(face_79_2_dial, LV_OBJ_FLAG_SCROLLABLE); diff --git a/app/src/ui/watchfaces/80_2_dial/zsw_watchface_80_2_dial_ui.c b/app/src/ui/watchfaces/80_2_dial/zsw_watchface_80_2_dial_ui.c index 7ab4932d..667ad8a4 100644 --- a/app/src/ui/watchfaces/80_2_dial/zsw_watchface_80_2_dial_ui.c +++ b/app/src/ui/watchfaces/80_2_dial/zsw_watchface_80_2_dial_ui.c @@ -515,12 +515,12 @@ static void watchface_80_2_dial_set_watch_env_sensors(int temperature, int humid } -void watchface_80_2_dial_show(watchface_app_evt_listener evt_cb, zsw_settings_watchface_t *settings) +void watchface_80_2_dial_show(lv_obj_t *parent, watchface_app_evt_listener evt_cb, zsw_settings_watchface_t *settings) { ui_80_2_dial_evt_cb = evt_cb; - lv_obj_clear_flag(lv_scr_act(), LV_OBJ_FLAG_SCROLLABLE); - face_80_2_dial = lv_obj_create(lv_scr_act()); + lv_obj_clear_flag(parent, LV_OBJ_FLAG_SCROLLABLE); + face_80_2_dial = lv_obj_create(parent); watchface_80_2_dial_invalidate_cached(); lv_obj_clear_flag(face_80_2_dial, LV_OBJ_FLAG_SCROLLABLE); diff --git a/app/src/ui/watchfaces/84_2_dial/zsw_watchface_84_2_dial_ui.c b/app/src/ui/watchfaces/84_2_dial/zsw_watchface_84_2_dial_ui.c index eaf163c8..3ea9af8f 100644 --- a/app/src/ui/watchfaces/84_2_dial/zsw_watchface_84_2_dial_ui.c +++ b/app/src/ui/watchfaces/84_2_dial/zsw_watchface_84_2_dial_ui.c @@ -304,12 +304,12 @@ static void watchface_84_2_dial_set_watch_env_sensors(int temperature, int humid } -void watchface_84_2_dial_show(watchface_app_evt_listener evt_cb, zsw_settings_watchface_t *settings) +void watchface_84_2_dial_show(lv_obj_t *parent, watchface_app_evt_listener evt_cb, zsw_settings_watchface_t *settings) { ui_84_2_dial_evt_cb = evt_cb; - lv_obj_clear_flag(lv_scr_act(), LV_OBJ_FLAG_SCROLLABLE); - face_84_2_dial = lv_obj_create(lv_scr_act()); + lv_obj_clear_flag(parent, LV_OBJ_FLAG_SCROLLABLE); + face_84_2_dial = lv_obj_create(parent); watchface_84_2_dial_invalidate_cached(); lv_obj_clear_flag(face_84_2_dial, LV_OBJ_FLAG_SCROLLABLE); diff --git a/app/src/ui/watchfaces/minimal/zsw_watchface_minimal_ui.c b/app/src/ui/watchfaces/minimal/zsw_watchface_minimal_ui.c index d89cb58b..6aa9a76e 100644 --- a/app/src/ui/watchfaces/minimal/zsw_watchface_minimal_ui.c +++ b/app/src/ui/watchfaces/minimal/zsw_watchface_minimal_ui.c @@ -48,11 +48,11 @@ static int last_minute = -1; static int last_second = -1; static int last_num_not = -1; -static void watchface_show(watchface_app_evt_listener evt_cb, zsw_settings_watchface_t *settings) +static void watchface_show(lv_obj_t *parent, watchface_app_evt_listener evt_cb, zsw_settings_watchface_t *settings) { ARG_UNUSED(evt_cb); - lv_obj_clear_flag(lv_scr_act(), LV_OBJ_FLAG_SCROLLABLE); - root_page = lv_obj_create(lv_scr_act()); + lv_obj_clear_flag(parent, LV_OBJ_FLAG_SCROLLABLE); + root_page = lv_obj_create(parent); watchface_ui_invalidate_cached(); lv_obj_clear_flag(root_page, LV_OBJ_FLAG_SCROLLABLE); diff --git a/app/src/ui/watchfaces/pixel/zsw_watchface_goog_ui.c b/app/src/ui/watchfaces/pixel/zsw_watchface_goog_ui.c index 72cfa7a8..77d86854 100644 --- a/app/src/ui/watchfaces/pixel/zsw_watchface_goog_ui.c +++ b/app/src/ui/watchfaces/pixel/zsw_watchface_goog_ui.c @@ -463,12 +463,12 @@ static void watchface_goog_set_watch_env_sensors(int temperature, int humidity, } -void watchface_goog_show(watchface_app_evt_listener evt_cb, zsw_settings_watchface_t *settings) +void watchface_goog_show(lv_obj_t *parent, watchface_app_evt_listener evt_cb, zsw_settings_watchface_t *settings) { ui_goog_evt_cb = evt_cb; - lv_obj_clear_flag(lv_scr_act(), LV_OBJ_FLAG_SCROLLABLE); - face_goog = lv_obj_create(lv_scr_act()); + lv_obj_clear_flag(parent, LV_OBJ_FLAG_SCROLLABLE); + face_goog = lv_obj_create(parent); watchface_goog_invalidate_cached(); lv_obj_clear_flag(face_goog, LV_OBJ_FLAG_SCROLLABLE); diff --git a/app/src/ui/watchfaces/zsw_watchface_dropdown_ui.c b/app/src/ui/watchfaces/zsw_watchface_dropdown_ui.c new file mode 100644 index 00000000..fb30061b --- /dev/null +++ b/app/src/ui/watchfaces/zsw_watchface_dropdown_ui.c @@ -0,0 +1,290 @@ +#include "zsw_ui.h" +#include "lvgl.h" +#include "drivers/zsw_display_control.h" +#include "applications/watchface/watchface_app.h" + +/* +Settings +Restart +Power off (nPM ship or hibernate) (BLE) +Music (NFC) +Current playing? (zbus in watchface_app listener and then call func here) +Brightness + +*/ + +static lv_obj_t *ui_down_bg_panel; +static lv_obj_t *ui_up_bg_Panel; +static lv_obj_t *ui_music_info_label; +static lv_obj_t *ui_music_button; +static lv_obj_t *ui_music_label; +static lv_obj_t *ui_restart_button; +static lv_obj_t *ui_restart_label; +static lv_obj_t *ui_shutdown_button; +static lv_obj_t *ui_shutdown_label; +static lv_obj_t *ui_settings_button; +static lv_obj_t *ui_settings_label; +static lv_obj_t *ui_bri_slider; +static lv_obj_t *ui_LightLabel; +static lv_obj_t *ui_dropdown_bg_panel; + +static lv_obj_t *dropdown_root; + +static uint8_t ui_light_slider_value = 30; + +static bool is_shown; +static watchface_app_evt_listener evt_cb; + +LV_FONT_DECLARE(ui_font_iconfont34); +LV_FONT_DECLARE(lv_font_montserrat_14_full); + +void ui_event_light_slider(lv_event_t *e) +{ + lv_event_code_t event_code = lv_event_get_code(e); + if (event_code == LV_EVENT_VALUE_CHANGED) { + ui_light_slider_value = lv_slider_get_value(ui_bri_slider); + evt_cb((watchface_app_evt_t) { + WATCHFACE_APP_EVENT_SET_BRIGHTNESS, .data.brightness = ui_light_slider_value + }); + } +} + +static void on_lvgl_screen_gesture_event_callback(lv_event_t *e) +{ + lv_dir_t dir; + lv_event_code_t event = lv_event_get_code(e); + if (event == LV_EVENT_GESTURE) { + dir = lv_indev_get_gesture_dir(lv_indev_get_act()); + switch (dir) { + case LV_DIR_BOTTOM: { + if (!is_shown) { + lv_obj_clear_flag(ui_down_bg_panel, LV_OBJ_FLAG_HIDDEN); + is_shown = true; + } + break; + } + } + } +} + +void ui_event_button(lv_event_t *e) +{ + lv_obj_t *button = e->current_target; + if (e->code == LV_EVENT_CLICKED) { + if (button == ui_restart_button) + evt_cb((watchface_app_evt_t) { + WATCHFACE_APP_EVENT_RESTART + }); + else if (button == ui_music_button) { + evt_cb((watchface_app_evt_t) { + WATCHFACE_APP_EVENT_OPEN_APP, .data.app = WATCHFACE_APP_EVT_CLICK_MUSIC + }); + } else if (button == ui_shutdown_button) { + evt_cb((watchface_app_evt_t) { + WATCHFACE_APP_EVENT_SHUTDOWN + }); + } else if (button == ui_settings_button) { + evt_cb((watchface_app_evt_t) { + WATCHFACE_APP_EVENT_OPEN_APP, .data.app = WATCHFACE_APP_EVT_CLICK_SETTINGS + }); + } + } +} + +static void on_lvgl_screen_gesture_event_callback_drop(lv_event_t *e) +{ + lv_dir_t dir; + lv_event_code_t event = lv_event_get_code(e); + if (event == LV_EVENT_GESTURE) { + dir = lv_indev_get_gesture_dir(lv_indev_get_act()); + switch (dir) { + case LV_DIR_TOP: { + if (is_shown) { + lv_obj_add_flag(ui_down_bg_panel, LV_OBJ_FLAG_HIDDEN); + is_shown = false; + } + break; + } + } + } +} + +void zsw_watchface_dropdown_ui_add(lv_obj_t *root_page, + watchface_app_evt_listener callback /*, TODO input starting state of buttons and sliders */) +{ + __ASSERT(ui_down_bg_panel == NULL, "ui_down_bg_panel is not NULL"); + + evt_cb = callback; + dropdown_root = root_page; + + ui_down_bg_panel = lv_obj_create(root_page); + lv_obj_set_width(ui_down_bg_panel, 240); + lv_obj_set_height(ui_down_bg_panel, 240); + lv_obj_set_x(ui_down_bg_panel, 0); + lv_obj_set_y(ui_down_bg_panel, -10); + lv_obj_set_align(ui_down_bg_panel, LV_ALIGN_TOP_MID); + lv_obj_clear_flag(ui_down_bg_panel, LV_OBJ_FLAG_GESTURE_BUBBLE | LV_OBJ_FLAG_SCROLL_ELASTIC | LV_OBJ_FLAG_SCROLL_CHAIN | + LV_OBJ_FLAG_SCROLLABLE); /// Flags + lv_obj_set_scroll_dir(ui_down_bg_panel, LV_DIR_VER); + lv_obj_set_style_bg_color(ui_down_bg_panel, lv_color_hex(0x323232), LV_PART_MAIN | LV_STATE_DEFAULT); + lv_obj_set_style_bg_opa(ui_down_bg_panel, 0, LV_PART_MAIN | LV_STATE_DEFAULT); + lv_obj_set_style_border_color(ui_down_bg_panel, lv_color_hex(0x000000), LV_PART_MAIN | LV_STATE_DEFAULT); + lv_obj_set_style_border_opa(ui_down_bg_panel, 0, LV_PART_MAIN | LV_STATE_DEFAULT); + lv_obj_set_style_bg_opa(ui_down_bg_panel, 0, LV_PART_SCROLLBAR | LV_STATE_DEFAULT); + lv_obj_set_style_bg_opa(ui_down_bg_panel, 0, LV_PART_SCROLLBAR | LV_STATE_SCROLLED); + lv_obj_add_flag(ui_down_bg_panel, LV_OBJ_FLAG_HIDDEN); + + ui_up_bg_Panel = lv_obj_create(ui_down_bg_panel); + + lv_obj_set_width(ui_up_bg_Panel, 240); + lv_obj_set_height(ui_up_bg_Panel, 170); + lv_obj_set_x(ui_up_bg_Panel, 0); + lv_obj_set_y(ui_up_bg_Panel, -10); + lv_obj_set_align(ui_up_bg_Panel, LV_ALIGN_TOP_MID); + lv_obj_clear_flag(ui_up_bg_Panel, LV_OBJ_FLAG_CLICKABLE | LV_OBJ_FLAG_SCROLLABLE); /// Flags + lv_obj_set_style_bg_color(ui_up_bg_Panel, lv_color_hex(0x323232), LV_PART_MAIN | LV_STATE_DEFAULT); + lv_obj_set_style_bg_opa(ui_up_bg_Panel, 200, LV_PART_MAIN | LV_STATE_DEFAULT); + + ui_music_info_label = lv_label_create(ui_down_bg_panel); + lv_label_set_text(ui_music_info_label, ""); + lv_obj_set_style_text_align(ui_music_info_label, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN | LV_STATE_DEFAULT); + lv_obj_set_align(ui_music_info_label, LV_ALIGN_TOP_MID); + lv_obj_set_y(ui_music_info_label, 10); + lv_obj_set_width(ui_music_info_label, 150); + lv_obj_set_style_text_font(ui_music_info_label, &lv_font_montserrat_14_full, LV_PART_MAIN | LV_STATE_DEFAULT); + lv_label_set_long_mode(ui_music_info_label, LV_LABEL_LONG_SCROLL_CIRCULAR); + lv_obj_set_style_anim_speed(ui_music_info_label, 10, 0); + + ui_music_button = lv_btn_create(ui_down_bg_panel); + lv_obj_set_width(ui_music_button, 50); + lv_obj_set_height(ui_music_button, 50); + lv_obj_set_x(ui_music_button, 20); + lv_obj_set_y(ui_music_button, 35); + lv_obj_clear_flag(ui_music_button, LV_OBJ_FLAG_SCROLLABLE); /// Flags + + ui_music_label = lv_label_create(ui_music_button); + lv_obj_set_width(ui_music_label, LV_SIZE_CONTENT); /// 1 + lv_obj_set_height(ui_music_label, LV_SIZE_CONTENT); /// 1 + lv_obj_set_align(ui_music_label, LV_ALIGN_CENTER); + lv_label_set_text(ui_music_label, LV_SYMBOL_AUDIO); + lv_obj_set_style_text_color(ui_music_label, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); + lv_obj_set_style_text_opa(ui_music_label, 255, LV_PART_MAIN | LV_STATE_DEFAULT); + lv_obj_set_style_text_font(ui_music_label, &lv_font_montserrat_18, LV_PART_MAIN | LV_STATE_DEFAULT); + + ui_restart_button = lv_btn_create(ui_down_bg_panel); + lv_obj_set_width(ui_restart_button, 50); + lv_obj_set_height(ui_restart_button, 50); + lv_obj_set_x(ui_restart_button, 20); + lv_obj_set_y(ui_restart_button, 95); + lv_obj_clear_flag(ui_restart_button, LV_OBJ_FLAG_SCROLLABLE); /// Flags + + ui_restart_label = lv_label_create(ui_restart_button); + lv_obj_set_width(ui_restart_label, LV_SIZE_CONTENT); /// 1 + lv_obj_set_height(ui_restart_label, LV_SIZE_CONTENT); /// 1 + lv_obj_set_align(ui_restart_label, LV_ALIGN_CENTER); + lv_label_set_text(ui_restart_label, LV_SYMBOL_REFRESH); + lv_obj_set_style_text_color(ui_restart_label, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); + lv_obj_set_style_text_opa(ui_restart_label, 255, LV_PART_MAIN | LV_STATE_DEFAULT); + lv_obj_set_style_text_font(ui_restart_label, &lv_font_montserrat_18, LV_PART_MAIN | LV_STATE_DEFAULT); + + ui_shutdown_button = lv_btn_create(ui_down_bg_panel); + lv_obj_set_width(ui_shutdown_button, 50); + lv_obj_set_height(ui_shutdown_button, 50); + lv_obj_set_x(ui_shutdown_button, 5); + lv_obj_set_y(ui_shutdown_button, 95); + lv_obj_set_align(ui_shutdown_button, LV_ALIGN_TOP_MID); + lv_obj_clear_flag(ui_shutdown_button, LV_OBJ_FLAG_SCROLLABLE); /// Flags + + ui_shutdown_label = lv_label_create(ui_shutdown_button); + lv_obj_set_width(ui_shutdown_label, LV_SIZE_CONTENT); /// 1 + lv_obj_set_height(ui_shutdown_label, LV_SIZE_CONTENT); /// 1 + lv_obj_set_align(ui_shutdown_label, LV_ALIGN_CENTER); + lv_label_set_text(ui_shutdown_label, LV_SYMBOL_POWER); + lv_obj_set_style_text_color(ui_shutdown_label, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); + lv_obj_set_style_text_opa(ui_shutdown_label, 255, LV_PART_MAIN | LV_STATE_DEFAULT); + lv_obj_set_style_text_font(ui_shutdown_label, &lv_font_montserrat_18, LV_PART_MAIN | LV_STATE_DEFAULT); + + ui_settings_button = lv_btn_create(ui_down_bg_panel); + lv_obj_set_width(ui_settings_button, 50); + lv_obj_set_height(ui_settings_button, 50); + lv_obj_set_x(ui_settings_button, 5); + lv_obj_set_y(ui_settings_button, 35); + lv_obj_set_align(ui_settings_button, LV_ALIGN_TOP_MID); + lv_obj_clear_flag(ui_settings_button, LV_OBJ_FLAG_SCROLLABLE); /// Flags + + ui_settings_label = lv_label_create(ui_settings_button); + lv_obj_set_width(ui_settings_label, LV_SIZE_CONTENT); /// 1 + lv_obj_set_height(ui_settings_label, LV_SIZE_CONTENT); /// 1 + lv_obj_set_align(ui_settings_label, LV_ALIGN_CENTER); + lv_label_set_text(ui_settings_label, LV_SYMBOL_SETTINGS); + lv_obj_set_style_text_color(ui_settings_label, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); + lv_obj_set_style_text_opa(ui_settings_label, 255, LV_PART_MAIN | LV_STATE_DEFAULT); + lv_obj_set_style_text_font(ui_settings_label, &lv_font_montserrat_18, LV_PART_MAIN | LV_STATE_DEFAULT); + + ui_bri_slider = lv_slider_create(ui_down_bg_panel); + lv_slider_set_value(ui_bri_slider, ui_light_slider_value, LV_ANIM_OFF); + if (lv_slider_get_mode(ui_bri_slider) == LV_SLIDER_MODE_RANGE) { + lv_slider_set_left_value(ui_bri_slider, 0, LV_ANIM_OFF); + } + lv_obj_set_width(ui_bri_slider, 50); + lv_obj_set_height(ui_bri_slider, 110); + lv_obj_set_x(ui_bri_slider, -10); + lv_obj_set_y(ui_bri_slider, 35); + lv_obj_set_align(ui_bri_slider, LV_ALIGN_TOP_RIGHT); + lv_obj_set_style_radius(ui_bri_slider, 15, LV_PART_MAIN | LV_STATE_DEFAULT); + lv_obj_set_style_bg_color(ui_bri_slider, lv_color_hex(0x808080), LV_PART_MAIN | LV_STATE_DEFAULT); + lv_obj_set_style_bg_opa(ui_bri_slider, 255, LV_PART_MAIN | LV_STATE_DEFAULT); + + lv_obj_set_style_radius(ui_bri_slider, 0, LV_PART_INDICATOR | LV_STATE_DEFAULT); + lv_obj_set_style_bg_color(ui_bri_slider, lv_color_hex(0x3264C8), LV_PART_INDICATOR | LV_STATE_DEFAULT); + lv_obj_set_style_bg_opa(ui_bri_slider, 255, LV_PART_INDICATOR | LV_STATE_DEFAULT); + + lv_obj_set_style_bg_color(ui_bri_slider, lv_color_hex(0x000000), LV_PART_KNOB | LV_STATE_DEFAULT); + lv_obj_set_style_bg_opa(ui_bri_slider, 0, LV_PART_KNOB | LV_STATE_DEFAULT); + lv_obj_clear_flag(ui_bri_slider, LV_OBJ_FLAG_GESTURE_BUBBLE); /// Flags + + ui_LightLabel = lv_label_create(ui_bri_slider); + lv_obj_set_width(ui_LightLabel, LV_SIZE_CONTENT); /// 1 + lv_obj_set_height(ui_LightLabel, LV_SIZE_CONTENT); /// 1 + lv_obj_set_x(ui_LightLabel, 0); + lv_obj_set_y(ui_LightLabel, 30); + lv_obj_set_align(ui_LightLabel, LV_ALIGN_CENTER); + lv_label_set_text(ui_LightLabel, ""); + lv_obj_set_style_text_color(ui_LightLabel, lv_color_hex(0xFFFFFF), LV_PART_MAIN | LV_STATE_DEFAULT); + lv_obj_set_style_text_opa(ui_LightLabel, 255, LV_PART_MAIN | LV_STATE_DEFAULT); + lv_obj_set_style_text_font(ui_LightLabel, &ui_font_iconfont34, LV_PART_MAIN | LV_STATE_DEFAULT); + + ui_dropdown_bg_panel = lv_obj_create(ui_down_bg_panel); + lv_obj_set_width(ui_dropdown_bg_panel, 240); + lv_obj_set_height(ui_dropdown_bg_panel, 160); + lv_obj_set_x(ui_dropdown_bg_panel, 0); + lv_obj_set_y(ui_dropdown_bg_panel, 150); + lv_obj_set_align(ui_dropdown_bg_panel, LV_ALIGN_TOP_MID); + lv_obj_clear_flag(ui_dropdown_bg_panel, LV_OBJ_FLAG_CLICKABLE | LV_OBJ_FLAG_SCROLLABLE); /// Flags + lv_obj_set_style_bg_color(ui_dropdown_bg_panel, lv_color_hex(0x323232), LV_PART_MAIN | LV_STATE_DEFAULT); + lv_obj_set_style_bg_opa(ui_dropdown_bg_panel, 0, LV_PART_MAIN | LV_STATE_DEFAULT); + lv_obj_set_style_border_color(ui_dropdown_bg_panel, lv_color_hex(0x000000), LV_PART_MAIN | LV_STATE_DEFAULT); + lv_obj_set_style_border_opa(ui_dropdown_bg_panel, 0, LV_PART_MAIN | LV_STATE_DEFAULT); + + lv_obj_add_event_cb(ui_music_button, ui_event_button, LV_EVENT_ALL, NULL); + lv_obj_add_event_cb(ui_restart_button, ui_event_button, LV_EVENT_ALL, NULL); + lv_obj_add_event_cb(ui_shutdown_button, ui_event_button, LV_EVENT_ALL, NULL); + lv_obj_add_event_cb(ui_settings_button, ui_event_button, LV_EVENT_ALL, NULL); + lv_obj_add_event_cb(ui_bri_slider, ui_event_light_slider, LV_EVENT_ALL, NULL); + + lv_obj_add_event_cb(dropdown_root, on_lvgl_screen_gesture_event_callback, LV_EVENT_GESTURE, NULL); + lv_obj_add_event_cb(ui_down_bg_panel, on_lvgl_screen_gesture_event_callback_drop, LV_EVENT_GESTURE, NULL); +} + +void zsw_watchface_dropdown_ui_set_music_info(char *track_name, char *artist) +{ + lv_label_set_text_fmt(ui_music_info_label, "%s - %s", artist, track_name); +} + +void zsw_watchface_dropdown_ui_remove(void) +{ + lv_obj_remove_event_cb(dropdown_root, on_lvgl_screen_gesture_event_callback); + lv_obj_del(ui_down_bg_panel); + ui_down_bg_panel = NULL; + is_shown = false; +} \ No newline at end of file diff --git a/app/src/ui/watchfaces/zsw_watchface_dropdown_ui.h b/app/src/ui/watchfaces/zsw_watchface_dropdown_ui.h new file mode 100644 index 00000000..5f646f1f --- /dev/null +++ b/app/src/ui/watchfaces/zsw_watchface_dropdown_ui.h @@ -0,0 +1,5 @@ +#include "applications/watchface/watchface_app.h" + +void zsw_watchface_dropdown_ui_add(lv_obj_t *root_page, watchface_app_evt_listener evt_cb); +void zsw_watchface_dropdown_ui_set_music_info(char *track_name, char *artist); +void zsw_watchface_dropdown_ui_remove(void);