From fbb77baa3b6e487f4c68e08770499cb893c4e035 Mon Sep 17 00:00:00 2001 From: jlukanc <27705324+jlukanc1@users.noreply.github.com> Date: Fri, 15 Jan 2021 22:11:53 -0500 Subject: [PATCH 01/20] add non-blocking motor controller --- src/CMakeLists.txt | 2 + src/components/motor/MotorController.cpp | 40 +++++++++++++++++ src/components/motor/MotorController.h | 57 ++++++++++++++++++++++++ 3 files changed, 99 insertions(+) create mode 100644 src/components/motor/MotorController.cpp create mode 100644 src/components/motor/MotorController.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index fde1f586..b5669414 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -36,10 +36,12 @@ set(SDK_SOURCE_FILES # Base SDK "${NRF5_SDK_PATH}/components/boards/boards.c" "${NRF5_SDK_PATH}/integration/nrfx/legacy/nrf_drv_clock.c" + "${NRF5_SDK_PATH}/integration/nrfx/legacy/nrf_drv_clock.h" "${NRF5_SDK_PATH}/modules/nrfx/drivers/src/nrfx_clock.c" "${NRF5_SDK_PATH}/modules/nrfx/drivers/src/nrfx_gpiote.c" "${NRF5_SDK_PATH}/modules/nrfx/soc/nrfx_atomic.c" "${NRF5_SDK_PATH}/modules/nrfx/drivers/src/nrfx_saadc.c" + "${NRF5_SDK_PATH}/components/libraries/timer/app_timer.h" # FreeRTOS ${NRF5_SDK_PATH}/external/freertos/source/croutine.c diff --git a/src/components/motor/MotorController.cpp b/src/components/motor/MotorController.cpp new file mode 100644 index 00000000..1885f7bd --- /dev/null +++ b/src/components/motor/MotorController.cpp @@ -0,0 +1,40 @@ +#include "MotorController.h" +#include +#include "systemtask/SystemTask.h" +#include "app_timer.h" +#include "nrf_drv_clock.h" + +APP_TIMER_DEF(vibTimer); + +using namespace Pinetime::Controllers; + +static void lfclk_request(void) //get the low freq. clock +{ + nrf_drv_clock_init(); + nrf_drv_clock_lfclk_request(NULL); +} + +void vibrateTimer(void * p_context) +{ + nrf_gpio_pin_set(pinMotor); +} + +static void create_timers() +{ + //create timer, single shot, re-armable + app_timer_create(&vibTimer, APP_TIMER_MODE_SINGLE_SHOT, vibrateTimer); +} + +void MotorController::Init() { + nrf_gpio_cfg_output(pinMotor); // set the motor pin as an output + nrf_gpio_pin_set(pinMotor); + lfclk_request(); //get lfclock ready + app_timer_init(); //start app timers to make calls + create_timers(); +} + +void MotorController::SetDuration(uint8_t motorDuration) { + nrf_gpio_pin_clear(pinMotor); + //start timer for motorDuration miliseconds + app_timer_start(vibTimer, APP_TIMER_TICKS(motorDuration), NULL); //timers trigger at end of duration? +} \ No newline at end of file diff --git a/src/components/motor/MotorController.h b/src/components/motor/MotorController.h new file mode 100644 index 00000000..6712d933 --- /dev/null +++ b/src/components/motor/MotorController.h @@ -0,0 +1,57 @@ +#pragma once + +#include + +namespace Pinetime { + namespace Controllers { + static constexpr uint8_t pinMotor = 16; + + class MotorController { + public: + void Init(); + void SetDuration(uint8_t motorDuration); + #ifndef NRF_CLOCK_ENABLED + #define NRF_CLOCK_ENABLED 1 + #endif + + #ifndef CLOCK_CONFIG_LF_SRC + #define CLOCK_CONFIG_LF_SRC 1 + #endif + + #ifndef CLOCK_CONFIG_IRQ_PRIORITY + #define CLOCK_CONFIG_IRQ_PRIORITY 6 + #endif + + #define APP_TIMER_ENABLED 1 + #define APP_TIMER_CONFIG_RTC_FREQUENCY 15 //2048hz + #define APP_TIMER_CONFIG_IRQ_PRIORITY 6 + + #ifndef APP_TIMER_CONFIG_OP_QUEUE_SIZE + #define APP_TIMER_CONFIG_OP_QUEUE_SIZE 10 + #endif + + #ifndef APP_TIMER_CONFIG_USE_SCHEDULER + #define APP_TIMER_CONFIG_USE_SCHEDULER 0 + #endif + + #ifndef APP_TIMER_KEEPS_RTC_ACTIVE + #define APP_TIMER_KEEPS_RTC_ACTIVE 0 + #endif + + #ifndef APP_TIMER_SAFE_WINDOW_MS + #define APP_TIMER_SAFE_WINDOW_MS 300000 + #endif + + #ifndef APP_TIMER_WITH_PROFILER + #define APP_TIMER_WITH_PROFILER 0 + #endif + + #ifndef APP_TIMER_CONFIG_SWI_NUMBER + #define APP_TIMER_CONFIG_SWI_NUMBER 0 + #endif + + private: + + }; + } +} \ No newline at end of file From ce6c5d3bd3691b283ac2102d1ed7b9a298928b6c Mon Sep 17 00:00:00 2001 From: jlukanc <27705324+jlukanc1@users.noreply.github.com> Date: Fri, 15 Jan 2021 22:46:03 -0500 Subject: [PATCH 02/20] add motorcontroller to cmake --- src/CMakeLists.txt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b5669414..3fe5d50a 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -376,6 +376,7 @@ list(APPEND SOURCE_FILES components/ble/ImmediateAlertService.cpp components/ble/ServiceDiscovery.cpp components/firmwarevalidator/FirmwareValidator.cpp + components/motor/MotorController.cpp drivers/Cst816s.cpp FreeRTOS/port.c FreeRTOS/port_cmsis_systick.c @@ -456,6 +457,7 @@ set(INCLUDE_FILES components/ble/ImmediateAlertService.h components/ble/ServiceDiscovery.h components/ble/BleClient.h + components/motor/MotorController.h drivers/Cst816s.h FreeRTOS/portmacro.h FreeRTOS/portmacro_cmsis.h From b5992fd7ec369d057ce4fe1b10bbc52ed4f6f988 Mon Sep 17 00:00:00 2001 From: jlukanc <27705324+jlukanc1@users.noreply.github.com> Date: Fri, 15 Jan 2021 22:49:37 -0500 Subject: [PATCH 03/20] add motor to notifs, fix tabs in motorcontroller.h --- src/components/motor/MotorController.h | 68 ++++++++++++------------ src/displayapp/screens/Notifications.cpp | 4 ++ src/displayapp/screens/Notifications.h | 2 + 3 files changed, 40 insertions(+), 34 deletions(-) diff --git a/src/components/motor/MotorController.h b/src/components/motor/MotorController.h index 6712d933..63bc9580 100644 --- a/src/components/motor/MotorController.h +++ b/src/components/motor/MotorController.h @@ -7,50 +7,50 @@ namespace Pinetime { static constexpr uint8_t pinMotor = 16; class MotorController { - public: - void Init(); - void SetDuration(uint8_t motorDuration); - #ifndef NRF_CLOCK_ENABLED - #define NRF_CLOCK_ENABLED 1 - #endif + public: + void Init(); + void SetDuration(uint8_t motorDuration); + #ifndef NRF_CLOCK_ENABLED + #define NRF_CLOCK_ENABLED 1 + #endif - #ifndef CLOCK_CONFIG_LF_SRC - #define CLOCK_CONFIG_LF_SRC 1 - #endif + #ifndef CLOCK_CONFIG_LF_SRC + #define CLOCK_CONFIG_LF_SRC 1 + #endif - #ifndef CLOCK_CONFIG_IRQ_PRIORITY - #define CLOCK_CONFIG_IRQ_PRIORITY 6 - #endif + #ifndef CLOCK_CONFIG_IRQ_PRIORITY + #define CLOCK_CONFIG_IRQ_PRIORITY 6 + #endif - #define APP_TIMER_ENABLED 1 - #define APP_TIMER_CONFIG_RTC_FREQUENCY 15 //2048hz - #define APP_TIMER_CONFIG_IRQ_PRIORITY 6 + #define APP_TIMER_ENABLED 1 + #define APP_TIMER_CONFIG_RTC_FREQUENCY 15 //2048hz + #define APP_TIMER_CONFIG_IRQ_PRIORITY 6 - #ifndef APP_TIMER_CONFIG_OP_QUEUE_SIZE - #define APP_TIMER_CONFIG_OP_QUEUE_SIZE 10 - #endif + #ifndef APP_TIMER_CONFIG_OP_QUEUE_SIZE + #define APP_TIMER_CONFIG_OP_QUEUE_SIZE 10 + #endif - #ifndef APP_TIMER_CONFIG_USE_SCHEDULER - #define APP_TIMER_CONFIG_USE_SCHEDULER 0 - #endif + #ifndef APP_TIMER_CONFIG_USE_SCHEDULER + #define APP_TIMER_CONFIG_USE_SCHEDULER 0 + #endif - #ifndef APP_TIMER_KEEPS_RTC_ACTIVE - #define APP_TIMER_KEEPS_RTC_ACTIVE 0 - #endif + #ifndef APP_TIMER_KEEPS_RTC_ACTIVE + #define APP_TIMER_KEEPS_RTC_ACTIVE 0 + #endif - #ifndef APP_TIMER_SAFE_WINDOW_MS - #define APP_TIMER_SAFE_WINDOW_MS 300000 - #endif + #ifndef APP_TIMER_SAFE_WINDOW_MS + #define APP_TIMER_SAFE_WINDOW_MS 300000 + #endif - #ifndef APP_TIMER_WITH_PROFILER - #define APP_TIMER_WITH_PROFILER 0 - #endif + #ifndef APP_TIMER_WITH_PROFILER + #define APP_TIMER_WITH_PROFILER 0 + #endif - #ifndef APP_TIMER_CONFIG_SWI_NUMBER - #define APP_TIMER_CONFIG_SWI_NUMBER 0 - #endif + #ifndef APP_TIMER_CONFIG_SWI_NUMBER + #define APP_TIMER_CONFIG_SWI_NUMBER 0 + #endif - private: + private: }; } diff --git a/src/displayapp/screens/Notifications.cpp b/src/displayapp/screens/Notifications.cpp index 51a601c4..cfcecec2 100644 --- a/src/displayapp/screens/Notifications.cpp +++ b/src/displayapp/screens/Notifications.cpp @@ -7,6 +7,9 @@ Notifications::Notifications(DisplayApp *app, Pinetime::Controllers::Notificatio Screen(app), notificationManager{notificationManager}, mode{mode} { notificationManager.ClearNewNotificationFlag(); auto notification = notificationManager.GetLastNotification(); + + motorController.Init(); //start the vibration timer setups + if(notification.valid) { currentId = notification.id; currentItem.reset(new NotificationItem("\nNotification", notification.message.data(), notification.index, notificationManager.NbNotifications(), mode)); @@ -22,6 +25,7 @@ Notifications::Notifications(DisplayApp *app, Pinetime::Controllers::Notificatio style_line.line.width = 3; style_line.line.rounded = 0; + motorController.SetDuration(35); timeoutLine = lv_line_create(lv_scr_act(), nullptr); lv_line_set_style(timeoutLine, LV_LINE_STYLE_MAIN, &style_line); diff --git a/src/displayapp/screens/Notifications.h b/src/displayapp/screens/Notifications.h index f5c6a860..345ad15a 100644 --- a/src/displayapp/screens/Notifications.h +++ b/src/displayapp/screens/Notifications.h @@ -5,6 +5,7 @@ #include #include "Screen.h" #include "components/ble/NotificationManager.h" +#include "components/motor/MotorController.h" namespace Pinetime { namespace Applications { @@ -45,6 +46,7 @@ namespace Pinetime { const char* text; }; Pinetime::Controllers::NotificationManager& notificationManager; + Pinetime::Controllers::MotorController motorController; Modes mode = Modes::Normal; std::unique_ptr currentItem; Controllers::NotificationManager::Notification::Id currentId; From 10ba20876f37c8e18307dfbc8d06d70bb94d5fae Mon Sep 17 00:00:00 2001 From: Rasmus Schenstrom Date: Tue, 27 Oct 2020 19:51:06 +0100 Subject: [PATCH 04/20] Add incoming call functionality Add categories to AlertNotification Add new alert notification screens bases Add Incoming Call Add Modal Add event to AlertNotification Co-authored-by: Robin Karlsson --- src/components/ble/AlertNotificationClient.h | 2 +- .../ble/AlertNotificationService.cpp | 34 ++++++++++++- src/components/ble/AlertNotificationService.h | 27 +++++++++- src/components/ble/NimbleController.h | 1 + src/displayapp/DisplayApp.cpp | 3 ++ src/displayapp/DisplayApp.h | 2 +- src/displayapp/screens/Modal.cpp | 50 +++++++++++++++---- src/displayapp/screens/Modal.h | 11 +++- src/systemtask/SystemTask.cpp | 4 ++ src/systemtask/SystemTask.h | 2 +- 10 files changed, 118 insertions(+), 18 deletions(-) diff --git a/src/components/ble/AlertNotificationClient.h b/src/components/ble/AlertNotificationClient.h index fa10456c..d49205e3 100644 --- a/src/components/ble/AlertNotificationClient.h +++ b/src/components/ble/AlertNotificationClient.h @@ -83,4 +83,4 @@ namespace Pinetime { bool isDescriptorFound = false; }; } -} \ No newline at end of file +} diff --git a/src/components/ble/AlertNotificationService.cpp b/src/components/ble/AlertNotificationService.cpp index 3156470c..9b9b4e9e 100644 --- a/src/components/ble/AlertNotificationService.cpp +++ b/src/components/ble/AlertNotificationService.cpp @@ -9,6 +9,7 @@ using namespace Pinetime::Controllers; constexpr ble_uuid16_t AlertNotificationService::ansUuid; constexpr ble_uuid16_t AlertNotificationService::ansCharUuid; +constexpr ble_uuid16_t AlertNotificationService::ansEventUuid; int AlertNotificationCallback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg) { @@ -33,6 +34,13 @@ AlertNotificationService::AlertNotificationService ( System::SystemTask& systemT .arg = this, .flags = BLE_GATT_CHR_F_WRITE }, + { + .uuid = (ble_uuid_t *) &ansEventUuid, + .access_cb = AlertNotificationCallback, + .arg = this, + .flags = BLE_GATT_CHR_F_NOTIFY, + .val_handle = &eventHandle + }, { 0 } @@ -61,14 +69,36 @@ int AlertNotificationService::OnAlert(uint16_t conn_handle, uint16_t attr_handle const auto dbgPacketLen = OS_MBUF_PKTLEN(ctxt->om); size_t bufferSize = std::min(dbgPacketLen + stringTerminatorSize, maxBufferSize); auto messageSize = std::min(maxMessageSize, (bufferSize-headerSize)); + uint8_t* category = new uint8_t[1]; NotificationManager::Notification notif; os_mbuf_copydata(ctxt->om, headerSize, messageSize-1, notif.message.data()); + os_mbuf_copydata(ctxt->om, 0, 1, category); notif.message[messageSize-1] = '\0'; notif.category = Pinetime::Controllers::NotificationManager::Categories::SimpleAlert; - notificationManager.Push(std::move(notif)); + Pinetime::System::SystemTask::Messages event = Pinetime::System::SystemTask::Messages::OnNewNotification; - systemTask.PushMessage(Pinetime::System::SystemTask::Messages::OnNewNotification); + switch(*category) { + case (uint8_t) 0x05: + notif.category = Pinetime::Controllers::NotificationManager::Categories::IncomingCall; + event = Pinetime::System::SystemTask::Messages::OnNewCall; + break; + } + + notificationManager.Push(std::move(notif)); + systemTask.PushMessage(event); } return 0; } + +void AlertNotificationService::event(char event) { + auto *om = ble_hs_mbuf_from_flat(&event, 1); + + uint16_t connectionHandle = systemTask.nimble().connHandle(); + + if (connectionHandle == 0 || connectionHandle == BLE_HS_CONN_HANDLE_NONE) { + return; + } + + ble_gattc_notify_custom(connectionHandle, eventHandle, om); +} diff --git a/src/components/ble/AlertNotificationService.h b/src/components/ble/AlertNotificationService.h index 120312d2..558cdf54 100644 --- a/src/components/ble/AlertNotificationService.h +++ b/src/components/ble/AlertNotificationService.h @@ -24,10 +24,28 @@ namespace Pinetime { int OnAlert(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt); + void event(char event); + + static const char EVENT_HANG_UP_CALL = 0x00; + static const char EVENT_ANSWER_CALL = 0x01; + private: + static const char ALERT_UNKNOWN = 0x01; + static const char ALERT_SIMPLE_ALERT = 0x02; + static const char ALERT_EMAIL = 0x03; + static const char ALERT_NEWS = 0x04; + static const char ALERT_INCOMING_CALL = 0x05; + static const char ALERT_MISSED_CALL = 0x06; + static const char ALERT_SMS = 0x07; + static const char ALERT_VOICE_MAIL = 0x08; + static const char ALERT_SCHEDULE = 0x09; + static const char ALERT_HIGH_PRIORITY_ALERT = 0x0a; + static const char ALERT_INSTANT_MESSAGE = 0x0b; + static constexpr uint16_t ansId {0x1811}; static constexpr uint16_t ansCharId {0x2a46}; + static constexpr uint16_t ansEventCharId = {0x2a47}; static constexpr ble_uuid16_t ansUuid { .u { .type = BLE_UUID_TYPE_16 }, @@ -39,11 +57,18 @@ namespace Pinetime { .value = ansCharId }; - struct ble_gatt_chr_def characteristicDefinition[2]; + static constexpr ble_uuid16_t ansEventUuid { + .u { .type = BLE_UUID_TYPE_16 }, + .value = ansEventCharId + }; + + struct ble_gatt_chr_def characteristicDefinition[3]; struct ble_gatt_svc_def serviceDefinition[2]; Pinetime::System::SystemTask &systemTask; NotificationManager ¬ificationManager; + + uint16_t eventHandle; }; } } diff --git a/src/components/ble/NimbleController.h b/src/components/ble/NimbleController.h index a109800c..7bb135da 100644 --- a/src/components/ble/NimbleController.h +++ b/src/components/ble/NimbleController.h @@ -58,6 +58,7 @@ namespace Pinetime { Pinetime::Controllers::MusicService& music() {return musicService;}; Pinetime::Controllers::NavigationService& navigation() {return navService;}; + Pinetime::Controllers::AlertNotificationService& alertService() {return anService;}; uint16_t connHandle(); diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index b6ad90b4..879b5f22 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -128,6 +128,9 @@ void DisplayApp::Refresh() { } } break; + case Messages::NewCall: + modal->NewNotification(notificationManager, &systemTask.nimble().alertService()); + break; case Messages::TouchEvent: { if (state != States::Running) break; auto gesture = OnTouchEvent(); diff --git a/src/displayapp/DisplayApp.h b/src/displayapp/DisplayApp.h index da5a7b22..b79df51a 100644 --- a/src/displayapp/DisplayApp.h +++ b/src/displayapp/DisplayApp.h @@ -34,7 +34,7 @@ namespace Pinetime { public: enum class States {Idle, Running}; enum class Messages : uint8_t {GoToSleep, GoToRunning, UpdateDateTime, UpdateBleConnection, UpdateBatteryLevel, TouchEvent, ButtonPushed, - NewNotification, BleFirmwareUpdateStarted }; + NewNotification, NewCall, BleFirmwareUpdateStarted }; enum class FullRefreshDirections { None, Up, Down }; enum class TouchModes { Gestures, Polling }; diff --git a/src/displayapp/screens/Modal.cpp b/src/displayapp/screens/Modal.cpp index d1a110ea..6d6768dc 100644 --- a/src/displayapp/screens/Modal.cpp +++ b/src/displayapp/screens/Modal.cpp @@ -6,10 +6,7 @@ using namespace Pinetime::Applications::Screens; extern lv_font_t jetbrains_mono_extrabold_compressed; extern lv_font_t jetbrains_mono_bold_20; -Modal::Modal(Pinetime::Applications::DisplayApp *app) : Screen(app) { - - -} +Modal::Modal(Pinetime::Applications::DisplayApp *app) : Screen(app), alertNotificationService(nullptr) {} Modal::~Modal() { lv_obj_clean(lv_scr_act()); @@ -41,13 +38,46 @@ void Modal::OnEvent(lv_obj_t *event_obj, lv_event_t evt) { if(evt == LV_EVENT_DELETE && event_obj == mbox) { Hide(); } else if(evt == LV_EVENT_VALUE_CHANGED) { - /* A button was clicked */ - lv_mbox_start_auto_close(mbox, 0); -// Hide(); + if(event_obj == mbox) { + if(strcmp(lv_mbox_get_active_btn_text(event_obj), this->positiveButton.c_str()) == 0) { + if(alertNotificationService != nullptr) { + alertNotificationService->event(Pinetime::Controllers::AlertNotificationService::EVENT_ANSWER_CALL); + } + } else { + if(alertNotificationService != nullptr) { + alertNotificationService->event(Pinetime::Controllers::AlertNotificationService::EVENT_HANG_UP_CALL); + } + } + lv_mbox_start_auto_close(mbox, 0); + } } } -void Modal::Show(const char* msg) { +void Modal::NewNotification(Pinetime::Controllers::NotificationManager ¬ificationManager, Pinetime::Controllers::AlertNotificationService* alertService) { + alertNotificationService = alertService; + auto notification = notificationManager.GetLastNotification(); + std::string msg; + if(notification.valid) { + switch(notification.category) { + case Pinetime::Controllers::NotificationManager::Categories::IncomingCall: + this->positiveButton = "Answer"; + this->negativeButton = "Hang up"; + msg += "Incoming call from:\n"; + msg += notification.message.data(); + break; + default: + this->positiveButton = "Ok"; + this->negativeButton = "Cancel"; + msg = notification.message.data(); + break; + } + + static const char *btns[] = {this->positiveButton.c_str(), this->negativeButton.c_str(), ""}; + this->Show(msg.c_str(), btns); + } +} + +void Modal::Show(const char* msg, const char *btns[]) { if(isVisible) return; isVisible = true; lv_style_copy(&modal_style, &lv_style_plain_color); @@ -60,11 +90,9 @@ void Modal::Show(const char* msg) { lv_obj_set_size(obj, LV_HOR_RES, LV_VER_RES); lv_obj_set_opa_scale_enable(obj, true); /* Enable opacity scaling for the animation */ - static const char * btns2[] = {"Ok", ""}; - /* Create the message box as a child of the modal background */ mbox = lv_mbox_create(obj, nullptr); - lv_mbox_add_btns(mbox, btns2); + lv_mbox_add_btns(mbox, btns); lv_mbox_set_text(mbox, msg); lv_obj_align(mbox, nullptr, LV_ALIGN_CENTER, 0, 0); lv_obj_set_event_cb(mbox, Modal::mbox_event_cb); diff --git a/src/displayapp/screens/Modal.h b/src/displayapp/screens/Modal.h index 9cc177f0..de7575a8 100644 --- a/src/displayapp/screens/Modal.h +++ b/src/displayapp/screens/Modal.h @@ -3,6 +3,8 @@ #include "Screen.h" #include #include +#include +#include namespace Pinetime { namespace Applications { @@ -13,7 +15,9 @@ namespace Pinetime { Modal(DisplayApp* app); ~Modal() override; - void Show(const char* msg); + + void NewNotification(Pinetime::Controllers::NotificationManager ¬ificationManager, Pinetime::Controllers::AlertNotificationService* alertService); + void Show(const char* msg, const char *btns[]); void Hide(); bool Refresh() override; @@ -23,6 +27,11 @@ namespace Pinetime { private: void OnEvent(lv_obj_t *event_obj, lv_event_t evt); + Pinetime::Controllers::AlertNotificationService* alertNotificationService = nullptr; + + std::string positiveButton; + std::string negativeButton; + lv_style_t modal_style; lv_obj_t *obj; lv_obj_t *mbox; diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index 13a84c26..2fbc8cf0 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -161,6 +161,10 @@ void SystemTask::Work() { if(isSleeping && !isWakingUp) GoToRunning(); displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::NewNotification); break; + case Messages::OnNewCall: + if(isSleeping && !isWakingUp) GoToRunning(); + displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::NewCall); + break; case Messages::BleConnected: ReloadIdleTimer(); isBleDiscoveryTimerRunning = true; diff --git a/src/systemtask/SystemTask.h b/src/systemtask/SystemTask.h index cf3f1021..7e031b52 100644 --- a/src/systemtask/SystemTask.h +++ b/src/systemtask/SystemTask.h @@ -27,7 +27,7 @@ namespace Pinetime { namespace System { class SystemTask { public: - enum class Messages {GoToSleep, GoToRunning, OnNewTime, OnNewNotification, BleConnected, + enum class Messages {GoToSleep, GoToRunning, OnNewTime, OnNewNotification, OnNewCall, BleConnected, BleFirmwareUpdateStarted, BleFirmwareUpdateFinished, OnTouchEvent, OnButtonEvent, OnDisplayTaskSleeping }; From 2d90571f0d9b86d7d7fbf414bbadd5092143c670 Mon Sep 17 00:00:00 2001 From: petter <39340152+petterhs@users.noreply.github.com> Date: Fri, 8 Jan 2021 14:21:52 +0100 Subject: [PATCH 05/20] change Notification Event UUID --- src/components/ble/AlertNotificationService.cpp | 4 ++-- src/components/ble/AlertNotificationService.h | 10 ++++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/components/ble/AlertNotificationService.cpp b/src/components/ble/AlertNotificationService.cpp index 9b9b4e9e..14d58d51 100644 --- a/src/components/ble/AlertNotificationService.cpp +++ b/src/components/ble/AlertNotificationService.cpp @@ -9,7 +9,7 @@ using namespace Pinetime::Controllers; constexpr ble_uuid16_t AlertNotificationService::ansUuid; constexpr ble_uuid16_t AlertNotificationService::ansCharUuid; -constexpr ble_uuid16_t AlertNotificationService::ansEventUuid; +constexpr ble_uuid128_t AlertNotificationService::notificationEventUuid; int AlertNotificationCallback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg) { @@ -35,7 +35,7 @@ AlertNotificationService::AlertNotificationService ( System::SystemTask& systemT .flags = BLE_GATT_CHR_F_WRITE }, { - .uuid = (ble_uuid_t *) &ansEventUuid, + .uuid = (ble_uuid_t *) ¬ificationEventUuid, .access_cb = AlertNotificationCallback, .arg = this, .flags = BLE_GATT_CHR_F_NOTIFY, diff --git a/src/components/ble/AlertNotificationService.h b/src/components/ble/AlertNotificationService.h index 558cdf54..7c99d3de 100644 --- a/src/components/ble/AlertNotificationService.h +++ b/src/components/ble/AlertNotificationService.h @@ -7,6 +7,9 @@ #undef max #undef min +//c7e50000-78fc-48fe-8e23-433b3a1942d1 +#define NOTIFICATION_EVENT_SERVICE_UUID_BASE {0xd1, 0x42, 0x19, 0x3a, 0x3b, 0x43, 0x23, 0x8e, 0xfe, 0x48, 0xfc, 0x78, 0x00, 0x00, 0xe5, 0xc7} + namespace Pinetime { namespace System { @@ -45,7 +48,6 @@ namespace Pinetime { static constexpr uint16_t ansId {0x1811}; static constexpr uint16_t ansCharId {0x2a46}; - static constexpr uint16_t ansEventCharId = {0x2a47}; static constexpr ble_uuid16_t ansUuid { .u { .type = BLE_UUID_TYPE_16 }, @@ -57,9 +59,9 @@ namespace Pinetime { .value = ansCharId }; - static constexpr ble_uuid16_t ansEventUuid { - .u { .type = BLE_UUID_TYPE_16 }, - .value = ansEventCharId + static constexpr ble_uuid128_t notificationEventUuid { + .u { .type = BLE_UUID_TYPE_128 }, + .value = NOTIFICATION_EVENT_SERVICE_UUID_BASE }; struct ble_gatt_chr_def characteristicDefinition[3]; From 6d76dbc9117693cc611ba106d696222580dbdc95 Mon Sep 17 00:00:00 2001 From: petter <39340152+petterhs@users.noreply.github.com> Date: Thu, 21 Jan 2021 23:36:17 +0100 Subject: [PATCH 06/20] change Notification Event base UUID --- .../ble/AlertNotificationService.cpp | 2 +- src/components/ble/AlertNotificationService.h | 26 +++++++++---------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/components/ble/AlertNotificationService.cpp b/src/components/ble/AlertNotificationService.cpp index 14d58d51..88d2ea8a 100644 --- a/src/components/ble/AlertNotificationService.cpp +++ b/src/components/ble/AlertNotificationService.cpp @@ -79,7 +79,7 @@ int AlertNotificationService::OnAlert(uint16_t conn_handle, uint16_t attr_handle Pinetime::System::SystemTask::Messages event = Pinetime::System::SystemTask::Messages::OnNewNotification; switch(*category) { - case (uint8_t) 0x05: + case (uint8_t) ANS_TYPE_NOTIFICATION_CALL: notif.category = Pinetime::Controllers::NotificationManager::Categories::IncomingCall; event = Pinetime::System::SystemTask::Messages::OnNewCall; break; diff --git a/src/components/ble/AlertNotificationService.h b/src/components/ble/AlertNotificationService.h index 7c99d3de..17153681 100644 --- a/src/components/ble/AlertNotificationService.h +++ b/src/components/ble/AlertNotificationService.h @@ -7,8 +7,8 @@ #undef max #undef min -//c7e50000-78fc-48fe-8e23-433b3a1942d1 -#define NOTIFICATION_EVENT_SERVICE_UUID_BASE {0xd1, 0x42, 0x19, 0x3a, 0x3b, 0x43, 0x23, 0x8e, 0xfe, 0x48, 0xfc, 0x78, 0x00, 0x00, 0xe5, 0xc7} +//00020000-78fc-48fe-8e23-433b3a1942d0 +#define NOTIFICATION_EVENT_SERVICE_UUID_BASE {0xd0, 0x42, 0x19, 0x3a, 0x3b, 0x43, 0x23, 0x8e, 0xfe, 0x48, 0xfc, 0x78, 0x00, 0x00, 0x02, 0x00} namespace Pinetime { @@ -34,17 +34,17 @@ namespace Pinetime { private: - static const char ALERT_UNKNOWN = 0x01; - static const char ALERT_SIMPLE_ALERT = 0x02; - static const char ALERT_EMAIL = 0x03; - static const char ALERT_NEWS = 0x04; - static const char ALERT_INCOMING_CALL = 0x05; - static const char ALERT_MISSED_CALL = 0x06; - static const char ALERT_SMS = 0x07; - static const char ALERT_VOICE_MAIL = 0x08; - static const char ALERT_SCHEDULE = 0x09; - static const char ALERT_HIGH_PRIORITY_ALERT = 0x0a; - static const char ALERT_INSTANT_MESSAGE = 0x0b; + static const char ANS_TYPE_SIMPLE_ALERT = 0x00; + static const char ANS_TYPE_EMAIL = 0x01; + static const char ANS_TYPE_NEWS = 0x02; + static const char ANS_TYPE_NOTIFICATION_CALL = 0x03; + static const char ANS_TYPE_MISSED_CALL = 0x04; + static const char ANS_TYPE_SMS_MMS = 0x05; + static const char ANS_TYPE_VOICE_MAIL = 0x06; + static const char ANS_TYPE_SCHEDULE = 0x07; + static const char ANS_TYPE_HIGH_PRIORITIZED_ALERT = 0x08; + static const char ANS_TYPE_INSTANT_MESSAGE = 0x09; + static const char ANS_TYPE_ALL_ALERTS = 0xff; static constexpr uint16_t ansId {0x1811}; static constexpr uint16_t ansCharId {0x2a46}; From bf7d77bd341de7360d7e4331ee088dc7a72620fc Mon Sep 17 00:00:00 2001 From: jlukanc <27705324+jlukanc1@users.noreply.github.com> Date: Sat, 23 Jan 2021 15:15:42 -0500 Subject: [PATCH 07/20] remove unneeded defines --- src/components/motor/MotorController.cpp | 1 - src/components/motor/MotorController.h | 39 +----------------------- 2 files changed, 1 insertion(+), 39 deletions(-) diff --git a/src/components/motor/MotorController.cpp b/src/components/motor/MotorController.cpp index 1885f7bd..738e6d33 100644 --- a/src/components/motor/MotorController.cpp +++ b/src/components/motor/MotorController.cpp @@ -4,7 +4,6 @@ #include "app_timer.h" #include "nrf_drv_clock.h" -APP_TIMER_DEF(vibTimer); using namespace Pinetime::Controllers; diff --git a/src/components/motor/MotorController.h b/src/components/motor/MotorController.h index 63bc9580..01fe9304 100644 --- a/src/components/motor/MotorController.h +++ b/src/components/motor/MotorController.h @@ -10,45 +10,8 @@ namespace Pinetime { public: void Init(); void SetDuration(uint8_t motorDuration); - #ifndef NRF_CLOCK_ENABLED - #define NRF_CLOCK_ENABLED 1 - #endif - #ifndef CLOCK_CONFIG_LF_SRC - #define CLOCK_CONFIG_LF_SRC 1 - #endif - - #ifndef CLOCK_CONFIG_IRQ_PRIORITY - #define CLOCK_CONFIG_IRQ_PRIORITY 6 - #endif - - #define APP_TIMER_ENABLED 1 - #define APP_TIMER_CONFIG_RTC_FREQUENCY 15 //2048hz - #define APP_TIMER_CONFIG_IRQ_PRIORITY 6 - - #ifndef APP_TIMER_CONFIG_OP_QUEUE_SIZE - #define APP_TIMER_CONFIG_OP_QUEUE_SIZE 10 - #endif - - #ifndef APP_TIMER_CONFIG_USE_SCHEDULER - #define APP_TIMER_CONFIG_USE_SCHEDULER 0 - #endif - - #ifndef APP_TIMER_KEEPS_RTC_ACTIVE - #define APP_TIMER_KEEPS_RTC_ACTIVE 0 - #endif - - #ifndef APP_TIMER_SAFE_WINDOW_MS - #define APP_TIMER_SAFE_WINDOW_MS 300000 - #endif - - #ifndef APP_TIMER_WITH_PROFILER - #define APP_TIMER_WITH_PROFILER 0 - #endif - - #ifndef APP_TIMER_CONFIG_SWI_NUMBER - #define APP_TIMER_CONFIG_SWI_NUMBER 0 - #endif + APP_TIMER_DEF(vibTimer); private: From 4cbcc99c8dfbd27bf3c87ef1c2b13af871a9c269 Mon Sep 17 00:00:00 2001 From: jlukanc <27705324+jlukanc1@users.noreply.github.com> Date: Sat, 23 Jan 2021 16:12:06 -0500 Subject: [PATCH 08/20] fis merge conflict? --- src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 3fe5d50a..0ed2562f 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -457,7 +457,6 @@ set(INCLUDE_FILES components/ble/ImmediateAlertService.h components/ble/ServiceDiscovery.h components/ble/BleClient.h - components/motor/MotorController.h drivers/Cst816s.h FreeRTOS/portmacro.h FreeRTOS/portmacro_cmsis.h @@ -474,6 +473,7 @@ set(INCLUDE_FILES systemtask/SystemMonitor.h displayapp/screens/Symbols.h drivers/TwiMaster.h + components/motor/MotorController.h ) include_directories( From 51c8cadcb78bdbe9013f5aace629c96ed3dfd06f Mon Sep 17 00:00:00 2001 From: jlukanc <27705324+jlukanc1@users.noreply.github.com> Date: Sat, 23 Jan 2021 16:13:58 -0500 Subject: [PATCH 09/20] fix merge issue --- src/CMakeLists.txt | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0ed2562f..b66f2ece 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -473,6 +473,11 @@ set(INCLUDE_FILES systemtask/SystemMonitor.h displayapp/screens/Symbols.h drivers/TwiMaster.h + heartratetask/HeartRateTask.h + components/heartrate/Ppg.h + components/heartrate/Biquad.h + components/heartrate/Ptagc.h + components/heartrate/HeartRateController.h components/motor/MotorController.h ) From 219bafb01ac11a2dc0591d37f00e1acc6d478b54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Milants?= Date: Sun, 24 Jan 2021 17:22:39 +0100 Subject: [PATCH 10/20] Handle call notification the same way than other notifications. Display the call notifications in the Notification app, with buttons to accept/reject the call. --- src/CMakeLists.txt | 2 - .../ble/AlertNotificationService.cpp | 34 +++-- src/components/ble/AlertNotificationService.h | 38 ++--- src/displayapp/DisplayApp.cpp | 11 +- src/displayapp/DisplayApp.h | 3 +- src/displayapp/screens/Navigation.h | 4 +- src/displayapp/screens/Notifications.cpp | 133 +++++++++++++++--- src/displayapp/screens/Notifications.h | 46 +++--- src/displayapp/screens/Tile.cpp | 1 - src/displayapp/screens/Tile.h | 2 - src/main.cpp | 4 +- src/systemtask/SystemTask.cpp | 7 +- src/systemtask/SystemTask.h | 3 +- 13 files changed, 198 insertions(+), 90 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5955d393..fda2b48e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -426,7 +426,6 @@ list(APPEND SOURCE_FILES displayapp/screens/InfiniPaint.cpp displayapp/screens/Paddle.cpp displayapp/screens/DropDownDemo.cpp - displayapp/screens/Modal.cpp displayapp/screens/BatteryIcon.cpp displayapp/screens/BleIcon.cpp displayapp/screens/NotificationIcon.cpp @@ -520,7 +519,6 @@ set(INCLUDE_FILES displayapp/screens/InfiniPaint.h displayapp/screens/Paddle.h displayapp/screens/DropDownDemo.h - displayapp/screens/Modal.h displayapp/screens/BatteryIcon.h displayapp/screens/BleIcon.h displayapp/screens/NotificationIcon.h diff --git a/src/components/ble/AlertNotificationService.cpp b/src/components/ble/AlertNotificationService.cpp index 88d2ea8a..5fb8338b 100644 --- a/src/components/ble/AlertNotificationService.cpp +++ b/src/components/ble/AlertNotificationService.cpp @@ -69,30 +69,46 @@ int AlertNotificationService::OnAlert(uint16_t conn_handle, uint16_t attr_handle const auto dbgPacketLen = OS_MBUF_PKTLEN(ctxt->om); size_t bufferSize = std::min(dbgPacketLen + stringTerminatorSize, maxBufferSize); auto messageSize = std::min(maxMessageSize, (bufferSize-headerSize)); - uint8_t* category = new uint8_t[1]; + Categories category; NotificationManager::Notification notif; os_mbuf_copydata(ctxt->om, headerSize, messageSize-1, notif.message.data()); - os_mbuf_copydata(ctxt->om, 0, 1, category); + os_mbuf_copydata(ctxt->om, 0, 1, &category); notif.message[messageSize-1] = '\0'; - notif.category = Pinetime::Controllers::NotificationManager::Categories::SimpleAlert; - Pinetime::System::SystemTask::Messages event = Pinetime::System::SystemTask::Messages::OnNewNotification; - switch(*category) { - case (uint8_t) ANS_TYPE_NOTIFICATION_CALL: + // TODO convert all ANS categories to NotificationController categories + switch(category) { + case Categories::Call: notif.category = Pinetime::Controllers::NotificationManager::Categories::IncomingCall; - event = Pinetime::System::SystemTask::Messages::OnNewCall; + break; + default: + notif.category = Pinetime::Controllers::NotificationManager::Categories::SimpleAlert; break; } + auto event = Pinetime::System::SystemTask::Messages::OnNewNotification; notificationManager.Push(std::move(notif)); systemTask.PushMessage(event); } return 0; } -void AlertNotificationService::event(char event) { - auto *om = ble_hs_mbuf_from_flat(&event, 1); +void AlertNotificationService::AcceptIncomingCall() { + auto response = IncomingCallResponses::Answer; + auto *om = ble_hs_mbuf_from_flat(&response, 1); + + uint16_t connectionHandle = systemTask.nimble().connHandle(); + + if (connectionHandle == 0 || connectionHandle == BLE_HS_CONN_HANDLE_NONE) { + return; + } + + ble_gattc_notify_custom(connectionHandle, eventHandle, om); +} + +void AlertNotificationService::RejectIncomingCall() { + auto response = IncomingCallResponses::Reject; + auto *om = ble_hs_mbuf_from_flat(&response, 1); uint16_t connectionHandle = systemTask.nimble().connHandle(); diff --git a/src/components/ble/AlertNotificationService.h b/src/components/ble/AlertNotificationService.h index 17153681..612a8a32 100644 --- a/src/components/ble/AlertNotificationService.h +++ b/src/components/ble/AlertNotificationService.h @@ -7,8 +7,8 @@ #undef max #undef min -//00020000-78fc-48fe-8e23-433b3a1942d0 -#define NOTIFICATION_EVENT_SERVICE_UUID_BASE {0xd0, 0x42, 0x19, 0x3a, 0x3b, 0x43, 0x23, 0x8e, 0xfe, 0x48, 0xfc, 0x78, 0x00, 0x00, 0x02, 0x00} +//00020001-78fc-48fe-8e23-433b3a1942d0 +#define NOTIFICATION_EVENT_SERVICE_UUID_BASE {0xd0, 0x42, 0x19, 0x3a, 0x3b, 0x43, 0x23, 0x8e, 0xfe, 0x48, 0xfc, 0x78, 0x01, 0x00, 0x02, 0x00} namespace Pinetime { @@ -27,24 +27,28 @@ namespace Pinetime { int OnAlert(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt); - void event(char event); - - static const char EVENT_HANG_UP_CALL = 0x00; - static const char EVENT_ANSWER_CALL = 0x01; + void AcceptIncomingCall(); + void RejectIncomingCall(); + enum class IncomingCallResponses : uint8_t { + Reject = 0x00, + Answer = 0x01 + }; private: - static const char ANS_TYPE_SIMPLE_ALERT = 0x00; - static const char ANS_TYPE_EMAIL = 0x01; - static const char ANS_TYPE_NEWS = 0x02; - static const char ANS_TYPE_NOTIFICATION_CALL = 0x03; - static const char ANS_TYPE_MISSED_CALL = 0x04; - static const char ANS_TYPE_SMS_MMS = 0x05; - static const char ANS_TYPE_VOICE_MAIL = 0x06; - static const char ANS_TYPE_SCHEDULE = 0x07; - static const char ANS_TYPE_HIGH_PRIORITIZED_ALERT = 0x08; - static const char ANS_TYPE_INSTANT_MESSAGE = 0x09; - static const char ANS_TYPE_ALL_ALERTS = 0xff; + enum class Categories : uint8_t { + SimpleAlert = 0x00, + Email = 0x01, + News = 0x02, + Call = 0x03, + MissedCall = 0x04, + MmsSms = 0x05, + VoiceMail = 0x06, + Schedule = 0x07, + HighPrioritizedAlert = 0x08, + InstantMessage = 0x09, + All = 0xff + }; static constexpr uint16_t ansId {0x1811}; static constexpr uint16_t ansCharId {0x2a46}; diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index 879b5f22..292c21f1 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -46,7 +46,6 @@ DisplayApp::DisplayApp(Drivers::St7789 &lcd, Components::LittleVgl &lvgl, Driver heartRateController{heartRateController} { msgQueue = xQueueCreate(queueSize, itemSize); onClockApp = true; - modal.reset(new Screens::Modal(this)); } void DisplayApp::Start() { @@ -110,9 +109,6 @@ void DisplayApp::Refresh() { brightnessController.Restore(); state = States::Running; break; - case Messages::UpdateDateTime: -// modal->Show(); - break; case Messages::UpdateBleConnection: // clockScreen.SetBleConnectionState(bleController.IsConnected() ? Screens::Clock::BleConnectionStates::Connected : Screens::Clock::BleConnectionStates::NotConnected); break; @@ -124,13 +120,10 @@ void DisplayApp::Refresh() { currentScreen.reset(nullptr); lvgl.SetFullRefresh(Components::LittleVgl::FullRefreshDirections::Up); onClockApp = false; - currentScreen.reset(new Screens::Notifications(this, notificationManager, Screens::Notifications::Modes::Preview)); + currentScreen.reset(new Screens::Notifications(this, notificationManager, systemTask.nimble().alertService(), Screens::Notifications::Modes::Preview)); } } break; - case Messages::NewCall: - modal->NewNotification(notificationManager, &systemTask.nimble().alertService()); - break; case Messages::TouchEvent: { if (state != States::Running) break; auto gesture = OnTouchEvent(); @@ -218,7 +211,7 @@ void DisplayApp::RunningState() { case Apps::Music : currentScreen.reset(new Screens::Music(this, systemTask.nimble().music())); break; case Apps::Navigation : currentScreen.reset(new Screens::Navigation(this, systemTask.nimble().navigation())); break; case Apps::FirmwareValidation: currentScreen.reset(new Screens::FirmwareValidation(this, validator)); break; - case Apps::Notifications: currentScreen.reset(new Screens::Notifications(this, notificationManager, Screens::Notifications::Modes::Normal)); break; + case Apps::Notifications: currentScreen.reset(new Screens::Notifications(this, notificationManager, systemTask.nimble().alertService(), Screens::Notifications::Modes::Normal)); break; case Apps::HeartRate: currentScreen.reset(new Screens::HeartRate(this, heartRateController)); break; } nextApp = Apps::None; diff --git a/src/displayapp/DisplayApp.h b/src/displayapp/DisplayApp.h index b79df51a..077cbba0 100644 --- a/src/displayapp/DisplayApp.h +++ b/src/displayapp/DisplayApp.h @@ -34,7 +34,7 @@ namespace Pinetime { public: enum class States {Idle, Running}; enum class Messages : uint8_t {GoToSleep, GoToRunning, UpdateDateTime, UpdateBleConnection, UpdateBatteryLevel, TouchEvent, ButtonPushed, - NewNotification, NewCall, BleFirmwareUpdateStarted }; + NewNotification, BleFirmwareUpdateStarted }; enum class FullRefreshDirections { None, Up, Down }; enum class TouchModes { Gestures, Polling }; @@ -85,7 +85,6 @@ namespace Pinetime { Apps nextApp = Apps::None; bool onClockApp = false; // TODO find a better way to know that we should handle gestures and button differently for the Clock app. Controllers::BrightnessController brightnessController; - std::unique_ptr modal; Pinetime::Controllers::NotificationManager& notificationManager; Pinetime::Controllers::FirmwareValidator validator; TouchModes touchMode = TouchModes::Gestures; diff --git a/src/displayapp/screens/Navigation.h b/src/displayapp/screens/Navigation.h index 9fdd37d9..ab622496 100644 --- a/src/displayapp/screens/Navigation.h +++ b/src/displayapp/screens/Navigation.h @@ -145,7 +145,7 @@ namespace Pinetime { const lv_img_dsc_t* iconForName(std::string icon); - std::array, 89 > m_iconMap = { { + std::array, 89 > m_iconMap;/* = { { {"arrive-left", &arrive_left}, {"arrive-right", &arrive_right}, {"arrive-straight", &arrive_straight}, @@ -231,7 +231,7 @@ namespace Pinetime { {"turn-slight-right", &turn_slight_right}, {"turn-straight", &turn_straight}, {"updown", &updown}, - {"uturn", &uturn} } }; + {"uturn", &uturn} } };*/ }; } } diff --git a/src/displayapp/screens/Notifications.cpp b/src/displayapp/screens/Notifications.cpp index 51a601c4..79189164 100644 --- a/src/displayapp/screens/Notifications.cpp +++ b/src/displayapp/screens/Notifications.cpp @@ -1,18 +1,34 @@ #include "Notifications.h" #include +#include "components/ble/MusicService.h" using namespace Pinetime::Applications::Screens; -Notifications::Notifications(DisplayApp *app, Pinetime::Controllers::NotificationManager ¬ificationManager, Modes mode) : - Screen(app), notificationManager{notificationManager}, mode{mode} { +Notifications::Notifications(DisplayApp *app, + Pinetime::Controllers::NotificationManager ¬ificationManager, + Pinetime::Controllers::AlertNotificationService& alertNotificationService, + Modes mode) : + Screen(app), notificationManager{notificationManager}, alertNotificationService{alertNotificationService}, mode{mode} { notificationManager.ClearNewNotificationFlag(); auto notification = notificationManager.GetLastNotification(); if(notification.valid) { currentId = notification.id; - currentItem.reset(new NotificationItem("\nNotification", notification.message.data(), notification.index, notificationManager.NbNotifications(), mode)); + currentItem.reset(new NotificationItem("\nNotification", + notification.message.data(), + notification.index, + notification.category, + notificationManager.NbNotifications(), + mode, + alertNotificationService)); validDisplay = true; } else { - currentItem.reset(new NotificationItem("\nNotification", "No notification to display", 0, notificationManager.NbNotifications(), Modes::Preview)); + currentItem.reset(new NotificationItem("\nNotification", + "No notification to display", + 0, + notification.category, + notificationManager.NbNotifications(), + Modes::Preview, + alertNotificationService)); } if(mode == Modes::Preview) { @@ -69,7 +85,13 @@ bool Notifications::OnTouchEvent(Pinetime::Applications::TouchEvents event) { currentId = previousNotification.id; currentItem.reset(nullptr); app->SetFullRefresh(DisplayApp::FullRefreshDirections::Up); - currentItem.reset(new NotificationItem("\nNotification", previousNotification.message.data(), previousNotification.index, notificationManager.NbNotifications(), mode)); + currentItem.reset(new NotificationItem("\nNotification", + previousNotification.message.data(), + previousNotification.index, + previousNotification.category, + notificationManager.NbNotifications(), + mode, + alertNotificationService)); } return true; case Pinetime::Applications::TouchEvents::SwipeDown: { @@ -85,7 +107,13 @@ bool Notifications::OnTouchEvent(Pinetime::Applications::TouchEvents event) { currentId = nextNotification.id; currentItem.reset(nullptr); app->SetFullRefresh(DisplayApp::FullRefreshDirections::Down); - currentItem.reset(new NotificationItem("\nNotification", nextNotification.message.data(), nextNotification.index, notificationManager.NbNotifications(), mode)); + currentItem.reset(new NotificationItem("\nNotification", + nextNotification.message.data(), + nextNotification.index, + nextNotification.category, + notificationManager.NbNotifications(), + mode, + alertNotificationService)); } return true; default: @@ -99,9 +127,26 @@ bool Notifications::OnButtonPushed() { return true; } +namespace { + static void AcceptIncomingCallEventHandler(lv_obj_t *obj, lv_event_t event) { + auto* item = static_cast(obj->user_data); + item->OnAcceptIncomingCall(event); + } -Notifications::NotificationItem::NotificationItem(const char *title, const char *msg, uint8_t notifNr, uint8_t notifNb, Modes mode) - : notifNr{notifNr}, notifNb{notifNb}, mode{mode} { + static void RejectIncomingCallEventHandler(lv_obj_t *obj, lv_event_t event) { + auto* item = static_cast(obj->user_data); + item->OnRejectIncomingCall(event); + } +} + +Notifications::NotificationItem::NotificationItem(const char *title, + const char *msg, + uint8_t notifNr, + Controllers::NotificationManager::Categories category, + uint8_t notifNb, + Modes mode, + Pinetime::Controllers::AlertNotificationService& alertNotificationService) + : notifNr{notifNr}, notifNb{notifNb}, mode{mode}, alertNotificationService{alertNotificationService} { container1 = lv_cont_create(lv_scr_act(), nullptr); static lv_style_t contStyle; lv_style_copy(&contStyle, lv_cont_get_style(container1, LV_CONT_STYLE_MAIN)); @@ -142,16 +187,59 @@ Notifications::NotificationItem::NotificationItem(const char *title, const char auto titleHeight = lv_obj_get_height(t1); - l1 = lv_label_create(container1, nullptr); - lv_label_set_style(l1, LV_LABEL_STYLE_MAIN, &textStyle); - lv_obj_set_pos(l1, textStyle.body.padding.left, - titleHeight + offscreenOffset + textStyle.body.padding.bottom + - textStyle.body.padding.top); + switch(category) { + default: { + l1 = lv_label_create(container1, nullptr); + lv_label_set_style(l1, LV_LABEL_STYLE_MAIN, &textStyle); + lv_obj_set_pos(l1, textStyle.body.padding.left, + titleHeight + offscreenOffset + textStyle.body.padding.bottom + + textStyle.body.padding.top); - lv_label_set_long_mode(l1, LV_LABEL_LONG_BREAK); - lv_label_set_body_draw(l1, true); - lv_obj_set_width(l1, LV_HOR_RES - (textStyle.body.padding.left + textStyle.body.padding.right)); - lv_label_set_text(l1, msg); + lv_label_set_long_mode(l1, LV_LABEL_LONG_BREAK); + lv_label_set_body_draw(l1, true); + lv_obj_set_width(l1, LV_HOR_RES - (textStyle.body.padding.left + textStyle.body.padding.right)); + lv_label_set_text(l1, msg); + } + break; + case Controllers::NotificationManager::Categories::IncomingCall: { + l1 = lv_label_create(container1, nullptr); + lv_label_set_style(l1, LV_LABEL_STYLE_MAIN, &textStyle); + lv_obj_set_pos(l1, textStyle.body.padding.left, + titleHeight + offscreenOffset + textStyle.body.padding.bottom + + textStyle.body.padding.top); + + lv_label_set_long_mode(l1, LV_LABEL_LONG_BREAK); + lv_label_set_body_draw(l1, true); + lv_obj_set_width(l1, LV_HOR_RES - (textStyle.body.padding.left + textStyle.body.padding.right)); + lv_label_set_text(l1, "Incoming call from "); + auto l1Height = lv_obj_get_height(l1); + + l2 = lv_label_create(container1, nullptr); + lv_label_set_style(l2, LV_LABEL_STYLE_MAIN, &textStyle); + lv_obj_set_pos(l2, textStyle.body.padding.left, + titleHeight + l1Height + offscreenOffset + (textStyle.body.padding.bottom*2) + + (textStyle.body.padding.top*2)); + lv_label_set_long_mode(l2, LV_LABEL_LONG_BREAK); + lv_label_set_body_draw(l2, true); + lv_obj_set_width(l2, LV_HOR_RES - (textStyle.body.padding.left + textStyle.body.padding.right)); + lv_label_set_text(l2, msg); + + bt_accept = lv_btn_create(container1, nullptr); + lv_obj_align(bt_accept, lv_scr_act(), LV_ALIGN_IN_BOTTOM_LEFT, 0, -20); + bt_accept->user_data = this; + lv_obj_set_event_cb(bt_accept, AcceptIncomingCallEventHandler); + + label_accept = lv_label_create(bt_accept, nullptr); + lv_label_set_text(label_accept, "Accept"); + + bt_reject = lv_btn_create(container1, nullptr); + lv_obj_align(bt_reject, lv_scr_act(), LV_ALIGN_IN_BOTTOM_RIGHT, 0, -20); + bt_reject->user_data = this; + lv_obj_set_event_cb(bt_reject, RejectIncomingCallEventHandler); + label_reject = lv_label_create(bt_reject, nullptr); + lv_label_set_text(label_reject, "Reject"); + } + } if(mode == Modes::Normal) { if(notifNr < notifNb) { @@ -166,6 +254,17 @@ Notifications::NotificationItem::NotificationItem(const char *title, const char } } +void Notifications::NotificationItem::OnAcceptIncomingCall(lv_event_t event) { + if (event != LV_EVENT_CLICKED) return; + + alertNotificationService.AcceptIncomingCall(); +} + +void Notifications::NotificationItem::OnRejectIncomingCall(lv_event_t event) { + if (event != LV_EVENT_CLICKED) return; + + alertNotificationService.RejectIncomingCall(); +} Notifications::NotificationItem::~NotificationItem() { lv_obj_clean(lv_scr_act()); diff --git a/src/displayapp/screens/Notifications.h b/src/displayapp/screens/Notifications.h index f5c6a860..4305c796 100644 --- a/src/displayapp/screens/Notifications.h +++ b/src/displayapp/screens/Notifications.h @@ -19,27 +19,37 @@ namespace Pinetime { bool OnButtonPushed() override; bool OnTouchEvent(Pinetime::Applications::TouchEvents event) override; + class NotificationItem { + public: + NotificationItem(const char* title, const char* msg, uint8_t notifNr, Controllers::NotificationManager::Categories, uint8_t notifNb, Modes mode, Pinetime::Controllers::AlertNotificationService& alertNotificationService); + ~NotificationItem(); + bool Refresh() {return false;} + void OnAcceptIncomingCall(lv_event_t event); + void OnRejectIncomingCall(lv_event_t event); + + private: + uint8_t notifNr = 0; + uint8_t notifNb = 0; + char pageText[4]; + + lv_obj_t* container1; + lv_obj_t* t1; + lv_obj_t* l1; + lv_obj_t* l2; + lv_obj_t* bt_accept; + lv_obj_t* bt_reject; + lv_obj_t* label_accept; + lv_obj_t* label_reject; + lv_obj_t* bottomPlaceholder; + Modes mode; + Pinetime::Controllers::AlertNotificationService& alertNotificationService; + + + }; + private: bool running = true; - class NotificationItem { - public: - NotificationItem(const char* title, const char* msg, uint8_t notifNr, uint8_t notifNb, Modes mode); - ~NotificationItem(); - bool Refresh() {return false;} - - private: - uint8_t notifNr = 0; - uint8_t notifNb = 0; - char pageText[4]; - - lv_obj_t* container1; - lv_obj_t* t1; - lv_obj_t* l1; - lv_obj_t* bottomPlaceholder; - Modes mode; - }; - struct NotificationData { const char* title; const char* text; diff --git a/src/displayapp/screens/Tile.cpp b/src/displayapp/screens/Tile.cpp index c1a5e94f..214d2736 100644 --- a/src/displayapp/screens/Tile.cpp +++ b/src/displayapp/screens/Tile.cpp @@ -22,7 +22,6 @@ Tile::Tile(DisplayApp* app, std::array& applications) : Screen( appIndex++; } } - modal.reset(new Modal(app)); btnm1 = lv_btnm_create(lv_scr_act(), nullptr); lv_btnm_set_map(btnm1, btnm_map1); diff --git a/src/displayapp/screens/Tile.h b/src/displayapp/screens/Tile.h index 7edf67b2..bf3f5d67 100644 --- a/src/displayapp/screens/Tile.h +++ b/src/displayapp/screens/Tile.h @@ -29,8 +29,6 @@ namespace Pinetime { lv_obj_t * btnm1; bool running = true; - std::unique_ptr modal; - const char* btnm_map1[8]; Pinetime::Applications::Apps apps[6]; }; diff --git a/src/main.cpp b/src/main.cpp index 3b993ee9..01ee3d86 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -98,8 +98,6 @@ void ble_manager_set_ble_disconnection_callback(void (*disconnection)()); static constexpr uint8_t pinTouchIrq = 28; std::unique_ptr systemTask; -Pinetime::Controllers::NotificationManager notificationManager; - void nrfx_gpiote_evt_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action) { if(pin == pinTouchIrq) { systemTask->OnTouchEvent(); @@ -241,7 +239,7 @@ int main(void) { debounceTimer = xTimerCreate ("debounceTimer", 200, pdFALSE, (void *) 0, DebounceTimerCallback); systemTask.reset(new Pinetime::System::SystemTask(spi, lcd, spiNorFlash, twiMaster, touchPanel, lvgl, batteryController, bleController, - dateTimeController, notificationManager, heartRateSensor)); + dateTimeController, heartRateSensor)); systemTask->Start(); nimble_port_init(); diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index 2fbc8cf0..f998ac82 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -40,13 +40,12 @@ SystemTask::SystemTask(Drivers::SpiMaster &spi, Drivers::St7789 &lcd, Components::LittleVgl &lvgl, Controllers::Battery &batteryController, Controllers::Ble &bleController, Controllers::DateTime &dateTimeController, - Pinetime::Controllers::NotificationManager& notificationManager, Pinetime::Drivers::Hrs3300& heartRateSensor) : spi{spi}, lcd{lcd}, spiNorFlash{spiNorFlash}, twiMaster{twiMaster}, touchPanel{touchPanel}, lvgl{lvgl}, batteryController{batteryController}, heartRateController{*this}, bleController{bleController}, dateTimeController{dateTimeController}, - watchdog{}, watchdogView{watchdog}, notificationManager{notificationManager}, + watchdog{}, watchdogView{watchdog}, heartRateSensor{heartRateSensor}, nimbleController(*this, bleController,dateTimeController, notificationManager, batteryController, spiNorFlash, heartRateController) { systemTasksMsgQueue = xQueueCreate(10, 1); @@ -161,10 +160,6 @@ void SystemTask::Work() { if(isSleeping && !isWakingUp) GoToRunning(); displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::NewNotification); break; - case Messages::OnNewCall: - if(isSleeping && !isWakingUp) GoToRunning(); - displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::NewCall); - break; case Messages::BleConnected: ReloadIdleTimer(); isBleDiscoveryTimerRunning = true; diff --git a/src/systemtask/SystemTask.h b/src/systemtask/SystemTask.h index 7e031b52..ed3574c0 100644 --- a/src/systemtask/SystemTask.h +++ b/src/systemtask/SystemTask.h @@ -37,7 +37,6 @@ namespace Pinetime { Components::LittleVgl &lvgl, Controllers::Battery &batteryController, Controllers::Ble &bleController, Controllers::DateTime &dateTimeController, - Pinetime::Controllers::NotificationManager& manager, Pinetime::Drivers::Hrs3300& heartRateSensor); @@ -73,7 +72,7 @@ namespace Pinetime { std::atomic isWakingUp{false}; Pinetime::Drivers::Watchdog watchdog; Pinetime::Drivers::WatchdogView watchdogView; - Pinetime::Controllers::NotificationManager& notificationManager; + Pinetime::Controllers::NotificationManager notificationManager; Pinetime::Drivers::Hrs3300& heartRateSensor; Pinetime::Controllers::NimbleController nimbleController; From 3d1881c5ab39fb5caf1cbb217fd227d0897b4ed1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Fran=C3=A7ois=20Milants?= Date: Sun, 24 Jan 2021 17:27:48 +0100 Subject: [PATCH 11/20] Revert invalid changes in Navigation.h and add missing changes in Notifications.h. --- src/displayapp/screens/Navigation.h | 4 ++-- src/displayapp/screens/Notifications.h | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/displayapp/screens/Navigation.h b/src/displayapp/screens/Navigation.h index ab622496..9fdd37d9 100644 --- a/src/displayapp/screens/Navigation.h +++ b/src/displayapp/screens/Navigation.h @@ -145,7 +145,7 @@ namespace Pinetime { const lv_img_dsc_t* iconForName(std::string icon); - std::array, 89 > m_iconMap;/* = { { + std::array, 89 > m_iconMap = { { {"arrive-left", &arrive_left}, {"arrive-right", &arrive_right}, {"arrive-straight", &arrive_straight}, @@ -231,7 +231,7 @@ namespace Pinetime { {"turn-slight-right", &turn_slight_right}, {"turn-straight", &turn_straight}, {"updown", &updown}, - {"uturn", &uturn} } };*/ + {"uturn", &uturn} } }; }; } } diff --git a/src/displayapp/screens/Notifications.h b/src/displayapp/screens/Notifications.h index 4305c796..aafd3e33 100644 --- a/src/displayapp/screens/Notifications.h +++ b/src/displayapp/screens/Notifications.h @@ -7,12 +7,16 @@ #include "components/ble/NotificationManager.h" namespace Pinetime { + namespace Controllers { + class AlertNotificationService; + } namespace Applications { namespace Screens { + class Notifications : public Screen { public: enum class Modes {Normal, Preview}; - explicit Notifications(DisplayApp* app, Pinetime::Controllers::NotificationManager& notificationManager, Modes mode); + explicit Notifications(DisplayApp* app, Pinetime::Controllers::NotificationManager& notificationManager, Pinetime::Controllers::AlertNotificationService& alertNotificationService, Modes mode); ~Notifications() override; bool Refresh() override; @@ -55,6 +59,7 @@ namespace Pinetime { const char* text; }; Pinetime::Controllers::NotificationManager& notificationManager; + Pinetime::Controllers::AlertNotificationService& alertNotificationService; Modes mode = Modes::Normal; std::unique_ptr currentItem; Controllers::NotificationManager::Notification::Id currentId; From 169b861af1fd8b1f7834ad78a8880882b236dc96 Mon Sep 17 00:00:00 2001 From: petter <39340152+petterhs@users.noreply.github.com> Date: Mon, 25 Jan 2021 14:18:57 +0100 Subject: [PATCH 12/20] fix build warnings in HR implementation --- src/components/ble/HeartRateService.cpp | 4 +--- src/components/ble/NimbleController.cpp | 4 ++-- src/components/heartrate/Ppg.cpp | 2 +- src/drivers/Hrs3300.cpp | 4 ++-- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/components/ble/HeartRateService.cpp b/src/components/ble/HeartRateService.cpp index ecd6235d..ee115ed0 100644 --- a/src/components/ble/HeartRateService.cpp +++ b/src/components/ble/HeartRateService.cpp @@ -57,9 +57,7 @@ void HeartRateService::Init() { int HeartRateService::OnHeartRateRequested(uint16_t connectionHandle, uint16_t attributeHandle, ble_gatt_access_ctxt *context) { if(attributeHandle == heartRateMeasurementHandle) { - NRF_LOG_INFO("BATTERY : handle = %d", heartRateMeasurementHandle); - static uint8_t batteryValue = heartRateController.HeartRate(); - + NRF_LOG_INFO("HEARTRATE : handle = %d", heartRateMeasurementHandle); uint8_t buffer[2] = {0, heartRateController.HeartRate()}; // [0] = flags, [1] = hr value int res = os_mbuf_append(context->om, buffer, 2); diff --git a/src/components/ble/NimbleController.cpp b/src/components/ble/NimbleController.cpp index f2786ea1..eb83c709 100644 --- a/src/components/ble/NimbleController.cpp +++ b/src/components/ble/NimbleController.cpp @@ -38,8 +38,8 @@ NimbleController::NimbleController(Pinetime::System::SystemTask& systemTask, navService{systemTask}, batteryInformationService{batteryController}, immediateAlertService{systemTask, notificationManager}, - serviceDiscovery({¤tTimeClient, &alertNotificationClient}), - heartRateService{systemTask, heartRateController} { + heartRateService{systemTask, heartRateController}, + serviceDiscovery({¤tTimeClient, &alertNotificationClient}) { } int GAPEventCallback(struct ble_gap_event *event, void *arg) { diff --git a/src/components/heartrate/Ppg.cpp b/src/components/heartrate/Ppg.cpp index 233c3003..e84cbdf3 100644 --- a/src/components/heartrate/Ppg.cpp +++ b/src/components/heartrate/Ppg.cpp @@ -13,7 +13,7 @@ using namespace Pinetime::Controllers; namespace { int Compare(int* d1, int* d2, size_t count) { int e = 0; - for(int i = 0; i < count; i++) { + for(size_t i = 0; i < count; i++) { auto d = d1[i] - d2[i]; e += d * d; } diff --git a/src/drivers/Hrs3300.cpp b/src/drivers/Hrs3300.cpp index 2aded7d3..a16c8e4e 100644 --- a/src/drivers/Hrs3300.cpp +++ b/src/drivers/Hrs3300.cpp @@ -73,10 +73,10 @@ void Hrs3300::SetGain(uint8_t gain) { static constexpr uint8_t maxGain = 64; gain = std::min(gain, maxGain); uint8_t hgain = 0; - while((1 << hgain) < gain) + while((1 << hgain) < gain) { hgain++; - WriteRegister(static_cast(Registers::Hgain), hgain << 2); + } } void Hrs3300::SetDrive(uint8_t drive) { From f27e63290639ca257e88298b60429d72271c4954 Mon Sep 17 00:00:00 2001 From: jlukanc <27705324+jlukanc1@users.noreply.github.com> Date: Mon, 25 Jan 2021 12:44:58 -0500 Subject: [PATCH 13/20] move app timer def --- src/components/motor/MotorController.cpp | 3 ++- src/components/motor/MotorController.h | 7 +++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/motor/MotorController.cpp b/src/components/motor/MotorController.cpp index 738e6d33..51a01b4c 100644 --- a/src/components/motor/MotorController.cpp +++ b/src/components/motor/MotorController.cpp @@ -4,6 +4,7 @@ #include "app_timer.h" #include "nrf_drv_clock.h" +APP_TIMER_DEF(vibTimer); using namespace Pinetime::Controllers; @@ -36,4 +37,4 @@ void MotorController::SetDuration(uint8_t motorDuration) { nrf_gpio_pin_clear(pinMotor); //start timer for motorDuration miliseconds app_timer_start(vibTimer, APP_TIMER_TICKS(motorDuration), NULL); //timers trigger at end of duration? -} \ No newline at end of file +} diff --git a/src/components/motor/MotorController.h b/src/components/motor/MotorController.h index 01fe9304..52ab558c 100644 --- a/src/components/motor/MotorController.h +++ b/src/components/motor/MotorController.h @@ -1,6 +1,7 @@ #pragma once #include +#include "app_timer.h" namespace Pinetime { namespace Controllers { @@ -11,10 +12,8 @@ namespace Pinetime { void Init(); void SetDuration(uint8_t motorDuration); - APP_TIMER_DEF(vibTimer); - private: - + app_timer_id_t vibTimer; }; } -} \ No newline at end of file +} From 3dd88339f39089232c40f043a478b9ba47cb1dad Mon Sep 17 00:00:00 2001 From: petter <39340152+petterhs@users.noreply.github.com> Date: Mon, 25 Jan 2021 16:47:52 +0100 Subject: [PATCH 14/20] create motorcontroller in main and pass by reference --- src/displayapp/DisplayApp.cpp | 7 +++++-- src/displayapp/DisplayApp.h | 3 +++ src/displayapp/screens/Notifications.cpp | 10 +++++++--- src/displayapp/screens/Notifications.h | 7 +++++-- src/main.cpp | 4 +++- src/systemtask/SystemTask.cpp | 7 +++++-- src/systemtask/SystemTask.h | 3 +++ 7 files changed, 31 insertions(+), 10 deletions(-) diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index b6ad90b4..12efe62b 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -5,6 +5,7 @@ #include "components/ble/BleController.h" #include "components/datetime/DateTimeController.h" #include "components/ble/NotificationManager.h" +#include "components/motor/MotorController.h" #include "displayapp/screens/ApplicationList.h" #include "displayapp/screens/Brightness.h" #include "displayapp/screens/Clock.h" @@ -32,6 +33,7 @@ DisplayApp::DisplayApp(Drivers::St7789 &lcd, Components::LittleVgl &lvgl, Driver Controllers::DateTime &dateTimeController, Drivers::WatchdogView &watchdog, System::SystemTask &systemTask, Pinetime::Controllers::NotificationManager& notificationManager, + Pinetime::Controllers::MotorController& motorController, Pinetime::Controllers::HeartRateController& heartRateController) : lcd{lcd}, lvgl{lvgl}, @@ -43,6 +45,7 @@ DisplayApp::DisplayApp(Drivers::St7789 &lcd, Components::LittleVgl &lvgl, Driver currentScreen{new Screens::Clock(this, dateTimeController, batteryController, bleController, notificationManager, heartRateController) }, systemTask{systemTask}, notificationManager{notificationManager}, + motorController{motorController}, heartRateController{heartRateController} { msgQueue = xQueueCreate(queueSize, itemSize); onClockApp = true; @@ -124,7 +127,7 @@ void DisplayApp::Refresh() { currentScreen.reset(nullptr); lvgl.SetFullRefresh(Components::LittleVgl::FullRefreshDirections::Up); onClockApp = false; - currentScreen.reset(new Screens::Notifications(this, notificationManager, Screens::Notifications::Modes::Preview)); + currentScreen.reset(new Screens::Notifications(this, notificationManager, motorController, Screens::Notifications::Modes::Preview)); } } break; @@ -215,7 +218,7 @@ void DisplayApp::RunningState() { case Apps::Music : currentScreen.reset(new Screens::Music(this, systemTask.nimble().music())); break; case Apps::Navigation : currentScreen.reset(new Screens::Navigation(this, systemTask.nimble().navigation())); break; case Apps::FirmwareValidation: currentScreen.reset(new Screens::FirmwareValidation(this, validator)); break; - case Apps::Notifications: currentScreen.reset(new Screens::Notifications(this, notificationManager, Screens::Notifications::Modes::Normal)); break; + case Apps::Notifications: currentScreen.reset(new Screens::Notifications(this, notificationManager, motorController, Screens::Notifications::Modes::Normal)); break; case Apps::HeartRate: currentScreen.reset(new Screens::HeartRate(this, heartRateController)); break; } nextApp = Apps::None; diff --git a/src/displayapp/DisplayApp.h b/src/displayapp/DisplayApp.h index da5a7b22..68730468 100644 --- a/src/displayapp/DisplayApp.h +++ b/src/displayapp/DisplayApp.h @@ -23,6 +23,7 @@ namespace Pinetime { class Ble; class DateTime; class NotificationManager; + class MotorController; class HeartRateController; } @@ -44,6 +45,7 @@ namespace Pinetime { Controllers::DateTime &dateTimeController, Drivers::WatchdogView &watchdog, System::SystemTask &systemTask, Pinetime::Controllers::NotificationManager& notificationManager, + Pinetime::Controllers::MotorController& motorController, Pinetime::Controllers::HeartRateController& heartRateController); void Start(); void PushMessage(Messages msg); @@ -87,6 +89,7 @@ namespace Pinetime { Controllers::BrightnessController brightnessController; std::unique_ptr modal; Pinetime::Controllers::NotificationManager& notificationManager; + Pinetime::Controllers::MotorController& motorController; Pinetime::Controllers::FirmwareValidator validator; TouchModes touchMode = TouchModes::Gestures; Pinetime::Controllers::HeartRateController& heartRateController; diff --git a/src/displayapp/screens/Notifications.cpp b/src/displayapp/screens/Notifications.cpp index cfcecec2..b777aca8 100644 --- a/src/displayapp/screens/Notifications.cpp +++ b/src/displayapp/screens/Notifications.cpp @@ -3,12 +3,16 @@ using namespace Pinetime::Applications::Screens; -Notifications::Notifications(DisplayApp *app, Pinetime::Controllers::NotificationManager ¬ificationManager, Modes mode) : - Screen(app), notificationManager{notificationManager}, mode{mode} { +Notifications::Notifications(DisplayApp *app, + Pinetime::Controllers::NotificationManager ¬ificationManager, + Pinetime::Controllers::MotorController& motorController, + Modes mode) : + Screen(app), notificationManager{notificationManager}, + motorController{motorController}, mode{mode} { + notificationManager.ClearNewNotificationFlag(); auto notification = notificationManager.GetLastNotification(); - motorController.Init(); //start the vibration timer setups if(notification.valid) { currentId = notification.id; diff --git a/src/displayapp/screens/Notifications.h b/src/displayapp/screens/Notifications.h index 345ad15a..85d13545 100644 --- a/src/displayapp/screens/Notifications.h +++ b/src/displayapp/screens/Notifications.h @@ -13,7 +13,10 @@ namespace Pinetime { class Notifications : public Screen { public: enum class Modes {Normal, Preview}; - explicit Notifications(DisplayApp* app, Pinetime::Controllers::NotificationManager& notificationManager, Modes mode); + explicit Notifications(DisplayApp* app, + Pinetime::Controllers::NotificationManager& notificationManager, + Pinetime::Controllers::MotorController& motorController, + Modes mode); ~Notifications() override; bool Refresh() override; @@ -46,7 +49,7 @@ namespace Pinetime { const char* text; }; Pinetime::Controllers::NotificationManager& notificationManager; - Pinetime::Controllers::MotorController motorController; + Pinetime::Controllers::MotorController& motorController; Modes mode = Modes::Normal; std::unique_ptr currentItem; Controllers::NotificationManager::Notification::Id currentId; diff --git a/src/main.cpp b/src/main.cpp index 3b993ee9..78a2cf5b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -30,6 +30,7 @@ #include "components/battery/BatteryController.h" #include "components/ble/BleController.h" #include "components/ble/NotificationManager.h" +#include "components/motor/MotorController.h" #include "components/datetime/DateTimeController.h" #include "displayapp/DisplayApp.h" #include "displayapp/LittleVgl.h" @@ -99,6 +100,7 @@ static constexpr uint8_t pinTouchIrq = 28; std::unique_ptr systemTask; Pinetime::Controllers::NotificationManager notificationManager; +Pinetime::Controllers::MotorController motorController; void nrfx_gpiote_evt_handler(nrfx_gpiote_pin_t pin, nrf_gpiote_polarity_t action) { if(pin == pinTouchIrq) { @@ -241,7 +243,7 @@ int main(void) { debounceTimer = xTimerCreate ("debounceTimer", 200, pdFALSE, (void *) 0, DebounceTimerCallback); systemTask.reset(new Pinetime::System::SystemTask(spi, lcd, spiNorFlash, twiMaster, touchPanel, lvgl, batteryController, bleController, - dateTimeController, notificationManager, heartRateSensor)); + dateTimeController, notificationManager, motorController, heartRateSensor)); systemTask->Start(); nimble_port_init(); diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index 13a84c26..4b9cb429 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -41,13 +41,14 @@ SystemTask::SystemTask(Drivers::SpiMaster &spi, Drivers::St7789 &lcd, Controllers::Battery &batteryController, Controllers::Ble &bleController, Controllers::DateTime &dateTimeController, Pinetime::Controllers::NotificationManager& notificationManager, + Pinetime::Controllers::MotorController& motorController, Pinetime::Drivers::Hrs3300& heartRateSensor) : spi{spi}, lcd{lcd}, spiNorFlash{spiNorFlash}, twiMaster{twiMaster}, touchPanel{touchPanel}, lvgl{lvgl}, batteryController{batteryController}, heartRateController{*this}, bleController{bleController}, dateTimeController{dateTimeController}, watchdog{}, watchdogView{watchdog}, notificationManager{notificationManager}, - heartRateSensor{heartRateSensor}, + motorController{motorController}, heartRateSensor{heartRateSensor}, nimbleController(*this, bleController,dateTimeController, notificationManager, batteryController, spiNorFlash, heartRateController) { systemTasksMsgQueue = xQueueCreate(10, 1); } @@ -81,12 +82,14 @@ void SystemTask::Work() { batteryController.Init(); displayApp.reset(new Pinetime::Applications::DisplayApp(lcd, lvgl, touchPanel, batteryController, bleController, - dateTimeController, watchdogView, *this, notificationManager, heartRateController)); + dateTimeController, watchdogView, *this, notificationManager, + motorController, heartRateController)); displayApp->Start(); batteryController.Update(); displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::UpdateBatteryLevel); + motorController.Init(); heartRateSensor.Init(); heartRateSensor.Disable(); diff --git a/src/systemtask/SystemTask.h b/src/systemtask/SystemTask.h index cf3f1021..70abf5f3 100644 --- a/src/systemtask/SystemTask.h +++ b/src/systemtask/SystemTask.h @@ -12,6 +12,7 @@ #include "components/battery/BatteryController.h" #include "components/ble/NimbleController.h" #include "components/ble/NotificationManager.h" +#include "components/motor/MotorController.h" #include "displayapp/DisplayApp.h" #include "drivers/Watchdog.h" @@ -38,6 +39,7 @@ namespace Pinetime { Controllers::Battery &batteryController, Controllers::Ble &bleController, Controllers::DateTime &dateTimeController, Pinetime::Controllers::NotificationManager& manager, + Pinetime::Controllers::MotorController& motorController, Pinetime::Drivers::Hrs3300& heartRateSensor); @@ -74,6 +76,7 @@ namespace Pinetime { Pinetime::Drivers::Watchdog watchdog; Pinetime::Drivers::WatchdogView watchdogView; Pinetime::Controllers::NotificationManager& notificationManager; + Pinetime::Controllers::MotorController& motorController; Pinetime::Drivers::Hrs3300& heartRateSensor; Pinetime::Controllers::NimbleController nimbleController; From da56ca5bfb5c9569d53bbe26ea8e6630dbead9f6 Mon Sep 17 00:00:00 2001 From: jlukanc <27705324+jlukanc1@users.noreply.github.com> Date: Mon, 25 Jan 2021 13:03:04 -0500 Subject: [PATCH 15/20] remove vibtimer from .h to fix nonstop vibration --- src/components/motor/MotorController.h | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/motor/MotorController.h b/src/components/motor/MotorController.h index 52ab558c..9ce91c52 100644 --- a/src/components/motor/MotorController.h +++ b/src/components/motor/MotorController.h @@ -13,7 +13,6 @@ namespace Pinetime { void SetDuration(uint8_t motorDuration); private: - app_timer_id_t vibTimer; }; } } From 523398d24a326a36784e9b28c9f3309a17df9363 Mon Sep 17 00:00:00 2001 From: petter <39340152+petterhs@users.noreply.github.com> Date: Wed, 27 Jan 2021 13:42:04 +0100 Subject: [PATCH 16/20] update font with icons for music, call and qr --- src/displayapp/fonts/Readme.md | 6 +- src/displayapp/fonts/jetbrains_mono_bold_20.c | 878 ++++++++++-------- src/displayapp/screens/Symbols.h | 10 + 3 files changed, 498 insertions(+), 396 deletions(-) diff --git a/src/displayapp/fonts/Readme.md b/src/displayapp/fonts/Readme.md index 314cb197..8e50c297 100644 --- a/src/displayapp/fonts/Readme.md +++ b/src/displayapp/fonts/Readme.md @@ -9,13 +9,13 @@ * Size : 20 * Bpp : 1 bit-per-pixel * Do not enable font compression and horizontal subpixel hinting - * Load the file `JetBrainsMono-Bold.woff` and specify the following range : `0x20-0x7f, 0x410-0x44f` - * Add a 2nd font, load the file `FontAwesome5-Solid+Brands+Regular.woff` and specify the following range : `0xf293, 0xf294, 0xf244, 0xf240, 0xf242, 0xf243, 0xf241, 0xf54b, 0xf21e, 0xf1e6, 0xf54b, 0xf017, 0xf129, 0xf03a, 0xf185, 0xf560, 0xf001, 0xf3fd, 0xf069, 0xf1fc, 0xf45d` + * Load the file `JetBrainsMono-Bold.tff` and specify the following range : `0x20-0x7f, 0x410-0x44f` + * Add a 2nd font, load the file `FontAwesome5-Solid+Brands+Regular.woff` and specify the following range : `0xf293, 0xf294, 0xf244, 0xf240, 0xf242, 0xf243, 0xf241, 0xf54b, 0xf21e, 0xf1e6, 0xf54b, 0xf017, 0xf129, 0xf03a, 0xf185, 0xf560, 0xf001, 0xf3fd, 0xf069, 0xf1fc, 0xf45d, 0xf59f, 0xf5a0, 0xf029, 0xf027, 0xf028, 0xf6a9, 0xf04b, 0xf04c, 0xf048, 0xf051, 0xf095, 0xf3dd` * Click on Convert, and download the file `jetbrains_mono_bold_20.c` and copy it in `src/DisplayApp/Fonts` Add new symbols: * Browse the [cheatsheet](https://fontawesome.com/cheatsheet/free/solid) and find your new symbols - * For each symbol, add its hex code (0xf641 for the 'Ad' icon, for example) to the *Range* list + * For each symbol, add its hex code (0xf641 for the 'Ad' icon, for example) to the *Range* list (Remember to keep this readme updated with newest range list) * Convert this hex value into a UTF-8 code using [this site](http://www.ltg.ed.ac.uk/~richard/utf-8.cgi?input=f185&mode=hex) * Define the new symbols in `src/DisplayApp/Screens/Symbols.h`: ``` diff --git a/src/displayapp/fonts/jetbrains_mono_bold_20.c b/src/displayapp/fonts/jetbrains_mono_bold_20.c index 2539eeed..dc30104a 100644 --- a/src/displayapp/fonts/jetbrains_mono_bold_20.c +++ b/src/displayapp/fonts/jetbrains_mono_bold_20.c @@ -22,43 +22,44 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { 0x0, /* U+21 "!" */ - 0xff, 0xff, 0xff, 0xe0, 0xf, 0xc0, + 0xff, 0xff, 0xff, 0xfc, 0xf, 0xc0, /* U+22 "\"" */ 0xef, 0xdf, 0xbf, 0x7e, 0xfd, 0xc0, /* U+23 "#" */ - 0x8, 0xc3, 0x10, 0x62, 0x3f, 0xf7, 0xfe, 0x23, + 0x8, 0xc3, 0x10, 0x66, 0x3f, 0xf7, 0xfe, 0x23, 0x4, 0x61, 0x88, 0x31, 0x1f, 0xfb, 0xff, 0x19, 0x82, 0x30, 0xc4, 0x0, /* U+24 "$" */ - 0x8, 0x2, 0x1, 0xc1, 0xfe, 0xeb, 0xf2, 0x7c, - 0x83, 0xa0, 0x7c, 0xf, 0xc0, 0xf8, 0x27, 0x9, - 0xf2, 0x7f, 0xf9, 0xfc, 0x8, 0x2, 0x0, 0x80, + 0x8, 0x2, 0x0, 0x80, 0xfc, 0x7f, 0xba, 0x7e, + 0x9f, 0xa0, 0xf8, 0x1f, 0x83, 0xf8, 0x3f, 0x9, + 0xfa, 0x7e, 0x9d, 0xfe, 0x7f, 0x2, 0x0, 0x80, + 0x20, /* U+25 "%" */ - 0x78, 0x1f, 0x83, 0x30, 0x66, 0x1f, 0xcc, 0xf2, - 0x1, 0x80, 0xde, 0x67, 0xf8, 0xcc, 0x19, 0x83, - 0x30, 0x7e, 0x7, 0x80, + 0x78, 0x3f, 0xc6, 0xcc, 0xcc, 0xcc, 0xfd, 0x87, + 0xb0, 0x6, 0x0, 0x7e, 0xf, 0xf1, 0xb3, 0x33, + 0x33, 0x33, 0x63, 0xfc, 0x1e, /* U+26 "&" */ - 0x1e, 0x7, 0xe1, 0xce, 0x38, 0x7, 0x0, 0x70, - 0x1e, 0x7, 0x66, 0xed, 0xdc, 0xf3, 0x9c, 0x73, - 0xcf, 0xfc, 0xf9, 0x80, + 0x1e, 0xf, 0xe1, 0x8e, 0x30, 0x6, 0x0, 0x60, + 0x1e, 0x7, 0xe6, 0xed, 0xdc, 0xf3, 0x9e, 0x73, + 0xcf, 0xfc, 0x79, 0x80, /* U+27 "'" */ 0xff, 0xff, 0xc0, /* U+28 "(" */ - 0x2, 0x1c, 0xfb, 0xc7, 0x1e, 0x38, 0x70, 0xe1, - 0xc3, 0x87, 0xe, 0x1c, 0x3c, 0x38, 0x38, 0x7c, + 0x2, 0x1c, 0x79, 0xc7, 0x1e, 0x38, 0x70, 0xe1, + 0xc3, 0x87, 0xe, 0x1c, 0x3c, 0x38, 0x3c, 0x3c, 0x38, /* U+29 ")" */ - 0x1, 0xc3, 0xc1, 0xc1, 0xc3, 0xc3, 0x87, 0xe, - 0x1c, 0x38, 0x70, 0xe1, 0xc7, 0x8e, 0x79, 0xe3, - 0x80, + 0x1, 0xc3, 0xc3, 0xc1, 0xc3, 0xc3, 0x87, 0xe, + 0x1c, 0x38, 0x70, 0xe1, 0xc7, 0xe, 0x79, 0xe3, + 0x0, /* U+2A "*" */ 0xc, 0x3, 0x8, 0xc7, 0xb7, 0x7f, 0x83, 0x1, @@ -72,10 +73,10 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { 0x7b, 0x9c, 0xce, 0x60, /* U+2D "-" */ - 0xff, 0xff, + 0xff, 0xf0, /* U+2E "." */ - 0x6f, 0xf6, + 0xff, 0xf0, /* U+2F "/" */ 0x1, 0xc0, 0x60, 0x38, 0xe, 0x3, 0x1, 0xc0, @@ -83,58 +84,58 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { 0xe, 0x3, 0x80, 0xc0, 0x70, 0x18, 0xe, 0x0, /* U+30 "0" */ - 0x3f, 0x1f, 0xef, 0x3f, 0x87, 0xed, 0xfb, 0x7e, - 0xdf, 0xb7, 0xed, 0xf8, 0x7e, 0x1f, 0xcf, 0x7f, - 0x8f, 0x80, + 0x3f, 0x1f, 0xef, 0x3f, 0x87, 0xe1, 0xf8, 0x7f, + 0xdf, 0xf7, 0xe1, 0xf8, 0x7e, 0x1f, 0xcf, 0x7f, + 0x8f, 0xc0, /* U+31 "1" */ - 0x3c, 0x3e, 0x3f, 0x13, 0x81, 0xc0, 0xe0, 0x70, - 0x38, 0x1c, 0xe, 0x7, 0x3, 0x8f, 0xff, 0xfc, + 0x1e, 0x3f, 0x3b, 0x99, 0xc8, 0xe0, 0x70, 0x38, + 0x1c, 0xe, 0x7, 0x3, 0x81, 0xcf, 0xff, 0xfc, /* U+32 "2" */ - 0x1f, 0x1f, 0xef, 0x3f, 0x87, 0x1, 0xc0, 0x70, - 0x38, 0x1e, 0xf, 0x7, 0x87, 0x83, 0xc0, 0xff, - 0xff, 0xf0, + 0x3e, 0x3f, 0xbc, 0xfc, 0x70, 0x38, 0x1c, 0x1c, + 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0xf, 0xff, 0xfc, /* U+33 "3" */ - 0x7f, 0xdf, 0xf0, 0x3c, 0x1c, 0x1c, 0x7, 0xc1, - 0xf8, 0xf, 0x1, 0xc0, 0x7e, 0x1d, 0x8f, 0x7f, - 0x87, 0xc0, + 0x7f, 0x9f, 0xe0, 0x30, 0x18, 0xc, 0x7, 0xc1, + 0xf8, 0xf, 0x1, 0xc0, 0x7e, 0x1f, 0xcf, 0x7f, + 0x8f, 0xc0, /* U+34 "4" */ - 0x7, 0x7, 0x3, 0x83, 0x83, 0x81, 0xc1, 0xcf, + 0x7, 0x7, 0x3, 0x83, 0x83, 0x83, 0xc1, 0xcf, 0xe7, 0xe3, 0xff, 0xff, 0xe0, 0x70, 0x38, 0x1c, /* U+35 "5" */ - 0xff, 0x7f, 0xb8, 0x1c, 0xe, 0x7, 0x73, 0xfd, - 0xcf, 0x3, 0x81, 0xc0, 0xfc, 0xff, 0xf1, 0xf0, + 0x7f, 0x9f, 0xe7, 0x1, 0xc0, 0x77, 0x1f, 0xe7, + 0x3c, 0x7, 0x1, 0xc0, 0x77, 0x1d, 0xcf, 0x7f, + 0x87, 0xc0, /* U+36 "6" */ - 0x6, 0x3, 0x1, 0xc0, 0x60, 0x30, 0x1b, 0xc7, + 0xe, 0x3, 0x1, 0xc0, 0x60, 0x38, 0x1d, 0xc7, 0xfb, 0xcf, 0xe1, 0xf8, 0x7e, 0x1f, 0xcf, 0x7f, 0x87, 0x80, /* U+37 "7" */ - 0xff, 0xff, 0xfe, 0xb, 0x86, 0x1, 0x80, 0xc0, - 0x30, 0x18, 0x6, 0x3, 0x80, 0xc0, 0x70, 0x18, - 0xe, 0x0, + 0xff, 0xff, 0xfe, 0x1f, 0x86, 0x3, 0x80, 0xe0, + 0x30, 0x1c, 0x6, 0x3, 0x80, 0xc0, 0x70, 0x1c, + 0x6, 0x0, /* U+38 "8" */ - 0x3e, 0x1f, 0xce, 0x3b, 0x6, 0xe3, 0x9f, 0xc7, - 0xf1, 0x8e, 0xc1, 0xf0, 0x7c, 0x1f, 0x8f, 0x7f, - 0x8f, 0x80, + 0x3f, 0x1f, 0xef, 0x3f, 0x87, 0xe1, 0xdc, 0xe3, + 0xf0, 0xfc, 0x73, 0xb8, 0x7e, 0x1f, 0xcf, 0x7f, + 0x8f, 0xc0, /* U+39 "9" */ 0x1e, 0x1f, 0xef, 0x3f, 0x87, 0xe1, 0xf8, 0x7f, - 0x3d, 0xfe, 0x3d, 0x80, 0xc0, 0x60, 0x38, 0xc, - 0x6, 0x0, + 0x3d, 0xfe, 0x3b, 0x81, 0xc0, 0x60, 0x38, 0xc, + 0x7, 0x0, /* U+3A ":" */ 0xff, 0x80, 0x0, 0xff, 0x80, /* U+3B ";" */ - 0x7b, 0xde, 0x0, 0x0, 0x0, 0x7b, 0x9c, 0xce, - 0x60, + 0x7b, 0xde, 0x0, 0x0, 0x0, 0x3, 0xdc, 0xe6, + 0x73, 0x0, /* U+3C "<" */ 0x0, 0x81, 0xc3, 0xe7, 0xcf, 0x6, 0x3, 0xc0, @@ -144,22 +145,23 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { 0xff, 0xff, 0xc0, 0x0, 0x0, 0x7, 0xff, 0xfe, /* U+3E ">" */ - 0x0, 0x70, 0x3e, 0x7, 0xc0, 0xf8, 0xc, 0x1e, - 0x7c, 0xf8, 0x70, 0x20, 0x0, + 0x80, 0x70, 0x3e, 0x7, 0xc0, 0xf8, 0xc, 0x1e, + 0x3c, 0xf8, 0x70, 0x20, 0x0, /* U+3F "?" */ 0xfc, 0xfe, 0xf, 0x7, 0x7, 0xf, 0x3e, 0x3c, 0x30, 0x30, 0x0, 0x0, 0x70, 0x70, /* U+40 "@" */ - 0x1f, 0x87, 0xf9, 0xc3, 0xf0, 0x3c, 0x77, 0x9f, - 0xf3, 0x1e, 0x63, 0xcc, 0x79, 0x8f, 0x31, 0xe7, - 0xfc, 0x77, 0xc0, 0x1c, 0x1, 0xf0, 0x1e, 0x0, + 0x1f, 0x7, 0xf9, 0xc3, 0x70, 0x3c, 0x7, 0x8f, + 0xf3, 0xfe, 0x63, 0xcc, 0x79, 0x8f, 0x31, 0xe6, + 0x3c, 0xff, 0x8e, 0xf8, 0x3, 0x80, 0x3e, 0x3, + 0xc0, /* U+41 "A" */ - 0xf, 0x0, 0xf0, 0xf, 0x1, 0xf8, 0x19, 0x81, - 0x98, 0x19, 0x83, 0x9c, 0x3f, 0xc3, 0xfc, 0x70, - 0xe7, 0xe, 0x60, 0x66, 0x6, + 0x1e, 0x7, 0x81, 0xe0, 0xfc, 0x3f, 0xc, 0xc3, + 0x31, 0xce, 0x73, 0x9f, 0xe7, 0xfb, 0x87, 0xe1, + 0xf0, 0x30, /* U+42 "B" */ 0xfe, 0x3f, 0xce, 0x3b, 0x8e, 0xe3, 0xb8, 0xcf, @@ -172,9 +174,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { 0x8f, 0xc0, /* U+44 "D" */ - 0xfe, 0x3f, 0xee, 0x3f, 0x87, 0xe1, 0xf8, 0x7e, - 0x1f, 0x87, 0xe1, 0xf8, 0x7e, 0x1f, 0x8f, 0xff, - 0xbf, 0x80, + 0xfe, 0x7f, 0xb9, 0xfc, 0x7e, 0x3f, 0x1f, 0x8f, + 0xc7, 0xe3, 0xf1, 0xf8, 0xfc, 0xff, 0xf7, 0xf0, /* U+45 "E" */ 0xff, 0xff, 0xf8, 0x1c, 0xe, 0x7, 0x3, 0xfd, @@ -185,34 +186,34 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { 0xff, 0xe0, 0x70, 0x38, 0x1c, 0xe, 0x7, 0x0, /* U+47 "G" */ - 0x3f, 0x1f, 0xef, 0x3f, 0x87, 0xe0, 0x38, 0xe, + 0x3f, 0x1f, 0xef, 0x1f, 0x87, 0xe0, 0x38, 0xe, 0x7f, 0x9f, 0xe1, 0xf8, 0x7e, 0x1f, 0xcf, 0x7f, - 0x87, 0x80, + 0x8f, 0xc0, /* U+48 "H" */ 0xe3, 0xf1, 0xf8, 0xfc, 0x7e, 0x3f, 0x1f, 0xff, 0xff, 0xe3, 0xf1, 0xf8, 0xfc, 0x7e, 0x3f, 0x1c, /* U+49 "I" */ - 0xff, 0xff, 0xc7, 0x3, 0x81, 0xc0, 0xe0, 0x70, - 0x38, 0x1c, 0xe, 0x7, 0x3, 0x8f, 0xff, 0xfc, + 0xff, 0xff, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, + 0x1c, 0x1c, 0x1c, 0x1c, 0xff, 0xff, /* U+4A "J" */ - 0x3f, 0xcf, 0xf0, 0x1c, 0x7, 0x1, 0xc0, 0x70, - 0x1c, 0x7, 0x1, 0xc0, 0x7e, 0x1f, 0x8f, 0x7f, + 0x1f, 0xc7, 0xf0, 0x1c, 0x7, 0x1, 0xc0, 0x70, + 0x1c, 0x7, 0x1, 0xc0, 0x7e, 0x1f, 0xcf, 0x7f, 0x8f, 0xc0, /* U+4B "K" */ - 0xe1, 0xdc, 0x3b, 0x8e, 0x71, 0xce, 0x31, 0xce, - 0x3f, 0x87, 0xf0, 0xe7, 0x1c, 0x63, 0x8e, 0x70, - 0xce, 0x1d, 0xc3, 0x80, + 0xe1, 0xf8, 0x7e, 0x3b, 0x8e, 0xe7, 0x39, 0xcf, + 0xe3, 0xf8, 0xe7, 0x39, 0xce, 0x3b, 0x8e, 0xe1, + 0xf8, 0x70, /* U+4C "L" */ 0xe0, 0x70, 0x38, 0x1c, 0xe, 0x7, 0x3, 0x81, 0xc0, 0xe0, 0x70, 0x38, 0x1c, 0xf, 0xff, 0xfc, /* U+4D "M" */ - 0xe1, 0xf8, 0x7f, 0x3f, 0xcf, 0xda, 0xf7, 0xbd, + 0xe1, 0xf8, 0x7f, 0x3f, 0xcf, 0xd2, 0xf7, 0xbd, 0xef, 0x33, 0xc0, 0xf0, 0x3c, 0xf, 0x3, 0xc0, 0xf0, 0x30, @@ -221,9 +222,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { 0x9b, 0xcd, 0xe6, 0xf1, 0xf8, 0xfc, 0x3e, 0x1c, /* U+4F "O" */ - 0x3f, 0x1f, 0xef, 0x3f, 0x87, 0xe1, 0xf8, 0x7e, - 0x1f, 0x87, 0xe1, 0xf8, 0x7e, 0x1f, 0xcf, 0x7f, - 0x8f, 0x80, + 0x3e, 0x3f, 0xb8, 0xfc, 0x7e, 0x3f, 0x1f, 0x8f, + 0xc7, 0xe3, 0xf1, 0xf8, 0xfc, 0x77, 0xf1, 0xf0, /* U+50 "P" */ 0xff, 0x3f, 0xee, 0x3f, 0x87, 0xe1, 0xf8, 0xff, @@ -233,7 +233,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { /* U+51 "Q" */ 0x3f, 0x1f, 0xef, 0x3f, 0x87, 0xe1, 0xf8, 0x7e, 0x1f, 0x87, 0xe1, 0xf8, 0x7e, 0x1f, 0xcf, 0x7f, - 0x8f, 0x80, 0x70, 0xe, 0x1, 0xc0, + 0x8f, 0x80, 0x70, 0xe, 0x3, 0x80, 0x70, /* U+52 "R" */ 0xff, 0x3f, 0xee, 0x3f, 0x87, 0xe1, 0xf8, 0xff, @@ -241,8 +241,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { 0xb8, 0x70, /* U+53 "S" */ - 0x3f, 0x1f, 0xee, 0x1f, 0x87, 0xe0, 0x3e, 0x7, - 0xf0, 0x7e, 0x3, 0xc0, 0x7e, 0x1f, 0xcf, 0x7f, + 0x3f, 0x1f, 0xee, 0x3f, 0x87, 0xe0, 0x3c, 0x7, + 0xf0, 0xfe, 0x3, 0xc0, 0x7e, 0x1f, 0xcf, 0x7f, 0x8f, 0xc0, /* U+54 "T" */ @@ -255,14 +255,14 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { 0xc7, 0xe3, 0xf1, 0xf8, 0xfc, 0x77, 0xf1, 0xf0, /* U+56 "V" */ - 0x60, 0x66, 0x6, 0x70, 0xe7, 0xe, 0x30, 0xc3, - 0xc, 0x39, 0xc1, 0x98, 0x19, 0x81, 0x98, 0x1f, - 0x80, 0xf0, 0xf, 0x0, 0xf0, + 0xc0, 0xf8, 0x7e, 0x1d, 0x86, 0x61, 0x9c, 0xe7, + 0x38, 0xcc, 0x33, 0xf, 0xc3, 0xf0, 0x78, 0x1e, + 0x7, 0x80, /* U+57 "W" */ - 0xc6, 0x78, 0xcf, 0x39, 0xe7, 0x3e, 0xa6, 0xd6, - 0xda, 0xdb, 0x5b, 0x6b, 0x6d, 0x2d, 0xe7, 0x3c, - 0xe7, 0x9c, 0xe3, 0x80, + 0xce, 0x79, 0xcf, 0x29, 0xe5, 0x3c, 0xa7, 0xd5, + 0xda, 0xb3, 0x56, 0x7b, 0xcf, 0x79, 0xef, 0x38, + 0xe7, 0x1c, 0xe3, 0x80, /* U+58 "X" */ 0xe1, 0xd8, 0x67, 0x38, 0xcc, 0x3f, 0x7, 0x81, @@ -270,12 +270,12 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { 0xf8, 0x70, /* U+59 "Y" */ - 0xe0, 0xfc, 0x1d, 0xc7, 0x38, 0xe3, 0x98, 0x77, + 0xe0, 0xfc, 0x1d, 0xc7, 0x38, 0xe3, 0xb8, 0x77, 0x6, 0xc0, 0xf8, 0xe, 0x1, 0xc0, 0x38, 0x7, 0x0, 0xe0, 0x1c, 0x0, /* U+5A "Z" */ - 0xff, 0xff, 0xc0, 0xe0, 0xe0, 0x60, 0x70, 0x70, + 0xff, 0xff, 0xc0, 0xe0, 0xe0, 0x70, 0x70, 0x70, 0x38, 0x38, 0x38, 0x1c, 0x1c, 0xf, 0xff, 0xfc, /* U+5B "[" */ @@ -299,29 +299,27 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { 0xff, 0xff, 0xf0, /* U+60 "`" */ - 0x63, 0x8e, + 0xe3, 0x8c, /* U+61 "a" */ - 0x3f, 0x1f, 0xee, 0x1c, 0x7, 0x3f, 0xdf, 0xfe, - 0x1f, 0x87, 0xe3, 0xff, 0xf7, 0xdc, + 0x1f, 0x1f, 0xe7, 0x1c, 0x7, 0x3f, 0xdf, 0xfe, + 0x1f, 0x87, 0xe3, 0xff, 0xf3, 0xdc, /* U+62 "b" */ - 0xe0, 0x38, 0xe, 0x3, 0xbc, 0xff, 0xbc, 0xfe, - 0x1f, 0x87, 0xe1, 0xf8, 0x7e, 0x1f, 0xcf, 0xff, - 0xbb, 0xc0, + 0xe0, 0x70, 0x38, 0x1d, 0xcf, 0xf7, 0x1f, 0x8f, + 0xc7, 0xe3, 0xf1, 0xf8, 0xfc, 0x7f, 0xf7, 0x70, /* U+63 "c" */ - 0x3f, 0x1f, 0xef, 0x1f, 0x83, 0xe0, 0x38, 0xe, - 0x3, 0x87, 0xf1, 0xdf, 0xe3, 0xe0, + 0x3e, 0x3f, 0xb8, 0xfc, 0x7e, 0x7, 0x3, 0x81, + 0xc7, 0xe3, 0xbf, 0x8f, 0x80, /* U+64 "d" */ - 0x1, 0xc0, 0x70, 0x1c, 0xf7, 0x7f, 0xfc, 0xfe, - 0x1f, 0x87, 0xe1, 0xf8, 0x7e, 0x1f, 0xcf, 0x7f, - 0xcf, 0x70, + 0x3, 0x81, 0xc0, 0xe7, 0x77, 0xff, 0x1f, 0x8f, + 0xc7, 0xe3, 0xf1, 0xf8, 0xfc, 0x77, 0xf9, 0xdc, /* U+65 "e" */ - 0x3f, 0x1f, 0xef, 0x3f, 0x87, 0xff, 0xff, 0xfe, - 0x3, 0x80, 0xf1, 0xdf, 0xe3, 0xf0, + 0x3e, 0x3f, 0xb8, 0xfc, 0x7f, 0xff, 0xff, 0x81, + 0xc0, 0xe3, 0xbf, 0x8f, 0x80, /* U+66 "f" */ 0xf, 0xc7, 0xf1, 0xc0, 0x70, 0xff, 0xff, 0xf1, @@ -329,119 +327,120 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { 0x7, 0x0, /* U+67 "g" */ - 0x3d, 0xdf, 0xff, 0x3f, 0x87, 0xe1, 0xf8, 0x7e, - 0x1f, 0xcf, 0x7f, 0xcf, 0x70, 0x1c, 0xf, 0x3f, - 0x8f, 0xc0, + 0x3b, 0xbf, 0xfd, 0xfc, 0x7e, 0x3f, 0x1f, 0x8f, + 0xc7, 0xf7, 0xbf, 0xce, 0xe0, 0x70, 0x39, 0xf8, + 0xf8, /* U+68 "h" */ - 0xe0, 0x70, 0x38, 0x1d, 0xcf, 0xf7, 0x9f, 0x8f, + 0xe0, 0x70, 0x38, 0x1d, 0xcf, 0xf7, 0x1f, 0x8f, 0xc7, 0xe3, 0xf1, 0xf8, 0xfc, 0x7e, 0x3f, 0x1c, /* U+69 "i" */ - 0x1c, 0x7, 0x0, 0x0, 0x0, 0xfc, 0x3f, 0x1, + 0x1c, 0x7, 0x1, 0xc0, 0x0, 0x0, 0x3f, 0xf, 0xc0, 0x70, 0x1c, 0x7, 0x1, 0xc0, 0x70, 0x1c, - 0x3f, 0xff, 0xfc, + 0x7, 0xf, 0xff, 0xff, /* U+6A "j" */ - 0x7, 0x7, 0x0, 0x0, 0x7f, 0x7f, 0x7, 0x7, - 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0xf, - 0xfe, 0xfc, + 0x7, 0x7, 0x7, 0x0, 0xff, 0xff, 0x7, 0x7, + 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, 0x7, + 0xf, 0xfe, 0xfc, /* U+6B "k" */ - 0xe0, 0x38, 0xe, 0x3, 0x87, 0xe1, 0xb8, 0xee, - 0x33, 0x9c, 0xfe, 0x3f, 0x8e, 0x73, 0x8e, 0xe3, + 0xe0, 0x38, 0xe, 0x3, 0x87, 0xe3, 0xb8, 0xee, + 0x73, 0xf8, 0xfe, 0x39, 0xce, 0x33, 0x8e, 0xe1, 0xb8, 0x70, /* U+6C "l" */ 0xfe, 0x1f, 0xc0, 0x38, 0x7, 0x0, 0xe0, 0x1c, 0x3, 0x80, 0x70, 0xe, 0x1, 0xc0, 0x38, 0x7, - 0x0, 0xfe, 0xf, 0xc0, + 0x0, 0x7e, 0x7, 0xc0, /* U+6D "m" */ 0xd9, 0xbf, 0xfc, 0xcf, 0x33, 0xcc, 0xf3, 0x3c, 0xcf, 0x33, 0xcc, 0xf3, 0x3c, 0xcc, /* U+6E "n" */ - 0xee, 0x7f, 0xbc, 0xfc, 0x7e, 0x3f, 0x1f, 0x8f, + 0xee, 0x7f, 0xb8, 0xfc, 0x7e, 0x3f, 0x1f, 0x8f, 0xc7, 0xe3, 0xf1, 0xf8, 0xe0, /* U+6F "o" */ - 0x3f, 0x1f, 0xef, 0x3f, 0x87, 0xe1, 0xf8, 0x7e, - 0x1f, 0x87, 0xf3, 0xdf, 0xe3, 0xf0, + 0x3e, 0x3f, 0xb8, 0xfc, 0x7e, 0x3f, 0x1f, 0x8f, + 0xc7, 0xe3, 0xbf, 0x8f, 0x80, /* U+70 "p" */ - 0xef, 0x3f, 0xef, 0x3f, 0x87, 0xe1, 0xf8, 0x7e, - 0x1f, 0x87, 0xf3, 0xff, 0xee, 0xf3, 0x80, 0xe0, - 0x38, 0x0, + 0xee, 0x7f, 0xb8, 0xfc, 0x7e, 0x3f, 0x1f, 0x8f, + 0xc7, 0xe3, 0xff, 0xbb, 0x9c, 0xe, 0x7, 0x3, + 0x80, /* U+71 "q" */ - 0x3d, 0xdf, 0xff, 0x3f, 0x87, 0xe1, 0xf8, 0x7e, - 0x1f, 0x87, 0xf3, 0xdf, 0xf3, 0xdc, 0x7, 0x1, - 0xc0, 0x70, + 0x3b, 0xbf, 0xf8, 0xfc, 0x7e, 0x3f, 0x1f, 0x8f, + 0xc7, 0xe3, 0xbf, 0xce, 0xe0, 0x70, 0x38, 0x1c, + 0xe, /* U+72 "r" */ - 0xef, 0x3f, 0xef, 0x3f, 0x87, 0xe1, 0xf8, 0xe, - 0x3, 0x80, 0xe0, 0x38, 0xe, 0x0, + 0xee, 0x7f, 0xb8, 0xfc, 0x7e, 0x3f, 0x3, 0x81, + 0xc0, 0xe0, 0x70, 0x38, 0x0, /* U+73 "s" */ - 0x3f, 0x3f, 0xee, 0x1f, 0x80, 0xfc, 0x1f, 0xe0, - 0x3c, 0x7, 0xe1, 0xff, 0xe3, 0xf0, + 0x1f, 0x1f, 0xf7, 0x1d, 0xc0, 0x7c, 0xf, 0xe0, + 0x3c, 0x7, 0x71, 0xdf, 0xe3, 0xf0, /* U+74 "t" */ 0x1c, 0x7, 0x1, 0xc3, 0xff, 0xff, 0xc7, 0x1, - 0xc0, 0x70, 0x1c, 0x7, 0x1, 0xc0, 0x70, 0xf, - 0xc1, 0xf0, + 0xc0, 0x70, 0x1c, 0x7, 0x1, 0xc0, 0x70, 0x1f, + 0xc3, 0xf0, /* U+75 "u" */ 0xe3, 0xf1, 0xf8, 0xfc, 0x7e, 0x3f, 0x1f, 0x8f, 0xc7, 0xe3, 0xbf, 0x8f, 0x80, /* U+76 "v" */ - 0xc0, 0xf8, 0x76, 0x19, 0x86, 0x73, 0x8c, 0xc3, + 0xe0, 0xf8, 0x76, 0x19, 0x86, 0x73, 0x8c, 0xc3, 0x30, 0xfc, 0x1e, 0x7, 0x81, 0xe0, /* U+77 "w" */ - 0xc6, 0x79, 0xcf, 0x39, 0xb5, 0x36, 0xa6, 0xd6, - 0xda, 0xdb, 0x4e, 0x79, 0xcf, 0x38, 0xc7, 0x0, + 0xe6, 0x36, 0x66, 0x66, 0x66, 0xf6, 0x6f, 0x66, + 0x96, 0x69, 0x62, 0x94, 0x39, 0xc3, 0x9c, 0x39, + 0xc0, /* U+78 "x" */ 0xe1, 0xdc, 0xe3, 0x30, 0xfc, 0x1e, 0x7, 0x81, 0xe0, 0xfc, 0x73, 0x9c, 0x6e, 0x1c, /* U+79 "y" */ - 0xe1, 0xf8, 0x76, 0x19, 0xce, 0x33, 0x8e, 0xc3, - 0xf0, 0x7c, 0x1e, 0x3, 0x80, 0xc0, 0x70, 0x1c, - 0x6, 0x0, + 0xe1, 0xf8, 0x76, 0x19, 0xce, 0x73, 0x8c, 0xc3, + 0xf0, 0x7c, 0x1e, 0x7, 0x80, 0xe0, 0x30, 0x1c, + 0x6, 0x3, 0x80, /* U+7A "z" */ - 0xff, 0xff, 0xc1, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xff, 0xff, 0xc0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0x7f, 0xff, 0xe0, /* U+7B "{" */ - 0x7, 0x87, 0xc3, 0x81, 0xc0, 0xe0, 0x70, 0x38, + 0x3, 0x87, 0xc3, 0x81, 0xc0, 0xe0, 0x70, 0x38, 0x1c, 0xfc, 0x7e, 0x3, 0x81, 0xc0, 0xe0, 0x70, - 0x38, 0x1c, 0xf, 0x83, 0xc0, + 0x38, 0x1c, 0xf, 0x81, 0xc0, /* U+7C "|" */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, /* U+7D "}" */ - 0xf0, 0x3f, 0x1, 0xc0, 0x70, 0x1c, 0x7, 0x1, + 0xf0, 0x3e, 0x1, 0xc0, 0x70, 0x1c, 0x7, 0x1, 0xc0, 0x70, 0xf, 0xc3, 0xf1, 0xc0, 0x70, 0x1c, 0x7, 0x1, 0xc0, 0x70, 0xf8, 0x3c, 0x0, /* U+7E "~" */ - 0x78, 0xff, 0x3c, 0xff, 0x1e, + 0x78, 0xff, 0x3c, 0xcf, 0x3f, 0xc7, 0x80, /* U+410 "А" */ - 0xf, 0x0, 0xf0, 0xf, 0x1, 0xf8, 0x19, 0x81, - 0x98, 0x19, 0x83, 0x9c, 0x3f, 0xc3, 0xfc, 0x70, - 0xe7, 0xe, 0x60, 0x66, 0x6, + 0x1e, 0x7, 0x81, 0xe0, 0xfc, 0x3f, 0xc, 0xc3, + 0x31, 0xce, 0x73, 0x9f, 0xe7, 0xfb, 0x87, 0xe1, + 0xf0, 0x30, /* U+411 "Б" */ 0xff, 0xbf, 0xee, 0x3, 0x80, 0xe0, 0x3f, 0xcf, 0xfb, 0x8f, 0xe1, 0xf8, 0x7e, 0x1f, 0x8f, 0xff, - 0xbf, 0xc0, + 0xbf, 0x80, /* U+412 "В" */ 0xfe, 0x3f, 0xce, 0x3b, 0x8e, 0xe3, 0xb8, 0xcf, @@ -454,7 +453,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { /* U+414 "Д" */ 0x3f, 0xc7, 0xf8, 0xe7, 0x1c, 0xe3, 0x9c, 0x73, - 0x8e, 0x71, 0xce, 0x39, 0xc7, 0x39, 0xe7, 0x38, + 0x8e, 0x71, 0xce, 0x39, 0xc7, 0x38, 0xe7, 0x38, 0xef, 0xff, 0xff, 0xf8, 0x3f, 0x7, 0xe0, 0xe0, /* U+415 "Е" */ @@ -462,36 +461,36 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { 0xfe, 0xe0, 0x70, 0x38, 0x1c, 0xf, 0xff, 0xfc, /* U+416 "Ж" */ - 0xe6, 0x36, 0x66, 0x66, 0x66, 0x66, 0x36, 0xc3, - 0x6c, 0x3f, 0xc3, 0x6c, 0x36, 0xc6, 0x66, 0x66, - 0x66, 0x66, 0xe6, 0x7c, 0x63, + 0xe6, 0x76, 0x66, 0x66, 0x67, 0x66, 0x36, 0xc3, + 0x6c, 0x3f, 0xc3, 0x6c, 0x36, 0xc7, 0x6e, 0x66, + 0x66, 0x66, 0x66, 0x6c, 0x63, /* U+417 "З" */ - 0x1f, 0x87, 0xf9, 0xc7, 0xb0, 0x70, 0xe, 0x3, - 0x87, 0xe0, 0xfe, 0x1, 0xe0, 0x1d, 0x83, 0xb8, + 0x1f, 0x8f, 0xfd, 0xc7, 0x80, 0x70, 0x1c, 0x3e, + 0x7, 0xf0, 0xf, 0x0, 0xe0, 0x1d, 0x83, 0xb8, 0xf7, 0xfc, 0x3e, 0x0, /* U+418 "И" */ - 0xc3, 0xe1, 0xf1, 0xf8, 0xfc, 0xde, 0x6f, 0x37, - 0xb3, 0xd9, 0xec, 0xfc, 0x7e, 0x3e, 0x1f, 0xc, + 0xc3, 0xe3, 0xf1, 0xf8, 0xfc, 0xde, 0x6f, 0x37, + 0xb3, 0xd9, 0xfc, 0xfc, 0x7e, 0x3e, 0x1f, 0xc, /* U+419 "Й" */ - 0x63, 0x31, 0x8f, 0x83, 0x80, 0x6, 0x1f, 0xf, - 0x8f, 0xc7, 0xe6, 0xf3, 0x79, 0xbd, 0x9e, 0xcf, - 0x67, 0xe3, 0xf1, 0xf0, 0xf8, 0x60, + 0x63, 0x31, 0x8f, 0x83, 0x80, 0x6, 0x1f, 0x1f, + 0x8f, 0xc7, 0xe7, 0xf3, 0x79, 0xbd, 0x9e, 0xcf, + 0xe7, 0xe3, 0xf1, 0xf8, 0xf8, 0x60, /* U+41A "К" */ - 0xe1, 0xdc, 0x3b, 0x8e, 0x71, 0xce, 0x31, 0xce, - 0x3f, 0x87, 0xf0, 0xe7, 0x1c, 0x63, 0x8e, 0x70, - 0xce, 0x1d, 0xc3, 0x80, + 0xe1, 0xf8, 0x7e, 0x3b, 0x8e, 0xe7, 0x39, 0xcf, + 0xe3, 0xf8, 0xe7, 0x39, 0xce, 0x3b, 0x8e, 0xe1, + 0xf8, 0x70, /* U+41B "Л" */ - 0x3f, 0xe7, 0xfc, 0xe3, 0x9c, 0x73, 0x8e, 0x71, - 0xce, 0x39, 0xc7, 0x38, 0xe7, 0x1c, 0xe3, 0xbc, - 0x7f, 0xf, 0xc1, 0xc0, + 0x3f, 0xcf, 0xf3, 0x9c, 0xe7, 0x39, 0xce, 0x73, + 0x9c, 0xe7, 0x39, 0xce, 0x73, 0x9d, 0xe7, 0xf1, + 0xf8, 0x70, /* U+41C "М" */ - 0xe1, 0xf8, 0x7f, 0x3f, 0xcf, 0xda, 0xf7, 0xbd, + 0xe1, 0xf8, 0x7f, 0x3f, 0xcf, 0xd2, 0xf7, 0xbd, 0xef, 0x33, 0xc0, 0xf0, 0x3c, 0xf, 0x3, 0xc0, 0xf0, 0x30, @@ -500,9 +499,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { 0xff, 0xe3, 0xf1, 0xf8, 0xfc, 0x7e, 0x3f, 0x1c, /* U+41E "О" */ - 0x3f, 0x1f, 0xef, 0x3f, 0x87, 0xe1, 0xf8, 0x7e, - 0x1f, 0x87, 0xe1, 0xf8, 0x7e, 0x1f, 0xcf, 0x7f, - 0x8f, 0x80, + 0x3e, 0x3f, 0xb8, 0xfc, 0x7e, 0x3f, 0x1f, 0x8f, + 0xc7, 0xe3, 0xf1, 0xf8, 0xfc, 0x77, 0xf1, 0xf0, /* U+41F "П" */ 0xff, 0xff, 0xf8, 0xfc, 0x7e, 0x3f, 0x1f, 0x8f, @@ -524,14 +522,14 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { 0x3, 0x80, /* U+423 "У" */ - 0xc0, 0xf8, 0x76, 0x1d, 0xc6, 0x73, 0x8c, 0xc3, - 0xf0, 0x7c, 0x1e, 0x3, 0x80, 0xc0, 0x70, 0x1c, + 0xe1, 0xf8, 0x76, 0x19, 0xce, 0x33, 0x8c, 0xc3, + 0xb0, 0x7c, 0x1e, 0x3, 0x80, 0xc0, 0x70, 0x1c, 0x6, 0x0, /* U+424 "Ф" */ 0xc, 0xf, 0xc7, 0xfb, 0xb7, 0xcc, 0xf3, 0x3c, 0xcf, 0x33, 0xcc, 0xf3, 0x3c, 0xcf, 0xb7, 0x7f, - 0x8f, 0xc0, 0xc0, + 0x8f, 0xc0, 0xc0, 0x30, /* U+425 "Х" */ 0xe1, 0xd8, 0x67, 0x38, 0xcc, 0x3f, 0x7, 0x81, @@ -544,9 +542,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { 0xff, 0xf0, 0x1c, 0x7, 0x1, 0xc0, /* U+427 "Ч" */ - 0xe1, 0xf8, 0x7e, 0x1f, 0x87, 0xe1, 0xf8, 0x7f, - 0x1d, 0xff, 0x3f, 0xc0, 0x70, 0x1c, 0x7, 0x1, - 0xc0, 0x70, + 0xe3, 0xf1, 0xf8, 0xfc, 0x7e, 0x3f, 0x1f, 0xce, + 0xff, 0x3f, 0x81, 0xc0, 0xe0, 0x70, 0x38, 0x1c, /* U+428 "Ш" */ 0xcc, 0xf3, 0x3c, 0xcf, 0x33, 0xcc, 0xf3, 0x3c, @@ -559,9 +556,9 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { 0x6f, 0xff, 0xff, 0xc0, 0x18, 0x3, /* U+42A "Ъ" */ - 0xf8, 0xf, 0x80, 0x38, 0x3, 0x80, 0x38, 0x3, - 0xf8, 0x3f, 0xe3, 0x8f, 0x38, 0x73, 0x87, 0x38, - 0x73, 0x8f, 0x3f, 0xe3, 0xf8, + 0xfc, 0xf, 0xc0, 0x1c, 0x1, 0xc0, 0x1c, 0x1, + 0xfc, 0x1f, 0xe1, 0xcf, 0x1c, 0x71, 0xc7, 0x1c, + 0x71, 0xcf, 0x1f, 0xe1, 0xf8, /* U+42B "Ы" */ 0xc0, 0xf0, 0x3c, 0xf, 0x3, 0xc0, 0xfe, 0x3f, @@ -571,17 +568,16 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { /* U+42C "Ь" */ 0xe0, 0x38, 0xe, 0x3, 0x80, 0xe0, 0x3f, 0xcf, 0xfb, 0x8f, 0xe1, 0xf8, 0x7e, 0x1f, 0x8f, 0xff, - 0xbf, 0xc0, + 0xbf, 0x80, /* U+42D "Э" */ - 0x3f, 0x1f, 0xee, 0x3f, 0x87, 0x1, 0xc0, 0x71, - 0xfc, 0x7f, 0x1, 0xc0, 0x7e, 0x1f, 0x8f, 0x7f, - 0x8f, 0xc0, + 0x3e, 0x3f, 0xb8, 0xfc, 0x70, 0x38, 0x1c, 0x7e, + 0x3f, 0x3, 0x81, 0xf8, 0xfc, 0x77, 0xf1, 0xf0, /* U+42E "Ю" */ - 0xc7, 0x99, 0xfb, 0x31, 0xe6, 0x3c, 0xc7, 0xf8, - 0xff, 0x1e, 0x63, 0xcc, 0x79, 0x8f, 0x31, 0xe6, - 0x3c, 0x7d, 0x87, 0x0, + 0xc7, 0xb3, 0xfc, 0xcf, 0x33, 0xcc, 0xff, 0x3f, + 0xcf, 0x33, 0xcc, 0xf3, 0x3c, 0xcf, 0x33, 0xcf, + 0xf1, 0xe0, /* U+42F "Я" */ 0x3f, 0xdf, 0xff, 0x1f, 0x87, 0xe1, 0xfc, 0x77, @@ -589,21 +585,20 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { 0xf8, 0x70, /* U+430 "а" */ - 0x3f, 0x1f, 0xee, 0x1c, 0x7, 0x3f, 0xdf, 0xfe, - 0x1f, 0x87, 0xe3, 0xff, 0xf7, 0xdc, + 0x1f, 0x1f, 0xe7, 0x1c, 0x7, 0x3f, 0xdf, 0xfe, + 0x1f, 0x87, 0xe3, 0xff, 0xf3, 0xdc, /* U+431 "б" */ - 0x1f, 0x8f, 0xe7, 0x3, 0x80, 0xef, 0x3f, 0xef, - 0x3f, 0x87, 0xe1, 0xf8, 0x7e, 0x1f, 0xcf, 0x7f, - 0x8f, 0x80, + 0x1f, 0x3f, 0x9c, 0x1c, 0xe, 0xe7, 0xfb, 0x8f, + 0xc7, 0xe3, 0xf1, 0xf8, 0xfc, 0x77, 0xf1, 0xf0, /* U+432 "в" */ - 0xfe, 0x3f, 0xce, 0x3b, 0x8e, 0xe3, 0xbf, 0x8f, - 0xfb, 0x87, 0xe1, 0xff, 0xff, 0xf0, + 0xff, 0x3f, 0xee, 0x3b, 0x8e, 0xfe, 0x3f, 0xee, + 0x1f, 0x87, 0xe1, 0xff, 0xef, 0xf0, /* U+433 "г" */ - 0xff, 0xff, 0xf8, 0x1c, 0xe, 0x7, 0x3, 0x81, - 0xc0, 0xe0, 0x70, 0x38, 0x0, + 0xff, 0xff, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, 0xe0, + 0xe0, 0xe0, 0xe0, /* U+434 "д" */ 0x3f, 0xc7, 0xf8, 0xe7, 0x1c, 0xe3, 0x9c, 0x73, @@ -611,34 +606,34 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { 0x7e, 0xf, 0xc1, 0xc0, /* U+435 "е" */ - 0x3f, 0x1f, 0xef, 0x3f, 0x87, 0xff, 0xff, 0xfe, - 0x3, 0x80, 0xf1, 0xdf, 0xe3, 0xf0, + 0x3e, 0x3f, 0xb8, 0xfc, 0x7f, 0xff, 0xff, 0x81, + 0xc0, 0xe3, 0xbf, 0x8f, 0x80, /* U+436 "ж" */ 0xe6, 0x76, 0x66, 0x66, 0x63, 0x6c, 0x36, 0xc3, - 0xfc, 0x36, 0xc7, 0x6e, 0x66, 0x66, 0x66, 0xc6, - 0x30, + 0xfc, 0x36, 0xc3, 0x6c, 0x66, 0x66, 0x66, 0xe6, + 0x70, /* U+437 "з" */ - 0x3f, 0x1f, 0xfe, 0x1c, 0x7, 0x1f, 0x87, 0xe0, + 0x3f, 0x1f, 0xfe, 0x1c, 0x7, 0x1f, 0x7, 0xe0, 0x1c, 0x7, 0xe1, 0xdf, 0xe3, 0xf0, /* U+438 "и" */ - 0xe7, 0xf3, 0xf9, 0xfd, 0xfe, 0xbf, 0x5f, 0xaf, - 0xf7, 0xf3, 0xf9, 0xfc, 0xe0, + 0xc3, 0xe3, 0xf1, 0xf9, 0xfc, 0xde, 0xef, 0x67, + 0xb3, 0xf1, 0xf8, 0xf8, 0x60, /* U+439 "й" */ - 0x63, 0x3b, 0x8f, 0x83, 0x80, 0x7, 0x3f, 0x9f, - 0xcf, 0xef, 0xf5, 0xfa, 0xfd, 0x7f, 0xbf, 0x9f, - 0xcf, 0xe7, + 0x63, 0x31, 0x8f, 0x83, 0x80, 0x6, 0x1f, 0x1f, + 0x8f, 0xcf, 0xe6, 0xf7, 0x7b, 0x3f, 0x9f, 0x8f, + 0xc7, 0xc3, /* U+43A "к" */ - 0xe1, 0xf8, 0x6e, 0x3b, 0x8c, 0xe7, 0x3f, 0x8f, - 0xe3, 0x9c, 0xe3, 0xb8, 0xee, 0x1c, + 0xe1, 0xf8, 0xee, 0x33, 0x9c, 0xfe, 0x3f, 0x8e, + 0x73, 0x9c, 0xe3, 0xb8, 0x6e, 0x1c, /* U+43B "л" */ - 0x3f, 0xe7, 0xfc, 0xe3, 0x9c, 0x73, 0x8e, 0x71, - 0xce, 0x39, 0xc7, 0x38, 0xfe, 0x1f, 0x83, 0x80, + 0x3f, 0xcf, 0xf3, 0x9c, 0xe7, 0x39, 0xce, 0x73, + 0x9c, 0xe7, 0x39, 0xfc, 0x7e, 0x1c, /* U+43C "м" */ 0xe1, 0xf8, 0x7f, 0x3f, 0xcf, 0xda, 0xf7, 0xbd, @@ -649,35 +644,35 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { 0xc7, 0xe3, 0xf1, 0xf8, 0xe0, /* U+43E "о" */ - 0x3f, 0x1f, 0xef, 0x3f, 0x87, 0xe1, 0xf8, 0x7e, - 0x1f, 0x87, 0xf3, 0xdf, 0xe3, 0xf0, + 0x3e, 0x3f, 0xb8, 0xfc, 0x7e, 0x3f, 0x1f, 0x8f, + 0xc7, 0xe3, 0xbf, 0x8f, 0x80, /* U+43F "п" */ 0xff, 0xff, 0xf8, 0xfc, 0x7e, 0x3f, 0x1f, 0x8f, 0xc7, 0xe3, 0xf1, 0xf8, 0xe0, /* U+440 "р" */ - 0xef, 0x3f, 0xef, 0x3f, 0x87, 0xe1, 0xf8, 0x7e, - 0x1f, 0x87, 0xf3, 0xff, 0xee, 0xf3, 0x80, 0xe0, - 0x38, 0x0, + 0xee, 0x7f, 0xb8, 0xfc, 0x7e, 0x3f, 0x1f, 0x8f, + 0xc7, 0xe3, 0xff, 0xbb, 0x9c, 0xe, 0x7, 0x3, + 0x80, /* U+441 "с" */ - 0x3f, 0x1f, 0xef, 0x1f, 0x83, 0xe0, 0x38, 0xe, - 0x3, 0x87, 0xf1, 0xdf, 0xe3, 0xe0, + 0x3e, 0x3f, 0xb8, 0xfc, 0x7e, 0x7, 0x3, 0x81, + 0xc7, 0xe3, 0xbf, 0x8f, 0x80, /* U+442 "т" */ 0xff, 0xff, 0xf0, 0xe0, 0x38, 0xe, 0x3, 0x80, 0xe0, 0x38, 0xe, 0x3, 0x80, 0xe0, /* U+443 "у" */ - 0xe1, 0xf8, 0x76, 0x19, 0xce, 0x33, 0x8e, 0xc3, - 0xf0, 0x7c, 0x1e, 0x3, 0x80, 0xc0, 0x70, 0x1c, - 0x6, 0x0, + 0xe1, 0xf8, 0x76, 0x19, 0xce, 0x73, 0x8c, 0xc3, + 0xf0, 0x7c, 0x1e, 0x7, 0x80, 0xe0, 0x30, 0x1c, + 0x6, 0x3, 0x80, /* U+444 "ф" */ 0xc, 0x3, 0x0, 0xc0, 0xfc, 0x7f, 0xbb, 0x7c, 0xcf, 0x33, 0xcc, 0xf3, 0x3c, 0xcf, 0xb7, 0x7f, - 0x8f, 0xc0, 0xc0, 0x30, 0xc, 0x0, + 0x8f, 0xc0, 0xc0, 0x30, 0xc, 0x3, 0x0, /* U+445 "х" */ 0xe1, 0xdc, 0xe3, 0x30, 0xfc, 0x1e, 0x7, 0x81, @@ -689,8 +684,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { 0xc0, 0x70, /* U+447 "ч" */ - 0xe1, 0xf8, 0x7e, 0x1f, 0x87, 0xe1, 0xfc, 0x77, - 0xfc, 0xff, 0x1, 0xc0, 0x70, 0x1c, + 0xe3, 0xf1, 0xf8, 0xfc, 0x7e, 0x3b, 0xfc, 0xfe, + 0x7, 0x3, 0x81, 0xc0, 0xe0, /* U+448 "ш" */ 0xcc, 0xf3, 0x3c, 0xcf, 0x33, 0xcc, 0xf3, 0x3c, @@ -708,23 +703,23 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { /* U+44B "ы" */ 0xc0, 0xf0, 0x3c, 0xf, 0x3, 0xf8, 0xff, 0x3c, - 0xef, 0x1b, 0xce, 0xff, 0x3f, 0x8c, + 0x6f, 0x1b, 0xc6, 0xff, 0x3f, 0x8c, /* U+44C "ь" */ 0xe0, 0x38, 0xe, 0x3, 0x80, 0xff, 0x3f, 0xee, 0x1f, 0x87, 0xe1, 0xff, 0xef, 0xf0, /* U+44D "э" */ - 0x3f, 0x1f, 0xee, 0x3c, 0x7, 0x1f, 0xc7, 0xf0, - 0x1f, 0x87, 0xe3, 0xdf, 0xe1, 0xf0, + 0x3e, 0x3f, 0xb8, 0xe0, 0x70, 0xf8, 0x7c, 0xf, + 0xc7, 0xe7, 0xbf, 0x8f, 0x80, /* U+44E "ю" */ 0xc7, 0xb3, 0xfc, 0xcf, 0x33, 0xfc, 0xff, 0x3c, 0xcf, 0x33, 0xcc, 0xf3, 0xfc, 0x78, /* U+44F "я" */ - 0x3f, 0xdf, 0xfe, 0x1f, 0x87, 0xe1, 0xff, 0xf7, - 0xfc, 0xe7, 0x71, 0xdc, 0x7e, 0x1c, + 0x3f, 0xbf, 0xf8, 0xfc, 0x7e, 0x3b, 0xfc, 0xfe, + 0x77, 0x33, 0xb9, 0xf8, 0xe0, /* U+F001 "" */ 0x0, 0x0, 0x70, 0x0, 0x7f, 0x0, 0x3f, 0xf0, @@ -743,6 +738,28 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { 0xcf, 0x9f, 0xff, 0xf1, 0xff, 0xfc, 0x1f, 0xff, 0x1, 0xff, 0xc0, 0x1f, 0xf0, 0x0, 0x70, 0x0, + /* U+F027 "" */ + 0x0, 0xc0, 0x3, 0x80, 0xf, 0x0, 0x3e, 0xf, + 0xfc, 0x9f, 0xf9, 0xbf, 0xf1, 0xff, 0xe3, 0xff, + 0xc7, 0xff, 0x9b, 0xff, 0x20, 0x3e, 0x0, 0x3c, + 0x0, 0x38, 0x0, 0x30, 0x0, + + /* U+F028 "" */ + 0x0, 0x0, 0x40, 0x0, 0x0, 0xc0, 0x3, 0x0, + 0xc0, 0xe, 0x18, 0xc0, 0x3c, 0x39, 0xc0, 0xf8, + 0x39, 0xbf, 0xf2, 0x33, 0xff, 0xe6, 0x33, 0xff, + 0xc6, 0x67, 0xff, 0x8c, 0xcf, 0xff, 0x19, 0x9f, + 0xfe, 0x63, 0x3f, 0xfc, 0x8c, 0xe0, 0xf8, 0x39, + 0x80, 0xf0, 0xe7, 0x0, 0xe1, 0x8c, 0x0, 0xc0, + 0x30, 0x0, 0x0, 0xc0, 0x0, 0x1, 0x0, + + /* U+F029 "" */ + 0xff, 0x3f, 0xff, 0xcf, 0xfe, 0x73, 0x9f, 0x9c, + 0xe7, 0xe7, 0x39, 0xff, 0xcf, 0xff, 0xf3, 0xfc, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0xf3, + 0xcf, 0xfc, 0xff, 0xff, 0x3f, 0xf9, 0xcf, 0xfe, + 0x73, 0xbf, 0xfc, 0xe0, 0xff, 0x3a, 0xc0, + /* U+F03A "" */ 0xf0, 0x0, 0xf, 0x3f, 0xff, 0xf3, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, @@ -751,6 +768,33 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { 0xf, 0x0, 0x0, 0xf3, 0xff, 0xff, 0x3f, 0xff, 0xf0, 0x0, 0x0, + /* U+F048 "" */ + 0xe0, 0x3f, 0x3, 0xf8, 0x3f, 0xc3, 0xfe, 0x3f, + 0xf3, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xfb, 0xff, 0xcf, 0xfe, 0x3f, 0xf0, 0xff, 0x83, + 0xfc, 0xf, 0xe0, 0x38, + + /* U+F04B "" */ + 0x0, 0x0, 0x3c, 0x0, 0xf, 0xc0, 0x3, 0xfc, + 0x0, 0xff, 0x80, 0x3f, 0xf8, 0xf, 0xff, 0x83, + 0xff, 0xf8, 0xff, 0xff, 0x3f, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xff, 0x8f, + 0xff, 0x83, 0xff, 0x80, 0xff, 0x80, 0x3f, 0xc0, + 0xf, 0xc0, 0x3, 0xc0, 0x0, 0x0, 0x0, 0x0, + + /* U+F04C "" */ + 0x7e, 0x1f, 0xbf, 0xcf, 0xff, 0xf3, 0xff, 0xfc, + 0xff, 0xff, 0x3f, 0xff, 0xcf, 0xff, 0xf3, 0xff, + 0xfc, 0xff, 0xff, 0x3f, 0xff, 0xcf, 0xff, 0xf3, + 0xff, 0xfc, 0xff, 0xff, 0x3f, 0xff, 0xcf, 0xff, + 0xf3, 0xff, 0xfc, 0xff, 0x7e, 0x1f, 0x80, + + /* U+F051 "" */ + 0xe0, 0x3f, 0x81, 0xfe, 0xf, 0xf8, 0x7f, 0xe3, + 0xff, 0x9f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xef, 0xfe, 0x7f, 0xe3, 0xfe, 0x1f, 0xe0, + 0xfe, 0x7, 0xe0, 0x38, + /* U+F069 "" */ 0x0, 0xe0, 0x0, 0x1c, 0x0, 0x3, 0x80, 0x0, 0x70, 0x6, 0xe, 0xc, 0xf1, 0xc7, 0x9f, 0xbb, @@ -759,6 +803,15 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { 0xdf, 0x9e, 0x38, 0xf3, 0x7, 0x6, 0x0, 0xe0, 0x0, 0x1c, 0x0, 0x3, 0x80, 0x0, 0x70, 0x0, + /* U+F095 "" */ + 0x0, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x7, 0xf0, + 0x0, 0x7f, 0x0, 0x7, 0xf0, 0x0, 0xff, 0x0, + 0x7, 0xf0, 0x0, 0x3e, 0x0, 0x1, 0xe0, 0x0, + 0x3e, 0x0, 0x3, 0xc0, 0x0, 0x7c, 0x0, 0xf, + 0x81, 0xc1, 0xf0, 0x7e, 0x3e, 0xf, 0xff, 0xc0, + 0xff, 0xf8, 0xf, 0xff, 0x0, 0x7f, 0xc0, 0x7, + 0xf0, 0x0, 0x0, 0x0, 0x0, + /* U+F129 "" */ 0x3c, 0x7e, 0x7e, 0x7e, 0x3c, 0x0, 0x0, 0xfc, 0xfc, 0xfc, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, 0x3c, @@ -844,6 +897,17 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { 0x81, 0xf8, 0x6d, 0x99, 0x9a, 0x36, 0x7, 0x80, 0xe0, 0x18, 0x2, 0x0, 0x0, + /* U+F3DD "" */ + 0x40, 0x0, 0x40, 0x70, 0x0, 0x7e, 0x3c, 0x0, + 0x3f, 0x8f, 0x80, 0x1f, 0x81, 0xe0, 0x1f, 0xc0, + 0x78, 0xf, 0xe0, 0x1e, 0x7, 0xf0, 0x3, 0xc1, + 0xf8, 0x0, 0xf0, 0x78, 0x0, 0x3c, 0x3c, 0x0, + 0xf, 0xbe, 0x0, 0x1, 0xfe, 0x0, 0x0, 0x7e, + 0x0, 0x1c, 0x1f, 0x0, 0x7f, 0x3, 0xc0, 0x7f, + 0xf0, 0xf0, 0x1f, 0xfc, 0x3c, 0xf, 0xfe, 0x7, + 0x87, 0xfe, 0x1, 0xe3, 0xf8, 0x0, 0x70, 0x0, + 0x0, 0x10, + /* U+F3FD "" */ 0x0, 0xfe, 0x0, 0x7, 0xff, 0x0, 0x3f, 0xbf, 0x80, 0xfe, 0x2f, 0x83, 0xfe, 0xcf, 0x8f, 0x3f, @@ -881,6 +945,15 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { 0x1f, 0xf0, 0x0, 0xfe, 0x0, 0x7, 0xc0, 0x0, 0x38, 0x0, 0x1, 0x0, 0x0, + /* U+F59F "" */ + 0x0, 0x78, 0x0, 0x7, 0xf8, 0x0, 0x1f, 0xe0, + 0x0, 0xff, 0xc0, 0x3, 0xff, 0x0, 0xf, 0xfc, + 0x0, 0x3f, 0xf0, 0x47, 0x7f, 0x87, 0x7d, 0xfe, + 0x7f, 0xf3, 0xf3, 0xff, 0xc7, 0x8f, 0xff, 0x5c, + 0xbf, 0xfd, 0xb6, 0xff, 0xf6, 0x1b, 0xff, 0xdf, + 0xef, 0xff, 0x7f, 0xbf, 0xfd, 0xfe, 0xff, 0xf7, + 0xfb, 0xff, 0x3, 0xef, 0x30, 0x1, 0xb0, + /* U+F5A0 "" */ 0x0, 0x78, 0x0, 0x7, 0xf8, 0x0, 0x1f, 0xe0, 0x0, 0xf3, 0xc0, 0x3, 0x87, 0x0, 0xf, 0x3c, @@ -888,7 +961,14 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { 0xff, 0xf1, 0xe3, 0xff, 0xd7, 0xaf, 0xff, 0x4d, 0xbf, 0xfd, 0x86, 0xff, 0xf7, 0xfb, 0xff, 0xdf, 0xef, 0xff, 0x7f, 0xbf, 0xfd, 0xfe, 0xff, 0xc0, - 0xfb, 0xcc, 0x0, 0x6c, 0x0 + 0xfb, 0xcc, 0x0, 0x6c, 0x0, + + /* U+F6A9 "" */ + 0x0, 0xc0, 0x0, 0x1c, 0x0, 0x3, 0xc0, 0x0, + 0x7c, 0x0, 0xff, 0xc6, 0x2f, 0xfc, 0x77, 0xff, + 0xc7, 0xef, 0xfc, 0x3c, 0xff, 0xc7, 0xef, 0xfc, + 0x77, 0xff, 0xc6, 0x20, 0x7c, 0x0, 0x3, 0xc0, + 0x0, 0x1c, 0x0, 0x0, 0xc0, 0x0 }; @@ -902,182 +982,193 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { {.bitmap_index = 1, .adv_w = 192, .box_w = 3, .box_h = 14, .ofs_x = 4, .ofs_y = 0}, {.bitmap_index = 7, .adv_w = 192, .box_w = 7, .box_h = 6, .ofs_x = 3, .ofs_y = 8}, {.bitmap_index = 13, .adv_w = 192, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 33, .adv_w = 192, .box_w = 10, .box_h = 19, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 57, .adv_w = 192, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 77, .adv_w = 192, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 97, .adv_w = 192, .box_w = 3, .box_h = 6, .ofs_x = 5, .ofs_y = 8}, - {.bitmap_index = 100, .adv_w = 192, .box_w = 7, .box_h = 19, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 117, .adv_w = 192, .box_w = 7, .box_h = 19, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 134, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 1}, - {.bitmap_index = 147, .adv_w = 192, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 2}, - {.bitmap_index = 159, .adv_w = 192, .box_w = 5, .box_h = 6, .ofs_x = 3, .ofs_y = -3}, - {.bitmap_index = 163, .adv_w = 192, .box_w = 8, .box_h = 2, .ofs_x = 2, .ofs_y = 5}, - {.bitmap_index = 165, .adv_w = 192, .box_w = 4, .box_h = 4, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 167, .adv_w = 192, .box_w = 10, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 191, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 209, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 225, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 33, .adv_w = 192, .box_w = 10, .box_h = 20, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 58, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 79, .adv_w = 192, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 99, .adv_w = 192, .box_w = 3, .box_h = 6, .ofs_x = 5, .ofs_y = 8}, + {.bitmap_index = 102, .adv_w = 192, .box_w = 7, .box_h = 19, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 119, .adv_w = 192, .box_w = 7, .box_h = 19, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 136, .adv_w = 192, .box_w = 10, .box_h = 10, .ofs_x = 1, .ofs_y = 1}, + {.bitmap_index = 149, .adv_w = 192, .box_w = 10, .box_h = 9, .ofs_x = 1, .ofs_y = 2}, + {.bitmap_index = 161, .adv_w = 192, .box_w = 5, .box_h = 6, .ofs_x = 3, .ofs_y = -4}, + {.bitmap_index = 165, .adv_w = 192, .box_w = 6, .box_h = 2, .ofs_x = 3, .ofs_y = 5}, + {.bitmap_index = 167, .adv_w = 192, .box_w = 4, .box_h = 3, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 169, .adv_w = 192, .box_w = 10, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 193, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 211, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 227, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, {.bitmap_index = 243, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, {.bitmap_index = 261, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 277, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 293, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 311, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 329, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 347, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 365, .adv_w = 192, .box_w = 3, .box_h = 11, .ofs_x = 4, .ofs_y = 0}, - {.bitmap_index = 370, .adv_w = 192, .box_w = 5, .box_h = 14, .ofs_x = 3, .ofs_y = -3}, - {.bitmap_index = 379, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 2, .ofs_y = 1}, - {.bitmap_index = 392, .adv_w = 192, .box_w = 9, .box_h = 7, .ofs_x = 2, .ofs_y = 3}, - {.bitmap_index = 400, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 2, .ofs_y = 1}, - {.bitmap_index = 413, .adv_w = 192, .box_w = 8, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 427, .adv_w = 192, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 451, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 472, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 490, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 508, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 526, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 542, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 558, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 576, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 592, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 608, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 626, .adv_w = 192, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 646, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 662, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 680, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 696, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 714, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 732, .adv_w = 192, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 754, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 772, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 790, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 808, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 824, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 845, .adv_w = 192, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 865, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 883, .adv_w = 192, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 903, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 919, .adv_w = 192, .box_w = 6, .box_h = 18, .ofs_x = 4, .ofs_y = -2}, - {.bitmap_index = 933, .adv_w = 192, .box_w = 10, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 957, .adv_w = 192, .box_w = 6, .box_h = 18, .ofs_x = 3, .ofs_y = -2}, - {.bitmap_index = 971, .adv_w = 192, .box_w = 10, .box_h = 8, .ofs_x = 1, .ofs_y = 6}, - {.bitmap_index = 981, .adv_w = 192, .box_w = 10, .box_h = 2, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 984, .adv_w = 192, .box_w = 5, .box_h = 3, .ofs_x = 3, .ofs_y = 13}, - {.bitmap_index = 986, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1000, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1018, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1032, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1050, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1064, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1082, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 1100, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1116, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1135, .adv_w = 192, .box_w = 8, .box_h = 18, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 1153, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1171, .adv_w = 192, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1191, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1205, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1218, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1232, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 1250, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 1268, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1282, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1296, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1314, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1327, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1341, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1357, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1371, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 1389, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1402, .adv_w = 192, .box_w = 9, .box_h = 18, .ofs_x = 2, .ofs_y = -2}, - {.bitmap_index = 1423, .adv_w = 192, .box_w = 3, .box_h = 18, .ofs_x = 5, .ofs_y = -2}, - {.bitmap_index = 1430, .adv_w = 192, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 1453, .adv_w = 192, .box_w = 10, .box_h = 4, .ofs_x = 1, .ofs_y = 5}, - {.bitmap_index = 1458, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1479, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1497, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1515, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1531, .adv_w = 192, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 1555, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 1571, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 1592, .adv_w = 192, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1612, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1628, .adv_w = 192, .box_w = 9, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1650, .adv_w = 192, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1670, .adv_w = 192, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1690, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1708, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1724, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1742, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1758, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1776, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1794, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1812, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1830, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1849, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1867, .adv_w = 192, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 1889, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1907, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1925, .adv_w = 192, .box_w = 11, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 1947, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1968, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 1986, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2004, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2022, .adv_w = 192, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2042, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2060, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2074, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2092, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2106, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2119, .adv_w = 192, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 2139, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2153, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2170, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2184, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2197, .adv_w = 192, .box_w = 9, .box_h = 16, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2215, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2229, .adv_w = 192, .box_w = 11, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2245, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2259, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2272, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2286, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2299, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 2317, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2331, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2345, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 2363, .adv_w = 192, .box_w = 10, .box_h = 17, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 2385, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2399, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 2417, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2431, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2445, .adv_w = 192, .box_w = 11, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, - {.bitmap_index = 2463, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, - {.bitmap_index = 2480, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2494, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, - {.bitmap_index = 2508, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2522, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2536, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, - {.bitmap_index = 2550, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2600, .adv_w = 320, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2648, .adv_w = 320, .box_w = 20, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2691, .adv_w = 320, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2739, .adv_w = 120, .box_w = 8, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2758, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 2808, .adv_w = 240, .box_w = 15, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2844, .adv_w = 320, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 2892, .adv_w = 320, .box_w = 20, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 2935, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 2973, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 3011, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 3049, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 3087, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, - {.bitmap_index = 3125, .adv_w = 280, .box_w = 15, .box_h = 20, .ofs_x = 1, .ofs_y = -3}, - {.bitmap_index = 3163, .adv_w = 200, .box_w = 11, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3192, .adv_w = 360, .box_w = 23, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, - {.bitmap_index = 3241, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3291, .adv_w = 400, .box_w = 25, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, - {.bitmap_index = 3351, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, - {.bitmap_index = 3404, .adv_w = 360, .box_w = 22, .box_h = 19, .ofs_x = 0, .ofs_y = -2} + {.bitmap_index = 277, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 295, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 313, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 331, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 349, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 367, .adv_w = 192, .box_w = 3, .box_h = 11, .ofs_x = 4, .ofs_y = 0}, + {.bitmap_index = 372, .adv_w = 192, .box_w = 5, .box_h = 15, .ofs_x = 3, .ofs_y = -4}, + {.bitmap_index = 382, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 395, .adv_w = 192, .box_w = 9, .box_h = 7, .ofs_x = 2, .ofs_y = 3}, + {.bitmap_index = 403, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 2, .ofs_y = 1}, + {.bitmap_index = 416, .adv_w = 192, .box_w = 8, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 430, .adv_w = 192, .box_w = 11, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 455, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 473, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 491, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 509, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 525, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 541, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 557, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 575, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 591, .adv_w = 192, .box_w = 8, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 605, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 623, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 641, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 657, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 675, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 691, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 707, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 725, .adv_w = 192, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 748, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 766, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 784, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 802, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 818, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 836, .adv_w = 192, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 856, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 874, .adv_w = 192, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 894, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 910, .adv_w = 192, .box_w = 6, .box_h = 18, .ofs_x = 4, .ofs_y = -2}, + {.bitmap_index = 924, .adv_w = 192, .box_w = 10, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 948, .adv_w = 192, .box_w = 6, .box_h = 18, .ofs_x = 3, .ofs_y = -2}, + {.bitmap_index = 962, .adv_w = 192, .box_w = 10, .box_h = 8, .ofs_x = 1, .ofs_y = 7}, + {.bitmap_index = 972, .adv_w = 192, .box_w = 10, .box_h = 2, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 975, .adv_w = 192, .box_w = 5, .box_h = 3, .ofs_x = 3, .ofs_y = 13}, + {.bitmap_index = 977, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 991, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1007, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1020, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1036, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1049, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1067, .adv_w = 192, .box_w = 9, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 1084, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1100, .adv_w = 192, .box_w = 10, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1120, .adv_w = 192, .box_w = 8, .box_h = 19, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 1139, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1157, .adv_w = 192, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1177, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1191, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1204, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1217, .adv_w = 192, .box_w = 9, .box_h = 15, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 1234, .adv_w = 192, .box_w = 9, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 1251, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1264, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1278, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1296, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1309, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1323, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1340, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1354, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 1373, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1386, .adv_w = 192, .box_w = 9, .box_h = 18, .ofs_x = 2, .ofs_y = -2}, + {.bitmap_index = 1407, .adv_w = 192, .box_w = 3, .box_h = 18, .ofs_x = 5, .ofs_y = -2}, + {.bitmap_index = 1414, .adv_w = 192, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 1437, .adv_w = 192, .box_w = 10, .box_h = 5, .ofs_x = 1, .ofs_y = 5}, + {.bitmap_index = 1444, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1462, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1480, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1498, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1514, .adv_w = 192, .box_w = 11, .box_h = 17, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 1538, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1554, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1575, .adv_w = 192, .box_w = 11, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1595, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1611, .adv_w = 192, .box_w = 9, .box_h = 19, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1633, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1651, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1669, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1687, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1703, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1719, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1735, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1753, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1771, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1789, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1807, .adv_w = 192, .box_w = 10, .box_h = 16, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 1827, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1845, .adv_w = 192, .box_w = 10, .box_h = 17, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 1867, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1883, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1901, .adv_w = 192, .box_w = 11, .box_h = 16, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 1923, .adv_w = 192, .box_w = 12, .box_h = 14, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1944, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1962, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 1980, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1996, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2014, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2032, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2046, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2062, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2076, .adv_w = 192, .box_w = 8, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2087, .adv_w = 192, .box_w = 11, .box_h = 14, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 2107, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2120, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2137, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2151, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2164, .adv_w = 192, .box_w = 9, .box_h = 16, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2182, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2196, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2210, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2224, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2237, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2250, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2263, .adv_w = 192, .box_w = 9, .box_h = 15, .ofs_x = 2, .ofs_y = -4}, + {.bitmap_index = 2280, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2293, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2307, .adv_w = 192, .box_w = 10, .box_h = 15, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 2326, .adv_w = 192, .box_w = 10, .box_h = 18, .ofs_x = 1, .ofs_y = -4}, + {.bitmap_index = 2349, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2363, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 2, .ofs_y = -3}, + {.bitmap_index = 2381, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2394, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2408, .adv_w = 192, .box_w = 11, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 2426, .adv_w = 192, .box_w = 12, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2443, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2457, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 2, .ofs_y = 0}, + {.bitmap_index = 2471, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2484, .adv_w = 192, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2498, .adv_w = 192, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 2511, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2561, .adv_w = 320, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2609, .adv_w = 240, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 2638, .adv_w = 360, .box_w = 23, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2693, .adv_w = 280, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2732, .adv_w = 320, .box_w = 20, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2775, .adv_w = 280, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 2803, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2851, .adv_w = 280, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2890, .adv_w = 280, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, + {.bitmap_index = 2918, .adv_w = 320, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 2966, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3019, .adv_w = 120, .box_w = 8, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3038, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3088, .adv_w = 240, .box_w = 15, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3124, .adv_w = 320, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3172, .adv_w = 320, .box_w = 20, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3215, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 3253, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 3291, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 3329, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 3367, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 3405, .adv_w = 280, .box_w = 15, .box_h = 20, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 3443, .adv_w = 200, .box_w = 11, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3472, .adv_w = 400, .box_w = 25, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3538, .adv_w = 360, .box_w = 23, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3587, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3637, .adv_w = 400, .box_w = 25, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3697, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 3750, .adv_w = 360, .box_w = 22, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3805, .adv_w = 360, .box_w = 22, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3858, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0} }; /*--------------------- @@ -1085,9 +1176,10 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { *--------------------*/ static const uint16_t unicode_list_2[] = { - 0x0, 0x16, 0x39, 0x68, 0x128, 0x184, 0x1e5, 0x1fb, + 0x0, 0x16, 0x26, 0x27, 0x28, 0x39, 0x47, 0x4a, + 0x4b, 0x50, 0x68, 0x94, 0x128, 0x184, 0x1e5, 0x1fb, 0x21d, 0x23f, 0x240, 0x241, 0x242, 0x243, 0x292, 0x293, - 0x3fc, 0x45c, 0x54a, 0x55f, 0x59f + 0x3dc, 0x3fc, 0x45c, 0x54a, 0x55f, 0x59e, 0x59f, 0x6a8 }; /*Collect the unicode lists and glyph_id offsets*/ @@ -1102,8 +1194,8 @@ static const lv_font_fmt_txt_cmap_t cmaps[] = .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY }, { - .range_start = 61441, .range_length = 1440, .glyph_id_start = 160, - .unicode_list = unicode_list_2, .glyph_id_ofs_list = NULL, .list_length = 21, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + .range_start = 61441, .range_length = 1705, .glyph_id_start = 160, + .unicode_list = unicode_list_2, .glyph_id_ofs_list = NULL, .list_length = 32, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY } }; @@ -1135,13 +1227,13 @@ static lv_font_fmt_txt_dsc_t font_dsc = { lv_font_t jetbrains_mono_bold_20 = { .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 = 22, /*The maximum line height required by the font*/ - .base_line = 3, /*Baseline measured from the bottom of the line*/ + .line_height = 23, /*The maximum line height required by the font*/ + .base_line = 4, /*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) - .underline_position = -2, + .underline_position = -3, .underline_thickness = 1, #endif .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ diff --git a/src/displayapp/screens/Symbols.h b/src/displayapp/screens/Symbols.h index bd6a0f90..1a6bbd7f 100644 --- a/src/displayapp/screens/Symbols.h +++ b/src/displayapp/screens/Symbols.h @@ -26,6 +26,16 @@ namespace Pinetime { static constexpr const char* paintbrush = "\xEF\x87\xBC"; static constexpr const char* paddle = "\xEF\x91\x9D"; static constexpr const char* map = "\xEF\x96\xa0"; + static constexpr const char* qrcode = "\xEF\x80\xa9"; + static constexpr const char* phone = "\xEF\x82\x95"; + static constexpr const char* phoneSlash = "\xEF\x8F\x9D"; + static constexpr const char* volumMute = "\xEF\x9A\xA9"; + static constexpr const char* volumUp = "\xEF\x80\xA8"; + static constexpr const char* volumDown = "\xEF\x80\xA7"; + static constexpr const char* stepForward = "\xEF\x81\x91"; + static constexpr const char* stepBackward = "\xEF\x81\x88"; + static constexpr const char* play = "\xEF\x81\x8B"; + static constexpr const char* pause = "\xEF\x81\x8C"; } } } From d4c31bcbbe2f8b6d2e6c45203193745f9cb2a41b Mon Sep 17 00:00:00 2001 From: petter <39340152+petterhs@users.noreply.github.com> Date: Wed, 27 Jan 2021 13:45:06 +0100 Subject: [PATCH 17/20] add mute button and functionality for call notification + new button icons --- .../ble/AlertNotificationService.cpp | 13 ++++++++ src/components/ble/AlertNotificationService.h | 4 ++- src/displayapp/screens/Notifications.cpp | 33 ++++++++++++++++--- src/displayapp/screens/Notifications.h | 3 ++ 4 files changed, 47 insertions(+), 6 deletions(-) diff --git a/src/components/ble/AlertNotificationService.cpp b/src/components/ble/AlertNotificationService.cpp index 5fb8338b..0639119c 100644 --- a/src/components/ble/AlertNotificationService.cpp +++ b/src/components/ble/AlertNotificationService.cpp @@ -118,3 +118,16 @@ void AlertNotificationService::RejectIncomingCall() { ble_gattc_notify_custom(connectionHandle, eventHandle, om); } + +void AlertNotificationService::MuteIncomingCall() { + auto response = IncomingCallResponses::Mute; + auto *om = ble_hs_mbuf_from_flat(&response, 1); + + uint16_t connectionHandle = systemTask.nimble().connHandle(); + + if (connectionHandle == 0 || connectionHandle == BLE_HS_CONN_HANDLE_NONE) { + return; + } + + ble_gattc_notify_custom(connectionHandle, eventHandle, om); +} \ No newline at end of file diff --git a/src/components/ble/AlertNotificationService.h b/src/components/ble/AlertNotificationService.h index 612a8a32..caad7a2b 100644 --- a/src/components/ble/AlertNotificationService.h +++ b/src/components/ble/AlertNotificationService.h @@ -29,10 +29,12 @@ namespace Pinetime { void AcceptIncomingCall(); void RejectIncomingCall(); + void MuteIncomingCall(); enum class IncomingCallResponses : uint8_t { Reject = 0x00, - Answer = 0x01 + Answer = 0x01, + Mute = 0x02 }; private: diff --git a/src/displayapp/screens/Notifications.cpp b/src/displayapp/screens/Notifications.cpp index 79189164..7ca91cfb 100644 --- a/src/displayapp/screens/Notifications.cpp +++ b/src/displayapp/screens/Notifications.cpp @@ -1,8 +1,11 @@ #include "Notifications.h" #include #include "components/ble/MusicService.h" +#include "Symbols.h" using namespace Pinetime::Applications::Screens; +extern lv_font_t jetbrains_mono_extrabold_compressed; +extern lv_font_t jetbrains_mono_bold_20; Notifications::Notifications(DisplayApp *app, Pinetime::Controllers::NotificationManager ¬ificationManager, @@ -132,6 +135,11 @@ namespace { auto* item = static_cast(obj->user_data); item->OnAcceptIncomingCall(event); } + + static void MuteIncomingCallEventHandler(lv_obj_t *obj, lv_event_t event) { + auto* item = static_cast(obj->user_data); + item->OnMuteIncomingCall(event); + } static void RejectIncomingCallEventHandler(lv_obj_t *obj, lv_event_t event) { auto* item = static_cast(obj->user_data); @@ -225,19 +233,28 @@ Notifications::NotificationItem::NotificationItem(const char *title, lv_label_set_text(l2, msg); bt_accept = lv_btn_create(container1, nullptr); - lv_obj_align(bt_accept, lv_scr_act(), LV_ALIGN_IN_BOTTOM_LEFT, 0, -20); bt_accept->user_data = this; lv_obj_set_event_cb(bt_accept, AcceptIncomingCallEventHandler); - + lv_obj_set_size(bt_accept, LV_HOR_RES / 3, 80); + lv_obj_align(bt_accept, lv_scr_act(), LV_ALIGN_IN_BOTTOM_LEFT, 0, -20); label_accept = lv_label_create(bt_accept, nullptr); - lv_label_set_text(label_accept, "Accept"); + lv_label_set_text(label_accept, Symbols::phone); bt_reject = lv_btn_create(container1, nullptr); - lv_obj_align(bt_reject, lv_scr_act(), LV_ALIGN_IN_BOTTOM_RIGHT, 0, -20); bt_reject->user_data = this; lv_obj_set_event_cb(bt_reject, RejectIncomingCallEventHandler); + lv_obj_set_size(bt_reject, LV_HOR_RES / 3, 80); + lv_obj_align(bt_reject, lv_scr_act(), LV_ALIGN_IN_BOTTOM_RIGHT, 0, -20); label_reject = lv_label_create(bt_reject, nullptr); - lv_label_set_text(label_reject, "Reject"); + lv_label_set_text(label_reject, Symbols::phoneSlash); + + bt_mute = lv_btn_create(container1, nullptr); + bt_mute->user_data = this; + lv_obj_set_event_cb(bt_mute, MuteIncomingCallEventHandler); + lv_obj_set_size(bt_mute, LV_HOR_RES / 3, 80); + lv_obj_align(bt_mute, lv_scr_act(), LV_ALIGN_IN_BOTTOM_MID, 0, -20); + label_mute = lv_label_create(bt_mute, nullptr); + lv_label_set_text(label_mute, Symbols::volumMute); } } @@ -260,6 +277,12 @@ void Notifications::NotificationItem::OnAcceptIncomingCall(lv_event_t event) { alertNotificationService.AcceptIncomingCall(); } +void Notifications::NotificationItem::OnMuteIncomingCall(lv_event_t event) { + if (event != LV_EVENT_CLICKED) return; + + alertNotificationService.MuteIncomingCall(); +} + void Notifications::NotificationItem::OnRejectIncomingCall(lv_event_t event) { if (event != LV_EVENT_CLICKED) return; diff --git a/src/displayapp/screens/Notifications.h b/src/displayapp/screens/Notifications.h index aafd3e33..c40e7002 100644 --- a/src/displayapp/screens/Notifications.h +++ b/src/displayapp/screens/Notifications.h @@ -29,6 +29,7 @@ namespace Pinetime { ~NotificationItem(); bool Refresh() {return false;} void OnAcceptIncomingCall(lv_event_t event); + void OnMuteIncomingCall(lv_event_t event); void OnRejectIncomingCall(lv_event_t event); private: @@ -41,8 +42,10 @@ namespace Pinetime { lv_obj_t* l1; lv_obj_t* l2; lv_obj_t* bt_accept; + lv_obj_t* bt_mute; lv_obj_t* bt_reject; lv_obj_t* label_accept; + lv_obj_t* label_mute; lv_obj_t* label_reject; lv_obj_t* bottomPlaceholder; Modes mode; From 1bd5457848babefbc0c129e77c9a2a314c55b780 Mon Sep 17 00:00:00 2001 From: petter <39340152+petterhs@users.noreply.github.com> Date: Fri, 5 Feb 2021 15:43:20 +0100 Subject: [PATCH 18/20] trigger vibration from systemtask --- src/displayapp/DisplayApp.cpp | 7 ++----- src/displayapp/DisplayApp.h | 3 --- src/displayapp/screens/Notifications.cpp | 10 +++------- src/displayapp/screens/Notifications.h | 3 --- src/systemtask/SystemTask.cpp | 7 ++++--- 5 files changed, 9 insertions(+), 21 deletions(-) diff --git a/src/displayapp/DisplayApp.cpp b/src/displayapp/DisplayApp.cpp index 12efe62b..b6ad90b4 100644 --- a/src/displayapp/DisplayApp.cpp +++ b/src/displayapp/DisplayApp.cpp @@ -5,7 +5,6 @@ #include "components/ble/BleController.h" #include "components/datetime/DateTimeController.h" #include "components/ble/NotificationManager.h" -#include "components/motor/MotorController.h" #include "displayapp/screens/ApplicationList.h" #include "displayapp/screens/Brightness.h" #include "displayapp/screens/Clock.h" @@ -33,7 +32,6 @@ DisplayApp::DisplayApp(Drivers::St7789 &lcd, Components::LittleVgl &lvgl, Driver Controllers::DateTime &dateTimeController, Drivers::WatchdogView &watchdog, System::SystemTask &systemTask, Pinetime::Controllers::NotificationManager& notificationManager, - Pinetime::Controllers::MotorController& motorController, Pinetime::Controllers::HeartRateController& heartRateController) : lcd{lcd}, lvgl{lvgl}, @@ -45,7 +43,6 @@ DisplayApp::DisplayApp(Drivers::St7789 &lcd, Components::LittleVgl &lvgl, Driver currentScreen{new Screens::Clock(this, dateTimeController, batteryController, bleController, notificationManager, heartRateController) }, systemTask{systemTask}, notificationManager{notificationManager}, - motorController{motorController}, heartRateController{heartRateController} { msgQueue = xQueueCreate(queueSize, itemSize); onClockApp = true; @@ -127,7 +124,7 @@ void DisplayApp::Refresh() { currentScreen.reset(nullptr); lvgl.SetFullRefresh(Components::LittleVgl::FullRefreshDirections::Up); onClockApp = false; - currentScreen.reset(new Screens::Notifications(this, notificationManager, motorController, Screens::Notifications::Modes::Preview)); + currentScreen.reset(new Screens::Notifications(this, notificationManager, Screens::Notifications::Modes::Preview)); } } break; @@ -218,7 +215,7 @@ void DisplayApp::RunningState() { case Apps::Music : currentScreen.reset(new Screens::Music(this, systemTask.nimble().music())); break; case Apps::Navigation : currentScreen.reset(new Screens::Navigation(this, systemTask.nimble().navigation())); break; case Apps::FirmwareValidation: currentScreen.reset(new Screens::FirmwareValidation(this, validator)); break; - case Apps::Notifications: currentScreen.reset(new Screens::Notifications(this, notificationManager, motorController, Screens::Notifications::Modes::Normal)); break; + case Apps::Notifications: currentScreen.reset(new Screens::Notifications(this, notificationManager, Screens::Notifications::Modes::Normal)); break; case Apps::HeartRate: currentScreen.reset(new Screens::HeartRate(this, heartRateController)); break; } nextApp = Apps::None; diff --git a/src/displayapp/DisplayApp.h b/src/displayapp/DisplayApp.h index 68730468..da5a7b22 100644 --- a/src/displayapp/DisplayApp.h +++ b/src/displayapp/DisplayApp.h @@ -23,7 +23,6 @@ namespace Pinetime { class Ble; class DateTime; class NotificationManager; - class MotorController; class HeartRateController; } @@ -45,7 +44,6 @@ namespace Pinetime { Controllers::DateTime &dateTimeController, Drivers::WatchdogView &watchdog, System::SystemTask &systemTask, Pinetime::Controllers::NotificationManager& notificationManager, - Pinetime::Controllers::MotorController& motorController, Pinetime::Controllers::HeartRateController& heartRateController); void Start(); void PushMessage(Messages msg); @@ -89,7 +87,6 @@ namespace Pinetime { Controllers::BrightnessController brightnessController; std::unique_ptr modal; Pinetime::Controllers::NotificationManager& notificationManager; - Pinetime::Controllers::MotorController& motorController; Pinetime::Controllers::FirmwareValidator validator; TouchModes touchMode = TouchModes::Gestures; Pinetime::Controllers::HeartRateController& heartRateController; diff --git a/src/displayapp/screens/Notifications.cpp b/src/displayapp/screens/Notifications.cpp index b777aca8..ece9eb07 100644 --- a/src/displayapp/screens/Notifications.cpp +++ b/src/displayapp/screens/Notifications.cpp @@ -5,11 +5,9 @@ using namespace Pinetime::Applications::Screens; Notifications::Notifications(DisplayApp *app, Pinetime::Controllers::NotificationManager ¬ificationManager, - Pinetime::Controllers::MotorController& motorController, - Modes mode) : - Screen(app), notificationManager{notificationManager}, - motorController{motorController}, mode{mode} { - + Modes mode) : + Screen(app), notificationManager{notificationManager}, mode{mode} { + notificationManager.ClearNewNotificationFlag(); auto notification = notificationManager.GetLastNotification(); @@ -29,8 +27,6 @@ Notifications::Notifications(DisplayApp *app, style_line.line.width = 3; style_line.line.rounded = 0; - motorController.SetDuration(35); - timeoutLine = lv_line_create(lv_scr_act(), nullptr); lv_line_set_style(timeoutLine, LV_LINE_STYLE_MAIN, &style_line); lv_line_set_points(timeoutLine, timeoutLinePoints, 2); diff --git a/src/displayapp/screens/Notifications.h b/src/displayapp/screens/Notifications.h index 85d13545..b621b777 100644 --- a/src/displayapp/screens/Notifications.h +++ b/src/displayapp/screens/Notifications.h @@ -5,7 +5,6 @@ #include #include "Screen.h" #include "components/ble/NotificationManager.h" -#include "components/motor/MotorController.h" namespace Pinetime { namespace Applications { @@ -15,7 +14,6 @@ namespace Pinetime { enum class Modes {Normal, Preview}; explicit Notifications(DisplayApp* app, Pinetime::Controllers::NotificationManager& notificationManager, - Pinetime::Controllers::MotorController& motorController, Modes mode); ~Notifications() override; @@ -49,7 +47,6 @@ namespace Pinetime { const char* text; }; Pinetime::Controllers::NotificationManager& notificationManager; - Pinetime::Controllers::MotorController& motorController; Modes mode = Modes::Normal; std::unique_ptr currentItem; Controllers::NotificationManager::Notification::Id currentId; diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index 4b9cb429..e195de8e 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -80,17 +80,17 @@ void SystemTask::Work() { twiMaster.Init(); touchPanel.Init(); batteryController.Init(); + motorController.Init(); + displayApp.reset(new Pinetime::Applications::DisplayApp(lcd, lvgl, touchPanel, batteryController, bleController, dateTimeController, watchdogView, *this, notificationManager, - motorController, heartRateController)); + heartRateController)); displayApp->Start(); batteryController.Update(); displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::UpdateBatteryLevel); - motorController.Init(); - heartRateSensor.Init(); heartRateSensor.Disable(); heartRateApp.reset(new Pinetime::Applications::HeartRateTask(heartRateSensor, heartRateController)); @@ -162,6 +162,7 @@ void SystemTask::Work() { break; case Messages::OnNewNotification: if(isSleeping && !isWakingUp) GoToRunning(); + motorController.SetDuration(35); displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::NewNotification); break; case Messages::BleConnected: From 7ab153cd7690db8a43bde1af792edecc5e0f8d5d Mon Sep 17 00:00:00 2001 From: petter <39340152+petterhs@users.noreply.github.com> Date: Fri, 5 Feb 2021 17:06:56 +0100 Subject: [PATCH 19/20] refactor MotorController --- src/components/motor/MotorController.cpp | 33 +++++++----------------- src/components/motor/MotorController.h | 1 + 2 files changed, 10 insertions(+), 24 deletions(-) diff --git a/src/components/motor/MotorController.cpp b/src/components/motor/MotorController.cpp index 51a01b4c..7f53fbf7 100644 --- a/src/components/motor/MotorController.cpp +++ b/src/components/motor/MotorController.cpp @@ -2,39 +2,24 @@ #include #include "systemtask/SystemTask.h" #include "app_timer.h" -#include "nrf_drv_clock.h" APP_TIMER_DEF(vibTimer); using namespace Pinetime::Controllers; -static void lfclk_request(void) //get the low freq. clock -{ - nrf_drv_clock_init(); - nrf_drv_clock_lfclk_request(NULL); -} - -void vibrateTimer(void * p_context) -{ - nrf_gpio_pin_set(pinMotor); -} - -static void create_timers() -{ - //create timer, single shot, re-armable - app_timer_create(&vibTimer, APP_TIMER_MODE_SINGLE_SHOT, vibrateTimer); -} - void MotorController::Init() { - nrf_gpio_cfg_output(pinMotor); // set the motor pin as an output + nrf_gpio_cfg_output(pinMotor); nrf_gpio_pin_set(pinMotor); - lfclk_request(); //get lfclock ready - app_timer_init(); //start app timers to make calls - create_timers(); + app_timer_init(); + app_timer_create(&vibTimer, APP_TIMER_MODE_SINGLE_SHOT, vibrate); } void MotorController::SetDuration(uint8_t motorDuration) { nrf_gpio_pin_clear(pinMotor); - //start timer for motorDuration miliseconds - app_timer_start(vibTimer, APP_TIMER_TICKS(motorDuration), NULL); //timers trigger at end of duration? + /* Start timer for motorDuration miliseconds and timer triggers vibrate() when it finishes*/ + app_timer_start(vibTimer, APP_TIMER_TICKS(motorDuration), NULL); } + +void MotorController::vibrate(void * p_context) { + nrf_gpio_pin_set(pinMotor); +} \ No newline at end of file diff --git a/src/components/motor/MotorController.h b/src/components/motor/MotorController.h index 9ce91c52..bdc20c0c 100644 --- a/src/components/motor/MotorController.h +++ b/src/components/motor/MotorController.h @@ -13,6 +13,7 @@ namespace Pinetime { void SetDuration(uint8_t motorDuration); private: + static void vibrate(void * p_context); }; } } From 1e2cc3ce91b402459790332b84e3f8dcbe5dc340 Mon Sep 17 00:00:00 2001 From: petter <39340152+petterhs@users.noreply.github.com> Date: Sun, 7 Feb 2021 13:31:02 +0100 Subject: [PATCH 20/20] add vibration toggle --- src/components/ble/NotificationManager.cpp | 8 ++++++++ src/components/ble/NotificationManager.h | 3 +++ src/displayapp/screens/Notifications.cpp | 4 ++++ src/systemtask/SystemTask.cpp | 2 +- 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/components/ble/NotificationManager.cpp b/src/components/ble/NotificationManager.cpp index dabcb4ba..fd66c194 100644 --- a/src/components/ble/NotificationManager.cpp +++ b/src/components/ble/NotificationManager.cpp @@ -71,6 +71,14 @@ bool NotificationManager::AreNewNotificationsAvailable() { return newNotification; } +bool NotificationManager::isVibrationEnabled() { + return vibrationEnabled; +} + +void NotificationManager::toggleVibrations() { + vibrationEnabled = !vibrationEnabled; +} + bool NotificationManager::ClearNewNotificationFlag() { return newNotification.exchange(false); } diff --git a/src/components/ble/NotificationManager.h b/src/components/ble/NotificationManager.h index 036d2ed9..4dce4eda 100644 --- a/src/components/ble/NotificationManager.h +++ b/src/components/ble/NotificationManager.h @@ -28,6 +28,8 @@ namespace Pinetime { Notification GetPrevious(Notification::Id id); bool ClearNewNotificationFlag(); bool AreNewNotificationsAvailable(); + bool isVibrationEnabled(); + void toggleVibrations(); static constexpr size_t MaximumMessageSize() { return MessageSize; }; size_t NbNotifications() const; @@ -40,6 +42,7 @@ namespace Pinetime { uint8_t writeIndex = 0; bool empty = true; std::atomic newNotification{false}; + bool vibrationEnabled = true; }; } } \ No newline at end of file diff --git a/src/displayapp/screens/Notifications.cpp b/src/displayapp/screens/Notifications.cpp index ece9eb07..b481c972 100644 --- a/src/displayapp/screens/Notifications.cpp +++ b/src/displayapp/screens/Notifications.cpp @@ -92,6 +92,10 @@ bool Notifications::OnTouchEvent(Pinetime::Applications::TouchEvents event) { currentItem.reset(new NotificationItem("\nNotification", nextNotification.message.data(), nextNotification.index, notificationManager.NbNotifications(), mode)); } return true; + case Pinetime::Applications::TouchEvents::LongTap: { + notificationManager.toggleVibrations(); + return true; + } default: return false; } diff --git a/src/systemtask/SystemTask.cpp b/src/systemtask/SystemTask.cpp index e195de8e..250a4ab4 100644 --- a/src/systemtask/SystemTask.cpp +++ b/src/systemtask/SystemTask.cpp @@ -162,7 +162,7 @@ void SystemTask::Work() { break; case Messages::OnNewNotification: if(isSleeping && !isWakingUp) GoToRunning(); - motorController.SetDuration(35); + if(notificationManager.isVibrationEnabled()) motorController.SetDuration(35); displayApp->PushMessage(Pinetime::Applications::DisplayApp::Messages::NewNotification); break; case Messages::BleConnected: