Merge branch 'develop' into remove-nm-reference

This commit is contained in:
Max Friedrich 2022-04-19 00:40:29 +02:00 committed by GitHub
commit f84a0a3897
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
93 changed files with 1675 additions and 1084 deletions

74
.github/workflows/lv_sim.yml vendored Normal file
View File

@ -0,0 +1,74 @@
# GitHub Actions Workflow to build Simulator for PineTime Smart Watch LVGL Interface
# Name of this Workflow
name: Build PineTime LVGL Simulator
# When to run this Workflow...
on:
# Run on all branches
push:
branches: []
# Also run this Workflow when a Pull Request is created or updated in the "master" and "develop" Branch
pull_request:
branches: [ master, develop ]
# Steps to run for the Workflow
jobs:
build:
# Run these steps on Ubuntu
runs-on: ubuntu-latest
steps:
#########################################################################################
# Download and Install Dependencies
- name: Install cmake
uses: lukka/get-cmake@v3.18.3
- name: Install SDL2 development package
run: |
sudo apt-get update
sudo apt-get -y install libsdl2-dev
#########################################################################################
# Checkout
- name: Checkout source files
uses: actions/checkout@v2
with:
submodules: recursive
#########################################################################################
# get InfiniSim repo
- name: Get InfiniSim repo
run: |
git clone https://github.com/InfiniTimeOrg/InfiniSim.git --depth 1 --branch main
git -C InfiniSim submodule update --init lv_drivers libpng
#########################################################################################
# CMake
- name: CMake
run: |
cmake -G Ninja -S InfiniSim -B build_lv_sim -DInfiniTime_DIR="${PWD}"
#########################################################################################
# Build and Upload simulator
# For Debugging Builds: Remove "make" option "-j" for clearer output. Add "--trace" to see details.
# For Faster Builds: Add "make" option "-j"
- name: Build simulator executable
run: |
cmake --build build_lv_sim
- name: Upload simulator executable
uses: actions/upload-artifact@v2
with:
name: infinisim
path: build_lv_sim/infinisim

View File

@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.10) cmake_minimum_required(VERSION 3.10)
project(pinetime VERSION 1.8.0 LANGUAGES C CXX ASM) project(pinetime VERSION 1.9.0 LANGUAGES C CXX ASM)
set(CMAKE_C_STANDARD 99) set(CMAKE_C_STANDARD 99)
set(CMAKE_CXX_STANDARD 14) set(CMAKE_CXX_STANDARD 14)

View File

@ -16,6 +16,7 @@ Fast open-source firmware for the [PineTime smartwatch](https://www.pine64.org/p
- [AmazFish](https://openrepos.net/content/piggz/amazfish/) (SailfishOS) - [AmazFish](https://openrepos.net/content/piggz/amazfish/) (SailfishOS)
- [Siglo](https://github.com/alexr4535/siglo) (Linux) - [Siglo](https://github.com/alexr4535/siglo) (Linux)
- [InfiniLink](https://github.com/xan-m/InfiniLink) **[Experimental]** (iOS) - [InfiniLink](https://github.com/xan-m/InfiniLink) **[Experimental]** (iOS)
- [ITD](https://gitea.arsenm.dev/Arsen6331/itd) (Linux)
## Development ## Development
@ -25,6 +26,10 @@ Fast open-source firmware for the [PineTime smartwatch](https://www.pine64.org/p
- [Creating a stopwatch in Pinetime(article)](https://pankajraghav.com/2021/04/03/PINETIME-STOPCLOCK.html) - [Creating a stopwatch in Pinetime(article)](https://pankajraghav.com/2021/04/03/PINETIME-STOPCLOCK.html)
- [Tips on designing an app UI](doc/ui_guidelines.md) - [Tips on designing an app UI](doc/ui_guidelines.md)
### InfiniSim Simulator
Use the [InfiniSim Simulator](https://github.com/InfiniTimeOrg/InfiniSim) to experience the `InfiniTime` user interface directly on your PC, to shorten the time until you get your hands on a real [PineTime smartwatch](https://www.pine64.org/pinetime/).
Or use it to develop new Watchfaces, new Screens, or quickly iterate on the user interface.
### Contributing ### Contributing
- [How to contribute?](/doc/contribute.md) - [How to contribute?](/doc/contribute.md)
- [Coding conventions](/doc/coding-convention.md) - [Coding conventions](/doc/coding-convention.md)

View File

@ -449,12 +449,14 @@ list(APPEND SOURCE_FILES
displayapp/screens/settings/SettingSetTime.cpp displayapp/screens/settings/SettingSetTime.cpp
displayapp/screens/settings/SettingChimes.cpp displayapp/screens/settings/SettingChimes.cpp
displayapp/screens/settings/SettingShakeThreshold.cpp displayapp/screens/settings/SettingShakeThreshold.cpp
displayapp/screens/settings/SettingBluetooth.cpp
## Watch faces ## Watch faces
displayapp/icons/bg_clock.c displayapp/icons/bg_clock.c
displayapp/screens/WatchFaceAnalog.cpp displayapp/screens/WatchFaceAnalog.cpp
displayapp/screens/WatchFaceDigital.cpp displayapp/screens/WatchFaceDigital.cpp
displayapp/screens/PineTimeStyle.cpp displayapp/screens/WatchFaceTerminal.cpp
displayapp/screens/WatchFacePineTimeStyle.cpp
## ##
@ -514,6 +516,7 @@ list(APPEND SOURCE_FILES
displayapp/lv_pinetime_theme.c displayapp/lv_pinetime_theme.c
systemtask/SystemTask.cpp systemtask/SystemTask.cpp
systemtask/SystemMonitor.cpp
drivers/TwiMaster.cpp drivers/TwiMaster.cpp
heartratetask/HeartRateTask.cpp heartratetask/HeartRateTask.cpp
@ -575,6 +578,7 @@ list(APPEND RECOVERY_SOURCE_FILES
FreeRTOS/port_cmsis.c FreeRTOS/port_cmsis.c
systemtask/SystemTask.cpp systemtask/SystemTask.cpp
systemtask/SystemMonitor.cpp
drivers/TwiMaster.cpp drivers/TwiMaster.cpp
components/gfx/Gfx.cpp components/gfx/Gfx.cpp
components/rle/RleDecoder.cpp components/rle/RleDecoder.cpp
@ -626,7 +630,6 @@ set(INCLUDE_FILES
displayapp/screens/InfiniPaint.h displayapp/screens/InfiniPaint.h
displayapp/screens/StopWatch.h displayapp/screens/StopWatch.h
displayapp/screens/Paddle.h displayapp/screens/Paddle.h
displayapp/screens/DropDownDemo.h
displayapp/screens/BatteryIcon.h displayapp/screens/BatteryIcon.h
displayapp/screens/BleIcon.h displayapp/screens/BleIcon.h
displayapp/screens/NotificationIcon.h displayapp/screens/NotificationIcon.h

View File

@ -93,7 +93,7 @@
/* Software timer definitions. */ /* Software timer definitions. */
#define configUSE_TIMERS 1 #define configUSE_TIMERS 1
#define configTIMER_TASK_PRIORITY (0) #define configTIMER_TASK_PRIORITY (1)
#define configTIMER_QUEUE_LENGTH 32 #define configTIMER_QUEUE_LENGTH 32
#define configTIMER_TASK_STACK_DEPTH (300) #define configTIMER_TASK_STACK_DEPTH (300)

View File

@ -54,7 +54,8 @@ void AlarmController::ScheduleAlarm() {
auto now = dateTimeController.CurrentDateTime(); auto now = dateTimeController.CurrentDateTime();
alarmTime = now; alarmTime = now;
time_t ttAlarmTime = std::chrono::system_clock::to_time_t(alarmTime); time_t ttAlarmTime = std::chrono::system_clock::to_time_t(
std::chrono::time_point_cast<std::chrono::system_clock::duration>(alarmTime));
tm* tmAlarmTime = std::localtime(&ttAlarmTime); tm* tmAlarmTime = std::localtime(&ttAlarmTime);
// If the time being set has already passed today,the alarm should be set for tomorrow // If the time being set has already passed today,the alarm should be set for tomorrow

View File

@ -2,6 +2,7 @@
#include <algorithm> #include <algorithm>
#include "components/ble/NotificationManager.h" #include "components/ble/NotificationManager.h"
#include "systemtask/SystemTask.h" #include "systemtask/SystemTask.h"
#include <nrf_log.h>
using namespace Pinetime::Controllers; using namespace Pinetime::Controllers;
constexpr ble_uuid16_t AlertNotificationClient::ansServiceUuid; constexpr ble_uuid16_t AlertNotificationClient::ansServiceUuid;

View File

@ -2,6 +2,10 @@
using namespace Pinetime::Controllers; using namespace Pinetime::Controllers;
bool Ble::IsConnected() const {
return isConnected;
}
void Ble::Connect() { void Ble::Connect() {
isConnected = true; isConnected = true;
} }
@ -10,6 +14,18 @@ void Ble::Disconnect() {
isConnected = false; isConnected = false;
} }
bool Ble::IsRadioEnabled() const {
return isRadioEnabled;
}
void Ble::EnableRadio() {
isRadioEnabled = true;
}
void Ble::DisableRadio() {
isRadioEnabled = false;
}
void Ble::StartFirmwareUpdate() { void Ble::StartFirmwareUpdate() {
isFirmwareUpdating = true; isFirmwareUpdating = true;
} }

View File

@ -12,12 +12,14 @@ namespace Pinetime {
enum class AddressTypes { Public, Random, RPA_Public, RPA_Random }; enum class AddressTypes { Public, Random, RPA_Public, RPA_Random };
Ble() = default; Ble() = default;
bool IsConnected() const { bool IsConnected() const;
return isConnected;
}
void Connect(); void Connect();
void Disconnect(); void Disconnect();
bool IsRadioEnabled() const;
void EnableRadio();
void DisableRadio();
void StartFirmwareUpdate(); void StartFirmwareUpdate();
void StopFirmwareUpdate(); void StopFirmwareUpdate();
void FirmwareUpdateTotalBytes(uint32_t totalBytes); void FirmwareUpdateTotalBytes(uint32_t totalBytes);
@ -57,6 +59,7 @@ namespace Pinetime {
private: private:
bool isConnected = false; bool isConnected = false;
bool isRadioEnabled = true;
bool isFirmwareUpdating = false; bool isFirmwareUpdating = false;
uint32_t firmwareUpdateTotalBytes = 0; uint32_t firmwareUpdateTotalBytes = 0;
uint32_t firmwareUpdateCurrentBytes = 0; uint32_t firmwareUpdateCurrentBytes = 0;

View File

@ -3,6 +3,7 @@
#include "components/ble/BleController.h" #include "components/ble/BleController.h"
#include "drivers/SpiNorFlash.h" #include "drivers/SpiNorFlash.h"
#include "systemtask/SystemTask.h" #include "systemtask/SystemTask.h"
#include <nrf_log.h>
using namespace Pinetime::Controllers; using namespace Pinetime::Controllers;

View File

@ -1,6 +1,7 @@
#include "components/ble/HeartRateService.h" #include "components/ble/HeartRateService.h"
#include "components/heartrate/HeartRateController.h" #include "components/heartrate/HeartRateController.h"
#include "systemtask/SystemTask.h" #include "systemtask/SystemTask.h"
#include <nrf_log.h>
using namespace Pinetime::Controllers; using namespace Pinetime::Controllers;

View File

@ -1,6 +1,7 @@
#include "components/ble/MotionService.h" #include "components/ble/MotionService.h"
#include "components/motion/MotionController.h" #include "components/motion/MotionController.h"
#include "systemtask/SystemTask.h" #include "systemtask/SystemTask.h"
#include <nrf_log.h>
using namespace Pinetime::Controllers; using namespace Pinetime::Controllers;

View File

@ -17,6 +17,7 @@
*/ */
#include "components/ble/MusicService.h" #include "components/ble/MusicService.h"
#include "systemtask/SystemTask.h" #include "systemtask/SystemTask.h"
#include <cstring>
namespace { namespace {
// 0000yyxx-78fc-48fe-8e23-433b3a1942d0 // 0000yyxx-78fc-48fe-8e23-433b3a1942d0
@ -47,6 +48,8 @@ namespace {
constexpr ble_uuid128_t msRepeatCharUuid {CharUuid(0x0b, 0x00)}; constexpr ble_uuid128_t msRepeatCharUuid {CharUuid(0x0b, 0x00)};
constexpr ble_uuid128_t msShuffleCharUuid {CharUuid(0x0c, 0x00)}; constexpr ble_uuid128_t msShuffleCharUuid {CharUuid(0x0c, 0x00)};
constexpr uint8_t MaxStringSize {40};
int MusicCallback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt, void* arg) { int MusicCallback(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt, void* arg) {
return static_cast<Pinetime::Controllers::MusicService*>(arg)->OnCommand(conn_handle, attr_handle, ctxt); return static_cast<Pinetime::Controllers::MusicService*>(arg)->OnCommand(conn_handle, attr_handle, ctxt);
} }
@ -125,9 +128,21 @@ void Pinetime::Controllers::MusicService::Init() {
int Pinetime::Controllers::MusicService::OnCommand(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt) { int Pinetime::Controllers::MusicService::OnCommand(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt* ctxt) {
if (ctxt->op == BLE_GATT_ACCESS_OP_WRITE_CHR) { if (ctxt->op == BLE_GATT_ACCESS_OP_WRITE_CHR) {
size_t notifSize = OS_MBUF_PKTLEN(ctxt->om); size_t notifSize = OS_MBUF_PKTLEN(ctxt->om);
char data[notifSize + 1]; size_t bufferSize = notifSize;
data[notifSize] = '\0'; if (notifSize > MaxStringSize) {
os_mbuf_copydata(ctxt->om, 0, notifSize, data); bufferSize = MaxStringSize;
}
char data[bufferSize + 1];
os_mbuf_copydata(ctxt->om, 0, bufferSize, data);
if (notifSize > bufferSize) {
data[bufferSize-1] = '.';
data[bufferSize-2] = '.';
data[bufferSize-3] = '.';
}
data[bufferSize] = '\0';
char* s = &data[0]; char* s = &data[0];
if (ble_uuid_cmp(ctxt->chr->uuid, &msArtistCharUuid.u) == 0) { if (ble_uuid_cmp(ctxt->chr->uuid, &msArtistCharUuid.u) == 0) {
artistName = s; artistName = s;

View File

@ -2,6 +2,7 @@
#include <cstring> #include <cstring>
#include <hal/nrf_rtc.h> #include <hal/nrf_rtc.h>
#include <nrf_log.h>
#define min // workaround: nimble's min/max macros conflict with libstdc++ #define min // workaround: nimble's min/max macros conflict with libstdc++
#define max #define max
#include <host/ble_gap.h> #include <host/ble_gap.h>
@ -23,14 +24,14 @@
using namespace Pinetime::Controllers; using namespace Pinetime::Controllers;
NimbleController::NimbleController(Pinetime::System::SystemTask& systemTask, NimbleController::NimbleController(Pinetime::System::SystemTask& systemTask,
Pinetime::Controllers::Ble& bleController, Ble& bleController,
DateTime& dateTimeController, DateTime& dateTimeController,
Pinetime::Controllers::NotificationManager& notificationManager, NotificationManager& notificationManager,
Controllers::Battery& batteryController, Battery& batteryController,
Pinetime::Drivers::SpiNorFlash& spiNorFlash, Pinetime::Drivers::SpiNorFlash& spiNorFlash,
Controllers::HeartRateController& heartRateController, HeartRateController& heartRateController,
Controllers::MotionController& motionController, MotionController& motionController,
Controllers::FS& fs) FS& fs)
: systemTask {systemTask}, : systemTask {systemTask},
bleController {bleController}, bleController {bleController},
dateTimeController {dateTimeController}, dateTimeController {dateTimeController},
@ -75,6 +76,7 @@ int GAPEventCallback(struct ble_gap_event* event, void* arg) {
void NimbleController::Init() { void NimbleController::Init() {
while (!ble_hs_synced()) { while (!ble_hs_synced()) {
vTaskDelay(10);
} }
nptr = this; nptr = this;
@ -183,7 +185,9 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) {
case BLE_GAP_EVENT_ADV_COMPLETE: case BLE_GAP_EVENT_ADV_COMPLETE:
NRF_LOG_INFO("Advertising event : BLE_GAP_EVENT_ADV_COMPLETE"); NRF_LOG_INFO("Advertising event : BLE_GAP_EVENT_ADV_COMPLETE");
NRF_LOG_INFO("reason=%d; status=%0X", event->adv_complete.reason, event->connect.status); NRF_LOG_INFO("reason=%d; status=%0X", event->adv_complete.reason, event->connect.status);
if (bleController.IsRadioEnabled() && !bleController.IsConnected()) {
StartAdvertising(); StartAdvertising();
}
break; break;
case BLE_GAP_EVENT_CONNECT: case BLE_GAP_EVENT_CONNECT:
@ -219,9 +223,11 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) {
currentTimeClient.Reset(); currentTimeClient.Reset();
alertNotificationClient.Reset(); alertNotificationClient.Reset();
connectionHandle = BLE_HS_CONN_HANDLE_NONE; connectionHandle = BLE_HS_CONN_HANDLE_NONE;
if(bleController.IsConnected()) {
bleController.Disconnect(); bleController.Disconnect();
fastAdvCount = 0; fastAdvCount = 0;
StartAdvertising(); StartAdvertising();
}
break; break;
case BLE_GAP_EVENT_CONN_UPDATE: case BLE_GAP_EVENT_CONN_UPDATE:
@ -396,6 +402,23 @@ void NimbleController::NotifyBatteryLevel(uint8_t level) {
} }
} }
void NimbleController::EnableRadio() {
bleController.EnableRadio();
bleController.Disconnect();
fastAdvCount = 0;
StartAdvertising();
}
void NimbleController::DisableRadio() {
bleController.DisableRadio();
if (bleController.IsConnected()) {
ble_gap_terminate(connectionHandle, BLE_ERR_REM_USER_CONN_TERM);
bleController.Disconnect();
} else {
ble_gap_adv_stop();
}
}
void NimbleController::PersistBond(struct ble_gap_conn_desc& desc) { void NimbleController::PersistBond(struct ble_gap_conn_desc& desc) {
union ble_store_key key; union ble_store_key key;
union ble_store_value our_sec, peer_sec, peer_cccd_set[MYNEWT_VAL(BLE_STORE_MAX_CCCDS)] = {0}; union ble_store_value our_sec, peer_sec, peer_cccd_set[MYNEWT_VAL(BLE_STORE_MAX_CCCDS)] = {0};

View File

@ -14,6 +14,7 @@
#include "components/ble/CurrentTimeService.h" #include "components/ble/CurrentTimeService.h"
#include "components/ble/DeviceInformationService.h" #include "components/ble/DeviceInformationService.h"
#include "components/ble/DfuService.h" #include "components/ble/DfuService.h"
#include "components/ble/FSService.h"
#include "components/ble/HeartRateService.h" #include "components/ble/HeartRateService.h"
#include "components/ble/ImmediateAlertService.h" #include "components/ble/ImmediateAlertService.h"
#include "components/ble/MusicService.h" #include "components/ble/MusicService.h"
@ -22,7 +23,6 @@
#include "components/ble/MotionService.h" #include "components/ble/MotionService.h"
#include "components/ble/weather/WeatherService.h" #include "components/ble/weather/WeatherService.h"
#include "components/fs/FS.h" #include "components/fs/FS.h"
#include "components/ble/FSService.h"
namespace Pinetime { namespace Pinetime {
namespace Drivers { namespace Drivers {
@ -42,27 +42,17 @@ namespace Pinetime {
public: public:
NimbleController(Pinetime::System::SystemTask& systemTask, NimbleController(Pinetime::System::SystemTask& systemTask,
Pinetime::Controllers::Ble& bleController, Ble& bleController,
DateTime& dateTimeController, DateTime& dateTimeController,
Pinetime::Controllers::NotificationManager& notificationManager, NotificationManager& notificationManager,
Controllers::Battery& batteryController, Battery& batteryController,
Pinetime::Drivers::SpiNorFlash& spiNorFlash, Pinetime::Drivers::SpiNorFlash& spiNorFlash,
Controllers::HeartRateController& heartRateController, HeartRateController& heartRateController,
Controllers::MotionController& motionController, MotionController& motionController,
Pinetime::Controllers::FS& fs); FS& fs);
void Init(); void Init();
void StartAdvertising(); void StartAdvertising();
int OnGAPEvent(ble_gap_event* event); int OnGAPEvent(ble_gap_event* event);
int OnDiscoveryEvent(uint16_t i, const ble_gatt_error* pError, const ble_gatt_svc* pSvc);
int OnCTSCharacteristicDiscoveryEvent(uint16_t connectionHandle, const ble_gatt_error* error, const ble_gatt_chr* characteristic);
int OnANSCharacteristicDiscoveryEvent(uint16_t connectionHandle, const ble_gatt_error* error, const ble_gatt_chr* characteristic);
int OnCurrentTimeReadResult(uint16_t connectionHandle, const ble_gatt_error* error, ble_gatt_attr* attribute);
int OnANSDescriptorDiscoveryEventCallback(uint16_t connectionHandle,
const ble_gatt_error* error,
uint16_t characteristicValueHandle,
const ble_gatt_dsc* descriptor);
void StartDiscovery(); void StartDiscovery();
Pinetime::Controllers::MusicService& music() { Pinetime::Controllers::MusicService& music() {
@ -83,7 +73,10 @@ namespace Pinetime {
void RestartFastAdv() { void RestartFastAdv() {
fastAdvCount = 0; fastAdvCount = 0;
} };
void EnableRadio();
void DisableRadio();
private: private:
void PersistBond(struct ble_gap_conn_desc& desc); void PersistBond(struct ble_gap_conn_desc& desc);
@ -91,11 +84,11 @@ namespace Pinetime {
static constexpr const char* deviceName = "InfiniTime"; static constexpr const char* deviceName = "InfiniTime";
Pinetime::System::SystemTask& systemTask; Pinetime::System::SystemTask& systemTask;
Pinetime::Controllers::Ble& bleController; Ble& bleController;
DateTime& dateTimeController; DateTime& dateTimeController;
Pinetime::Drivers::SpiNorFlash& spiNorFlash; Pinetime::Drivers::SpiNorFlash& spiNorFlash;
Pinetime::Controllers::FS& fs; FS& fs;
Pinetime::Controllers::DfuService dfuService; DfuService dfuService;
DeviceInformationService deviceInformationService; DeviceInformationService deviceInformationService;
CurrentTimeClient currentTimeClient; CurrentTimeClient currentTimeClient;

View File

@ -108,11 +108,11 @@ void DateTime::UpdateTime(uint32_t systickCounter) {
} }
} }
const char* DateTime::MonthShortToString() { const char* DateTime::MonthShortToString() const {
return MonthsString[static_cast<uint8_t>(month)]; return MonthsString[static_cast<uint8_t>(month)];
} }
const char* DateTime::DayOfWeekShortToString() { const char* DateTime::DayOfWeekShortToString() const {
return DaysStringShort[static_cast<uint8_t>(dayOfWeek)]; return DaysStringShort[static_cast<uint8_t>(dayOfWeek)];
} }

View File

@ -61,8 +61,8 @@ namespace Pinetime {
return second; return second;
} }
const char* MonthShortToString(); const char* MonthShortToString() const;
const char* DayOfWeekShortToString(); const char* DayOfWeekShortToString() const;
static const char* MonthShortToStringLow(Months month); static const char* MonthShortToStringLow(Months month);
std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds> CurrentDateTime() const { std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds> CurrentDateTime() const {

View File

@ -1,6 +1,8 @@
#pragma once #pragma once
#include <array> #include <array>
#include <cstddef>
#include <cstdint>
#include "components/heartrate/Biquad.h" #include "components/heartrate/Biquad.h"
#include "components/heartrate/Ptagc.h" #include "components/heartrate/Ptagc.h"

View File

@ -12,7 +12,7 @@ namespace Pinetime {
void Init(); void Init();
void RunForDuration(uint8_t motorDuration); void RunForDuration(uint8_t motorDuration);
void StartRinging(); void StartRinging();
static void StopRinging(); void StopRinging();
private: private:
static void Ring(void* p_context); static void Ring(void* p_context);

View File

@ -26,7 +26,7 @@ void Settings::LoadSettingsFromFile() {
SettingsData bufferSettings; SettingsData bufferSettings;
lfs_file_t settingsFile; lfs_file_t settingsFile;
if ( fs.FileOpen(&settingsFile, "/settings.dat", LFS_O_RDWR | LFS_O_CREAT) != LFS_ERR_OK) { if ( fs.FileOpen(&settingsFile, "/settings.dat", LFS_O_RDONLY) != LFS_ERR_OK) {
return; return;
} }
fs.FileRead(&settingsFile, reinterpret_cast<uint8_t*>(&bufferSettings), sizeof(settings)); fs.FileRead(&settingsFile, reinterpret_cast<uint8_t*>(&bufferSettings), sizeof(settings));
@ -39,7 +39,7 @@ void Settings::LoadSettingsFromFile() {
void Settings::SaveSettingsToFile() { void Settings::SaveSettingsToFile() {
lfs_file_t settingsFile; lfs_file_t settingsFile;
if ( fs.FileOpen(&settingsFile, "/settings.dat", LFS_O_RDWR | LFS_O_CREAT) != LFS_ERR_OK) { if ( fs.FileOpen(&settingsFile, "/settings.dat", LFS_O_WRONLY | LFS_O_CREAT) != LFS_ERR_OK) {
return; return;
} }
fs.FileWrite(&settingsFile, reinterpret_cast<uint8_t*>(&settings), sizeof(settings)); fs.FileWrite(&settingsFile, reinterpret_cast<uint8_t*>(&settings), sizeof(settings));

View File

@ -18,7 +18,23 @@ namespace Pinetime {
Shake = 3, Shake = 3,
}; };
enum class Colors : uint8_t { enum class Colors : uint8_t {
White, Silver, Gray, Black, Red, Maroon, Yellow, Olive, Lime, Green, Cyan, Teal, Blue, Navy, Magenta, Purple, Orange White,
Silver,
Gray,
Black,
Red,
Maroon,
Yellow,
Olive,
Lime,
Green,
Cyan,
Teal,
Blue,
Navy,
Magenta,
Purple,
Orange
}; };
struct PineTimeStyle { struct PineTimeStyle {
Colors ColorTime = Colors::Teal; Colors ColorTime = Colors::Teal;
@ -170,18 +186,29 @@ namespace Pinetime {
} }
settings.brightLevel = level; settings.brightLevel = level;
}; };
Controllers::BrightnessController::Levels GetBrightness() const { Controllers::BrightnessController::Levels GetBrightness() const {
return settings.brightLevel; return settings.brightLevel;
}; };
void SetStepsGoal( uint32_t goal ) { void SetStepsGoal(uint32_t goal) {
if ( goal != settings.stepsGoal ) { if (goal != settings.stepsGoal) {
settingsChanged = true; settingsChanged = true;
} }
settings.stepsGoal = goal; settings.stepsGoal = goal;
}; };
uint32_t GetStepsGoal() const { return settings.stepsGoal; }; uint32_t GetStepsGoal() const {
return settings.stepsGoal;
};
void SetBleRadioEnabled(bool enabled) {
bleRadioEnabled = enabled;
};
bool GetBleRadioEnabled() const {
return bleRadioEnabled;
};
private: private:
Pinetime::Controllers::FS& fs; Pinetime::Controllers::FS& fs;
@ -210,6 +237,10 @@ namespace Pinetime {
uint8_t appMenu = 0; uint8_t appMenu = 0;
uint8_t settingsMenu = 0; uint8_t settingsMenu = 0;
/* ble state is intentionally not saved with the other watch settings and initialized
* to off (false) on every boot because we always want ble to be enabled on startup
*/
bool bleRadioEnabled = true;
void LoadSettingsFromFile(); void LoadSettingsFromFile();
void SaveSettingsToFile(); void SaveSettingsToFile();

View File

@ -38,6 +38,7 @@ namespace Pinetime {
SettingSetTime, SettingSetTime,
SettingChimes, SettingChimes,
SettingShakeThreshold, SettingShakeThreshold,
SettingBluetooth,
Error Error
}; };
} }

View File

@ -49,6 +49,7 @@
#include "displayapp/screens/settings/SettingSetTime.h" #include "displayapp/screens/settings/SettingSetTime.h"
#include "displayapp/screens/settings/SettingChimes.h" #include "displayapp/screens/settings/SettingChimes.h"
#include "displayapp/screens/settings/SettingShakeThreshold.h" #include "displayapp/screens/settings/SettingShakeThreshold.h"
#include "displayapp/screens/settings/SettingBluetooth.h"
#include "libs/lv_conf.h" #include "libs/lv_conf.h"
@ -59,28 +60,6 @@ namespace {
static inline bool in_isr(void) { static inline bool in_isr(void) {
return (SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk) != 0; return (SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk) != 0;
} }
TouchEvents ConvertGesture(Pinetime::Drivers::Cst816S::Gestures gesture) {
switch (gesture) {
case Pinetime::Drivers::Cst816S::Gestures::SingleTap:
return TouchEvents::Tap;
case Pinetime::Drivers::Cst816S::Gestures::LongPress:
return TouchEvents::LongTap;
case Pinetime::Drivers::Cst816S::Gestures::DoubleTap:
return TouchEvents::DoubleTap;
case Pinetime::Drivers::Cst816S::Gestures::SlideRight:
return TouchEvents::SwipeRight;
case Pinetime::Drivers::Cst816S::Gestures::SlideLeft:
return TouchEvents::SwipeLeft;
case Pinetime::Drivers::Cst816S::Gestures::SlideDown:
return TouchEvents::SwipeDown;
case Pinetime::Drivers::Cst816S::Gestures::SlideUp:
return TouchEvents::SwipeUp;
case Pinetime::Drivers::Cst816S::Gestures::None:
default:
return TouchEvents::None;
}
}
} }
DisplayApp::DisplayApp(Drivers::St7789& lcd, DisplayApp::DisplayApp(Drivers::St7789& lcd,
@ -97,6 +76,7 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd,
Pinetime::Controllers::MotionController& motionController, Pinetime::Controllers::MotionController& motionController,
Pinetime::Controllers::TimerController& timerController, Pinetime::Controllers::TimerController& timerController,
Pinetime::Controllers::AlarmController& alarmController, Pinetime::Controllers::AlarmController& alarmController,
Pinetime::Controllers::BrightnessController& brightnessController,
Pinetime::Controllers::TouchHandler& touchHandler) Pinetime::Controllers::TouchHandler& touchHandler)
: lcd {lcd}, : lcd {lcd},
lvgl {lvgl}, lvgl {lvgl},
@ -112,6 +92,7 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd,
motionController {motionController}, motionController {motionController},
timerController {timerController}, timerController {timerController},
alarmController {alarmController}, alarmController {alarmController},
brightnessController {brightnessController},
touchHandler {touchHandler} { touchHandler {touchHandler} {
} }
@ -204,7 +185,7 @@ void DisplayApp::Refresh() {
case Messages::TimerDone: case Messages::TimerDone:
if (currentApp == Apps::Timer) { if (currentApp == Apps::Timer) {
auto* timer = static_cast<Screens::Timer*>(currentScreen.get()); auto* timer = static_cast<Screens::Timer*>(currentScreen.get());
timer->setDone(); timer->SetDone();
} else { } else {
LoadApp(Apps::Timer, DisplayApp::FullRefreshDirections::Down); LoadApp(Apps::Timer, DisplayApp::FullRefreshDirections::Down);
} }
@ -224,7 +205,7 @@ void DisplayApp::Refresh() {
if (state != States::Running) { if (state != States::Running) {
break; break;
} }
auto gesture = ConvertGesture(touchHandler.GestureGet()); auto gesture = touchHandler.GestureGet();
if (gesture == TouchEvents::None) { if (gesture == TouchEvents::None) {
break; break;
} }
@ -290,6 +271,9 @@ void DisplayApp::Refresh() {
case Messages::BleFirmwareUpdateStarted: case Messages::BleFirmwareUpdateStarted:
LoadApp(Apps::FirmwareUpdate, DisplayApp::FullRefreshDirections::Down); LoadApp(Apps::FirmwareUpdate, DisplayApp::FullRefreshDirections::Down);
break; break;
case Messages::BleRadioEnableToggle:
PushMessageToSystemTask(System::Messages::BleRadioEnableToggle);
break;
case Messages::UpdateDateTime: case Messages::UpdateDateTime:
// Added to remove warning // Added to remove warning
// What should happen here? // What should happen here?
@ -300,14 +284,14 @@ void DisplayApp::Refresh() {
} }
} }
if (touchHandler.IsTouching()) {
currentScreen->OnTouchEvent(touchHandler.GetX(), touchHandler.GetY());
}
if (nextApp != Apps::None) { if (nextApp != Apps::None) {
LoadApp(nextApp, nextDirection); LoadApp(nextApp, nextDirection);
nextApp = Apps::None; nextApp = Apps::None;
} }
if (touchHandler.IsTouching()) {
currentScreen->OnTouchEvent(touchHandler.GetX(), touchHandler.GetY());
}
} }
void DisplayApp::StartApp(Apps app, DisplayApp::FullRefreshDirections direction) { void DisplayApp::StartApp(Apps app, DisplayApp::FullRefreshDirections direction) {
@ -428,6 +412,10 @@ void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction)
currentScreen = std::make_unique<Screens::SettingShakeThreshold>(this, settingsController, motionController, *systemTask); currentScreen = std::make_unique<Screens::SettingShakeThreshold>(this, settingsController, motionController, *systemTask);
ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown); ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown);
break; break;
case Apps::SettingBluetooth:
currentScreen = std::make_unique<Screens::SettingBluetooth>(this, settingsController);
ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown);
break;
case Apps::BatteryInfo: case Apps::BatteryInfo:
currentScreen = std::make_unique<Screens::BatteryInfo>(this, batteryController); currentScreen = std::make_unique<Screens::BatteryInfo>(this, batteryController);
ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown); ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown);

View File

@ -61,6 +61,7 @@ namespace Pinetime {
Pinetime::Controllers::MotionController& motionController, Pinetime::Controllers::MotionController& motionController,
Pinetime::Controllers::TimerController& timerController, Pinetime::Controllers::TimerController& timerController,
Pinetime::Controllers::AlarmController& alarmController, Pinetime::Controllers::AlarmController& alarmController,
Pinetime::Controllers::BrightnessController& brightnessController,
Pinetime::Controllers::TouchHandler& touchHandler); Pinetime::Controllers::TouchHandler& touchHandler);
void Start(System::BootErrors error); void Start(System::BootErrors error);
void PushMessage(Display::Messages msg); void PushMessage(Display::Messages msg);
@ -87,10 +88,10 @@ namespace Pinetime {
Pinetime::Controllers::MotionController& motionController; Pinetime::Controllers::MotionController& motionController;
Pinetime::Controllers::TimerController& timerController; Pinetime::Controllers::TimerController& timerController;
Pinetime::Controllers::AlarmController& alarmController; Pinetime::Controllers::AlarmController& alarmController;
Pinetime::Controllers::BrightnessController &brightnessController;
Pinetime::Controllers::TouchHandler& touchHandler; Pinetime::Controllers::TouchHandler& touchHandler;
Pinetime::Controllers::FirmwareValidator validator; Pinetime::Controllers::FirmwareValidator validator;
Controllers::BrightnessController brightnessController;
TaskHandle_t taskHandle; TaskHandle_t taskHandle;

View File

@ -23,6 +23,7 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd,
Pinetime::Controllers::MotionController& motionController, Pinetime::Controllers::MotionController& motionController,
Pinetime::Controllers::TimerController& timerController, Pinetime::Controllers::TimerController& timerController,
Pinetime::Controllers::AlarmController& alarmController, Pinetime::Controllers::AlarmController& alarmController,
Pinetime::Controllers::BrightnessController& brightnessController,
Pinetime::Controllers::TouchHandler& touchHandler) Pinetime::Controllers::TouchHandler& touchHandler)
: lcd {lcd}, bleController {bleController} { : lcd {lcd}, bleController {bleController} {

View File

@ -34,6 +34,7 @@ namespace Pinetime {
class MotorController; class MotorController;
class TimerController; class TimerController;
class AlarmController; class AlarmController;
class BrightnessController;
} }
namespace System { namespace System {
@ -57,6 +58,7 @@ namespace Pinetime {
Pinetime::Controllers::MotionController& motionController, Pinetime::Controllers::MotionController& motionController,
Pinetime::Controllers::TimerController& timerController, Pinetime::Controllers::TimerController& timerController,
Pinetime::Controllers::AlarmController& alarmController, Pinetime::Controllers::AlarmController& alarmController,
Pinetime::Controllers::BrightnessController& brightnessController,
Pinetime::Controllers::TouchHandler& touchHandler); Pinetime::Controllers::TouchHandler& touchHandler);
void Start(); void Start();
void Start(Pinetime::System::BootErrors){ Start(); }; void Start(Pinetime::System::BootErrors){ Start(); };

View File

@ -21,7 +21,8 @@ namespace Pinetime {
RestoreBrightness, RestoreBrightness,
ShowPairingKey, ShowPairingKey,
AlarmTriggered, AlarmTriggered,
Clock Clock,
BleRadioEnableToggle
}; };
} }
} }

Binary file not shown.

Binary file not shown.

View File

@ -7,20 +7,12 @@
## Generate the fonts: ## Generate the fonts:
* Open the [LVGL font converter](https://lvgl.io/tools/fontconverter) * Open the [LVGL font converter](https://lvgl.io/tools/fontconverter)
* Name : jetbrains_mono_bold_20 * Enter the settings for the font that you wish to convert
* Size : 20 * Click on Convert, download the file and place it in `src/DisplayApp/Fonts`
* Bpp : 1 bit-per-pixel
* Do not enable font compression and horizontal subpixel hinting
* Load the file `JetBrainsMono-Bold.tff` (use the file in this repo to ensure the version matches) 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, 0xf04d, 0xf2f2, 0xf024, 0xf252, 0xf569, 0xf201, 0xf06e, 0xf015`
* Click on Convert, and download the file `jetbrains_mono_bold_20.c` and copy it in `src/DisplayApp/Fonts`
* Add the font .c file path to src/CMakeLists.txt
* Add an LV_FONT_DECLARE line in src/libs/lv_conf.h
Add new symbols: ### How to add new symbols:
* Browse the [cheatsheet](https://fontawesome.com/cheatsheet/free/solid) and find your new symbols * Browse [this cheatsheet](https://fontawesome.com/cheatsheet/free/solid) and pick symbols
* For each symbol, add its hex code (0xf641 for the 'Ad' icon, for example) to the *Range* list (Remember to keep this * 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) readme updated with newest range list)
* Convert this hex value into a UTF-8 code * Convert this hex value into a UTF-8 code
@ -31,32 +23,77 @@ Add new symbols:
static constexpr const char* newSymbol = "\xEF\x86\x85"; static constexpr const char* newSymbol = "\xEF\x86\x85";
``` ```
## Simple method to generate a font ### Small font
If you want to generate a basic font containing only numbers and letters, you can use the above settings but instead of specifying a range, simply list the characters you need in the Symbols field and leave the range blank. This is the approach used for the PineTimeStyle watchface. * Name: jetbrains_mono_bold_20
This works well for fonts which will only be used to display numbers, but will fail if you try to add a colon or other punctuation. * Size: 20
* Bpp: 1 bit-per-pixel
* Do not enable font compression or horizontal subpixel rendering
* Load the file `JetBrainsMono-Bold.tff` (use the file in this repo to ensure the version matches) and specify the following range: `0x20-0x7e, 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, 0xf04d, 0xf2f2, 0xf024, 0xf252, 0xf569, 0xf201, 0xf06e, 0xf015`
* Fix an error in the font conversion.
* Open the [LVGL font converter](https://lvgl.io/tools/fontconverter) Replace the following:
* Name : open_sans_light
* Size : 150
* Bpp : 1 bit-per-pixel
* Do not enable font compression and horizontal subpixel hinting
* Load the file `open_sans_light.tff` (use the file in this repo to ensure the version matches) and specify the following symbols : `0123456789`
* Click on Convert, and download the file `open_sans_light.c` and copy it in `src/DisplayApp/Fonts`
* Add the font .c file path to src/CMakeLists.txt (search for jetbrains to find the appropriate location/format)
* Add an LV_FONT_DECLARE line in src/libs/lv_conf.h (as above)
#### Navigation font /* U+0030 "0" */
0x3f, 0x1f, 0xef, 0x3f, 0x87, 0xe1, 0xf8, 0x7f,
0xdf, 0xf7, 0xe1, 0xf8, 0x7e, 0x1f, 0xcf, 0x7f,
0x8f, 0xc0,
To create the navigtion.ttf I use the web app [icomoon](https://icomoon.io/app) with
this app can import the svg files from the folder *src/displayapp/icons/navigation/unique* and creat a ttf file the
project for the site is *lv_font_navi_80.json* you can import it to add or remove icons
You can also use the online LVGL tool to create the .c /* U+0030 "0" */
0x3f, 0x1f, 0xef, 0x3f, 0x87, 0xe1, 0xf8, 0x7e,
0xdf, 0xb7, 0xe1, 0xf8, 0x7e, 0x1f, 0xcf, 0x7f,
0x8f, 0xc0,
ttf file : navigation.ttf name : lv_font_navi_80 size : 80px Bpp : 2 bit-per-pixel range : 0xe900-0xe929 (there are two changes: 7f -> 7e and f7 -> b7)
$lv_font_conv --font navigation.ttf -r '0xe900-0xe929' --size 80 --format lvgl --bpp 2 --no-prefilter -o ### Medium font
lv_font_navi_80.c
#### I use the method above to create the other ttf * Name: jetbrains_mono_42
* Size: 42
* Bpp: 1 bit-per-pixel
* Do not enable font compression or horizontal subpixel rendering
* Load the file `JetBrainsMono-Regular.tff` (use the file in this repo to ensure the version matches) and specify the following range: `0x25, 0x30-0x3a`
### Large font
* Name: jetbrains_mono_76
* Size: 76
* Bpp: 1 bit-per-pixel
* Do not enable font compression or horizontal subpixel rendering
* Load the file `JetBrainsMono-Regular.tff` (use the file in this repo to ensure the version matches) and specify the following range: `0x25, 0x2D, 0x2F, 0x30-0x3a`
### Digital watchface font
* Name: jetbrains_mono_extrabold_compressed
* Size: 80
* Bpp: 1 bit-per-pixel
* Do not enable font compression or horizontal subpixel rendering
* Load the file `JetBrainsMono-ExtraBold.tff` (use the file in this repo to ensure the version matches) and specify the following range: `0x30-0x3a`
### PineTimeStyle font
* Name: open_sans_light
* Size: 150
* Bpp: 1 bit-per-pixel
* Do not enable font compression or horizontal subpixel rendering
* Load the file `open_sans_light.tff` (use the file in this repo to ensure the version matches) and specify the following symbols: `0123456789`
### Symbols font (Used in QuickSettings for example)
* Name: lv_font_sys_48
* Size: 48
* Bpp: 1 bit-per-pixel
* Do not enable font compression or horizontal subpixel rendering
* Load the file `icons_sys_48.tff` and specify the following range: `0xe902, 0xe904-0xe907, 0xe90b-0xe90c`
### Navigation font
`navigtion.ttf` is created with the web app [icomoon](https://icomoon.io/app) by importing the svg files from `src/displayapp/icons/navigation/unique` and generating the font. `lv_font_navi_80.json` is a project file for the site, which you can import to add or remove icons.
This font must be generated with the `lv_font_conv` tool, which has additional options not available in the online converter.
`lv_font_conv --font navigation.ttf -r '0xe900-0xe929' --size 80 --format lvgl --bpp 2 -o lv_font_navi_80.c`

View File

@ -61,13 +61,13 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0xff, 0xf8, 0xff, 0xf8,
/* U+0032 "2" */ /* U+0032 "2" */
0x3, 0xf8, 0x1, 0xff, 0xc0, 0x7f, 0xfe, 0x1f, 0x3, 0xf8, 0x1, 0xff, 0xc0, 0xff, 0xfc, 0x1f,
0x7, 0xc7, 0xc0, 0x3c, 0xf0, 0x7, 0xbc, 0x0, 0x7, 0xc7, 0xc0, 0x7c, 0xf0, 0x7, 0xbc, 0x0,
0x7f, 0x80, 0xf, 0xf0, 0x1, 0xe0, 0x0, 0x3c, 0x7f, 0x80, 0xf, 0xf0, 0x1, 0xe0, 0x0, 0x3c,
0x0, 0x7, 0x80, 0x1, 0xf0, 0x0, 0x3c, 0x0, 0x0, 0x7, 0x80, 0x1, 0xf0, 0x0, 0x3c, 0x0,
0xf, 0x80, 0x1, 0xe0, 0x0, 0x7c, 0x0, 0x1f, 0xf, 0x80, 0x1, 0xe0, 0x0, 0x7c, 0x0, 0x1f,
0x0, 0x7, 0xc0, 0x1, 0xf0, 0x0, 0x7e, 0x0, 0x0, 0x7, 0xc0, 0x1, 0xf0, 0x0, 0x7c, 0x0,
0xf, 0x80, 0x3, 0xe0, 0x0, 0xf8, 0x0, 0x3e, 0x1f, 0x0, 0x3, 0xc0, 0x0, 0xf0, 0x0, 0x3e,
0x0, 0xf, 0x80, 0x3, 0xe0, 0x0, 0xf8, 0x0, 0x0, 0xf, 0x80, 0x3, 0xe0, 0x0, 0xf8, 0x0,
0x3e, 0x0, 0x7, 0xff, 0xfe, 0xff, 0xff, 0xdf, 0x3e, 0x0, 0x7, 0xff, 0xfe, 0xff, 0xff, 0xdf,
0xff, 0xf8, 0xff, 0xf8,
@ -75,12 +75,12 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
/* U+0033 "3" */ /* U+0033 "3" */
0x7f, 0xff, 0x8f, 0xff, 0xf1, 0xff, 0xfe, 0x0, 0x7f, 0xff, 0x8f, 0xff, 0xf1, 0xff, 0xfe, 0x0,
0x3, 0xc0, 0x0, 0xf0, 0x0, 0x3c, 0x0, 0xf, 0x3, 0xc0, 0x0, 0xf0, 0x0, 0x3c, 0x0, 0xf,
0x0, 0x3, 0xc0, 0x0, 0xf0, 0x0, 0x3e, 0x0, 0x0, 0x3, 0xe0, 0x0, 0x78, 0x0, 0x1e, 0x0,
0x7, 0x80, 0x1, 0xfe, 0x0, 0x3f, 0xf0, 0x7, 0x7, 0x80, 0x1, 0xfc, 0x0, 0x3f, 0xe0, 0x7,
0xff, 0x0, 0x3, 0xf0, 0x0, 0x1e, 0x0, 0x3, 0xfe, 0x0, 0xff, 0xe0, 0x0, 0x3e, 0x0, 0x3,
0xc0, 0x0, 0x3c, 0x0, 0x7, 0x80, 0x0, 0xf0, 0xc0, 0x0, 0x7c, 0x0, 0x7, 0x80, 0x0, 0xf0,
0x0, 0x1e, 0x0, 0x3, 0xfc, 0x0, 0x7f, 0x80, 0x0, 0x1e, 0x0, 0x3, 0xfc, 0x0, 0x7f, 0x80,
0xf, 0xf0, 0x1, 0xef, 0x0, 0x79, 0xf0, 0x1f, 0xf, 0xf0, 0x1, 0xff, 0x0, 0x79, 0xe0, 0x1f,
0x1f, 0x7, 0xc3, 0xff, 0xf0, 0x1f, 0xfc, 0x0, 0x1f, 0x7, 0xc3, 0xff, 0xf0, 0x1f, 0xfc, 0x0,
0xfe, 0x0, 0xfe, 0x0,
@ -245,7 +245,7 @@ lv_font_t jetbrains_mono_42 = {
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) #if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE, .subpx = LV_FONT_SUBPX_NONE,
#endif #endif
#if LV_VERSION_CHECK(7, 4, 0) #if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = -7, .underline_position = -7,
.underline_thickness = 2, .underline_thickness = 2,
#endif #endif

View File

@ -175,30 +175,30 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
/* U+0032 "2" */ /* U+0032 "2" */
0x0, 0x7, 0xfc, 0x0, 0x0, 0x1f, 0xff, 0xe0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0x1f, 0xff, 0xe0,
0x0, 0x1f, 0xff, 0xfe, 0x0, 0xf, 0xff, 0xff, 0x0, 0x1f, 0xff, 0xfe, 0x0, 0xf, 0xff, 0xff,
0xe0, 0x7, 0xff, 0xff, 0xfc, 0x3, 0xff, 0xff, 0xc0, 0x7, 0xff, 0xff, 0xf8, 0x3, 0xff, 0xff,
0xff, 0x81, 0xff, 0xc0, 0x7f, 0xe0, 0xff, 0x80, 0xff, 0x1, 0xff, 0xc0, 0x7f, 0xe0, 0xff, 0x80,
0x7, 0xfc, 0x3f, 0xc0, 0x0, 0xff, 0x1f, 0xe0, 0x7, 0xfc, 0x3f, 0xc0, 0x0, 0xff, 0x1f, 0xe0,
0x0, 0x1f, 0xe7, 0xf0, 0x0, 0x3, 0xf9, 0xfc, 0x0, 0x1f, 0xe7, 0xf0, 0x0, 0x3, 0xf9, 0xfc,
0x0, 0x0, 0xfe, 0xff, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0xfe, 0xff, 0x0, 0x0, 0x3f, 0xff,
0x80, 0x0, 0x7, 0xff, 0xe0, 0x0, 0x1, 0xff, 0x80, 0x0, 0x7, 0xff, 0xe0, 0x0, 0x1, 0xff,
0xf8, 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x1f, 0xf8, 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x1f,
0xc0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x1, 0xc0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x1,
0xfc, 0x0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x0, 0xfc, 0x0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x0,
0x3f, 0xc0, 0x0, 0x0, 0xf, 0xe0, 0x0, 0x0, 0x3f, 0x80, 0x0, 0x0, 0xf, 0xe0, 0x0, 0x0,
0x7, 0xf8, 0x0, 0x0, 0x1, 0xfe, 0x0, 0x0, 0x7, 0xf8, 0x0, 0x0, 0x1, 0xfc, 0x0, 0x0,
0x0, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xc0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x3f, 0x80, 0x0,
0x0, 0x1f, 0xe0, 0x0, 0x0, 0xf, 0xf0, 0x0, 0x0, 0x1f, 0xe0, 0x0, 0x0, 0xf, 0xf0, 0x0,
0x0, 0x7, 0xfc, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x0, 0x7, 0xf8, 0x0, 0x0, 0x3, 0xfe, 0x0,
0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x7f, 0xc0, 0x0, 0x1, 0xff, 0x0, 0x0, 0x0, 0xff, 0x80,
0x0, 0x0, 0x3f, 0xe0, 0x0, 0x0, 0x1f, 0xf0, 0x0, 0x0, 0x3f, 0xc0, 0x0, 0x0, 0x1f, 0xe0,
0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, 0x7, 0xfc, 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, 0x7, 0xfc,
0x0, 0x0, 0x3, 0xfe, 0x0, 0x0, 0x1, 0xff, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x0, 0x1, 0xff,
0x0, 0x0, 0x0, 0xff, 0x80, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x0, 0xff, 0x80, 0x0, 0x0, 0x7f,
0xc0, 0x0, 0x0, 0x3f, 0xe0, 0x0, 0x0, 0x1f, 0xc0, 0x0, 0x0, 0x3f, 0xe0, 0x0, 0x0, 0x1f,
0xf8, 0x0, 0x0, 0xf, 0xfc, 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, 0x7,
0xfe, 0x0, 0x0, 0x1, 0xff, 0x0, 0x0, 0x0, 0xfc, 0x0, 0x0, 0x3, 0xfe, 0x0, 0x0, 0x0,
0xff, 0x80, 0x0, 0x0, 0x7f, 0xc0, 0x0, 0x0, 0xff, 0x80, 0x0, 0x0, 0x7f, 0xc0, 0x0, 0x0,
0x3f, 0xe0, 0x0, 0x0, 0x1f, 0xf0, 0x0, 0x0, 0x3f, 0xe0, 0x0, 0x0, 0x1f, 0xf0, 0x0, 0x0,
0xf, 0xf8, 0x0, 0x0, 0x7, 0xfc, 0x0, 0x0, 0xf, 0xf8, 0x0, 0x0, 0x7, 0xfc, 0x0, 0x0,
@ -214,22 +214,22 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0xff, 0x80, 0x0, 0x0, 0xf, 0xe0, 0x0, 0x0, 0xff, 0x80, 0x0, 0x0, 0xf, 0xe0, 0x0, 0x0,
0x7, 0xf0, 0x0, 0x0, 0x3, 0xf8, 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x3, 0xf8, 0x0, 0x0,
0x1, 0xfc, 0x0, 0x0, 0x0, 0xfe, 0x0, 0x0, 0x1, 0xfc, 0x0, 0x0, 0x0, 0xfe, 0x0, 0x0,
0x0, 0x7f, 0x80, 0x0, 0x0, 0x1f, 0xc0, 0x0, 0x0, 0x7f, 0x80, 0x0, 0x0, 0x3f, 0xc0, 0x0,
0x0, 0xf, 0xe0, 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x1f, 0xe0, 0x0, 0x0, 0x7, 0xf0, 0x0,
0x0, 0x3, 0xf8, 0x0, 0x0, 0x1, 0xfc, 0x0, 0x0, 0x3, 0xf8, 0x0, 0x0, 0x1, 0xfc, 0x0,
0x0, 0x0, 0xfe, 0x0, 0x0, 0x0, 0x7f, 0x80, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x7f, 0x80,
0x0, 0x0, 0x3f, 0xc0, 0x0, 0x0, 0x1f, 0xe0, 0x0, 0x0, 0x3f, 0xc0, 0x0, 0x0, 0x1f, 0xe0,
0x0, 0x0, 0x7, 0xff, 0x80, 0x0, 0x1, 0xff, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x1, 0xff,
0xfc, 0x0, 0x0, 0x7f, 0xff, 0xc0, 0x0, 0x1f, 0xfc, 0x0, 0x0, 0x7f, 0xff, 0xc0, 0x0, 0x1f,
0xff, 0xf8, 0x0, 0x7, 0xff, 0xff, 0x0, 0x1, 0xff, 0xf8, 0x0, 0x7, 0xff, 0xff, 0x0, 0x1,
0xff, 0xff, 0xe0, 0x0, 0x0, 0x1f, 0xfc, 0x0, 0xff, 0xff, 0xe0, 0x0, 0x0, 0xf, 0xfc, 0x0,
0x0, 0x1, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xe0, 0x0, 0x1, 0xff, 0x0, 0x0, 0x0, 0x1f, 0xe0,
0x0, 0x0, 0x7, 0xf8, 0x0, 0x0, 0x0, 0xfe, 0x0, 0x0, 0x7, 0xf8, 0x0, 0x0, 0x0, 0xfe,
0x0, 0x0, 0x0, 0x3f, 0xc0, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x3f, 0xc0, 0x0, 0x0, 0x7,
0xf0, 0x0, 0x0, 0x1, 0xfc, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, 0x1, 0xfc, 0x0, 0x0, 0x0,
0x7f, 0x0, 0x0, 0x0, 0x1f, 0xc0, 0x0, 0x0, 0x7f, 0x0, 0x0, 0x0, 0x1f, 0xc0, 0x0, 0x0,
0x7, 0xf0, 0x0, 0x0, 0x1, 0xfc, 0x0, 0x0, 0x7, 0xf0, 0x0, 0x0, 0x1, 0xfc, 0x0, 0x0,
0x0, 0x7f, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x80, 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x1f, 0xff, 0x80,
0x0, 0x7, 0xff, 0xe0, 0x0, 0x1, 0xff, 0xf8, 0x0, 0x7, 0xff, 0xe0, 0x0, 0x1, 0xff, 0xf8,
0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x3f, 0xdf, 0x0, 0x0, 0x7f, 0xff, 0x0, 0x0, 0x3f, 0xdf,
0xc0, 0x0, 0xf, 0xe7, 0xf8, 0x0, 0x7, 0xf9, 0xc0, 0x0, 0xf, 0xe7, 0xf8, 0x0, 0x7, 0xf9,
@ -466,10 +466,10 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {
{.bitmap_index = 878, .adv_w = 730, .box_w = 34, .box_h = 56, .ofs_x = 7, .ofs_y = 0}, {.bitmap_index = 878, .adv_w = 730, .box_w = 34, .box_h = 56, .ofs_x = 7, .ofs_y = 0},
{.bitmap_index = 1116, .adv_w = 730, .box_w = 34, .box_h = 57, .ofs_x = 6, .ofs_y = 0}, {.bitmap_index = 1116, .adv_w = 730, .box_w = 34, .box_h = 57, .ofs_x = 6, .ofs_y = 0},
{.bitmap_index = 1359, .adv_w = 730, .box_w = 34, .box_h = 57, .ofs_x = 5, .ofs_y = -1}, {.bitmap_index = 1359, .adv_w = 730, .box_w = 34, .box_h = 57, .ofs_x = 5, .ofs_y = -1},
{.bitmap_index = 1602, .adv_w = 730, .box_w = 32, .box_h = 56, .ofs_x = 6, .ofs_y = 0}, {.bitmap_index = 1602, .adv_w = 730, .box_w = 32, .box_h = 56, .ofs_x = 5, .ofs_y = 0},
{.bitmap_index = 1826, .adv_w = 730, .box_w = 32, .box_h = 57, .ofs_x = 7, .ofs_y = -1}, {.bitmap_index = 1826, .adv_w = 730, .box_w = 32, .box_h = 57, .ofs_x = 7, .ofs_y = -1},
{.bitmap_index = 2054, .adv_w = 730, .box_w = 36, .box_h = 58, .ofs_x = 5, .ofs_y = -1}, {.bitmap_index = 2054, .adv_w = 730, .box_w = 36, .box_h = 58, .ofs_x = 5, .ofs_y = -1},
{.bitmap_index = 2315, .adv_w = 730, .box_w = 36, .box_h = 56, .ofs_x = 5, .ofs_y = 0}, {.bitmap_index = 2315, .adv_w = 730, .box_w = 36, .box_h = 56, .ofs_x = 6, .ofs_y = 0},
{.bitmap_index = 2567, .adv_w = 730, .box_w = 36, .box_h = 58, .ofs_x = 5, .ofs_y = -1}, {.bitmap_index = 2567, .adv_w = 730, .box_w = 36, .box_h = 58, .ofs_x = 5, .ofs_y = -1},
{.bitmap_index = 2828, .adv_w = 730, .box_w = 36, .box_h = 57, .ofs_x = 5, .ofs_y = 0}, {.bitmap_index = 2828, .adv_w = 730, .box_w = 36, .box_h = 57, .ofs_x = 5, .ofs_y = 0},
{.bitmap_index = 3085, .adv_w = 730, .box_w = 13, .box_h = 44, .ofs_x = 16, .ofs_y = -1} {.bitmap_index = 3085, .adv_w = 730, .box_w = 13, .box_h = 44, .ofs_x = 16, .ofs_y = -1}
@ -541,7 +541,7 @@ lv_font_t jetbrains_mono_76 = {
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) #if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE, .subpx = LV_FONT_SUBPX_NONE,
#endif #endif
#if LV_VERSION_CHECK(7, 4, 0) #if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = -12, .underline_position = -12,
.underline_thickness = 4, .underline_thickness = 4,
#endif #endif

View File

@ -32,9 +32,9 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0xef, 0xdf, 0xbf, 0x7e, 0xfd, 0xc0, 0xef, 0xdf, 0xbf, 0x7e, 0xfd, 0xc0,
/* U+0023 "#" */ /* U+0023 "#" */
0x8, 0xc3, 0x10, 0x66, 0x3f, 0xf7, 0xfe, 0x23, 0x8, 0xc3, 0x18, 0x62, 0x3f, 0xf7, 0xfe, 0x23,
0x4, 0x61, 0x88, 0x31, 0x1f, 0xfb, 0xff, 0x19, 0xc, 0x61, 0x88, 0xff, 0xdf, 0xf8, 0x8c, 0x11,
0x82, 0x30, 0xc4, 0x0, 0x86, 0x30, 0xc4, 0x0,
/* U+0024 "$" */ /* U+0024 "$" */
0x8, 0x2, 0x0, 0x81, 0xfc, 0x7f, 0xba, 0x7e, 0x8, 0x2, 0x0, 0x81, 0xfc, 0x7f, 0xba, 0x7e,
@ -88,16 +88,16 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0xe, 0x3, 0x80, 0xc0, 0x70, 0x18, 0xe, 0x0, 0xe, 0x3, 0x80, 0xc0, 0x70, 0x18, 0xe, 0x0,
/* U+0030 "0" */ /* U+0030 "0" */
0x3f, 0x1f, 0xef, 0x3f, 0x87, 0xe1, 0xf8, 0x7f, 0x3f, 0x1f, 0xef, 0x3f, 0x87, 0xe1, 0xf8, 0x7e,
0xdf, 0xf7, 0xe1, 0xf8, 0x7e, 0x1f, 0xcf, 0x7f, 0xdf, 0xb7, 0xe1, 0xf8, 0x7e, 0x1f, 0xcf, 0x7f,
0x8f, 0xc0, 0x8f, 0xc0,
/* U+0031 "1" */ /* U+0031 "1" */
0x1e, 0x3f, 0x3b, 0x99, 0xc8, 0xe0, 0x70, 0x38, 0x1e, 0x3f, 0x3f, 0x99, 0xc8, 0xe0, 0x70, 0x38,
0x1c, 0xe, 0x7, 0x3, 0x81, 0xcf, 0xff, 0xfc, 0x1c, 0xe, 0x7, 0x3, 0x81, 0xcf, 0xff, 0xfc,
/* U+0032 "2" */ /* U+0032 "2" */
0x3e, 0x3f, 0xbc, 0xfc, 0x70, 0x38, 0x1c, 0x1c, 0x3e, 0x3f, 0xbd, 0xfc, 0x70, 0x38, 0x1c, 0x1c,
0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0xf, 0xff, 0xfc, 0x1e, 0x1e, 0x1e, 0x1e, 0x1e, 0xf, 0xff, 0xfc,
/* U+0033 "3" */ /* U+0033 "3" */
@ -122,7 +122,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
/* U+0037 "7" */ /* U+0037 "7" */
0xff, 0xff, 0xfe, 0x1f, 0x86, 0x3, 0x80, 0xe0, 0xff, 0xff, 0xfe, 0x1f, 0x86, 0x3, 0x80, 0xe0,
0x30, 0x1c, 0x6, 0x3, 0x80, 0xc0, 0x70, 0x1c, 0x30, 0x1c, 0x6, 0x3, 0x80, 0xc0, 0x70, 0x1c,
0x6, 0x0, 0xe, 0x0,
/* U+0038 "8" */ /* U+0038 "8" */
0x3f, 0x1f, 0xef, 0x3f, 0x87, 0xe1, 0xdc, 0xe3, 0x3f, 0x1f, 0xef, 0x3f, 0x87, 0xe1, 0xdc, 0xe3,
@ -157,7 +157,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0x30, 0x30, 0x0, 0x0, 0x70, 0x70, 0x30, 0x30, 0x0, 0x0, 0x70, 0x70,
/* U+0040 "@" */ /* U+0040 "@" */
0x1f, 0x7, 0xf9, 0xc3, 0x70, 0x3c, 0x7, 0x8f, 0x1f, 0x7, 0xf9, 0xc3, 0x70, 0x3c, 0x7, 0x8e,
0xf3, 0xfe, 0x63, 0xcc, 0x79, 0x8f, 0x31, 0xe6, 0xf3, 0xfe, 0x63, 0xcc, 0x79, 0x8f, 0x31, 0xe6,
0x3c, 0xff, 0x8e, 0xf8, 0x3, 0x80, 0x3e, 0x3, 0x3c, 0xff, 0x8e, 0xf8, 0x3, 0x80, 0x3e, 0x3,
0xc0, 0xc0,
@ -168,8 +168,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0xf0, 0x30, 0xf0, 0x30,
/* U+0042 "B" */ /* U+0042 "B" */
0xfe, 0x3f, 0xce, 0x3b, 0x8e, 0xe3, 0xb8, 0xcf, 0xfe, 0x3f, 0xce, 0x3b, 0x8e, 0xe3, 0xb8, 0xef,
0xe3, 0xfc, 0xe3, 0xb8, 0x7e, 0x1f, 0x8f, 0xff, 0xe3, 0xfc, 0xe3, 0xf8, 0x7e, 0x1f, 0x8f, 0xff,
0xbf, 0xc0, 0xbf, 0xc0,
/* U+0043 "C" */ /* U+0043 "C" */
@ -217,9 +217,9 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0xc0, 0xe0, 0x70, 0x38, 0x1c, 0xf, 0xff, 0xfc, 0xc0, 0xe0, 0x70, 0x38, 0x1c, 0xf, 0xff, 0xfc,
/* U+004D "M" */ /* U+004D "M" */
0xe1, 0xf8, 0x7f, 0x3f, 0xcf, 0xd2, 0xf7, 0xbd, 0xf3, 0xfc, 0xfd, 0x3f, 0xcf, 0xff, 0xff, 0xfe,
0xef, 0x33, 0xc0, 0xf0, 0x3c, 0xf, 0x3, 0xc0, 0xdf, 0xb7, 0xe1, 0xf8, 0x7e, 0x1f, 0x87, 0xe1,
0xf0, 0x30, 0xf8, 0x70,
/* U+004E "N" */ /* U+004E "N" */
0xe1, 0xf0, 0xfc, 0x7e, 0x3f, 0x9e, 0xcf, 0x67, 0xe1, 0xf0, 0xfc, 0x7e, 0x3f, 0x9e, 0xcf, 0x67,
@ -245,7 +245,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0xb8, 0x70, 0xb8, 0x70,
/* U+0053 "S" */ /* U+0053 "S" */
0x3f, 0x1f, 0xee, 0x3f, 0x87, 0xe0, 0x3c, 0x7, 0x3f, 0x1f, 0xee, 0x3f, 0x87, 0xe0, 0x3e, 0x7,
0xf0, 0xfe, 0x3, 0xc0, 0x7e, 0x1f, 0xcf, 0x7f, 0xf0, 0xfe, 0x3, 0xc0, 0x7e, 0x1f, 0xcf, 0x7f,
0x8f, 0xc0, 0x8f, 0xc0,
@ -260,7 +260,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
/* U+0056 "V" */ /* U+0056 "V" */
0xc0, 0xf8, 0x7e, 0x1d, 0x86, 0x61, 0x9c, 0xe7, 0xc0, 0xf8, 0x7e, 0x1d, 0x86, 0x61, 0x9c, 0xe7,
0x38, 0xcc, 0x33, 0xf, 0xc3, 0xf0, 0x78, 0x1e, 0x38, 0xcc, 0x33, 0xe, 0xc3, 0xf0, 0x78, 0x1e,
0x7, 0x80, 0x7, 0x80,
/* U+0057 "W" */ /* U+0057 "W" */
@ -314,8 +314,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0xc7, 0xe3, 0xf1, 0xf8, 0xfc, 0x7f, 0xf7, 0x70, 0xc7, 0xe3, 0xf1, 0xf8, 0xfc, 0x7f, 0xf7, 0x70,
/* U+0063 "c" */ /* U+0063 "c" */
0x3e, 0x3f, 0xb8, 0xfc, 0x7e, 0x7, 0x3, 0x81, 0x3f, 0x1f, 0xef, 0x3f, 0x87, 0xe0, 0x38, 0xe,
0xc7, 0xe3, 0xbf, 0x8f, 0x80, 0x3, 0x87, 0xf3, 0xdf, 0xe3, 0xf0,
/* U+0064 "d" */ /* U+0064 "d" */
0x3, 0x81, 0xc0, 0xe7, 0x77, 0xff, 0x1f, 0x8f, 0x3, 0x81, 0xc0, 0xe7, 0x77, 0xff, 0x1f, 0x8f,
@ -382,12 +382,12 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0xe, 0xe,
/* U+0072 "r" */ /* U+0072 "r" */
0xee, 0x7f, 0xb9, 0xfc, 0x7e, 0x3f, 0x3, 0x81, 0xee, 0x7f, 0xb8, 0xfc, 0x7e, 0x3f, 0x3, 0x81,
0xc0, 0xe0, 0x70, 0x38, 0x0, 0xc0, 0xe0, 0x70, 0x38, 0x0,
/* U+0073 "s" */ /* U+0073 "s" */
0x1f, 0x1f, 0xf7, 0x1d, 0xc0, 0x7c, 0xf, 0xe0, 0x1f, 0x1f, 0xf7, 0x1d, 0xc0, 0x7c, 0xf, 0xe0,
0x3c, 0x7, 0x71, 0xdf, 0xe3, 0xf0, 0x3c, 0x7, 0x71, 0xdf, 0xf3, 0xf0,
/* U+0074 "t" */ /* U+0074 "t" */
0x1c, 0x7, 0x1, 0xc3, 0xff, 0xff, 0xc7, 0x1, 0x1c, 0x7, 0x1, 0xc3, 0xff, 0xff, 0xc7, 0x1,
@ -399,12 +399,12 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0xc7, 0xe3, 0xbf, 0x8f, 0x80, 0xc7, 0xe3, 0xbf, 0x8f, 0x80,
/* U+0076 "v" */ /* U+0076 "v" */
0xe0, 0xf8, 0x76, 0x19, 0x86, 0x73, 0x8c, 0xc3, 0xc0, 0xf8, 0x7e, 0x1d, 0x86, 0x73, 0x8c, 0xc3,
0x30, 0xfc, 0x1e, 0x7, 0x81, 0xe0, 0x30, 0xfc, 0x1e, 0x7, 0x81, 0xe0,
/* U+0077 "w" */ /* U+0077 "w" */
0xe6, 0x36, 0x66, 0x66, 0x66, 0xf6, 0x6f, 0x66, 0xc6, 0x36, 0x66, 0x66, 0x66, 0xf6, 0x6f, 0x66,
0x96, 0x69, 0x62, 0x94, 0x39, 0xc3, 0x9c, 0x39, 0x96, 0x69, 0x62, 0x94, 0x29, 0x43, 0x9c, 0x39,
0xc0, 0xc0,
/* U+0078 "x" */ /* U+0078 "x" */
@ -412,7 +412,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0xe0, 0xfc, 0x73, 0x9c, 0xee, 0x1c, 0xe0, 0xfc, 0x73, 0x9c, 0xee, 0x1c,
/* U+0079 "y" */ /* U+0079 "y" */
0xe1, 0xf8, 0x76, 0x19, 0xce, 0x73, 0x8c, 0xc3, 0xe0, 0xf8, 0x76, 0x19, 0xce, 0x73, 0x8c, 0xc3,
0xf0, 0x7c, 0x1e, 0x7, 0x80, 0xe0, 0x30, 0x1c, 0xf0, 0x7c, 0x1e, 0x7, 0x80, 0xe0, 0x30, 0x1c,
0x6, 0x3, 0x80, 0x6, 0x3, 0x80,
@ -421,17 +421,17 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0xe0, 0xe0, 0x7f, 0xff, 0xe0, 0xe0, 0xe0, 0x7f, 0xff, 0xe0,
/* U+007B "{" */ /* U+007B "{" */
0x3, 0x87, 0xc3, 0x81, 0xc0, 0xe0, 0x70, 0x38, 0x7, 0x87, 0xc3, 0x81, 0xc0, 0xe0, 0x70, 0x38,
0x1c, 0xfc, 0x7e, 0x3, 0x81, 0xc0, 0xe0, 0x70, 0x1c, 0xfc, 0x7e, 0x3, 0x81, 0xc0, 0xe0, 0x70,
0x38, 0x1c, 0xf, 0x81, 0xc0, 0x30, 0x1c, 0xf, 0x83, 0xc0,
/* U+007C "|" */ /* U+007C "|" */
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc,
/* U+007D "}" */ /* U+007D "}" */
0xf0, 0x3e, 0x1, 0xc0, 0x70, 0x1c, 0x7, 0x1, 0xf0, 0x7c, 0xe, 0x7, 0x3, 0x81, 0xc0, 0xe0,
0xc0, 0x70, 0xf, 0xc3, 0xf1, 0xc0, 0x70, 0x1c, 0x70, 0x1f, 0x8f, 0xce, 0x7, 0x3, 0x81, 0xc0,
0x7, 0x1, 0xc0, 0x70, 0xf8, 0x3c, 0x0, 0x60, 0x70, 0xf8, 0x78, 0x0,
/* U+007E "~" */ /* U+007E "~" */
0x78, 0xff, 0x3c, 0xcf, 0x3f, 0xc7, 0x80, 0x78, 0xff, 0x3c, 0xcf, 0x3f, 0xc7, 0x80,
@ -447,8 +447,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0xbf, 0xc0, 0xbf, 0xc0,
/* U+0412 "В" */ /* U+0412 "В" */
0xfe, 0x3f, 0xce, 0x3b, 0x8e, 0xe3, 0xb8, 0xcf, 0xfe, 0x3f, 0xce, 0x3b, 0x8e, 0xe3, 0xb8, 0xef,
0xe3, 0xfc, 0xe3, 0xb8, 0x7e, 0x1f, 0x8f, 0xff, 0xe3, 0xfc, 0xe3, 0xf8, 0x7e, 0x1f, 0x8f, 0xff,
0xbf, 0xc0, 0xbf, 0xc0,
/* U+0413 "Г" */ /* U+0413 "Г" */
@ -470,9 +470,9 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0x66, 0x66, 0x66, 0x6c, 0x63, 0x66, 0x66, 0x66, 0x6c, 0x63,
/* U+0417 "З" */ /* U+0417 "З" */
0x1f, 0xf, 0xf3, 0xc7, 0x0, 0x60, 0x1c, 0x1e, 0x3f, 0x1f, 0xef, 0x1f, 0x87, 0x1, 0xc7, 0xc1,
0x3, 0xf0, 0xe, 0x0, 0xe0, 0x1f, 0x83, 0xf8, 0xf8, 0xf, 0x1, 0xc0, 0x7e, 0x1f, 0xcf, 0x7f,
0xf7, 0xfc, 0x3e, 0x0, 0x8f, 0x80,
/* U+0418 "И" */ /* U+0418 "И" */
0xc3, 0xe3, 0xf1, 0xf8, 0xfc, 0xde, 0x6f, 0x37, 0xc3, 0xe3, 0xf1, 0xf8, 0xfc, 0xde, 0x6f, 0x37,
@ -494,9 +494,9 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0xf8, 0x70, 0xf8, 0x70,
/* U+041C "М" */ /* U+041C "М" */
0xe1, 0xf8, 0x7f, 0x3f, 0xcf, 0xd2, 0xf7, 0xbd, 0xf3, 0xfc, 0xfd, 0x3f, 0xcf, 0xff, 0xff, 0xfe,
0xef, 0x33, 0xc0, 0xf0, 0x3c, 0xf, 0x3, 0xc0, 0xdf, 0xb7, 0xe1, 0xf8, 0x7e, 0x1f, 0x87, 0xe1,
0xf0, 0x30, 0xf8, 0x70,
/* U+041D "Н" */ /* U+041D "Н" */
0xe3, 0xf1, 0xf8, 0xfc, 0x7e, 0x3f, 0x1f, 0xff, 0xe3, 0xf1, 0xf8, 0xfc, 0x7e, 0x3f, 0x1f, 0xff,
@ -546,7 +546,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0xff, 0xf0, 0x1c, 0x7, 0x1, 0xc0, 0xff, 0xf0, 0x1c, 0x7, 0x1, 0xc0,
/* U+0427 "Ч" */ /* U+0427 "Ч" */
0xe3, 0xf1, 0xf8, 0xfc, 0x7e, 0x3f, 0x1f, 0xce, 0xe3, 0xf1, 0xf8, 0xfc, 0x7e, 0x3f, 0x1f, 0x8f,
0xff, 0x3f, 0x81, 0xc0, 0xe0, 0x70, 0x38, 0x1c, 0xff, 0x3f, 0x81, 0xc0, 0xe0, 0x70, 0x38, 0x1c,
/* U+0428 "Ш" */ /* U+0428 "Ш" */
@ -593,8 +593,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0x1f, 0x87, 0xe3, 0xff, 0xf3, 0xdc, 0x1f, 0x87, 0xe3, 0xff, 0xf3, 0xdc,
/* U+0431 "б" */ /* U+0431 "б" */
0x1f, 0x3f, 0x9c, 0x1c, 0xe, 0xe7, 0xfb, 0x8f, 0x1f, 0x3f, 0x9c, 0x1c, 0xe, 0xe7, 0xfb, 0x9f,
0xc7, 0xe3, 0xf1, 0xf8, 0xfc, 0x77, 0xf1, 0xf0, 0xc7, 0xe3, 0xf1, 0xf8, 0xfe, 0xf7, 0xf1, 0xf0,
/* U+0432 "в" */ /* U+0432 "в" */
0xff, 0x3f, 0xee, 0x3b, 0x8e, 0xfe, 0x3f, 0xee, 0xff, 0x3f, 0xee, 0x3b, 0x8e, 0xfe, 0x3f, 0xee,
@ -619,7 +619,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0x70, 0x70,
/* U+0437 "з" */ /* U+0437 "з" */
0x3f, 0x1f, 0xfe, 0x1c, 0x7, 0x1f, 0x87, 0xe0, 0x3f, 0x1f, 0xfe, 0x1c, 0x7, 0x1f, 0x7, 0xe0,
0x1c, 0x7, 0xe1, 0xdf, 0xe3, 0xf0, 0x1c, 0x7, 0xe1, 0xdf, 0xe3, 0xf0,
/* U+0438 "и" */ /* U+0438 "и" */
@ -632,8 +632,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0xc7, 0xc3, 0xc7, 0xc3,
/* U+043A "к" */ /* U+043A "к" */
0xe1, 0xf8, 0xee, 0x33, 0x9c, 0xfe, 0x3f, 0x8e, 0xe1, 0xf8, 0xee, 0x3b, 0x9c, 0xfe, 0x3f, 0x8e,
0x73, 0x9c, 0xe3, 0xb8, 0x6e, 0x1c, 0x73, 0x8c, 0xe3, 0xb8, 0x6e, 0x1c,
/* U+043B "л" */ /* U+043B "л" */
0x3f, 0xcf, 0xf3, 0x9c, 0xe7, 0x39, 0xce, 0x73, 0x3f, 0xcf, 0xf3, 0x9c, 0xe7, 0x39, 0xce, 0x73,
@ -644,7 +644,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0xef, 0x33, 0xc0, 0xf0, 0x3c, 0xc, 0xef, 0x33, 0xc0, 0xf0, 0x3c, 0xc,
/* U+043D "н" */ /* U+043D "н" */
0xe3, 0xf1, 0xf8, 0xfc, 0x7e, 0x3f, 0xff, 0xff, 0xe3, 0xf1, 0xf8, 0xfc, 0x7f, 0xff, 0xff, 0x8f,
0xc7, 0xe3, 0xf1, 0xf8, 0xe0, 0xc7, 0xe3, 0xf1, 0xf8, 0xe0,
/* U+043E "о" */ /* U+043E "о" */
@ -661,15 +661,15 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0x80, 0x80,
/* U+0441 "с" */ /* U+0441 "с" */
0x3e, 0x3f, 0xb8, 0xfc, 0x7e, 0x7, 0x3, 0x81, 0x3f, 0x1f, 0xef, 0x3f, 0x87, 0xe0, 0x38, 0xe,
0xc7, 0xe3, 0xbf, 0x8f, 0x80, 0x3, 0x87, 0xf3, 0xdf, 0xe3, 0xf0,
/* U+0442 "т" */ /* U+0442 "т" */
0xff, 0xff, 0xf0, 0xe0, 0x38, 0xe, 0x3, 0x80, 0xff, 0xff, 0xf0, 0xe0, 0x38, 0xe, 0x3, 0x80,
0xe0, 0x38, 0xe, 0x3, 0x80, 0xe0, 0xe0, 0x38, 0xe, 0x3, 0x80, 0xe0,
/* U+0443 "у" */ /* U+0443 "у" */
0xe1, 0xf8, 0x76, 0x19, 0xce, 0x73, 0x8c, 0xc3, 0xe0, 0xf8, 0x76, 0x19, 0xce, 0x73, 0x8c, 0xc3,
0xf0, 0x7c, 0x1e, 0x7, 0x80, 0xe0, 0x30, 0x1c, 0xf0, 0x7c, 0x1e, 0x7, 0x80, 0xe0, 0x30, 0x1c,
0x6, 0x3, 0x80, 0x6, 0x3, 0x80,
@ -688,7 +688,7 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0xc0, 0x70, 0xc0, 0x70,
/* U+0447 "ч" */ /* U+0447 "ч" */
0xe3, 0xf1, 0xf8, 0xfc, 0x7e, 0x3b, 0xfc, 0xfe, 0xe3, 0xf1, 0xf8, 0xfc, 0x7e, 0x3f, 0xfd, 0xfe,
0x7, 0x3, 0x81, 0xc0, 0xe0, 0x7, 0x3, 0x81, 0xc0, 0xe0,
/* U+0448 "ш" */ /* U+0448 "ш" */
@ -714,8 +714,8 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
0x1f, 0x87, 0xe1, 0xff, 0xef, 0xf0, 0x1f, 0x87, 0xe1, 0xff, 0xef, 0xf0,
/* U+044D "э" */ /* U+044D "э" */
0x3e, 0x3f, 0xb8, 0xe0, 0x70, 0xf8, 0x7c, 0xf, 0x1f, 0x1f, 0xe6, 0x3c, 0x7, 0xf, 0xc3, 0xf0,
0xc7, 0xe7, 0xbf, 0x8f, 0x80, 0x1d, 0x87, 0x73, 0xdf, 0xe1, 0xf0,
/* U+044E "ю" */ /* U+044E "ю" */
0xc7, 0xb3, 0xfc, 0xcf, 0x33, 0xfc, 0xff, 0x3c, 0xc7, 0xb3, 0xfc, 0xcf, 0x33, 0xfc, 0xff, 0x3c,
@ -1113,138 +1113,138 @@ static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {
{.bitmap_index = 975, .adv_w = 192, .box_w = 5, .box_h = 3, .ofs_x = 3, .ofs_y = 13}, {.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 = 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 = 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 = 1007, .adv_w = 192, .box_w = 10, .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 = 1021, .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 = 1037, .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 = 1050, .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 = 1068, .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 = 1085, .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 = 1101, .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 = 1121, .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 = 1140, .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 = 1158, .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 = 1178, .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 = 1192, .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 = 1205, .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 = 1218, .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 = 1235, .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 = 1252, .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 = 1265, .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 = 1279, .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 = 1297, .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 = 1310, .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 = 1324, .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 = 1341, .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 = 1355, .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 = 1374, .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 = 1387, .adv_w = 192, .box_w = 9, .box_h = 18, .ofs_x = 1, .ofs_y = -2},
{.bitmap_index = 1407, .adv_w = 192, .box_w = 3, .box_h = 18, .ofs_x = 5, .ofs_y = -2}, {.bitmap_index = 1408, .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 = 1415, .adv_w = 192, .box_w = 9, .box_h = 18, .ofs_x = 2, .ofs_y = -2},
{.bitmap_index = 1437, .adv_w = 192, .box_w = 10, .box_h = 5, .ofs_x = 1, .ofs_y = 5}, {.bitmap_index = 1436, .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 = 1443, .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 = 1461, .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 = 1479, .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 = 1497, .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 = 1513, .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 = 1537, .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 = 1553, .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 = 1, .ofs_y = 0}, {.bitmap_index = 1574, .adv_w = 192, .box_w = 10, .box_h = 14, .ofs_x = 1, .ofs_y = 0},
{.bitmap_index = 1595, .adv_w = 192, .box_w = 9, .box_h = 14, .ofs_x = 1, .ofs_y = 0}, {.bitmap_index = 1592, .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 = 1608, .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 = 1630, .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 = 1648, .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 = 1666, .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 = 1684, .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 = 1700, .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 = 1716, .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 = 1732, .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 = 1750, .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 = 1768, .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 = 1786, .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 = 1804, .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 = 1824, .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 = 1842, .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 = 1864, .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 = 1880, .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 = 1898, .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 = 1920, .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 = 1941, .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 = 1959, .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 = 1977, .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 = 1993, .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 = 2011, .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 = 2029, .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 = 2043, .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 = 2059, .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 = 2073, .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 = 2084, .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 = 2104, .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 = 2117, .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 = 2134, .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 = 2148, .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 = 2161, .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 = 2179, .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 = 2193, .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 = 2207, .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 = 2221, .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 = 2234, .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 = 2247, .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 = 2260, .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 = 2277, .adv_w = 192, .box_w = 10, .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 = 2291, .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 = 2305, .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 = 2324, .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 = 2347, .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 = 2361, .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 = 2379, .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 = 2392, .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 = 2406, .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 = 2424, .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 = 2441, .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 = 2455, .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 = 2469, .adv_w = 192, .box_w = 10, .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 = 2483, .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 = 2497, .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 = 2510, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 2561, .adv_w = 360, .box_w = 23, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, {.bitmap_index = 2560, .adv_w = 360, .box_w = 23, .box_h = 17, .ofs_x = 0, .ofs_y = -1},
{.bitmap_index = 2610, .adv_w = 320, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, {.bitmap_index = 2609, .adv_w = 320, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 2658, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, {.bitmap_index = 2657, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 2708, .adv_w = 240, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, {.bitmap_index = 2707, .adv_w = 240, .box_w = 15, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 2737, .adv_w = 360, .box_w = 23, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, {.bitmap_index = 2736, .adv_w = 360, .box_w = 23, .box_h = 19, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 2792, .adv_w = 280, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, {.bitmap_index = 2791, .adv_w = 280, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -1},
{.bitmap_index = 2831, .adv_w = 320, .box_w = 20, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, {.bitmap_index = 2830, .adv_w = 320, .box_w = 20, .box_h = 17, .ofs_x = 0, .ofs_y = -1},
{.bitmap_index = 2874, .adv_w = 280, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, {.bitmap_index = 2873, .adv_w = 280, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = -1},
{.bitmap_index = 2902, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, {.bitmap_index = 2901, .adv_w = 280, .box_w = 18, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 2950, .adv_w = 280, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, {.bitmap_index = 2949, .adv_w = 280, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -1},
{.bitmap_index = 2989, .adv_w = 280, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, {.bitmap_index = 2988, .adv_w = 280, .box_w = 18, .box_h = 17, .ofs_x = 0, .ofs_y = -1},
{.bitmap_index = 3028, .adv_w = 280, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = -1}, {.bitmap_index = 3027, .adv_w = 280, .box_w = 13, .box_h = 17, .ofs_x = 2, .ofs_y = -1},
{.bitmap_index = 3056, .adv_w = 320, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, {.bitmap_index = 3055, .adv_w = 320, .box_w = 19, .box_h = 20, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 3104, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, {.bitmap_index = 3103, .adv_w = 360, .box_w = 23, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 3148, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, {.bitmap_index = 3147, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 3201, .adv_w = 120, .box_w = 8, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, {.bitmap_index = 3200, .adv_w = 120, .box_w = 8, .box_h = 19, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3220, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -3}, {.bitmap_index = 3219, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 3270, .adv_w = 240, .box_w = 15, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, {.bitmap_index = 3269, .adv_w = 240, .box_w = 15, .box_h = 19, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3306, .adv_w = 320, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, {.bitmap_index = 3305, .adv_w = 320, .box_w = 20, .box_h = 19, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3354, .adv_w = 320, .box_w = 21, .box_h = 15, .ofs_x = 0, .ofs_y = 0}, {.bitmap_index = 3353, .adv_w = 320, .box_w = 21, .box_h = 15, .ofs_x = 0, .ofs_y = 0},
{.bitmap_index = 3394, .adv_w = 320, .box_w = 20, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, {.bitmap_index = 3393, .adv_w = 320, .box_w = 20, .box_h = 17, .ofs_x = 0, .ofs_y = -1},
{.bitmap_index = 3437, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, {.bitmap_index = 3436, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1},
{.bitmap_index = 3475, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, {.bitmap_index = 3474, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1},
{.bitmap_index = 3513, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, {.bitmap_index = 3512, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1},
{.bitmap_index = 3551, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, {.bitmap_index = 3550, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1},
{.bitmap_index = 3589, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1}, {.bitmap_index = 3588, .adv_w = 400, .box_w = 25, .box_h = 12, .ofs_x = 0, .ofs_y = 1},
{.bitmap_index = 3627, .adv_w = 240, .box_w = 15, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, {.bitmap_index = 3626, .adv_w = 240, .box_w = 15, .box_h = 19, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3663, .adv_w = 280, .box_w = 15, .box_h = 20, .ofs_x = 1, .ofs_y = -3}, {.bitmap_index = 3662, .adv_w = 280, .box_w = 15, .box_h = 20, .ofs_x = 1, .ofs_y = -3},
{.bitmap_index = 3701, .adv_w = 200, .box_w = 11, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, {.bitmap_index = 3700, .adv_w = 200, .box_w = 11, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 3730, .adv_w = 280, .box_w = 16, .box_h = 19, .ofs_x = 1, .ofs_y = -2}, {.bitmap_index = 3729, .adv_w = 280, .box_w = 16, .box_h = 19, .ofs_x = 1, .ofs_y = -2},
{.bitmap_index = 3768, .adv_w = 400, .box_w = 25, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, {.bitmap_index = 3767, .adv_w = 400, .box_w = 25, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 3834, .adv_w = 360, .box_w = 23, .box_h = 17, .ofs_x = 0, .ofs_y = -1}, {.bitmap_index = 3833, .adv_w = 360, .box_w = 23, .box_h = 17, .ofs_x = 0, .ofs_y = -1},
{.bitmap_index = 3883, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, {.bitmap_index = 3882, .adv_w = 320, .box_w = 20, .box_h = 20, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3933, .adv_w = 400, .box_w = 25, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, {.bitmap_index = 3932, .adv_w = 400, .box_w = 25, .box_h = 19, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 3993, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, {.bitmap_index = 3992, .adv_w = 320, .box_w = 20, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 4046, .adv_w = 360, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -3}, {.bitmap_index = 4045, .adv_w = 360, .box_w = 23, .box_h = 21, .ofs_x = 0, .ofs_y = -3},
{.bitmap_index = 4107, .adv_w = 360, .box_w = 22, .box_h = 20, .ofs_x = 0, .ofs_y = -2}, {.bitmap_index = 4106, .adv_w = 360, .box_w = 22, .box_h = 20, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 4162, .adv_w = 360, .box_w = 22, .box_h = 19, .ofs_x = 0, .ofs_y = -2}, {.bitmap_index = 4161, .adv_w = 360, .box_w = 22, .box_h = 19, .ofs_x = 0, .ofs_y = -2},
{.bitmap_index = 4215, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0} {.bitmap_index = 4214, .adv_w = 320, .box_w = 20, .box_h = 15, .ofs_x = 0, .ofs_y = 0}
}; };
/*--------------------- /*---------------------
@ -1321,7 +1321,7 @@ lv_font_t jetbrains_mono_bold_20 = {
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) #if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE, .subpx = LV_FONT_SUBPX_NONE,
#endif #endif
#if LV_VERSION_CHECK(7, 4, 0) #if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = -3, .underline_position = -3,
.underline_thickness = 1, .underline_thickness = 1,
#endif #endif

View File

@ -1,11 +1,15 @@
#include "lvgl/lvgl.h"
/******************************************************************************* /*******************************************************************************
* Size: 80 px * Size: 80 px
* Bpp: 1 * Bpp: 1
* Opts: * Opts:
******************************************************************************/ ******************************************************************************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef JETBRAINS_MONO_EXTRABOLD_COMPRESSED #ifndef JETBRAINS_MONO_EXTRABOLD_COMPRESSED
#define JETBRAINS_MONO_EXTRABOLD_COMPRESSED 1 #define JETBRAINS_MONO_EXTRABOLD_COMPRESSED 1
#endif #endif
@ -17,418 +21,412 @@
*----------------*/ *----------------*/
/*Store the image of the glyphs*/ /*Store the image of the glyphs*/
static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = { static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = {
/* U+30 "0" */ /* U+0030 "0" */
0x0, 0x1, 0xff, 0xc0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x3, 0xff, 0x80, 0x0, 0x0, 0x3f, 0xff,
0xfe, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xc0, 0x0, 0xe0, 0x0, 0x1, 0xff, 0xff, 0xf0, 0x0, 0xf,
0x3f, 0xff, 0xff, 0xf8, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x3f, 0xff, 0xff, 0xf8,
0xfe, 0x0, 0x3f, 0xff, 0xff, 0xff, 0x80, 0x3f, 0x0, 0xff, 0xff, 0xff, 0xf8, 0x3, 0xff, 0xff,
0xff, 0xff, 0xff, 0xe0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf, 0xff, 0xff, 0xff, 0xf8, 0x3f,
0xf8, 0x1f, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x7f, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0x1f, 0xff, 0xe0, 0x3f, 0xff, 0xf1, 0xff, 0xfc, 0x7, 0xff, 0xf3, 0xff, 0xe0,
0xcf, 0xff, 0xc0, 0x7, 0xff, 0xe7, 0xff, 0xc0, 0x3, 0xff, 0xe7, 0xff, 0x80, 0x3, 0xff, 0xdf,
0x1, 0xff, 0xf7, 0xff, 0xc0, 0x0, 0x7f, 0xff, 0xfe, 0x0, 0x3, 0xff, 0xff, 0xfc, 0x0, 0x3,
0xff, 0xe0, 0x0, 0x3f, 0xff, 0xff, 0xe0, 0x0, 0xff, 0xff, 0xf0, 0x0, 0x7, 0xff, 0xff, 0xe0,
0xf, 0xff, 0xff, 0xf0, 0x0, 0x7, 0xff, 0xff, 0x0, 0xf, 0xff, 0xff, 0xc0, 0x0, 0x1f, 0xff,
0xf8, 0x0, 0x3, 0xff, 0xff, 0xfc, 0x0, 0x1, 0xff, 0x80, 0x0, 0x3f, 0xff, 0xff, 0x0, 0x0,
0xff, 0xff, 0xfe, 0x0, 0x0, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xfe, 0x0, 0x0, 0xff, 0xff, 0xfc,
0x0, 0x0, 0x7f, 0xff, 0xff, 0x80, 0x0, 0x3f, 0x0, 0x1, 0xff, 0xff, 0xf8, 0x0, 0x3, 0xff,
0xff, 0xff, 0xc0, 0x70, 0x1f, 0xff, 0xff, 0xe0, 0xff, 0xf0, 0x0, 0x7, 0xff, 0xff, 0xe0, 0x7c,
0x7c, 0xf, 0xff, 0xff, 0xf0, 0x7f, 0x7, 0xff, 0xf, 0xff, 0xff, 0xc1, 0xfe, 0x1f, 0xff, 0xff,
0xff, 0xf8, 0x3f, 0x83, 0xff, 0xff, 0xfc, 0x1f, 0x87, 0xfc, 0x3f, 0xff, 0xff, 0x1f, 0xfc, 0x7f,
0xc1, 0xff, 0xff, 0xfe, 0xf, 0xe0, 0xff, 0xff, 0xff, 0xfe, 0x3f, 0xf8, 0xff, 0xff, 0xfc, 0x7f,
0xff, 0x7, 0xf0, 0x7f, 0xff, 0xff, 0x83, 0xf8, 0xf1, 0xff, 0xff, 0xf8, 0xff, 0xe3, 0xff, 0xff,
0x3f, 0xff, 0xff, 0xc1, 0xfc, 0x1f, 0xff, 0xff, 0xf1, 0xff, 0xc7, 0xff, 0xff, 0xe1, 0xff, 0xf,
0xe0, 0xfe, 0xf, 0xff, 0xff, 0xf0, 0x7f, 0x7, 0xff, 0xff, 0xc1, 0xfc, 0x1f, 0xff, 0xff, 0x81,
0xff, 0xff, 0xf8, 0x3f, 0x83, 0xff, 0xff, 0xfc, 0xf0, 0x3f, 0xff, 0xff, 0x0, 0x0, 0x7f, 0xff,
0x1f, 0xc1, 0xff, 0xff, 0xfe, 0xf, 0xe0, 0xff, 0xfe, 0x0, 0x0, 0xff, 0xff, 0xfc, 0x0, 0x1,
0xff, 0xff, 0x3, 0xe0, 0x7f, 0xff, 0xff, 0x80, 0xff, 0xff, 0xf8, 0x0, 0x3, 0xff, 0xff, 0xf0,
0xe0, 0x3f, 0xff, 0xff, 0xc0, 0x0, 0x1f, 0xff, 0x0, 0x7, 0xff, 0xff, 0xe0, 0x0, 0xf, 0xff,
0xff, 0xe0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xc0, 0x0, 0x1f, 0xff, 0xff, 0x80, 0x0,
0x7, 0xff, 0xff, 0xf8, 0x0, 0x3, 0xff, 0xff, 0x3f, 0xff, 0xff, 0x0, 0x0, 0x7f, 0xff, 0xfe,
0xfc, 0x0, 0x1, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0xfe, 0x0, 0x1, 0xff,
0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x7, 0xff, 0xbf, 0xfc, 0x0,
0xc0, 0x0, 0x7f, 0xf9, 0xff, 0xf0, 0x0, 0x7f, 0x1f, 0xfe, 0x7f, 0xfc, 0x0, 0x7f, 0xfc, 0xff,
0xfc, 0xff, 0xfc, 0x0, 0x7f, 0xfe, 0x7f, 0xff, 0xfe, 0x3, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff,
0x80, 0xff, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xff, 0xff, 0xff, 0xc1, 0xff, 0xff,
0x7, 0xff, 0xff, 0xff, 0xff, 0x3, 0xff, 0xff, 0xff, 0xff, 0x1, 0xff, 0xff, 0xff, 0xfc, 0x1,
0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xf0, 0x1, 0xff, 0xff, 0xff,
0x3f, 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, 0xc0, 0x1, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff,
0xff, 0x80, 0x3, 0xff, 0xff, 0xff, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x7f, 0xff, 0xc0, 0x0,
0x7f, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xfc, 0x0, 0x1f, 0xfc, 0x0, 0x0,
0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, 0x0,
/* U+31 "1" */ /* U+0031 "1" */
0x0, 0x7, 0xff, 0xe0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x3f, 0xff,
0xe0, 0x0, 0x0, 0x3f, 0xff, 0xe0, 0x0, 0x0, 0x80, 0x0, 0x1, 0xff, 0xfe, 0x0, 0x0, 0x1f,
0x7f, 0xff, 0xe0, 0x0, 0x1, 0xff, 0xff, 0xe0, 0xff, 0xf8, 0x0, 0x0, 0xff, 0xff, 0xe0, 0x0,
0x0, 0x3, 0xff, 0xff, 0xe0, 0x0, 0x7, 0xff, 0x7, 0xff, 0xff, 0x80, 0x0, 0x7f, 0xff, 0xfe,
0xff, 0xe0, 0x0, 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf8, 0x0, 0x3f, 0xff,
0x3f, 0xff, 0xff, 0xe0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xe0, 0x1, 0xff, 0xff, 0xff, 0x80, 0xf,
0xe0, 0x0, 0x7f, 0xff, 0xff, 0xe0, 0x0, 0x7f, 0xff, 0xff, 0xfe, 0x0, 0x3f, 0xff, 0xff, 0xf8,
0xfd, 0xff, 0xe0, 0x0, 0x7f, 0xf9, 0xff, 0xe0, 0x0, 0xff, 0xfd, 0xff, 0xe0, 0x3, 0xff, 0xc7,
0x0, 0x7f, 0xf1, 0xff, 0xe0, 0x0, 0x7f, 0xe1, 0xff, 0x80, 0xf, 0xfe, 0x1f, 0xfe, 0x0, 0x3f,
0xff, 0xe0, 0x0, 0x7f, 0x81, 0xff, 0xe0, 0x0, 0xe0, 0x7f, 0xf8, 0x0, 0xff, 0x1, 0xff, 0xe0,
0x7f, 0x1, 0xff, 0xe0, 0x0, 0x7c, 0x1, 0xff, 0x3, 0xf8, 0x7, 0xff, 0x80, 0xf, 0x80, 0x1f,
0xe0, 0x0, 0x78, 0x1, 0xff, 0xe0, 0x0, 0x60, 0xfe, 0x0, 0x3c, 0x0, 0x7f, 0xf8, 0x0, 0xe0,
0x1, 0xff, 0xe0, 0x0, 0x40, 0x1, 0xff, 0xe0, 0x1, 0xff, 0xe0, 0x2, 0x0, 0x7, 0xff, 0x80,
0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x1f, 0xfe, 0x0, 0x0, 0x0, 0x7f,
0xff, 0xe0, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0xf8, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0,
0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x1, 0xff, 0x7, 0xff, 0x80, 0x0, 0x0, 0x1f, 0xfe, 0x0,
0xe0, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x0, 0x0, 0x1, 0xff,
0x1, 0xff, 0xe0, 0x0, 0x0, 0x1, 0xff, 0xe0, 0xe0, 0x0, 0x0, 0x7, 0xff, 0x80, 0x0, 0x0,
0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x1, 0x1f, 0xfe, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x0,
0xff, 0xe0, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x7, 0xff,
0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x1, 0xff, 0x80, 0x0, 0x0, 0x1f, 0xfe, 0x0, 0x0, 0x0,
0xe0, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x7f, 0xf8, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0,
0x1, 0xff, 0xe0, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0x7, 0xff, 0x80, 0x0, 0x0, 0x1f, 0xfe,
0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x0, 0x0, 0x1,
0xff, 0xe0, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0xff, 0xe0, 0x0, 0x0, 0x7, 0xff, 0x80, 0x0,
0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x1, 0xff, 0x0, 0x1f, 0xfe, 0x0, 0x0, 0x0, 0x7f, 0xf8,
0xe0, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x7,
0x1, 0xff, 0xe0, 0x0, 0x0, 0x1, 0xff, 0xe0, 0xff, 0x80, 0x0, 0x0, 0x1f, 0xfe, 0x0, 0x0,
0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x1, 0x0, 0x7f, 0xf8, 0x0, 0xff, 0xff, 0xff, 0xff,
0xff, 0xe0, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xc0,
/* U+32 "2" */ /* U+0032 "2" */
0x0, 0x1, 0xff, 0xc0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x1, 0xff, 0x80, 0x0, 0x0, 0x3f, 0xff,
0xfc, 0x0, 0x0, 0x1f, 0xff, 0xff, 0x80, 0x0, 0xe0, 0x0, 0x1, 0xff, 0xff, 0xf8, 0x0, 0xf,
0x3f, 0xff, 0xff, 0xf0, 0x0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x3f, 0xff, 0xff, 0xf8,
0xfc, 0x0, 0x3f, 0xff, 0xff, 0xff, 0x0, 0x3f, 0x0, 0xff, 0xff, 0xff, 0xfc, 0x3, 0xff, 0xff,
0xff, 0xff, 0xff, 0xc0, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0xf, 0xff, 0xff, 0xff, 0xf8, 0x1f,
0xf0, 0x3f, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x7f, 0xff, 0xff, 0xff,
0xff, 0xff, 0xfe, 0x1f, 0xff, 0xe0, 0x7f, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xf3, 0xff, 0xfc,
0x8f, 0xff, 0xc0, 0xf, 0xff, 0xc7, 0xff, 0xc0, 0xf, 0xff, 0xe7, 0xff, 0xe0, 0xf, 0xff, 0xcf,
0x3, 0xff, 0xe7, 0xff, 0xc0, 0x0, 0xff, 0xfb, 0xff, 0x80, 0xf, 0xff, 0xff, 0xfe, 0x0, 0xf,
0xff, 0xc0, 0x0, 0x7f, 0xfd, 0xff, 0xe0, 0x0, 0xff, 0xff, 0xfc, 0x0, 0x1f, 0xff, 0xff, 0xf0,
0x1f, 0xfe, 0xff, 0xf0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x1f, 0xff, 0xff, 0xe0, 0x0, 0x3f, 0xff,
0x0, 0x0, 0x7, 0xff, 0x80, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, 0x7f, 0xf8, 0x0, 0x0, 0x0,
0xff, 0xc0, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0,
0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x3, 0xff, 0xc0, 0x0, 0x0, 0xf, 0xff,
0xf8, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfe, 0x0, 0x0, 0x0,
0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0,
0x0, 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0xf, 0xff,
0x3f, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0xc0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0,
0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xfc, 0x0, 0x0, 0x3, 0xff, 0xf8, 0x0,
0xff, 0x80, 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, 0x0, 0xf, 0xff, 0xe0, 0x0, 0x0, 0x3f, 0xff,
0x0, 0x7f, 0xff, 0x80, 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, 0x3,
0x80, 0x0, 0x0, 0x7f, 0xff, 0x80, 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0,
0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0xff, 0x80, 0x0, 0x3f, 0xff, 0xc0, 0x0, 0x0, 0xff, 0xff,
0x0, 0x0, 0xff, 0xff, 0x80, 0x0, 0x0, 0xff, 0x0, 0x0, 0x3, 0xff, 0xfc, 0x0, 0x0, 0xf,
0xff, 0x80, 0x0, 0x1, 0xff, 0xff, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x3f, 0xff, 0xc0, 0x0,
0x1, 0xff, 0xff, 0x0, 0x0, 0x1, 0xff, 0xff, 0x0, 0xff, 0xff, 0x0, 0x0, 0x3, 0xff, 0xf8,
0x0, 0x0, 0x1, 0xff, 0xfe, 0x0, 0x0, 0x3, 0x0, 0x0, 0xf, 0xff, 0xe0, 0x0, 0x0, 0x3f,
0xff, 0xfe, 0x0, 0x0, 0x3, 0xff, 0xfe, 0x0, 0xff, 0x80, 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0,
0x0, 0x3, 0xff, 0xfc, 0x0, 0x0, 0x3, 0xff, 0x3, 0xff, 0xf8, 0x0, 0x0, 0xf, 0xff, 0xe0,
0xfc, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x80, 0x0, 0x0, 0xff,
0x0, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xf7, 0xff, 0xff,
0xdf, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xef, 0xff, 0xff, 0xff, 0xff, 0xdf,
0xff, 0xff, 0xf7, 0xff, 0xff, 0xff, 0xff, 0xfb,
0xff, 0xff, 0xff, 0xff, 0xfd, 0xff, 0xff, 0xff,
0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xbf, 0xff, 0xff, 0xff,
0xff, 0xc0, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xfe, 0xff, 0xff,
0xff, 0xff, 0xfd, 0xff, 0xff, 0xff, 0xff, 0xfb,
0xff, 0xff, 0xff, 0xff, 0xf0,
/* U+33 "3" */ /* U+0033 "3" */
0x1f, 0xff, 0xff, 0xff, 0xfe, 0xf, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xff,
0xff, 0xff, 0x7, 0xff, 0xff, 0xff, 0xff, 0x83, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xff, 0xe0, 0xff,
0xff, 0xff, 0xff, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff,
0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x7f, 0x83, 0xff, 0xff, 0xff, 0xff, 0x7, 0xff, 0xff,
0xff, 0xfe, 0xf, 0xff, 0xff, 0xff, 0xfc, 0x1f,
0xff, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x3f, 0xff, 0xff, 0xff,
0xfc, 0x1f, 0xff, 0xff, 0xff, 0xfe, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, 0x0,
0xff, 0x8f, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xfc, 0x0,
0x80, 0x0, 0x0, 0x1f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff,
0x1f, 0xff, 0x80, 0x0, 0x0, 0x3f, 0xff, 0x80, 0xc0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0,
0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, 0x3f, 0x7f, 0xf8, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0,
0xff, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, 0x7, 0xff, 0x80, 0x0, 0x0, 0x1f, 0xfe,
0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x0, 0x0, 0x1,
0x0, 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x3, 0xff, 0xfe, 0x0,
0x3f, 0xfe, 0x0, 0x0, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x7, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff,
0x0, 0x0, 0x1f, 0xff, 0x80, 0x0, 0x0, 0xf, 0xff, 0x80, 0x0, 0x1f, 0xff, 0xff, 0x80, 0x0,
0xff, 0xf8, 0x0, 0x0, 0x7, 0xff, 0xff, 0x0, 0x3f, 0xff, 0xff, 0x80, 0x0, 0x7f, 0xff, 0xff,
0x0, 0x3, 0xff, 0xff, 0xe0, 0x0, 0x1, 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, 0x80, 0x1, 0xff,
0xff, 0xf8, 0x0, 0x0, 0xff, 0xff, 0xfe, 0x0, 0xff, 0xff, 0x0, 0x3, 0xff, 0xff, 0xff, 0x0,
0x0, 0x7f, 0xff, 0xff, 0x80, 0x0, 0x3f, 0xff, 0x0, 0x0, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x7f,
0xff, 0xe0, 0x0, 0x1f, 0xff, 0xff, 0xf0, 0x0, 0xfc, 0x0, 0x0, 0x0, 0x7f, 0xfc, 0x0, 0x0,
0xf, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xff, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf0,
0xfe, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x80, 0x0, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x3,
0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, 0x1, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x7, 0xff, 0x80, 0x0,
0xe0, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0x1f, 0xfe,
0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x1f, 0xfe, 0x0, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xc0, 0x0,
0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, 0xff,
0x7, 0xff, 0x80, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x0, 0x7, 0xff,
0x0, 0x0, 0x1, 0xff, 0xff, 0xfe, 0x0, 0x0, 0xff, 0xfe, 0x0, 0xf, 0xff, 0xbf, 0xfe, 0x0,
0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, 0x3f, 0xfe, 0x7f, 0xff, 0x1, 0xff, 0xfc, 0xff,
0xc0, 0x0, 0x7f, 0xf9, 0xff, 0xf0, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xff,
0xfc, 0xff, 0xfc, 0x0, 0x7f, 0xfe, 0x7f, 0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0x81, 0xff, 0xff,
0x80, 0xff, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1, 0xff, 0xff, 0xff, 0xfc, 0x1,
0xf, 0xff, 0xff, 0xff, 0xff, 0x3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff,
0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0x80, 0x80, 0x0, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x7f,
0x3f, 0xff, 0xff, 0xff, 0x80, 0xf, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x0, 0xf, 0xfe, 0x0, 0x0,
0xff, 0x80, 0x3, 0xff, 0xff, 0xff, 0x0, 0x0,
0x7f, 0xff, 0xff, 0x0, 0x0, 0xf, 0xff, 0xfc,
0x0, 0x0, 0x0, 0x7f, 0xf0, 0x0, 0x0,
/* U+34 "4" */ /* U+0034 "4" */
0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, 0x1f,
0xff, 0x80, 0x0, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0xff, 0x80, 0x0, 0x0, 0x7f, 0xfc, 0x0, 0x0,
0x3, 0xff, 0xe0, 0x0, 0x0, 0x1f, 0xff, 0x80, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x1f, 0xff, 0x80,
0x0, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x3, 0xff, 0x0, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x3, 0xff,
0xe0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0x1f, 0xff, 0x80, 0x0, 0x0,
0xff, 0xfc, 0x0, 0x0, 0x7, 0xff, 0xe0, 0x0, 0xff, 0xfc, 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0,
0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0xff, 0xfc,
0x0, 0x0, 0x7, 0xff, 0xe0, 0x0, 0x0, 0x3f, 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x1f,
0xff, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0xff, 0xfc, 0x0, 0x0,
0x7, 0xff, 0xe0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x7, 0xff, 0xe0, 0x0, 0x0, 0x1f, 0xff, 0x0,
0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x7, 0xff, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x7, 0xff,
0xc0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x1, 0xe0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0,
0xff, 0xf8, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x7, 0xff, 0xe0, 0x0,
0x0, 0x3f, 0xfe, 0x0, 0x0, 0x1, 0xff, 0xf8, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0, 0xff, 0xf8,
0x0, 0x0, 0xf, 0xff, 0xc0, 0x0, 0x0, 0x3f, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, 0x3f,
0xfe, 0x0, 0xff, 0xf1, 0xff, 0xf0, 0x3, 0xff, 0xff, 0x0, 0xff, 0xf0, 0xff, 0xf8, 0x3, 0xff,
0xcf, 0xff, 0xc0, 0xf, 0xff, 0x7f, 0xfe, 0x0, 0xc7, 0xff, 0xc0, 0xf, 0xff, 0x3f, 0xff, 0x0,
0x3f, 0xfd, 0xff, 0xf0, 0x0, 0xff, 0xff, 0xff, 0x3f, 0xfd, 0xff, 0xf8, 0x0, 0xff, 0xf7, 0xff,
0xc0, 0x3, 0xff, 0xff, 0xfe, 0x0, 0xf, 0xff, 0xc0, 0x3, 0xff, 0xff, 0xfe, 0x0, 0xf, 0xff,
0xff, 0xf0, 0x0, 0x3f, 0xff, 0xff, 0x80, 0x0, 0xff, 0xf8, 0x0, 0x3f, 0xff, 0xff, 0xc0, 0x0,
0xff, 0xff, 0xfe, 0x0, 0x3, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xfe, 0x0, 0x3, 0xff, 0xff, 0xf8,
0x0, 0xf, 0xff, 0xff, 0xe0, 0x0, 0x3f, 0xff, 0x0, 0xf, 0xff, 0xff, 0xe0, 0x0, 0x3f, 0xff,
0xff, 0x80, 0x0, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x0, 0x3f,
0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0x3f,
0xfc, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0xfc, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0,
0x3, 0xff, 0xc0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x3, 0xff, 0xc0, 0x0, 0x0, 0xf, 0xff, 0x0,
0x0, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, 0xff,
0xf0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, 0x0, 0xf0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, 0x0,
0xf, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xfc, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xfc, 0x0,
0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff,
0xc0,
/* U+35 "5" */ /* U+0035 "5" */
0x3f, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff,
0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xc7, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff,
0xff, 0xff, 0xff, 0xff, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff, 0xff, 0xf1,
0xff, 0xe1, 0xff, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xf8, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff,
0xfc, 0x3f, 0xff, 0xff, 0xff, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xf1, 0xff, 0xff, 0xff, 0xff, 0xc7,
0xff, 0xff, 0xff, 0xf, 0xff, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xfe, 0x0, 0x0,
0x7, 0xff, 0x80, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, 0x7f, 0xf8, 0x0, 0x0, 0x1, 0xff, 0xe0,
0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0x80, 0x0, 0x0, 0x1f,
0xff, 0xf0, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x0, 0xfe, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x0, 0x0,
0x0, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x1f, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x7, 0xff, 0x80,
0xfe, 0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xfe, 0x0, 0x0, 0x0, 0x7f,
0x0, 0x7, 0xff, 0x80, 0x0, 0x0, 0x3, 0xff, 0xf8, 0x1f, 0xf0, 0x1, 0xff, 0xe1, 0xff, 0xf0,
0xc0, 0x7f, 0x80, 0x1, 0xff, 0xe1, 0xff, 0xf8, 0x7, 0xff, 0x9f, 0xff, 0xf0, 0x1f, 0xfe, 0xff,
0x0, 0xff, 0xf1, 0xff, 0xff, 0x0, 0x7f, 0xf9, 0xff, 0xe0, 0x7f, 0xfb, 0xff, 0xff, 0xc1, 0xff,
0xff, 0xff, 0xc0, 0x3f, 0xfd, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff, 0xff, 0xff,
0x1f, 0xff, 0xff, 0xff, 0xfc, 0xf, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0xff,
0xff, 0xff, 0x7, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xff, 0xf9, 0xff, 0xff, 0xff, 0xff, 0xe7, 0xff,
0xff, 0xff, 0xff, 0xff, 0xe1, 0xff, 0xfc, 0x7, 0xf0, 0x3f, 0xff, 0x9f, 0xff, 0x0, 0x3f, 0xfe,
0xff, 0xf8, 0xff, 0xf8, 0x0, 0xff, 0xfc, 0x0, 0x7f, 0xf8, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x1,
0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0,
0xff, 0x80, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0x3f, 0xfc,
0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x3,
0xf0, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0,
0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x1f, 0xfe, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, 0xff, 0xf0,
0x0, 0x0, 0x0, 0xf, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0xff, 0xc0, 0x0, 0x0, 0xf,
0x7, 0xff, 0x80, 0x0, 0x0, 0x3, 0xff, 0xc0, 0xff, 0xff, 0xf0, 0x0, 0x3f, 0xff, 0xff, 0xc0,
0x0, 0x0, 0x1, 0xff, 0xff, 0xff, 0x0, 0x1, 0x0, 0xff, 0xff, 0xff, 0x0, 0x7, 0xff, 0xff,
0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xfb, 0xff, 0xfe, 0x0, 0x1f, 0xfe, 0xff, 0xfc, 0x0, 0xff,
0xe0, 0x0, 0xff, 0xf9, 0xff, 0xf8, 0x0, 0xff, 0xf9, 0xff, 0xfc, 0xf, 0xff, 0xe7, 0xff, 0xff,
0xfc, 0xff, 0xff, 0x81, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xf, 0xff, 0xff, 0xff, 0xfc, 0x3f,
0xff, 0xff, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x7f, 0xff, 0xff, 0xff,
0x7, 0xff, 0xff, 0xff, 0xff, 0x1, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xfc, 0x1, 0xff, 0xff,
0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xff, 0x0, 0xff, 0xe0, 0x3, 0xff, 0xff, 0xfe, 0x0, 0x3,
0x1f, 0xff, 0xff, 0xff, 0x0, 0x7, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x0, 0x3, 0xff, 0xff, 0x0,
0xff, 0x0, 0x0, 0xff, 0xff, 0xfe, 0x0, 0x0, 0x0, 0x1, 0xff, 0xc0, 0x0,
0x1f, 0xff, 0xfc, 0x0, 0x0, 0x0, 0xff, 0xe0,
0x0, 0x0,
/* U+36 "6" */ /* U+0036 "6" */
0x0, 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0x7, 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x1f,
0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0,
0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x7f,
0xfe, 0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0,
0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0x7, 0xff,
0xc0, 0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0,
0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x7f, 0xfc,
0x0, 0x0, 0x0, 0x3f, 0xff, 0x0, 0x0, 0x0,
0xf, 0xff, 0x80, 0x0, 0x0, 0x7, 0xff, 0xc0,
0x0, 0x0, 0x3, 0xff, 0xf0, 0x0, 0x0, 0x1,
0xff, 0xf8, 0x0, 0x0, 0x0, 0x7f, 0xfc, 0x0,
0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0xf,
0xff, 0x80, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0,
0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x0, 0xff,
0xf8, 0x0, 0x0, 0x0, 0x7f, 0xfc, 0x3f, 0xc0,
0x0, 0x1f, 0xfe, 0x3f, 0xfe, 0x0, 0xf, 0xff,
0xbf, 0xff, 0xe0, 0x3, 0xff, 0xdf, 0xff, 0xfc,
0x1, 0xff, 0xef, 0xff, 0xff, 0x80, 0x7f, 0xff,
0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xfe,
0xf, 0xff, 0xff, 0xff, 0xff, 0x87, 0xff, 0xff,
0xff, 0xff, 0xf1, 0xff, 0xff, 0x3, 0xff, 0xfc,
0x7f, 0xff, 0x0, 0x3f, 0xff, 0x9f, 0xff, 0x0,
0x3, 0xff, 0xef, 0xff, 0xc0, 0x0, 0xff, 0xfb,
0xff, 0xe0, 0x0, 0x1f, 0xff, 0xff, 0xf8, 0x0,
0x7, 0xff, 0xff, 0xfc, 0x0, 0x0, 0xff, 0xff,
0xff, 0x0, 0x0, 0x3f, 0xff, 0xff, 0xc0, 0x0,
0xf, 0xff, 0xff, 0xf0, 0x0, 0x3, 0xff, 0xff,
0xfc, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0,
0x3f, 0xff, 0xff, 0xe0, 0x0, 0x1f, 0xff, 0x7f,
0xf8, 0x0, 0x7, 0xff, 0xdf, 0xfe, 0x0, 0x3,
0xff, 0xe7, 0xff, 0xc0, 0x0, 0xff, 0xf9, 0xff,
0xfc, 0x0, 0xff, 0xfe, 0x3f, 0xff, 0xc0, 0xff,
0xff, 0xf, 0xff, 0xff, 0xff, 0xff, 0xc1, 0xff,
0xff, 0xff, 0xff, 0xe0, 0x3f, 0xff, 0xff, 0xff,
0xf0, 0x7, 0xff, 0xff, 0xff, 0xf8, 0x0, 0xff,
0xff, 0xff, 0xfe, 0x0, 0x1f, 0xff, 0xff, 0xfe,
0x0, 0x3, 0xff, 0xff, 0xff, 0x0, 0x0, 0x3f,
0xff, 0xff, 0x0, 0x0, 0x3, 0xff, 0xff, 0x0,
0x0, 0x0, 0xf, 0xfc, 0x0, 0x0,
/* U+37 "7" */
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xe0, 0x0, 0xf, 0xff, 0xff, 0xe0, 0x0, 0x1f,
0xfe, 0xff, 0xe0, 0x0, 0x1f, 0xfe, 0xff, 0xe0,
0x0, 0x3f, 0xfc, 0xff, 0xe0, 0x0, 0x3f, 0xfc,
0xff, 0xe0, 0x0, 0x7f, 0xf8, 0xff, 0xe0, 0x0,
0x7f, 0xf8, 0xff, 0xe0, 0x0, 0xff, 0xf8, 0xff,
0xe0, 0x0, 0xff, 0xf0, 0x0, 0x0, 0x1, 0xff,
0xf0, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0,
0x3, 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, 0xc0,
0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, 0x7,
0xff, 0x80, 0x0, 0x0, 0x7, 0xff, 0x80, 0x0,
0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0xf, 0xff,
0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0,
0x1f, 0xfe, 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x0,
0x0, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x7f,
0xfc, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x0, 0x0,
0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8,
0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x1,
0xff, 0xf0, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0,
0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff,
0xc0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0,
0x7, 0xff, 0x80, 0x0, 0x0, 0xf, 0xff, 0x80,
0x0, 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0x1f,
0xff, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0xff, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0,
0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0xf, 0xff,
0x80, 0x0, 0x0, 0x7, 0xff, 0x80, 0x0, 0x0,
0x7, 0xff, 0xc0, 0x0, 0x0, 0x7, 0xff, 0xc0,
0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x3,
0xff, 0xe0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0,
0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xff,
0xf0, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0,
0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x7f, 0xfc,
0x0, 0x0, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0,
0x7f, 0xfc, 0x0, 0x0, 0x0, 0x7f, 0xf8, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x0,
0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x1f,
0xff, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0,
0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0xf, 0xff,
0x87, 0xf8, 0x0, 0x7, 0xff, 0x8f, 0xff, 0x0,
0x7, 0xff, 0xcf, 0xff, 0xe0, 0x3, 0xff, 0xdf,
0xff, 0xf8, 0x3, 0xff, 0xef, 0xff, 0xfe, 0x1,
0xff, 0xff, 0xff, 0xff, 0x81, 0xff, 0xff, 0xff,
0xff, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x7f,
0xff, 0xff, 0xff, 0xfc, 0x7f, 0xff, 0x81, 0xff,
0xff, 0x3f, 0xff, 0x0, 0x3f, 0xff, 0x9f, 0xff,
0x0, 0x7, 0xff, 0xdf, 0xff, 0x80, 0x3, 0xff,
0xef, 0xff, 0x80, 0x0, 0xff, 0xff, 0xff, 0xc0,
0x0, 0x7f, 0xff, 0xff, 0xc0, 0x0, 0x1f, 0xff,
0xff, 0xe0, 0x0, 0xf, 0xff, 0xff, 0xf0, 0x0,
0x7, 0xff, 0xff, 0xf8, 0x0, 0x3, 0xff, 0xff,
0xfc, 0x0, 0x1, 0xff, 0xff, 0xfe, 0x0, 0x0,
0xff, 0xff, 0xff, 0x80, 0x0, 0xff, 0xfb, 0xff,
0xc0, 0x0, 0x7f, 0xfd, 0xff, 0xf0, 0x0, 0x7f,
0xfc, 0xff, 0xf8, 0x0, 0x3f, 0xfe, 0x3f, 0xfe,
0x0, 0x3f, 0xff, 0x1f, 0xff, 0xc0, 0x7f, 0xff,
0x7, 0xff, 0xff, 0xff, 0xff, 0x83, 0xff, 0xff,
0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0xff, 0x80,
0x3f, 0xff, 0xff, 0xff, 0xc0, 0xf, 0xff, 0xff,
0xff, 0xc0, 0x3, 0xff, 0xff, 0xff, 0x80, 0x0,
0xff, 0xff, 0xff, 0x80, 0x0, 0x1f, 0xff, 0xff,
0x0, 0x0, 0x3, 0xff, 0xfe, 0x0, 0x0, 0x0,
0x3f, 0xf8, 0x0, 0x0,
/* U+0037 "7" */
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xfc, 0x0, 0x3, 0xff,
0xff, 0xfe, 0x0, 0x1, 0xff, 0xef, 0xff, 0x0,
0x1, 0xff, 0xf7, 0xff, 0x80, 0x0, 0xff, 0xf3,
0xff, 0xc0, 0x0, 0xff, 0xf9, 0xff, 0xe0, 0x0,
0x7f, 0xfc, 0xff, 0xf0, 0x0, 0x7f, 0xfc, 0x7f,
0xf8, 0x0, 0x3f, 0xfe, 0x3f, 0xfc, 0x0, 0x3f,
0xfe, 0x1f, 0xfe, 0x0, 0x1f, 0xff, 0x0, 0x0,
0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff,
0x80, 0x0, 0x0, 0x7, 0xff, 0x80, 0x0, 0x0,
0x7, 0xff, 0xc0, 0x0, 0x0, 0x3, 0xff, 0xe0,
0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x1,
0xff, 0xf0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0,
0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff,
0xf8, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0xf8, 0x0, 0x0, 0x0, 0x7f, 0xfc, 0x0, 0x0,
0x1, 0xff, 0xf0, 0x0, 0x0, 0x3, 0xff, 0xe0, 0x0, 0x3f, 0xfc, 0x0, 0x0, 0x0, 0x3f, 0xfe,
0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0,
0x1f, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0x80,
0x0, 0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0x7,
0xff, 0xc0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0,
0x0, 0x3, 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff,
0xe0, 0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0,
0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0xff, 0xf8,
0x0, 0x0, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0,
0x7f, 0xfc, 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x0,
0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0, 0x0, 0x1f,
0xff, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0,
0x0, 0xf, 0xff, 0x80, 0x0, 0x0, 0xf, 0xff,
0xc0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0,
0x3, 0xff, 0xe0, 0x0, 0x0, 0x3, 0xff, 0xe0,
0x0, 0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x1,
0xff, 0xf0, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0,
0x0, 0x0, 0x0, 0x0,
/* U+38 "8" */ /* U+0038 "8" */
0x0, 0x1, 0xff, 0xe0, 0x0, 0x0, 0x7, 0xff, 0x0, 0x1, 0xff, 0x80, 0x0, 0x0, 0xf, 0xff,
0xff, 0x80, 0x0, 0x7, 0xff, 0xff, 0xf8, 0x0, 0xfc, 0x0, 0x0, 0x1f, 0xff, 0xff, 0x80, 0x0,
0x7, 0xff, 0xff, 0xff, 0x80, 0x3, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xf0, 0x0, 0x3f, 0xff, 0xff,
0xff, 0xf0, 0x1, 0xff, 0xff, 0xff, 0xfe, 0x0, 0xfc, 0x0, 0x3f, 0xff, 0xff, 0xff, 0x0, 0x3f,
0xff, 0xff, 0xff, 0xff, 0xc0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x3f, 0xff, 0xff, 0xff,
0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xfe, 0xf, 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff,
0xff, 0xe0, 0x3f, 0xff, 0xc3, 0xff, 0xe0, 0x3, 0xff, 0xff, 0xfe, 0xf, 0xff, 0xe0, 0x7f, 0xff,
0xff, 0xf0, 0xff, 0xf0, 0x0, 0x7f, 0xfc, 0x7f, 0x7, 0xff, 0xc0, 0xf, 0xff, 0x87, 0xff, 0xc0,
0xf8, 0x0, 0xf, 0xff, 0x9f, 0xfe, 0x0, 0x3, 0x3, 0xff, 0xe3, 0xff, 0xe0, 0x1, 0xff, 0xf1,
0xff, 0xe7, 0xff, 0x0, 0x0, 0x7f, 0xf9, 0xff, 0xff, 0xe0, 0x0, 0x7f, 0xf8, 0xff, 0xf0, 0x0,
0xc0, 0x0, 0x1f, 0xfe, 0x7f, 0xf0, 0x0, 0x7, 0x3f, 0xfc, 0x7f, 0xf8, 0x0, 0x1f, 0xfe, 0x3f,
0xff, 0x9f, 0xfc, 0x0, 0x1, 0xff, 0xe7, 0xff, 0xfc, 0x0, 0xf, 0xff, 0x1f, 0xfe, 0x0, 0x7,
0x0, 0x0, 0x7f, 0xf9, 0xff, 0xc0, 0x0, 0x1f, 0xff, 0x8f, 0xff, 0x80, 0x7, 0xff, 0xc3, 0xff,
0xfe, 0x3f, 0xf8, 0x0, 0xf, 0xff, 0xf, 0xfe, 0xc0, 0x3, 0xff, 0xc1, 0xff, 0xf0, 0x3, 0xff,
0x0, 0x3, 0xff, 0xc3, 0xff, 0xc0, 0x1, 0xff, 0xe0, 0x7f, 0xfc, 0x3, 0xff, 0xe0, 0x3f, 0xff,
0xe0, 0x7f, 0xf8, 0x0, 0xff, 0xf8, 0xf, 0xff, 0x3, 0xff, 0xf0, 0xf, 0xff, 0xe7, 0xff, 0xf0,
0x80, 0xff, 0xfc, 0x1, 0xff, 0xff, 0xff, 0xfe, 0x3, 0xff, 0xff, 0xff, 0xf0, 0x0, 0xff, 0xff,
0x0, 0x3f, 0xff, 0xff, 0xff, 0x0, 0x7, 0xff, 0xff, 0xf0, 0x0, 0x1f, 0xff, 0xff, 0xf0, 0x0,
0xff, 0xff, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x0, 0x7, 0xff, 0xff, 0xf0, 0x0, 0x1, 0xff, 0xff,
0x0, 0x3, 0xff, 0xfe, 0x0, 0x0, 0x7, 0xff, 0xf0, 0x0, 0x3, 0xff, 0xff, 0xfc, 0x0, 0x3,
0xff, 0xf0, 0x0, 0x7, 0xff, 0xff, 0xff, 0x80, 0xff, 0xff, 0xff, 0x80, 0x3, 0xff, 0xff, 0xff,
0x7, 0xff, 0xff, 0xff, 0xf0, 0x3, 0xff, 0xff, 0xe0, 0x3, 0xff, 0xff, 0xff, 0xf8, 0x3, 0xff,
0xff, 0xff, 0x1, 0xff, 0xf8, 0xf, 0xff, 0xe0, 0xf0, 0xff, 0xfe, 0x3, 0xff, 0xf0, 0x1f, 0xff,
0xff, 0xf8, 0x0, 0x7f, 0xf8, 0x3f, 0xfc, 0x0, 0x83, 0xff, 0xe0, 0x7, 0xff, 0xe3, 0xff, 0xe0,
0xf, 0xff, 0x1f, 0xfe, 0x0, 0x1, 0xff, 0xe7, 0x1, 0xff, 0xf1, 0xff, 0xe0, 0x0, 0x7f, 0xfc,
0xff, 0x80, 0x0, 0x7f, 0xfb, 0xff, 0xc0, 0x0, 0xff, 0xf0, 0x0, 0x1f, 0xfe, 0xff, 0xf0, 0x0,
0xf, 0xfe, 0xff, 0xf0, 0x0, 0x3, 0xff, 0xff, 0x7, 0xff, 0xff, 0xf8, 0x0, 0x3, 0xff, 0xff,
0xfc, 0x0, 0x0, 0xff, 0xff, 0xff, 0x0, 0x0, 0xfc, 0x0, 0x1, 0xff, 0xff, 0xfe, 0x0, 0x0,
0x3f, 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0, 0x0, 0x7f, 0xff, 0xff,
0xf0, 0x0, 0x3, 0xff, 0xff, 0xfe, 0x0, 0x1, 0xc0, 0x0, 0x7f, 0xff, 0xff, 0xe0, 0x0, 0x3f,
0xff, 0xff, 0xff, 0x80, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x3f, 0xff, 0x7f, 0xfe,
0xf0, 0x0, 0x3f, 0xff, 0x7f, 0xfe, 0x0, 0x1f, 0x0, 0x3f, 0xff, 0x3f, 0xff, 0xc0, 0x7f, 0xff,
0xff, 0x9f, 0xff, 0xe0, 0x3f, 0xff, 0xe3, 0xff, 0x9f, 0xff, 0xff, 0xff, 0xff, 0xc7, 0xff, 0xff,
0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xc0,
0xfc, 0x1f, 0xff, 0xff, 0xff, 0xfe, 0x3, 0xff, 0x7f, 0xff, 0xff, 0xff, 0xe0, 0x3f, 0xff, 0xff,
0xff, 0xff, 0xff, 0x0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x7, 0xff, 0xff, 0xff, 0xe0, 0x1,
0x80, 0xf, 0xff, 0xff, 0xff, 0xc0, 0x1, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x0, 0x3f, 0xff, 0xff,
0xff, 0xff, 0xe0, 0x0, 0x1f, 0xff, 0xff, 0xe0, 0x80, 0x0, 0x7, 0xff, 0xff, 0x0, 0x0, 0x0,
0x0, 0x1, 0xff, 0xff, 0xe0, 0x0, 0x0, 0x7, 0x3f, 0xf8, 0x0, 0x0,
0xff, 0x80, 0x0,
/* U+39 "9" */ /* U+0039 "9" */
0x0, 0x0, 0xff, 0xc0, 0x0, 0x0, 0x3, 0xff, 0x0, 0x1, 0xff, 0x80, 0x0, 0x0, 0x7, 0xff,
0xff, 0x0, 0x0, 0x3, 0xff, 0xff, 0xf0, 0x0, 0xfc, 0x0, 0x0, 0xf, 0xff, 0xff, 0x80, 0x0,
0x3, 0xff, 0xff, 0xff, 0x0, 0x1, 0xff, 0xff, 0x1f, 0xff, 0xff, 0xf0, 0x0, 0x1f, 0xff, 0xff,
0xff, 0xe0, 0x1, 0xff, 0xff, 0xff, 0xfc, 0x0, 0xfc, 0x0, 0x1f, 0xff, 0xff, 0xff, 0x0, 0x1f,
0x7f, 0xff, 0xff, 0xff, 0x80, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x1f, 0xff, 0xff, 0xff,
0xff, 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xfe, 0xf, 0xf0, 0x1f, 0xff, 0xff, 0xff, 0xfc, 0x1f, 0xff,
0xff, 0xff, 0xff, 0xff, 0x83, 0xff, 0xfc, 0xf, 0xff, 0xff, 0xfe, 0xf, 0xff, 0xf0, 0x7f, 0xff,
0xff, 0xf1, 0xff, 0xf8, 0x0, 0xff, 0xfc, 0x7f, 0x8f, 0xff, 0xe0, 0xf, 0xff, 0xc7, 0xff, 0xc0,
0xfc, 0x0, 0xf, 0xff, 0x9f, 0xff, 0x0, 0x3, 0x1, 0xff, 0xf3, 0xff, 0xe0, 0x0, 0xff, 0xfb,
0xff, 0xef, 0xff, 0x80, 0x0, 0x7f, 0xfb, 0xff, 0xff, 0xe0, 0x0, 0x3f, 0xfd, 0xff, 0xf0, 0x0,
0xe0, 0x0, 0x1f, 0xff, 0xff, 0xf0, 0x0, 0x3, 0x1f, 0xff, 0xff, 0xf0, 0x0, 0x7, 0xff, 0xff,
0xff, 0xff, 0xfc, 0x0, 0x0, 0xff, 0xff, 0xff, 0xf8, 0x0, 0x3, 0xff, 0xff, 0xfc, 0x0, 0x1,
0x0, 0x0, 0x3f, 0xff, 0xff, 0xc0, 0x0, 0xf, 0xff, 0xff, 0xfe, 0x0, 0x0, 0xff, 0xff, 0xff,
0xff, 0xff, 0xf0, 0x0, 0x3, 0xff, 0xff, 0xfc, 0x0, 0x0, 0x7f, 0xff, 0xff, 0x80, 0x0, 0x3f,
0x0, 0x0, 0xff, 0xff, 0xff, 0x80, 0x0, 0x7f, 0xff, 0xff, 0xe0, 0x0, 0x3f, 0xff, 0xff, 0xf0,
0xff, 0xff, 0xe0, 0x0, 0x1f, 0xff, 0x7f, 0xf8, 0x0, 0x1f, 0xff, 0x7f, 0xfc, 0x0, 0x1f, 0xff,
0x0, 0xf, 0xff, 0xdf, 0xff, 0x0, 0x3, 0xff, 0x3f, 0xfe, 0x0, 0xf, 0xff, 0x9f, 0xff, 0xc0,
0xe7, 0xff, 0xf0, 0x3, 0xff, 0xf8, 0xff, 0xff, 0x1f, 0xff, 0xc7, 0xff, 0xf8, 0x3f, 0xff, 0xe3,
0x3, 0xff, 0xfe, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0xff, 0xff, 0xff,
0x87, 0xff, 0xff, 0xff, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xf0, 0x7f, 0xff, 0xff, 0xff, 0xf8, 0x1f,
0xff, 0xff, 0xf0, 0x3f, 0xff, 0xff, 0xff, 0xf8, 0xff, 0xff, 0xff, 0xf8, 0x7, 0xff, 0xff, 0xbf,
0x7, 0xff, 0xff, 0xdf, 0xfe, 0x0, 0xff, 0xff, 0xfc, 0x1, 0xff, 0xff, 0xbf, 0xfc, 0x0, 0x7f,
0xef, 0xff, 0x80, 0x1f, 0xff, 0xf7, 0xff, 0xc0, 0xff, 0xbf, 0xfe, 0x0, 0xf, 0xff, 0x1f, 0xfe,
0x1, 0xff, 0xf1, 0xff, 0xf0, 0x0, 0xf, 0xf0, 0x0, 0x1, 0xfe, 0x1f, 0xff, 0x0, 0x0, 0x0,
0xf, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0x80,
0x0, 0x0, 0x7, 0xff, 0x80, 0x0, 0x0, 0x7,
0xff, 0xc0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0,
0x0, 0x3, 0xff, 0xc0, 0x0, 0x0, 0x3, 0xff,
0xe0, 0x0, 0x0, 0x1, 0xff, 0xe0, 0x0, 0x0,
0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xff, 0xf0,
0x0, 0x0, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0,
0xff, 0xf8, 0x0, 0x0, 0x0, 0x7f, 0xfc, 0x0, 0xff, 0xf8, 0x0, 0x0, 0x0, 0x7f, 0xfc, 0x0,
0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x7f, 0xfc, 0x0, 0x0, 0x0, 0x3f,
0xff, 0x80, 0x0, 0x0, 0x7, 0xff, 0xe0, 0x0, 0xfe, 0x0, 0x0, 0x0, 0x3f, 0xfe, 0x0, 0x0,
0x0, 0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xff, 0x0, 0x1f, 0xfe, 0x0, 0x0, 0x0, 0x1f, 0xff,
0xf8, 0x0, 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0xff, 0x0, 0x0, 0x0,
0x0, 0x1f, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0xf, 0xff, 0x80, 0x0, 0x0, 0xf, 0xff, 0x80,
0x80, 0x0, 0x0, 0x7, 0xff, 0xe0, 0x0, 0x0, 0x0, 0x0, 0x7, 0xff, 0xc0, 0x0, 0x0, 0x7,
0x1, 0xff, 0xf0, 0x0, 0x0, 0x0, 0xff, 0xf8, 0xff, 0xc0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x0,
0x1f, 0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0x80,
0x0, 0x0, 0x7, 0xff, 0xe0, 0x0, 0x0, 0x3,
0xff, 0xf0, 0x0, 0x0, 0x0, 0xff, 0xf8, 0x0,
0x0, 0x0, 0x7f, 0xfe, 0x0, 0x0, 0x0, 0x3f,
0xff, 0x0, 0x0, 0x0, 0xf, 0xff, 0x80, 0x0,
0x0, 0x7, 0xff, 0xe0, 0x0, 0x0,
/* U+3A ":" */ /* U+003A ":" */
0x7, 0xe0, 0x1f, 0xf8, 0x3f, 0xfc, 0x7f, 0xfe, 0x7, 0xe0, 0x1f, 0xf8, 0x3f, 0xfc, 0x7f, 0xfe,
0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe,
0x7f, 0xfe, 0x3f, 0xfc, 0x1f, 0xf8, 0x7, 0xe0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x7, 0xe0, 0x1f, 0xf8,
0x3f, 0xfc, 0x7f, 0xfe, 0x7f, 0xfe, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0x7f, 0xfe, 0x7f, 0xfe, 0x3f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0x3f, 0xfc,
0x1f, 0xf8, 0x7, 0xe0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x7, 0xe0, 0x1f, 0xf8, 0x3f, 0xfc, 0x7f, 0xfe,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0x3f, 0xfc,
0x1f, 0xf8, 0x7, 0xe0 0x1f, 0xf8, 0x7, 0xe0
}; };
@ -439,17 +437,17 @@ static LV_ATTRIBUTE_LARGE_CONST const uint8_t gylph_bitmap[] = {
static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = {
{.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */,
{.bitmap_index = 0, .adv_w = 768, .box_w = 41, .box_h = 59, .ofs_x = 4, .ofs_y = -1}, {.bitmap_index = 0, .adv_w = 768, .box_w = 39, .box_h = 60, .ofs_x = 5, .ofs_y = -1},
{.bitmap_index = 303, .adv_w = 768, .box_w = 40, .box_h = 58, .ofs_x = 6, .ofs_y = 0}, {.bitmap_index = 293, .adv_w = 768, .box_w = 38, .box_h = 59, .ofs_x = 6, .ofs_y = 0},
{.bitmap_index = 593, .adv_w = 768, .box_w = 41, .box_h = 58, .ofs_x = 4, .ofs_y = 0}, {.bitmap_index = 574, .adv_w = 768, .box_w = 39, .box_h = 60, .ofs_x = 4, .ofs_y = 0},
{.bitmap_index = 891, .adv_w = 768, .box_w = 41, .box_h = 59, .ofs_x = 3, .ofs_y = -1}, {.bitmap_index = 867, .adv_w = 768, .box_w = 39, .box_h = 59, .ofs_x = 4, .ofs_y = -1},
{.bitmap_index = 1194, .adv_w = 768, .box_w = 38, .box_h = 58, .ofs_x = 4, .ofs_y = 0}, {.bitmap_index = 1155, .adv_w = 768, .box_w = 38, .box_h = 59, .ofs_x = 4, .ofs_y = 0},
{.bitmap_index = 1470, .adv_w = 768, .box_w = 41, .box_h = 58, .ofs_x = 4, .ofs_y = -1}, {.bitmap_index = 1436, .adv_w = 768, .box_w = 38, .box_h = 60, .ofs_x = 5, .ofs_y = -1},
{.bitmap_index = 1768, .adv_w = 768, .box_w = 42, .box_h = 59, .ofs_x = 3, .ofs_y = -1}, {.bitmap_index = 1721, .adv_w = 768, .box_w = 41, .box_h = 60, .ofs_x = 4, .ofs_y = -1},
{.bitmap_index = 2078, .adv_w = 768, .box_w = 40, .box_h = 58, .ofs_x = 4, .ofs_y = 0}, {.bitmap_index = 2029, .adv_w = 768, .box_w = 41, .box_h = 58, .ofs_x = 4, .ofs_y = 0},
{.bitmap_index = 2368, .adv_w = 768, .box_w = 42, .box_h = 60, .ofs_x = 3, .ofs_y = -1}, {.bitmap_index = 2327, .adv_w = 768, .box_w = 41, .box_h = 60, .ofs_x = 4, .ofs_y = -1},
{.bitmap_index = 2683, .adv_w = 768, .box_w = 42, .box_h = 59, .ofs_x = 3, .ofs_y = 0}, {.bitmap_index = 2635, .adv_w = 768, .box_w = 41, .box_h = 60, .ofs_x = 4, .ofs_y = -1},
{.bitmap_index = 2993, .adv_w = 768, .box_w = 16, .box_h = 46, .ofs_x = 16, .ofs_y = -1} {.bitmap_index = 2943, .adv_w = 768, .box_w = 16, .box_h = 46, .ofs_x = 16, .ofs_y = -1}
}; };
/*--------------------- /*---------------------
@ -473,9 +471,14 @@ static const lv_font_fmt_txt_cmap_t cmaps[] =
* ALL CUSTOM DATA * ALL CUSTOM DATA
*--------------------*/ *--------------------*/
#if LV_VERSION_CHECK(8, 0, 0)
/*Store all the custom data of the font*/ /*Store all the custom data of the font*/
static lv_font_fmt_txt_glyph_cache_t cache;
static const lv_font_fmt_txt_dsc_t font_dsc = {
#else
static lv_font_fmt_txt_dsc_t font_dsc = { static lv_font_fmt_txt_dsc_t font_dsc = {
.glyph_bitmap = gylph_bitmap, #endif
.glyph_bitmap = glyph_bitmap,
.glyph_dsc = glyph_dsc, .glyph_dsc = glyph_dsc,
.cmaps = cmaps, .cmaps = cmaps,
.kern_dsc = NULL, .kern_dsc = NULL,
@ -483,7 +486,10 @@ static lv_font_fmt_txt_dsc_t font_dsc = {
.cmap_num = 1, .cmap_num = 1,
.bpp = 1, .bpp = 1,
.kern_classes = 0, .kern_classes = 0,
.bitmap_format = 0 .bitmap_format = 0,
#if LV_VERSION_CHECK(8, 0, 0)
.cache = &cache
#endif
}; };
@ -492,16 +498,26 @@ static lv_font_fmt_txt_dsc_t font_dsc = {
*----------------*/ *----------------*/
/*Initialize a public general font descriptor*/ /*Initialize a public general font descriptor*/
#if LV_VERSION_CHECK(8, 0, 0)
const lv_font_t jetbrains_mono_extrabold_compressed = {
#else
lv_font_t jetbrains_mono_extrabold_compressed = { lv_font_t jetbrains_mono_extrabold_compressed = {
#endif
.get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ .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*/ .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/
.line_height = 60, /*The maximum line height required by the font*/ .line_height = 61, /*The maximum line height required by the font*/
.base_line = 1, /*Baseline measured from the bottom of the line*/ .base_line = 1, /*Baseline measured from the bottom of the line*/
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) #if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE, .subpx = LV_FONT_SUBPX_NONE,
#endif
#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = -12,
.underline_thickness = 4,
#endif #endif
.dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ .dsc = &font_dsc /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */
}; };
#endif /*#if JETBRAINS_MONO_EXTRABOLD_COMPRESSED*/ #endif /*#if JETBRAINS_MONO_EXTRABOLD_COMPRESSED*/

View File

@ -2623,7 +2623,7 @@ lv_font_t lv_font_navi_80 = {
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) #if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE, .subpx = LV_FONT_SUBPX_NONE,
#endif #endif
#if LV_VERSION_CHECK(7, 4, 0) #if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = 0, .underline_position = 0,
.underline_thickness = 0, .underline_thickness = 0,
#endif #endif

View File

@ -311,7 +311,7 @@ lv_font_t lv_font_sys_48 = {
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) #if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE, .subpx = LV_FONT_SUBPX_NONE,
#endif #endif
#if LV_VERSION_CHECK(7, 4, 0) #if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = 0, .underline_position = 0,
.underline_thickness = 0, .underline_thickness = 0,
#endif #endif

View File

@ -1248,7 +1248,7 @@ lv_font_t open_sans_light = {
#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) #if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0)
.subpx = LV_FONT_SUBPX_NONE, .subpx = LV_FONT_SUBPX_NONE,
#endif #endif
#if LV_VERSION_CHECK(7, 4, 0) #if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8
.underline_position = -11, .underline_position = -11,
.underline_thickness = 7, .underline_thickness = 7,
#endif #endif

View File

@ -303,7 +303,7 @@ void Alarm::ShowInfo() {
lv_label_set_text_fmt( lv_label_set_text_fmt(
txtMessage, "Time to\nalarm:\n%2lu Days\n%2lu Hours\n%2lu Minutes\n%2lu Seconds", daysToAlarm, hrsToAlarm, minToAlarm, secToAlarm); txtMessage, "Time to\nalarm:\n%2lu Days\n%2lu Hours\n%2lu Minutes\n%2lu Seconds", daysToAlarm, hrsToAlarm, minToAlarm, secToAlarm);
} else { } else {
lv_label_set_text(txtMessage, "Alarm\nis not\nset."); lv_label_set_text_static(txtMessage, "Alarm\nis not\nset.");
} }
} }
@ -317,13 +317,13 @@ void Alarm::SetRecurButtonState() {
using Pinetime::Controllers::AlarmController; using Pinetime::Controllers::AlarmController;
switch (alarmController.Recurrence()) { switch (alarmController.Recurrence()) {
case AlarmController::RecurType::None: case AlarmController::RecurType::None:
lv_label_set_text(txtRecur, "ONCE"); lv_label_set_text_static(txtRecur, "ONCE");
break; break;
case AlarmController::RecurType::Daily: case AlarmController::RecurType::Daily:
lv_label_set_text(txtRecur, "DAILY"); lv_label_set_text_static(txtRecur, "DAILY");
break; break;
case AlarmController::RecurType::Weekdays: case AlarmController::RecurType::Weekdays:
lv_label_set_text(txtRecur, "MON-FRI"); lv_label_set_text_static(txtRecur, "MON-FRI");
} }
} }

View File

@ -3,8 +3,9 @@
using namespace Pinetime::Applications::Screens; using namespace Pinetime::Applications::Screens;
const char* BleIcon::GetIcon(bool isConnected) { const char* BleIcon::GetIcon(bool isConnected) {
if (isConnected) if (isConnected) {
return Symbols::bluetooth; return Symbols::bluetooth;
else }
return "";
return Symbols::none;
} }

View File

@ -1,5 +1,7 @@
#pragma once #pragma once
#include "components/ble/BleController.h"
namespace Pinetime { namespace Pinetime {
namespace Applications { namespace Applications {
namespace Screens { namespace Screens {

View File

@ -9,8 +9,9 @@
#include "components/settings/Settings.h" #include "components/settings/Settings.h"
#include "displayapp/DisplayApp.h" #include "displayapp/DisplayApp.h"
#include "displayapp/screens/WatchFaceDigital.h" #include "displayapp/screens/WatchFaceDigital.h"
#include "displayapp/screens/WatchFaceTerminal.h"
#include "displayapp/screens/WatchFaceAnalog.h" #include "displayapp/screens/WatchFaceAnalog.h"
#include "displayapp/screens/PineTimeStyle.h" #include "displayapp/screens/WatchFacePineTimeStyle.h"
using namespace Pinetime::Applications::Screens; using namespace Pinetime::Applications::Screens;
@ -39,7 +40,10 @@ Clock::Clock(DisplayApp* app,
return WatchFaceAnalogScreen(); return WatchFaceAnalogScreen();
break; break;
case 2: case 2:
return PineTimeStyleScreen(); return WatchFacePineTimeStyleScreen();
break;
case 3:
return WatchFaceTerminalScreen();
break; break;
} }
return WatchFaceDigitalScreen(); return WatchFaceDigitalScreen();
@ -75,12 +79,18 @@ std::unique_ptr<Screen> Clock::WatchFaceAnalogScreen() {
app, dateTimeController, batteryController, bleController, notificatioManager, settingsController); app, dateTimeController, batteryController, bleController, notificatioManager, settingsController);
} }
std::unique_ptr<Screen> Clock::PineTimeStyleScreen() { std::unique_ptr<Screen> Clock::WatchFacePineTimeStyleScreen() {
return std::make_unique<Screens::PineTimeStyle>(app, return std::make_unique<Screens::WatchFacePineTimeStyle>(
app, dateTimeController, batteryController, bleController, notificatioManager, settingsController, motionController);
}
std::unique_ptr<Screen> Clock::WatchFaceTerminalScreen() {
return std::make_unique<Screens::WatchFaceTerminal>(app,
dateTimeController, dateTimeController,
batteryController, batteryController,
bleController, bleController,
notificatioManager, notificatioManager,
settingsController, settingsController,
heartRateController,
motionController); motionController);
} }

View File

@ -46,7 +46,8 @@ namespace Pinetime {
std::unique_ptr<Screen> screen; std::unique_ptr<Screen> screen;
std::unique_ptr<Screen> WatchFaceDigitalScreen(); std::unique_ptr<Screen> WatchFaceDigitalScreen();
std::unique_ptr<Screen> WatchFaceAnalogScreen(); std::unique_ptr<Screen> WatchFaceAnalogScreen();
std::unique_ptr<Screen> PineTimeStyleScreen(); std::unique_ptr<Screen> WatchFacePineTimeStyleScreen();
std::unique_ptr<Screen> WatchFaceTerminalScreen();
}; };
} }
} }

View File

@ -1,57 +0,0 @@
#include "displayapp/screens/DropDownDemo.h"
#include <lvgl/lvgl.h>
#include <libraries/log/nrf_log.h>
#include "displayapp/DisplayApp.h"
using namespace Pinetime::Applications::Screens;
DropDownDemo::DropDownDemo(Pinetime::Applications::DisplayApp* app) : Screen(app) {
// Create the dropdown object, with many item, and fix its height
ddlist = lv_ddlist_create(lv_scr_act(), nullptr);
lv_ddlist_set_options(ddlist,
"Apple\n"
"Banana\n"
"Orange\n"
"Melon\n"
"Grape\n"
"Raspberry\n"
"A\n"
"B\n"
"C\n"
"D\n"
"E");
lv_ddlist_set_fix_width(ddlist, 150);
lv_ddlist_set_draw_arrow(ddlist, true);
lv_ddlist_set_fix_height(ddlist, 150);
lv_obj_align(ddlist, nullptr, LV_ALIGN_IN_TOP_MID, 0, 20);
}
DropDownDemo::~DropDownDemo() {
// Reset the touchmode
app->SetTouchMode(DisplayApp::TouchModes::Gestures);
lv_obj_clean(lv_scr_act());
}
bool DropDownDemo::Refresh() {
auto* list = static_cast<lv_ddlist_ext_t*>(ddlist->ext_attr);
// Switch touchmode to Polling if the dropdown is opened. This will allow to scroll inside the
// dropdown while it is opened.
// Disable the polling mode when the dropdown is closed to be able to handle the gestures.
if (list->opened)
app->SetTouchMode(DisplayApp::TouchModes::Polling);
else
app->SetTouchMode(DisplayApp::TouchModes::Gestures);
return running;
}
bool DropDownDemo::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
// If the dropdown is opened, notify Display app that it doesn't need to handle the event
// (this will prevent displayApp from going back to the menu or clock scree).
auto* list = static_cast<lv_ddlist_ext_t*>(ddlist->ext_attr);
if (list->opened) {
return true;
} else {
return false;
}
}

View File

@ -1,27 +0,0 @@
#pragma once
#include <cstdint>
#include "displayapp/screens/Screen.h"
#include <lvgl/src/lv_core/lv_obj.h>
namespace Pinetime {
namespace Applications {
namespace Screens {
class DropDownDemo : public Screen {
public:
DropDownDemo(DisplayApp* app);
~DropDownDemo() override;
bool Refresh() override;
bool OnTouchEvent(TouchEvents event) override;
private:
lv_obj_t* ddlist;
bool isDropDownOpened = false;
};
}
}
}

View File

@ -15,7 +15,7 @@ FirmwareUpdate::FirmwareUpdate(Pinetime::Applications::DisplayApp* app, Pinetime
lv_label_set_text_static(backgroundLabel, ""); lv_label_set_text_static(backgroundLabel, "");
titleLabel = lv_label_create(lv_scr_act(), nullptr); titleLabel = lv_label_create(lv_scr_act(), nullptr);
lv_label_set_text(titleLabel, "Firmware update"); lv_label_set_text_static(titleLabel, "Firmware update");
lv_obj_set_auto_realign(titleLabel, true); lv_obj_set_auto_realign(titleLabel, true);
lv_obj_align(titleLabel, nullptr, LV_ALIGN_IN_TOP_MID, 0, 50); lv_obj_align(titleLabel, nullptr, LV_ALIGN_IN_TOP_MID, 0, 50);
@ -27,7 +27,7 @@ FirmwareUpdate::FirmwareUpdate(Pinetime::Applications::DisplayApp* app, Pinetime
lv_bar_set_value(bar1, 0, LV_ANIM_OFF); lv_bar_set_value(bar1, 0, LV_ANIM_OFF);
percentLabel = lv_label_create(lv_scr_act(), nullptr); percentLabel = lv_label_create(lv_scr_act(), nullptr);
lv_label_set_text(percentLabel, "Waiting..."); lv_label_set_text_static(percentLabel, "Waiting...");
lv_obj_set_auto_realign(percentLabel, true); lv_obj_set_auto_realign(percentLabel, true);
lv_obj_align(percentLabel, bar1, LV_ALIGN_OUT_TOP_MID, 0, 60); lv_obj_align(percentLabel, bar1, LV_ALIGN_OUT_TOP_MID, 0, 60);
taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this); taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this);
@ -81,20 +81,19 @@ void FirmwareUpdate::DisplayProgression() const {
float current = bleController.FirmwareUpdateCurrentBytes() / 1024.0f; float current = bleController.FirmwareUpdateCurrentBytes() / 1024.0f;
float total = bleController.FirmwareUpdateTotalBytes() / 1024.0f; float total = bleController.FirmwareUpdateTotalBytes() / 1024.0f;
int16_t pc = (current / total) * 100.0f; int16_t pc = (current / total) * 100.0f;
sprintf(percentStr, "%d %%", pc); lv_label_set_text_fmt(percentLabel, "%d %%", pc);
lv_label_set_text(percentLabel, percentStr);
lv_bar_set_value(bar1, pc, LV_ANIM_OFF); lv_bar_set_value(bar1, pc, LV_ANIM_OFF);
} }
void FirmwareUpdate::UpdateValidated() { void FirmwareUpdate::UpdateValidated() {
lv_label_set_recolor(percentLabel, true); lv_label_set_recolor(percentLabel, true);
lv_label_set_text(percentLabel, "#00ff00 Image Ok!#"); lv_label_set_text_static(percentLabel, "#00ff00 Image Ok!#");
} }
void FirmwareUpdate::UpdateError() { void FirmwareUpdate::UpdateError() {
lv_label_set_recolor(percentLabel, true); lv_label_set_recolor(percentLabel, true);
lv_label_set_text(percentLabel, "#ff0000 Error!#"); lv_label_set_text_static(percentLabel, "#ff0000 Error!#");
startTime = xTaskGetTickCount(); startTime = xTaskGetTickCount();
} }

View File

@ -24,7 +24,6 @@ namespace Pinetime {
lv_obj_t* bar1; lv_obj_t* bar1;
lv_obj_t* percentLabel; lv_obj_t* percentLabel;
lv_obj_t* titleLabel; lv_obj_t* titleLabel;
mutable char percentStr[10];
States state = States::Idle; States state = States::Idle;

View File

@ -33,9 +33,9 @@ FirmwareValidation::FirmwareValidation(Pinetime::Applications::DisplayApp* app,
lv_obj_set_width(labelIsValidated, 240); lv_obj_set_width(labelIsValidated, 240);
if (validator.IsValidated()) if (validator.IsValidated())
lv_label_set_text(labelIsValidated, "You have already\n#00ff00 validated# this firmware#"); lv_label_set_text_static(labelIsValidated, "You have already\n#00ff00 validated# this firmware#");
else { else {
lv_label_set_text(labelIsValidated, "Please #00ff00 Validate# this version or\n#ff0000 Reset# to rollback to the previous version."); lv_label_set_text_static(labelIsValidated, "Please #00ff00 Validate# this version or\n#ff0000 Reset# to rollback to the previous version.");
buttonValidate = lv_btn_create(lv_scr_act(), nullptr); buttonValidate = lv_btn_create(lv_scr_act(), nullptr);
buttonValidate->user_data = this; buttonValidate->user_data = this;

View File

@ -45,7 +45,7 @@ FlashLight::FlashLight(Pinetime::Applications::DisplayApp* app,
lv_label_set_long_mode(backgroundAction, LV_LABEL_LONG_CROP); lv_label_set_long_mode(backgroundAction, LV_LABEL_LONG_CROP);
lv_obj_set_size(backgroundAction, 240, 240); lv_obj_set_size(backgroundAction, 240, 240);
lv_obj_set_pos(backgroundAction, 0, 0); lv_obj_set_pos(backgroundAction, 0, 0);
lv_label_set_text(backgroundAction, ""); lv_label_set_text_static(backgroundAction, "");
lv_obj_set_click(backgroundAction, true); lv_obj_set_click(backgroundAction, true);
backgroundAction->user_data = this; backgroundAction->user_data = this;
lv_obj_set_event_cb(backgroundAction, event_handler); lv_obj_set_event_cb(backgroundAction, event_handler);

View File

@ -41,16 +41,16 @@ HeartRate::HeartRate(Pinetime::Applications::DisplayApp* app,
else else
lv_obj_set_style_local_text_color(label_hr, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY); lv_obj_set_style_local_text_color(label_hr, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY);
lv_label_set_text(label_hr, "000"); lv_label_set_text_static(label_hr, "000");
lv_obj_align(label_hr, nullptr, LV_ALIGN_CENTER, 0, -40); lv_obj_align(label_hr, nullptr, LV_ALIGN_CENTER, 0, -40);
label_bpm = lv_label_create(lv_scr_act(), nullptr); label_bpm = lv_label_create(lv_scr_act(), nullptr);
lv_label_set_text(label_bpm, "Heart rate BPM"); lv_label_set_text_static(label_bpm, "Heart rate BPM");
lv_obj_align(label_bpm, label_hr, LV_ALIGN_OUT_TOP_MID, 0, -20); lv_obj_align(label_bpm, label_hr, LV_ALIGN_OUT_TOP_MID, 0, -20);
label_status = lv_label_create(lv_scr_act(), nullptr); label_status = lv_label_create(lv_scr_act(), nullptr);
lv_obj_set_style_local_text_color(label_status, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x222222)); lv_obj_set_style_local_text_color(label_status, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x222222));
lv_label_set_text(label_status, ToString(Pinetime::Controllers::HeartRateController::States::NotEnoughData)); lv_label_set_text_static(label_status, ToString(Pinetime::Controllers::HeartRateController::States::NotEnoughData));
lv_obj_align(label_status, label_hr, LV_ALIGN_OUT_BOTTOM_MID, 0, 10); lv_obj_align(label_status, label_hr, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
@ -81,13 +81,13 @@ void HeartRate::Refresh() {
case Controllers::HeartRateController::States::NoTouch: case Controllers::HeartRateController::States::NoTouch:
case Controllers::HeartRateController::States::NotEnoughData: case Controllers::HeartRateController::States::NotEnoughData:
// case Controllers::HeartRateController::States::Stopped: // case Controllers::HeartRateController::States::Stopped:
lv_label_set_text(label_hr, "000"); lv_label_set_text_static(label_hr, "000");
break; break;
default: default:
lv_label_set_text_fmt(label_hr, "%03d", heartRateController.HeartRate()); lv_label_set_text_fmt(label_hr, "%03d", heartRateController.HeartRate());
} }
lv_label_set_text(label_status, ToString(state)); lv_label_set_text_static(label_status, ToString(state));
lv_obj_align(label_status, label_hr, LV_ALIGN_OUT_BOTTOM_MID, 0, 10); lv_obj_align(label_status, label_hr, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
} }
@ -109,7 +109,7 @@ void HeartRate::OnStartStopEvent(lv_event_t event) {
void HeartRate::UpdateStartStopButton(bool isRunning) { void HeartRate::UpdateStartStopButton(bool isRunning) {
if (isRunning) if (isRunning)
lv_label_set_text(label_startStop, "Stop"); lv_label_set_text_static(label_startStop, "Stop");
else else
lv_label_set_text(label_startStop, "Start"); lv_label_set_text_static(label_startStop, "Start");
} }

View File

@ -3,7 +3,6 @@
#include <cstdint> #include <cstdint>
#include <chrono> #include <chrono>
#include "displayapp/screens/Screen.h" #include "displayapp/screens/Screen.h"
#include <bits/unique_ptr.h>
#include "systemtask/SystemTask.h" #include "systemtask/SystemTask.h"
#include <lvgl/src/lv_core/lv_style.h> #include <lvgl/src/lv_core/lv_style.h>
#include <lvgl/src/lv_core/lv_obj.h> #include <lvgl/src/lv_core/lv_obj.h>

View File

@ -35,7 +35,7 @@ Motion::Motion(Pinetime::Applications::DisplayApp* app, Controllers::MotionContr
labelStep = lv_label_create(lv_scr_act(), NULL); labelStep = lv_label_create(lv_scr_act(), NULL);
lv_obj_align(labelStep, chart, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0); lv_obj_align(labelStep, chart, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0);
lv_label_set_text(labelStep, "Steps ---"); lv_label_set_text_static(labelStep, "Steps ---");
taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this); taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this);
} }

View File

@ -3,7 +3,6 @@
#include <cstdint> #include <cstdint>
#include <chrono> #include <chrono>
#include "displayapp/screens/Screen.h" #include "displayapp/screens/Screen.h"
#include <bits/unique_ptr.h>
#include <lvgl/src/lv_core/lv_style.h> #include <lvgl/src/lv_core/lv_style.h>
#include <lvgl/src/lv_core/lv_obj.h> #include <lvgl/src/lv_core/lv_obj.h>
#include <components/motion/MotionController.h> #include <components/motion/MotionController.h>

View File

@ -62,7 +62,7 @@ Music::Music(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Mus
lv_obj_align(btnVolDown, nullptr, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0); lv_obj_align(btnVolDown, nullptr, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0);
lv_obj_add_style(btnVolDown, LV_STATE_DEFAULT, &btn_style); lv_obj_add_style(btnVolDown, LV_STATE_DEFAULT, &btn_style);
label = lv_label_create(btnVolDown, nullptr); label = lv_label_create(btnVolDown, nullptr);
lv_label_set_text(label, Symbols::volumDown); lv_label_set_text_static(label, Symbols::volumDown);
lv_obj_set_hidden(btnVolDown, true); lv_obj_set_hidden(btnVolDown, true);
btnVolUp = lv_btn_create(lv_scr_act(), nullptr); btnVolUp = lv_btn_create(lv_scr_act(), nullptr);
@ -72,7 +72,7 @@ Music::Music(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Mus
lv_obj_align(btnVolUp, nullptr, LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0); lv_obj_align(btnVolUp, nullptr, LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0);
lv_obj_add_style(btnVolUp, LV_STATE_DEFAULT, &btn_style); lv_obj_add_style(btnVolUp, LV_STATE_DEFAULT, &btn_style);
label = lv_label_create(btnVolUp, nullptr); label = lv_label_create(btnVolUp, nullptr);
lv_label_set_text(label, Symbols::volumUp); lv_label_set_text_static(label, Symbols::volumUp);
lv_obj_set_hidden(btnVolUp, true); lv_obj_set_hidden(btnVolUp, true);
btnPrev = lv_btn_create(lv_scr_act(), nullptr); btnPrev = lv_btn_create(lv_scr_act(), nullptr);
@ -82,7 +82,7 @@ Music::Music(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Mus
lv_obj_align(btnPrev, nullptr, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0); lv_obj_align(btnPrev, nullptr, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0);
lv_obj_add_style(btnPrev, LV_STATE_DEFAULT, &btn_style); lv_obj_add_style(btnPrev, LV_STATE_DEFAULT, &btn_style);
label = lv_label_create(btnPrev, nullptr); label = lv_label_create(btnPrev, nullptr);
lv_label_set_text(label, Symbols::stepBackward); lv_label_set_text_static(label, Symbols::stepBackward);
btnNext = lv_btn_create(lv_scr_act(), nullptr); btnNext = lv_btn_create(lv_scr_act(), nullptr);
btnNext->user_data = this; btnNext->user_data = this;
@ -91,7 +91,7 @@ Music::Music(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Mus
lv_obj_align(btnNext, nullptr, LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0); lv_obj_align(btnNext, nullptr, LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0);
lv_obj_add_style(btnNext, LV_STATE_DEFAULT, &btn_style); lv_obj_add_style(btnNext, LV_STATE_DEFAULT, &btn_style);
label = lv_label_create(btnNext, nullptr); label = lv_label_create(btnNext, nullptr);
lv_label_set_text(label, Symbols::stepForward); lv_label_set_text_static(label, Symbols::stepForward);
btnPlayPause = lv_btn_create(lv_scr_act(), nullptr); btnPlayPause = lv_btn_create(lv_scr_act(), nullptr);
btnPlayPause->user_data = this; btnPlayPause->user_data = this;
@ -100,12 +100,12 @@ Music::Music(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Mus
lv_obj_align(btnPlayPause, nullptr, LV_ALIGN_IN_BOTTOM_MID, 0, 0); lv_obj_align(btnPlayPause, nullptr, LV_ALIGN_IN_BOTTOM_MID, 0, 0);
lv_obj_add_style(btnPlayPause, LV_STATE_DEFAULT, &btn_style); lv_obj_add_style(btnPlayPause, LV_STATE_DEFAULT, &btn_style);
txtPlayPause = lv_label_create(btnPlayPause, nullptr); txtPlayPause = lv_label_create(btnPlayPause, nullptr);
lv_label_set_text(txtPlayPause, Symbols::play); lv_label_set_text_static(txtPlayPause, Symbols::play);
txtTrackDuration = lv_label_create(lv_scr_act(), nullptr); txtTrackDuration = lv_label_create(lv_scr_act(), nullptr);
lv_label_set_long_mode(txtTrackDuration, LV_LABEL_LONG_SROLL); lv_label_set_long_mode(txtTrackDuration, LV_LABEL_LONG_SROLL);
lv_obj_align(txtTrackDuration, nullptr, LV_ALIGN_IN_TOP_LEFT, 12, 20); lv_obj_align(txtTrackDuration, nullptr, LV_ALIGN_IN_TOP_LEFT, 12, 20);
lv_label_set_text(txtTrackDuration, "--:--/--:--"); lv_label_set_text_static(txtTrackDuration, "--:--/--:--");
lv_label_set_align(txtTrackDuration, LV_ALIGN_IN_LEFT_MID); lv_label_set_align(txtTrackDuration, LV_ALIGN_IN_LEFT_MID);
lv_obj_set_width(txtTrackDuration, LV_HOR_RES); lv_obj_set_width(txtTrackDuration, LV_HOR_RES);
@ -117,7 +117,7 @@ Music::Music(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Mus
lv_obj_align(txtArtist, nullptr, LV_ALIGN_IN_LEFT_MID, 12, MIDDLE_OFFSET + 1 * FONT_HEIGHT); lv_obj_align(txtArtist, nullptr, LV_ALIGN_IN_LEFT_MID, 12, MIDDLE_OFFSET + 1 * FONT_HEIGHT);
lv_label_set_align(txtArtist, LV_ALIGN_IN_LEFT_MID); lv_label_set_align(txtArtist, LV_ALIGN_IN_LEFT_MID);
lv_obj_set_width(txtArtist, LV_HOR_RES - 12); lv_obj_set_width(txtArtist, LV_HOR_RES - 12);
lv_label_set_text(txtArtist, "Artist Name"); lv_label_set_text_static(txtArtist, "Artist Name");
txtTrack = lv_label_create(lv_scr_act(), nullptr); txtTrack = lv_label_create(lv_scr_act(), nullptr);
lv_label_set_long_mode(txtTrack, LV_LABEL_LONG_SROLL_CIRC); lv_label_set_long_mode(txtTrack, LV_LABEL_LONG_SROLL_CIRC);
@ -125,7 +125,7 @@ Music::Music(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Mus
lv_label_set_align(txtTrack, LV_ALIGN_IN_LEFT_MID); lv_label_set_align(txtTrack, LV_ALIGN_IN_LEFT_MID);
lv_obj_set_width(txtTrack, LV_HOR_RES - 12); lv_obj_set_width(txtTrack, LV_HOR_RES - 12);
lv_label_set_text(txtTrack, "This is a very long getTrack name"); lv_label_set_text_static(txtTrack, "This is a very long getTrack name");
/** Init animation */ /** Init animation */
imgDisc = lv_img_create(lv_scr_act(), nullptr); imgDisc = lv_img_create(lv_scr_act(), nullptr);
@ -187,7 +187,7 @@ void Music::Refresh() {
} }
if (playing == Pinetime::Controllers::MusicService::MusicStatus::Playing) { if (playing == Pinetime::Controllers::MusicService::MusicStatus::Playing) {
lv_label_set_text(txtPlayPause, Symbols::pause); lv_label_set_text_static(txtPlayPause, Symbols::pause);
if (xTaskGetTickCount() - 1024 >= lastIncrement) { if (xTaskGetTickCount() - 1024 >= lastIncrement) {
if (frameB) { if (frameB) {
@ -211,31 +211,27 @@ void Music::Refresh() {
UpdateLength(); UpdateLength();
} }
} else { } else {
lv_label_set_text(txtPlayPause, Symbols::play); lv_label_set_text_static(txtPlayPause, Symbols::play);
} }
} }
void Music::UpdateLength() { void Music::UpdateLength() {
if (totalLength > (99 * 60 * 60)) { if (totalLength > (99 * 60 * 60)) {
lv_label_set_text(txtTrackDuration, "Inf/Inf"); lv_label_set_text_static(txtTrackDuration, "Inf/Inf");
} else if (totalLength > (99 * 60)) { } else if (totalLength > (99 * 60)) {
char timer[12]; lv_label_set_text_fmt(txtTrackDuration,
sprintf(timer,
"%02d:%02d/%02d:%02d", "%02d:%02d/%02d:%02d",
(currentLength / (60 * 60)) % 100, (currentLength / (60 * 60)) % 100,
((currentLength % (60 * 60)) / 60) % 100, ((currentLength % (60 * 60)) / 60) % 100,
(totalLength / (60 * 60)) % 100, (totalLength / (60 * 60)) % 100,
((totalLength % (60 * 60)) / 60) % 100); ((totalLength % (60 * 60)) / 60) % 100);
lv_label_set_text(txtTrackDuration, timer);
} else { } else {
char timer[12]; lv_label_set_text_fmt(txtTrackDuration,
sprintf(timer,
"%02d:%02d/%02d:%02d", "%02d:%02d/%02d:%02d",
(currentLength / 60) % 100, (currentLength / 60) % 100,
(currentLength % 60) % 100, (currentLength % 60) % 100,
(totalLength / 60) % 100, (totalLength / 60) % 100,
(totalLength % 60) % 100); (totalLength % 60) % 100);
lv_label_set_text(txtTrackDuration, timer);
} }
} }

View File

@ -40,7 +40,7 @@ namespace Pinetime {
void OnObjectEvent(lv_obj_t* obj, lv_event_t event); void OnObjectEvent(lv_obj_t* obj, lv_event_t event);
private: private:
bool OnTouchEvent(TouchEvents event); bool OnTouchEvent(TouchEvents event) override;
void UpdateLength(); void UpdateLength();

View File

@ -134,13 +134,13 @@ Navigation::Navigation(Pinetime::Applications::DisplayApp* app, Pinetime::Contro
imgFlag = lv_label_create(lv_scr_act(), nullptr); imgFlag = lv_label_create(lv_scr_act(), nullptr);
lv_obj_set_style_local_text_font(imgFlag, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &lv_font_navi_80); lv_obj_set_style_local_text_font(imgFlag, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &lv_font_navi_80);
lv_obj_set_style_local_text_color(imgFlag, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_CYAN); lv_obj_set_style_local_text_color(imgFlag, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_CYAN);
lv_label_set_text(imgFlag, iconForName("flag")); lv_label_set_text_static(imgFlag, iconForName("flag"));
lv_obj_align(imgFlag, nullptr, LV_ALIGN_CENTER, 0, -60); lv_obj_align(imgFlag, nullptr, LV_ALIGN_CENTER, 0, -60);
txtNarrative = lv_label_create(lv_scr_act(), nullptr); txtNarrative = lv_label_create(lv_scr_act(), nullptr);
lv_label_set_long_mode(txtNarrative, LV_LABEL_LONG_BREAK); lv_label_set_long_mode(txtNarrative, LV_LABEL_LONG_BREAK);
lv_obj_set_width(txtNarrative, LV_HOR_RES); lv_obj_set_width(txtNarrative, LV_HOR_RES);
lv_label_set_text(txtNarrative, "Navigation"); lv_label_set_text_static(txtNarrative, "Navigation");
lv_label_set_align(txtNarrative, LV_LABEL_ALIGN_CENTER); lv_label_set_align(txtNarrative, LV_LABEL_ALIGN_CENTER);
lv_obj_align(txtNarrative, nullptr, LV_ALIGN_CENTER, 0, 10); lv_obj_align(txtNarrative, nullptr, LV_ALIGN_CENTER, 0, 10);
@ -148,7 +148,7 @@ Navigation::Navigation(Pinetime::Applications::DisplayApp* app, Pinetime::Contro
lv_label_set_long_mode(txtManDist, LV_LABEL_LONG_BREAK); lv_label_set_long_mode(txtManDist, LV_LABEL_LONG_BREAK);
lv_obj_set_style_local_text_color(txtManDist, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GREEN); lv_obj_set_style_local_text_color(txtManDist, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GREEN);
lv_obj_set_width(txtManDist, LV_HOR_RES); lv_obj_set_width(txtManDist, LV_HOR_RES);
lv_label_set_text(txtManDist, "--M"); lv_label_set_text_static(txtManDist, "--M");
lv_label_set_align(txtManDist, LV_LABEL_ALIGN_CENTER); lv_label_set_align(txtManDist, LV_LABEL_ALIGN_CENTER);
lv_obj_align(txtManDist, nullptr, LV_ALIGN_CENTER, 0, 60); lv_obj_align(txtManDist, nullptr, LV_ALIGN_CENTER, 0, 60);
@ -173,7 +173,7 @@ Navigation::~Navigation() {
void Navigation::Refresh() { void Navigation::Refresh() {
if (flag != navService.getFlag()) { if (flag != navService.getFlag()) {
flag = navService.getFlag(); flag = navService.getFlag();
lv_label_set_text(imgFlag, iconForName(flag)); lv_label_set_text_static(imgFlag, iconForName(flag));
} }
if (narrative != navService.getNarrative()) { if (narrative != navService.getNarrative()) {

View File

@ -17,6 +17,7 @@ Notifications::Notifications(DisplayApp* app,
: Screen(app), : Screen(app),
notificationManager {notificationManager}, notificationManager {notificationManager},
alertNotificationService {alertNotificationService}, alertNotificationService {alertNotificationService},
motorController {motorController},
systemTask {systemTask}, systemTask {systemTask},
mode {mode} { mode {mode} {
notificationManager.ClearNewNotificationFlag(); notificationManager.ClearNewNotificationFlag();
@ -29,7 +30,8 @@ Notifications::Notifications(DisplayApp* app,
notification.category, notification.category,
notificationManager.NbNotifications(), notificationManager.NbNotifications(),
mode, mode,
alertNotificationService); alertNotificationService,
motorController);
validDisplay = true; validDisplay = true;
} else { } else {
currentItem = std::make_unique<NotificationItem>("Notification", currentItem = std::make_unique<NotificationItem>("Notification",
@ -38,7 +40,8 @@ Notifications::Notifications(DisplayApp* app,
notification.category, notification.category,
notificationManager.NbNotifications(), notificationManager.NbNotifications(),
Modes::Preview, Modes::Preview,
alertNotificationService); alertNotificationService,
motorController);
} }
if (mode == Modes::Preview) { if (mode == Modes::Preview) {
@ -66,7 +69,7 @@ Notifications::Notifications(DisplayApp* app,
Notifications::~Notifications() { Notifications::~Notifications() {
lv_task_del(taskRefresh); lv_task_del(taskRefresh);
// make sure we stop any vibrations before exiting // make sure we stop any vibrations before exiting
Controllers::MotorController::StopRinging(); motorController.StopRinging();
systemTask.PushMessage(System::Messages::EnableSleeping); systemTask.PushMessage(System::Messages::EnableSleeping);
lv_obj_clean(lv_scr_act()); lv_obj_clean(lv_scr_act());
} }
@ -87,7 +90,7 @@ void Notifications::Refresh() {
void Notifications::OnPreviewInteraction() { void Notifications::OnPreviewInteraction() {
systemTask.PushMessage(System::Messages::EnableSleeping); systemTask.PushMessage(System::Messages::EnableSleeping);
Controllers::MotorController::StopRinging(); motorController.StopRinging();
if (timeoutLine != nullptr) { if (timeoutLine != nullptr) {
lv_obj_del(timeoutLine); lv_obj_del(timeoutLine);
timeoutLine = nullptr; timeoutLine = nullptr;
@ -125,7 +128,8 @@ bool Notifications::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
previousNotification.category, previousNotification.category,
notificationManager.NbNotifications(), notificationManager.NbNotifications(),
mode, mode,
alertNotificationService); alertNotificationService,
motorController);
} }
return true; return true;
case Pinetime::Applications::TouchEvents::SwipeUp: { case Pinetime::Applications::TouchEvents::SwipeUp: {
@ -150,7 +154,8 @@ bool Notifications::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
nextNotification.category, nextNotification.category,
notificationManager.NbNotifications(), notificationManager.NbNotifications(),
mode, mode,
alertNotificationService); alertNotificationService,
motorController);
} }
return true; return true;
default: default:
@ -171,8 +176,9 @@ Notifications::NotificationItem::NotificationItem(const char* title,
Controllers::NotificationManager::Categories category, Controllers::NotificationManager::Categories category,
uint8_t notifNb, uint8_t notifNb,
Modes mode, Modes mode,
Pinetime::Controllers::AlertNotificationService& alertNotificationService) Pinetime::Controllers::AlertNotificationService& alertNotificationService,
: mode {mode}, alertNotificationService {alertNotificationService} { Pinetime::Controllers::MotorController& motorController)
: mode {mode}, alertNotificationService {alertNotificationService}, motorController {motorController} {
lv_obj_t* container1 = lv_cont_create(lv_scr_act(), NULL); lv_obj_t* container1 = lv_cont_create(lv_scr_act(), NULL);
lv_obj_set_style_local_bg_color(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x222222)); lv_obj_set_style_local_bg_color(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x222222));
@ -192,15 +198,18 @@ Notifications::NotificationItem::NotificationItem(const char* title,
lv_obj_t* alert_type = lv_label_create(lv_scr_act(), nullptr); lv_obj_t* alert_type = lv_label_create(lv_scr_act(), nullptr);
lv_obj_set_style_local_text_color(alert_type, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x888888)); lv_obj_set_style_local_text_color(alert_type, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x888888));
if (title == nullptr) if(title == nullptr) {
title = "Notification"; lv_label_set_text_static(alert_type, "Notification");
char* pchar; } else {
pchar = strchr(title, '\n'); // copy title to label and replace newlines with spaces
lv_label_set_text(alert_type, title);
char *pchar = strchr(lv_label_get_text(alert_type), '\n');
while (pchar != nullptr) { while (pchar != nullptr) {
*pchar = ' '; *pchar = ' ';
pchar = strchr(pchar + 1, '\n'); pchar = strchr(pchar + 1, '\n');
} }
lv_label_set_text(alert_type, title); lv_label_refr_text(alert_type);
}
lv_label_set_long_mode(alert_type, LV_LABEL_LONG_SROLL_CIRC); lv_label_set_long_mode(alert_type, LV_LABEL_LONG_SROLL_CIRC);
lv_obj_set_width(alert_type, 180); lv_obj_set_width(alert_type, 180);
lv_obj_align(alert_type, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 16); lv_obj_align(alert_type, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 16);
@ -220,7 +229,7 @@ Notifications::NotificationItem::NotificationItem(const char* title,
lv_obj_set_style_local_text_color(alert_subject, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_ORANGE); lv_obj_set_style_local_text_color(alert_subject, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_ORANGE);
lv_label_set_long_mode(alert_subject, LV_LABEL_LONG_BREAK); lv_label_set_long_mode(alert_subject, LV_LABEL_LONG_BREAK);
lv_obj_set_width(alert_subject, LV_HOR_RES - 20); lv_obj_set_width(alert_subject, LV_HOR_RES - 20);
lv_label_set_text(alert_subject, "Incoming call from"); lv_label_set_text_static(alert_subject, "Incoming call from");
lv_obj_t* alert_caller = lv_label_create(container1, nullptr); lv_obj_t* alert_caller = lv_label_create(container1, nullptr);
lv_obj_align(alert_caller, alert_subject, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 0); lv_obj_align(alert_caller, alert_subject, LV_ALIGN_OUT_BOTTOM_LEFT, 0, 0);
@ -234,7 +243,7 @@ Notifications::NotificationItem::NotificationItem(const char* title,
lv_obj_set_size(bt_accept, 76, 76); lv_obj_set_size(bt_accept, 76, 76);
lv_obj_align(bt_accept, NULL, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0); lv_obj_align(bt_accept, NULL, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0);
label_accept = lv_label_create(bt_accept, nullptr); label_accept = lv_label_create(bt_accept, nullptr);
lv_label_set_text(label_accept, Symbols::phone); lv_label_set_text_static(label_accept, Symbols::phone);
lv_obj_set_style_local_bg_color(bt_accept, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GREEN); lv_obj_set_style_local_bg_color(bt_accept, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GREEN);
bt_reject = lv_btn_create(lv_scr_act(), nullptr); bt_reject = lv_btn_create(lv_scr_act(), nullptr);
@ -243,7 +252,7 @@ Notifications::NotificationItem::NotificationItem(const char* title,
lv_obj_set_size(bt_reject, 76, 76); lv_obj_set_size(bt_reject, 76, 76);
lv_obj_align(bt_reject, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, 0); lv_obj_align(bt_reject, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, 0);
label_reject = lv_label_create(bt_reject, nullptr); label_reject = lv_label_create(bt_reject, nullptr);
lv_label_set_text(label_reject, Symbols::phoneSlash); lv_label_set_text_static(label_reject, Symbols::phoneSlash);
lv_obj_set_style_local_bg_color(bt_reject, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_RED); lv_obj_set_style_local_bg_color(bt_reject, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_RED);
bt_mute = lv_btn_create(lv_scr_act(), nullptr); bt_mute = lv_btn_create(lv_scr_act(), nullptr);
@ -252,7 +261,7 @@ Notifications::NotificationItem::NotificationItem(const char* title,
lv_obj_set_size(bt_mute, 76, 76); lv_obj_set_size(bt_mute, 76, 76);
lv_obj_align(bt_mute, NULL, LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0); lv_obj_align(bt_mute, NULL, LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0);
label_mute = lv_label_create(bt_mute, nullptr); label_mute = lv_label_create(bt_mute, nullptr);
lv_label_set_text(label_mute, Symbols::volumMute); lv_label_set_text_static(label_mute, Symbols::volumMute);
lv_obj_set_style_local_bg_color(bt_mute, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY); lv_obj_set_style_local_bg_color(bt_mute, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY);
} break; } break;
} }
@ -261,7 +270,7 @@ Notifications::NotificationItem::NotificationItem(const char* title,
lv_label_set_long_mode(backgroundLabel, LV_LABEL_LONG_CROP); lv_label_set_long_mode(backgroundLabel, LV_LABEL_LONG_CROP);
lv_obj_set_size(backgroundLabel, 240, 240); lv_obj_set_size(backgroundLabel, 240, 240);
lv_obj_set_pos(backgroundLabel, 0, 0); lv_obj_set_pos(backgroundLabel, 0, 0);
lv_label_set_text(backgroundLabel, ""); lv_label_set_text_static(backgroundLabel, "");
} }
void Notifications::NotificationItem::OnCallButtonEvent(lv_obj_t* obj, lv_event_t event) { void Notifications::NotificationItem::OnCallButtonEvent(lv_obj_t* obj, lv_event_t event) {
@ -269,7 +278,7 @@ void Notifications::NotificationItem::OnCallButtonEvent(lv_obj_t* obj, lv_event_
return; return;
} }
Controllers::MotorController::StopRinging(); motorController.StopRinging();
if (obj == bt_accept) { if (obj == bt_accept) {
alertNotificationService.AcceptIncomingCall(); alertNotificationService.AcceptIncomingCall();

View File

@ -39,7 +39,8 @@ namespace Pinetime {
Controllers::NotificationManager::Categories, Controllers::NotificationManager::Categories,
uint8_t notifNb, uint8_t notifNb,
Modes mode, Modes mode,
Pinetime::Controllers::AlertNotificationService& alertNotificationService); Pinetime::Controllers::AlertNotificationService& alertNotificationService,
Pinetime::Controllers::MotorController& motorController);
~NotificationItem(); ~NotificationItem();
bool IsRunning() const { bool IsRunning() const {
return running; return running;
@ -56,16 +57,14 @@ namespace Pinetime {
lv_obj_t* label_reject; lv_obj_t* label_reject;
Modes mode; Modes mode;
Pinetime::Controllers::AlertNotificationService& alertNotificationService; Pinetime::Controllers::AlertNotificationService& alertNotificationService;
Pinetime::Controllers::MotorController& motorController;
bool running = true; bool running = true;
}; };
private: private:
struct NotificationData {
const char* title;
const char* text;
};
Pinetime::Controllers::NotificationManager& notificationManager; Pinetime::Controllers::NotificationManager& notificationManager;
Pinetime::Controllers::AlertNotificationService& alertNotificationService; Pinetime::Controllers::AlertNotificationService& alertNotificationService;
Pinetime::Controllers::MotorController& motorController;
System::SystemTask& systemTask; System::SystemTask& systemTask;
Modes mode = Modes::Normal; Modes mode = Modes::Normal;
std::unique_ptr<NotificationItem> currentItem; std::unique_ptr<NotificationItem> currentItem;

View File

@ -17,7 +17,7 @@ Paddle::Paddle(Pinetime::Applications::DisplayApp* app, Pinetime::Components::Li
points = lv_label_create(lv_scr_act(), nullptr); points = lv_label_create(lv_scr_act(), nullptr);
lv_obj_set_style_local_text_font(points, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_42); lv_obj_set_style_local_text_font(points, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_42);
lv_label_set_text(points, "0000"); lv_label_set_text_static(points, "0000");
lv_obj_align(points, lv_scr_act(), LV_ALIGN_IN_TOP_MID, 0, 10); lv_obj_align(points, lv_scr_act(), LV_ALIGN_IN_TOP_MID, 0, 10);
paddle = lv_obj_create(lv_scr_act(), nullptr); paddle = lv_obj_create(lv_scr_act(), nullptr);

View File

@ -15,7 +15,7 @@ PassKey::PassKey(Pinetime::Applications::DisplayApp* app, uint32_t key) : Screen
lv_label_set_long_mode(backgroundLabel, LV_LABEL_LONG_CROP); lv_label_set_long_mode(backgroundLabel, LV_LABEL_LONG_CROP);
lv_obj_set_size(backgroundLabel, 240, 240); lv_obj_set_size(backgroundLabel, 240, 240);
lv_obj_set_pos(backgroundLabel, 0, 0); lv_obj_set_pos(backgroundLabel, 0, 0);
lv_label_set_text(backgroundLabel, ""); lv_label_set_text_static(backgroundLabel, "");
} }
PassKey::~PassKey() { PassKey::~PassKey() {

View File

@ -61,7 +61,7 @@ Steps::Steps(Pinetime::Applications::DisplayApp* app,
lv_obj_set_width(resetBtn, 115); lv_obj_set_width(resetBtn, 115);
lv_obj_align(resetBtn, lv_scr_act(), LV_ALIGN_IN_BOTTOM_MID, 0, 0); lv_obj_align(resetBtn, lv_scr_act(), LV_ALIGN_IN_BOTTOM_MID, 0, 0);
resetButtonLabel = lv_label_create(resetBtn, nullptr); resetButtonLabel = lv_label_create(resetBtn, nullptr);
lv_label_set_text(resetButtonLabel, "Reset"); lv_label_set_text_static(resetButtonLabel, "Reset");
currentTripSteps = motionController.GetTripSteps(); currentTripSteps = motionController.GetTripSteps();

View File

@ -55,13 +55,13 @@ StopWatch::StopWatch(DisplayApp* app, System::SystemTask& systemTask)
time = lv_label_create(lv_scr_act(), nullptr); time = lv_label_create(lv_scr_act(), nullptr);
lv_obj_set_style_local_text_font(time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_76); lv_obj_set_style_local_text_font(time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_76);
lv_obj_set_style_local_text_color(time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY); lv_obj_set_style_local_text_color(time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY);
lv_label_set_text(time, "00:00"); lv_label_set_text_static(time, "00:00");
lv_obj_align(time, lv_scr_act(), LV_ALIGN_CENTER, 0, -45); lv_obj_align(time, lv_scr_act(), LV_ALIGN_CENTER, 0, -45);
msecTime = lv_label_create(lv_scr_act(), nullptr); msecTime = lv_label_create(lv_scr_act(), nullptr);
// lv_obj_set_style_local_text_font(msecTime, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_bold_20); // lv_obj_set_style_local_text_font(msecTime, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_bold_20);
lv_obj_set_style_local_text_color(msecTime, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY); lv_obj_set_style_local_text_color(msecTime, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY);
lv_label_set_text(msecTime, "00"); lv_label_set_text_static(msecTime, "00");
lv_obj_align(msecTime, lv_scr_act(), LV_ALIGN_CENTER, 0, 3); lv_obj_align(msecTime, lv_scr_act(), LV_ALIGN_CENTER, 0, 3);
btnPlayPause = lv_btn_create(lv_scr_act(), nullptr); btnPlayPause = lv_btn_create(lv_scr_act(), nullptr);
@ -71,7 +71,7 @@ StopWatch::StopWatch(DisplayApp* app, System::SystemTask& systemTask)
lv_obj_set_width(btnPlayPause, 115); lv_obj_set_width(btnPlayPause, 115);
lv_obj_align(btnPlayPause, lv_scr_act(), LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0); lv_obj_align(btnPlayPause, lv_scr_act(), LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0);
txtPlayPause = lv_label_create(btnPlayPause, nullptr); txtPlayPause = lv_label_create(btnPlayPause, nullptr);
lv_label_set_text(txtPlayPause, Symbols::play); lv_label_set_text_static(txtPlayPause, Symbols::play);
btnStopLap = lv_btn_create(lv_scr_act(), nullptr); btnStopLap = lv_btn_create(lv_scr_act(), nullptr);
btnStopLap->user_data = this; btnStopLap->user_data = this;
@ -82,7 +82,7 @@ StopWatch::StopWatch(DisplayApp* app, System::SystemTask& systemTask)
lv_obj_set_style_local_bg_color(btnStopLap, LV_BTN_PART_MAIN, LV_STATE_DISABLED, lv_color_hex(0x080808)); lv_obj_set_style_local_bg_color(btnStopLap, LV_BTN_PART_MAIN, LV_STATE_DISABLED, lv_color_hex(0x080808));
txtStopLap = lv_label_create(btnStopLap, nullptr); txtStopLap = lv_label_create(btnStopLap, nullptr);
lv_obj_set_style_local_text_color(txtStopLap, LV_BTN_PART_MAIN, LV_STATE_DISABLED, lv_color_hex(0x888888)); lv_obj_set_style_local_text_color(txtStopLap, LV_BTN_PART_MAIN, LV_STATE_DISABLED, lv_color_hex(0x888888));
lv_label_set_text(txtStopLap, Symbols::stop); lv_label_set_text_static(txtStopLap, Symbols::stop);
lv_obj_set_state(btnStopLap, LV_STATE_DISABLED); lv_obj_set_state(btnStopLap, LV_STATE_DISABLED);
lv_obj_set_state(txtStopLap, LV_STATE_DISABLED); lv_obj_set_state(txtStopLap, LV_STATE_DISABLED);
@ -90,13 +90,13 @@ StopWatch::StopWatch(DisplayApp* app, System::SystemTask& systemTask)
// lv_obj_set_style_local_text_font(lapOneText, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_bold_20); // lv_obj_set_style_local_text_font(lapOneText, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_bold_20);
lv_obj_set_style_local_text_color(lapOneText, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_YELLOW); lv_obj_set_style_local_text_color(lapOneText, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_YELLOW);
lv_obj_align(lapOneText, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 50, 30); lv_obj_align(lapOneText, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 50, 30);
lv_label_set_text(lapOneText, ""); lv_label_set_text_static(lapOneText, "");
lapTwoText = lv_label_create(lv_scr_act(), nullptr); lapTwoText = lv_label_create(lv_scr_act(), nullptr);
// lv_obj_set_style_local_text_font(lapTwoText, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_bold_20); // lv_obj_set_style_local_text_font(lapTwoText, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_bold_20);
lv_obj_set_style_local_text_color(lapTwoText, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_YELLOW); lv_obj_set_style_local_text_color(lapTwoText, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_YELLOW);
lv_obj_align(lapTwoText, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 50, 55); lv_obj_align(lapTwoText, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 50, 55);
lv_label_set_text(lapTwoText, ""); lv_label_set_text_static(lapTwoText, "");
taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this); taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this);
} }
@ -113,11 +113,11 @@ void StopWatch::reset() {
lv_obj_set_style_local_text_color(time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY); lv_obj_set_style_local_text_color(time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY);
lv_obj_set_style_local_text_color(msecTime, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY); lv_obj_set_style_local_text_color(msecTime, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY);
lv_label_set_text(time, "00:00"); lv_label_set_text_static(time, "00:00");
lv_label_set_text(msecTime, "00"); lv_label_set_text_static(msecTime, "00");
lv_label_set_text(lapOneText, ""); lv_label_set_text_static(lapOneText, "");
lv_label_set_text(lapTwoText, ""); lv_label_set_text_static(lapTwoText, "");
lapBuffer.clearBuffer(); lapBuffer.clearBuffer();
lapNr = 0; lapNr = 0;
lv_obj_set_state(btnStopLap, LV_STATE_DISABLED); lv_obj_set_state(btnStopLap, LV_STATE_DISABLED);
@ -129,8 +129,8 @@ void StopWatch::start() {
lv_obj_set_state(txtStopLap, LV_STATE_DEFAULT); lv_obj_set_state(txtStopLap, LV_STATE_DEFAULT);
lv_obj_set_style_local_text_color(time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GREEN); lv_obj_set_style_local_text_color(time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GREEN);
lv_obj_set_style_local_text_color(msecTime, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GREEN); lv_obj_set_style_local_text_color(msecTime, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GREEN);
lv_label_set_text(txtPlayPause, Symbols::pause); lv_label_set_text_static(txtPlayPause, Symbols::pause);
lv_label_set_text(txtStopLap, Symbols::lapsFlag); lv_label_set_text_static(txtStopLap, Symbols::lapsFlag);
startTime = xTaskGetTickCount(); startTime = xTaskGetTickCount();
currentState = States::Running; currentState = States::Running;
systemTask.PushMessage(Pinetime::System::Messages::DisableSleeping); systemTask.PushMessage(Pinetime::System::Messages::DisableSleeping);
@ -141,8 +141,8 @@ void StopWatch::pause() {
// Store the current time elapsed in cache // Store the current time elapsed in cache
oldTimeElapsed += timeElapsed; oldTimeElapsed += timeElapsed;
currentState = States::Halted; currentState = States::Halted;
lv_label_set_text(txtPlayPause, Symbols::play); lv_label_set_text_static(txtPlayPause, Symbols::play);
lv_label_set_text(txtStopLap, Symbols::stop); lv_label_set_text_static(txtStopLap, Symbols::stop);
lv_obj_set_style_local_text_color(time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_YELLOW); lv_obj_set_style_local_text_color(time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_YELLOW);
lv_obj_set_style_local_text_color(msecTime, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_YELLOW); lv_obj_set_style_local_text_color(msecTime, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_YELLOW);
systemTask.PushMessage(Pinetime::System::Messages::EnableSleeping); systemTask.PushMessage(Pinetime::System::Messages::EnableSleeping);

View File

@ -39,7 +39,7 @@ Tile::Tile(uint8_t screenID,
// Battery // Battery
batteryIcon = lv_label_create(lv_scr_act(), nullptr); batteryIcon = lv_label_create(lv_scr_act(), nullptr);
lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryController.PercentRemaining())); lv_label_set_text_static(batteryIcon, BatteryIcon::GetBatteryIcon(batteryController.PercentRemaining()));
lv_obj_align(batteryIcon, nullptr, LV_ALIGN_IN_TOP_RIGHT, -8, 0); lv_obj_align(batteryIcon, nullptr, LV_ALIGN_IN_TOP_RIGHT, -8, 0);
if (numScreens > 1) { if (numScreens > 1) {
@ -120,7 +120,7 @@ Tile::~Tile() {
void Tile::UpdateScreen() { void Tile::UpdateScreen() {
lv_label_set_text(label_time, dateTimeController.FormattedTime().c_str()); lv_label_set_text(label_time, dateTimeController.FormattedTime().c_str());
lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryController.PercentRemaining())); lv_label_set_text_static(batteryIcon, BatteryIcon::GetBatteryIcon(batteryController.PercentRemaining()));
} }
void Tile::OnValueChangedEvent(lv_obj_t* obj, uint32_t buttonId) { void Tile::OnValueChangedEvent(lv_obj_t* obj, uint32_t buttonId) {

View File

@ -1,5 +1,4 @@
#include "displayapp/screens/Timer.h" #include "displayapp/screens/Timer.h"
#include "displayapp/screens/Screen.h" #include "displayapp/screens/Screen.h"
#include "displayapp/screens/Symbols.h" #include "displayapp/screens/Symbols.h"
#include <lvgl/lvgl.h> #include <lvgl/lvgl.h>
@ -7,11 +6,11 @@
using namespace Pinetime::Applications::Screens; using namespace Pinetime::Applications::Screens;
static void btnEventHandler(lv_obj_t* obj, lv_event_t event) { static void btnEventHandler(lv_obj_t* obj, lv_event_t event) {
Timer* screen = static_cast<Timer*>(obj->user_data); auto* screen = static_cast<Timer*>(obj->user_data);
screen->OnButtonEvent(obj, event); screen->OnButtonEvent(obj, event);
} }
void Timer::createButtons() { void Timer::CreateButtons() {
btnMinutesUp = lv_btn_create(lv_scr_act(), nullptr); btnMinutesUp = lv_btn_create(lv_scr_act(), nullptr);
btnMinutesUp->user_data = this; btnMinutesUp->user_data = this;
lv_obj_set_event_cb(btnMinutesUp, btnEventHandler); lv_obj_set_event_cb(btnMinutesUp, btnEventHandler);
@ -19,7 +18,7 @@ void Timer::createButtons() {
lv_obj_set_height(btnMinutesUp, 40); lv_obj_set_height(btnMinutesUp, 40);
lv_obj_set_width(btnMinutesUp, 60); lv_obj_set_width(btnMinutesUp, 60);
txtMUp = lv_label_create(btnMinutesUp, nullptr); txtMUp = lv_label_create(btnMinutesUp, nullptr);
lv_label_set_text(txtMUp, "+"); lv_label_set_text_static(txtMUp, "+");
btnMinutesDown = lv_btn_create(lv_scr_act(), nullptr); btnMinutesDown = lv_btn_create(lv_scr_act(), nullptr);
btnMinutesDown->user_data = this; btnMinutesDown->user_data = this;
@ -28,7 +27,7 @@ void Timer::createButtons() {
lv_obj_set_height(btnMinutesDown, 40); lv_obj_set_height(btnMinutesDown, 40);
lv_obj_set_width(btnMinutesDown, 60); lv_obj_set_width(btnMinutesDown, 60);
txtMDown = lv_label_create(btnMinutesDown, nullptr); txtMDown = lv_label_create(btnMinutesDown, nullptr);
lv_label_set_text(txtMDown, "-"); lv_label_set_text_static(txtMDown, "-");
btnSecondsUp = lv_btn_create(lv_scr_act(), nullptr); btnSecondsUp = lv_btn_create(lv_scr_act(), nullptr);
btnSecondsUp->user_data = this; btnSecondsUp->user_data = this;
@ -37,7 +36,7 @@ void Timer::createButtons() {
lv_obj_set_height(btnSecondsUp, 40); lv_obj_set_height(btnSecondsUp, 40);
lv_obj_set_width(btnSecondsUp, 60); lv_obj_set_width(btnSecondsUp, 60);
txtSUp = lv_label_create(btnSecondsUp, nullptr); txtSUp = lv_label_create(btnSecondsUp, nullptr);
lv_label_set_text(txtSUp, "+"); lv_label_set_text_static(txtSUp, "+");
btnSecondsDown = lv_btn_create(lv_scr_act(), nullptr); btnSecondsDown = lv_btn_create(lv_scr_act(), nullptr);
btnSecondsDown->user_data = this; btnSecondsDown->user_data = this;
@ -46,11 +45,17 @@ void Timer::createButtons() {
lv_obj_set_height(btnSecondsDown, 40); lv_obj_set_height(btnSecondsDown, 40);
lv_obj_set_width(btnSecondsDown, 60); lv_obj_set_width(btnSecondsDown, 60);
txtSDown = lv_label_create(btnSecondsDown, nullptr); txtSDown = lv_label_create(btnSecondsDown, nullptr);
lv_label_set_text(txtSDown, "-"); lv_label_set_text_static(txtSDown, "-");
} }
Timer::Timer(DisplayApp* app, Controllers::TimerController& timerController) Timer::Timer(DisplayApp* app, Controllers::TimerController& timerController)
: Screen(app), running {true}, timerController {timerController} { : Screen(app), running {true}, timerController {timerController} {
backgroundLabel = lv_label_create(lv_scr_act(), nullptr);
lv_obj_set_click(backgroundLabel, true);
lv_label_set_long_mode(backgroundLabel, LV_LABEL_LONG_CROP);
lv_obj_set_size(backgroundLabel, 240, 240);
lv_obj_set_pos(backgroundLabel, 0, 0);
lv_label_set_text_static(backgroundLabel, "");
time = lv_label_create(lv_scr_act(), nullptr); time = lv_label_create(lv_scr_act(), nullptr);
lv_obj_set_style_local_text_font(time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_76); lv_obj_set_style_local_text_font(time, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_76);
@ -68,10 +73,10 @@ Timer::Timer(DisplayApp* app, Controllers::TimerController& timerController)
lv_obj_set_height(btnPlayPause, 40); lv_obj_set_height(btnPlayPause, 40);
txtPlayPause = lv_label_create(btnPlayPause, nullptr); txtPlayPause = lv_label_create(btnPlayPause, nullptr);
if (timerController.IsRunning()) { if (timerController.IsRunning()) {
lv_label_set_text(txtPlayPause, Symbols::pause); lv_label_set_text_static(txtPlayPause, Symbols::pause);
} else { } else {
lv_label_set_text(txtPlayPause, Symbols::play); lv_label_set_text_static(txtPlayPause, Symbols::play);
createButtons(); CreateButtons();
} }
taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this); taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this);
@ -93,15 +98,15 @@ void Timer::OnButtonEvent(lv_obj_t* obj, lv_event_t event) {
if (event == LV_EVENT_CLICKED) { if (event == LV_EVENT_CLICKED) {
if (obj == btnPlayPause) { if (obj == btnPlayPause) {
if (timerController.IsRunning()) { if (timerController.IsRunning()) {
lv_label_set_text(txtPlayPause, Symbols::play); lv_label_set_text_static(txtPlayPause, Symbols::play);
uint32_t seconds = timerController.GetTimeRemaining() / 1000; uint32_t seconds = timerController.GetTimeRemaining() / 1000;
minutesToSet = seconds / 60; minutesToSet = seconds / 60;
secondsToSet = seconds % 60; secondsToSet = seconds % 60;
timerController.StopTimer(); timerController.StopTimer();
createButtons(); CreateButtons();
} else if (secondsToSet + minutesToSet > 0) { } else if (secondsToSet + minutesToSet > 0) {
lv_label_set_text(txtPlayPause, Symbols::pause); lv_label_set_text_static(txtPlayPause, Symbols::pause);
timerController.StartTimer((secondsToSet + minutesToSet * 60) * 1000); timerController.StartTimer((secondsToSet + minutesToSet * 60) * 1000);
lv_obj_del(btnSecondsDown); lv_obj_del(btnSecondsDown);
@ -152,10 +157,10 @@ void Timer::OnButtonEvent(lv_obj_t* obj, lv_event_t event) {
} }
} }
void Timer::setDone() { void Timer::SetDone() {
lv_label_set_text(time, "00:00"); lv_label_set_text_static(time, "00:00");
lv_label_set_text(txtPlayPause, Symbols::play); lv_label_set_text_static(txtPlayPause, Symbols::play);
secondsToSet = 0; secondsToSet = 0;
minutesToSet = 0; minutesToSet = 0;
createButtons(); CreateButtons();
} }

View File

@ -8,32 +8,35 @@
#include "components/timer/TimerController.h" #include "components/timer/TimerController.h"
namespace Pinetime::Applications::Screens { namespace Pinetime::Applications::Screens {
class Timer : public Screen { class Timer : public Screen {
public: public:
enum class Modes { Normal, Done }; enum class Modes { Normal, Done };
Timer(DisplayApp* app, Controllers::TimerController& timerController); Timer(DisplayApp* app, Controllers::TimerController& timerController);
~Timer() override; ~Timer() override;
void Refresh() override; void Refresh() override;
void SetDone();
void setDone();
void OnButtonEvent(lv_obj_t* obj, lv_event_t event); void OnButtonEvent(lv_obj_t* obj, lv_event_t event);
private: private:
void CreateButtons();
bool running; bool running;
uint8_t secondsToSet = 0; uint8_t secondsToSet = 0;
uint8_t minutesToSet = 0; uint8_t minutesToSet = 0;
Controllers::TimerController& timerController; Controllers::TimerController& timerController;
lv_obj_t* backgroundLabel;
void createButtons(); lv_obj_t* time;
lv_obj_t* msecTime;
lv_obj_t *time, *msecTime, *btnPlayPause, *txtPlayPause, *btnMinutesUp, *btnMinutesDown, *btnSecondsUp, *btnSecondsDown, *txtMUp, lv_obj_t* btnPlayPause;
*txtMDown, *txtSUp, *txtSDown; lv_obj_t* txtPlayPause;
lv_obj_t* btnMinutesUp;
lv_obj_t* btnMinutesDown;
lv_obj_t* btnSecondsUp;
lv_obj_t* btnSecondsDown;
lv_obj_t* txtMUp;
lv_obj_t* txtMDown;
lv_obj_t* txtSUp;
lv_obj_t* txtSDown;
lv_task_t* taskRefresh; lv_task_t* taskRefresh;
}; };
} }

View File

@ -90,7 +90,7 @@ Twos::Twos(Pinetime::Applications::DisplayApp* app) : Screen(app) {
lv_label_set_long_mode(backgroundLabel, LV_LABEL_LONG_CROP); lv_label_set_long_mode(backgroundLabel, LV_LABEL_LONG_CROP);
lv_obj_set_size(backgroundLabel, 240, 240); lv_obj_set_size(backgroundLabel, 240, 240);
lv_obj_set_pos(backgroundLabel, 0, 0); lv_obj_set_pos(backgroundLabel, 0, 0);
lv_label_set_text(backgroundLabel, ""); lv_label_set_text_static(backgroundLabel, "");
} }
Twos::~Twos() { Twos::~Twos() {
@ -130,7 +130,7 @@ bool Twos::placeNewTile() {
} }
bool Twos::tryMerge(TwosTile grid[][4], int& newRow, int& newCol, int oldRow, int oldCol) { bool Twos::tryMerge(TwosTile grid[][4], int& newRow, int& newCol, int oldRow, int oldCol) {
if ((grid[newRow][newCol].value == grid[oldRow][oldCol].value)) { if (grid[newRow][newCol].value == grid[oldRow][oldCol].value) {
if ((newCol != oldCol) || (newRow != oldRow)) { if ((newCol != oldCol) || (newRow != oldRow)) {
if (!grid[newRow][newCol].merged) { if (!grid[newRow][newCol].merged) {
unsigned int newVal = grid[oldRow][oldCol].value *= 2; unsigned int newVal = grid[oldRow][oldCol].value *= 2;

View File

@ -57,7 +57,6 @@ WatchFaceAnalog::WatchFaceAnalog(Pinetime::Applications::DisplayApp* app,
bleController {bleController}, bleController {bleController},
notificationManager {notificationManager}, notificationManager {notificationManager},
settingsController {settingsController} { settingsController {settingsController} {
settingsController.SetClockFace(1);
sHour = 99; sHour = 99;
sMinute = 99; sMinute = 99;
@ -68,13 +67,13 @@ WatchFaceAnalog::WatchFaceAnalog(Pinetime::Applications::DisplayApp* app,
lv_obj_align(bg_clock_img, NULL, LV_ALIGN_CENTER, 0, 0); lv_obj_align(bg_clock_img, NULL, LV_ALIGN_CENTER, 0, 0);
batteryIcon = lv_label_create(lv_scr_act(), nullptr); batteryIcon = lv_label_create(lv_scr_act(), nullptr);
lv_label_set_text(batteryIcon, Symbols::batteryHalf); lv_label_set_text_static(batteryIcon, Symbols::batteryHalf);
lv_obj_align(batteryIcon, NULL, LV_ALIGN_IN_TOP_RIGHT, 0, 0); lv_obj_align(batteryIcon, NULL, LV_ALIGN_IN_TOP_RIGHT, 0, 0);
lv_obj_set_auto_realign(batteryIcon, true); lv_obj_set_auto_realign(batteryIcon, true);
notificationIcon = lv_label_create(lv_scr_act(), NULL); notificationIcon = lv_label_create(lv_scr_act(), NULL);
lv_obj_set_style_local_text_color(notificationIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x00FF00)); lv_obj_set_style_local_text_color(notificationIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x00FF00));
lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(false)); lv_label_set_text_static(notificationIcon, NotificationIcon::GetIcon(false));
lv_obj_align(notificationIcon, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 0); lv_obj_align(notificationIcon, NULL, LV_ALIGN_IN_TOP_LEFT, 0, 0);
// Date - Day / Week day // Date - Day / Week day
@ -138,9 +137,9 @@ WatchFaceAnalog::~WatchFaceAnalog() {
} }
void WatchFaceAnalog::UpdateClock() { void WatchFaceAnalog::UpdateClock() {
hour = dateTimeController.Hours(); uint8_t hour = dateTimeController.Hours();
minute = dateTimeController.Minutes(); uint8_t minute = dateTimeController.Minutes();
second = dateTimeController.Seconds(); uint8_t second = dateTimeController.Seconds();
if (sMinute != minute) { if (sMinute != minute) {
auto const angle = minute * 6; auto const angle = minute * 6;
@ -186,7 +185,7 @@ void WatchFaceAnalog::SetBatteryIcon() {
} else { } else {
lv_obj_set_style_local_text_color(batteryIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE); lv_obj_set_style_local_text_color(batteryIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE);
} }
lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryPercent)); lv_label_set_text_static(batteryIcon, BatteryIcon::GetBatteryIcon(batteryPercent));
} }
void WatchFaceAnalog::Refresh() { void WatchFaceAnalog::Refresh() {
@ -194,7 +193,7 @@ void WatchFaceAnalog::Refresh() {
if (isCharging.IsUpdated()) { if (isCharging.IsUpdated()) {
if (isCharging.Get()) { if (isCharging.Get()) {
lv_obj_set_style_local_text_color(batteryIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_RED); lv_obj_set_style_local_text_color(batteryIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_RED);
lv_label_set_text(batteryIcon, Symbols::plug); lv_label_set_text_static(batteryIcon, Symbols::plug);
} else { } else {
SetBatteryIcon(); SetBatteryIcon();
} }
@ -209,15 +208,15 @@ void WatchFaceAnalog::Refresh() {
notificationState = notificationManager.AreNewNotificationsAvailable(); notificationState = notificationManager.AreNewNotificationsAvailable();
if (notificationState.IsUpdated()) { if (notificationState.IsUpdated()) {
lv_label_set_text(notificationIcon, NotificationIcon::GetIcon(notificationState.Get())); lv_label_set_text_static(notificationIcon, NotificationIcon::GetIcon(notificationState.Get()));
} }
currentDateTime = dateTimeController.CurrentDateTime(); currentDateTime = dateTimeController.CurrentDateTime();
if (currentDateTime.IsUpdated()) { if (currentDateTime.IsUpdated()) {
month = dateTimeController.Month(); Pinetime::Controllers::DateTime::Months month = dateTimeController.Month();
day = dateTimeController.Day(); uint8_t day = dateTimeController.Day();
dayOfWeek = dateTimeController.DayOfWeek(); Pinetime::Controllers::DateTime::Days dayOfWeek = dateTimeController.DayOfWeek();
UpdateClock(); UpdateClock();

View File

@ -35,13 +35,6 @@ namespace Pinetime {
private: private:
uint8_t sHour, sMinute, sSecond; uint8_t sHour, sMinute, sSecond;
uint8_t hour;
uint8_t minute;
uint8_t second;
Pinetime::Controllers::DateTime::Months month;
uint8_t day;
Pinetime::Controllers::DateTime::Days dayOfWeek;
Pinetime::Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown; Pinetime::Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown;
Pinetime::Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown; Pinetime::Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown;
@ -74,7 +67,7 @@ namespace Pinetime {
lv_obj_t* batteryIcon; lv_obj_t* batteryIcon;
lv_obj_t* notificationIcon; lv_obj_t* notificationIcon;
Controllers::DateTime& dateTimeController; const Controllers::DateTime& dateTimeController;
Controllers::Battery& batteryController; Controllers::Battery& batteryController;
Controllers::Ble& bleController; Controllers::Ble& bleController;
Controllers::NotificationManager& notificationManager; Controllers::NotificationManager& notificationManager;

View File

@ -32,7 +32,6 @@ WatchFaceDigital::WatchFaceDigital(DisplayApp* app,
settingsController {settingsController}, settingsController {settingsController},
heartRateController {heartRateController}, heartRateController {heartRateController},
motionController {motionController} { motionController {motionController} {
settingsController.SetClockFace(0);
batteryIcon = lv_label_create(lv_scr_act(), nullptr); batteryIcon = lv_label_create(lv_scr_act(), nullptr);
lv_label_set_text_static(batteryIcon, Symbols::batteryFull); lv_label_set_text_static(batteryIcon, Symbols::batteryFull);
@ -120,7 +119,8 @@ void WatchFaceDigital::Refresh() {
} }
bleState = bleController.IsConnected(); bleState = bleController.IsConnected();
if (bleState.IsUpdated()) { bleRadioEnabled = bleController.IsRadioEnabled();
if (bleState.IsUpdated() || bleRadioEnabled.IsUpdated()) {
lv_label_set_text_static(bleIcon, BleIcon::GetIcon(bleState.Get())); lv_label_set_text_static(bleIcon, BleIcon::GetIcon(bleState.Get()));
} }
lv_obj_realign(batteryIcon); lv_obj_realign(batteryIcon);

View File

@ -6,6 +6,7 @@
#include <memory> #include <memory>
#include "displayapp/screens/Screen.h" #include "displayapp/screens/Screen.h"
#include "components/datetime/DateTimeController.h" #include "components/datetime/DateTimeController.h"
#include "components/ble/BleController.h"
namespace Pinetime { namespace Pinetime {
namespace Controllers { namespace Controllers {
@ -39,13 +40,14 @@ namespace Pinetime {
uint8_t displayedMinute = -1; uint8_t displayedMinute = -1;
uint16_t currentYear = 1970; uint16_t currentYear = 1970;
Pinetime::Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown; Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown;
Pinetime::Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown; Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown;
uint8_t currentDay = 0; uint8_t currentDay = 0;
DirtyValue<uint8_t> batteryPercentRemaining {}; DirtyValue<uint8_t> batteryPercentRemaining {};
DirtyValue<bool> powerPresent {}; DirtyValue<bool> powerPresent {};
DirtyValue<bool> bleState {}; DirtyValue<bool> bleState {};
DirtyValue<bool> bleRadioEnabled {};
DirtyValue<std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds>> currentDateTime {}; DirtyValue<std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds>> currentDateTime {};
DirtyValue<bool> motionSensorOk {}; DirtyValue<bool> motionSensorOk {};
DirtyValue<uint32_t> stepCount {}; DirtyValue<uint32_t> stepCount {};

View File

@ -19,7 +19,7 @@
* Style/layout copied from TimeStyle for Pebble by Dan Tilden (github.com/tilden) * Style/layout copied from TimeStyle for Pebble by Dan Tilden (github.com/tilden)
*/ */
#include "displayapp/screens/PineTimeStyle.h" #include "displayapp/screens/WatchFacePineTimeStyle.h"
#include <date/date.h> #include <date/date.h>
#include <lvgl/lvgl.h> #include <lvgl/lvgl.h>
#include <cstdio> #include <cstdio>
@ -39,12 +39,19 @@ using namespace Pinetime::Applications::Screens;
namespace { namespace {
void event_handler(lv_obj_t* obj, lv_event_t event) { void event_handler(lv_obj_t* obj, lv_event_t event) {
auto* screen = static_cast<PineTimeStyle*>(obj->user_data); auto* screen = static_cast<WatchFacePineTimeStyle*>(obj->user_data);
screen->UpdateSelected(obj, event); screen->UpdateSelected(obj, event);
} }
bool IsBleIconVisible(bool isRadioEnabled, bool isConnected) {
if(!isRadioEnabled) {
return true;
}
return isConnected;
}
} }
PineTimeStyle::PineTimeStyle(DisplayApp* app, WatchFacePineTimeStyle::WatchFacePineTimeStyle(DisplayApp* app,
Controllers::DateTime& dateTimeController, Controllers::DateTime& dateTimeController,
Controllers::Battery& batteryController, Controllers::Battery& batteryController,
Controllers::Ble& bleController, Controllers::Ble& bleController,
@ -293,12 +300,12 @@ PineTimeStyle::PineTimeStyle(DisplayApp* app,
Refresh(); Refresh();
} }
PineTimeStyle::~PineTimeStyle() { WatchFacePineTimeStyle::~WatchFacePineTimeStyle() {
lv_task_del(taskRefresh); lv_task_del(taskRefresh);
lv_obj_clean(lv_scr_act()); lv_obj_clean(lv_scr_act());
} }
bool PineTimeStyle::OnTouchEvent(Pinetime::Applications::TouchEvents event) { bool WatchFacePineTimeStyle::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
if ((event == Pinetime::Applications::TouchEvents::LongTap) && lv_obj_get_hidden(btnRandom)) { if ((event == Pinetime::Applications::TouchEvents::LongTap) && lv_obj_get_hidden(btnRandom)) {
lv_obj_set_hidden(btnSet, false); lv_obj_set_hidden(btnSet, false);
savedTick = lv_tick_get(); savedTick = lv_tick_get();
@ -310,7 +317,7 @@ bool PineTimeStyle::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
return false; return false;
} }
void PineTimeStyle::CloseMenu() { void WatchFacePineTimeStyle::CloseMenu() {
settingsController.SaveSettings(); settingsController.SaveSettings();
lv_obj_set_hidden(btnNextTime, true); lv_obj_set_hidden(btnNextTime, true);
lv_obj_set_hidden(btnPrevTime, true); lv_obj_set_hidden(btnPrevTime, true);
@ -323,7 +330,7 @@ void PineTimeStyle::CloseMenu() {
lv_obj_set_hidden(btnClose, true); lv_obj_set_hidden(btnClose, true);
} }
bool PineTimeStyle::OnButtonPushed() { bool WatchFacePineTimeStyle::OnButtonPushed() {
if (!lv_obj_get_hidden(btnClose)) { if (!lv_obj_get_hidden(btnClose)) {
CloseMenu(); CloseMenu();
return true; return true;
@ -331,12 +338,12 @@ bool PineTimeStyle::OnButtonPushed() {
return false; return false;
} }
void PineTimeStyle::SetBatteryIcon() { void WatchFacePineTimeStyle::SetBatteryIcon() {
auto batteryPercent = batteryPercentRemaining.Get(); auto batteryPercent = batteryPercentRemaining.Get();
lv_label_set_text_static(batteryIcon, BatteryIcon::GetBatteryIcon(batteryPercent)); lv_label_set_text_static(batteryIcon, BatteryIcon::GetBatteryIcon(batteryPercent));
} }
void PineTimeStyle::AlignIcons() { void WatchFacePineTimeStyle::AlignIcons() {
if (notificationState.Get() && bleState.Get()) { if (notificationState.Get() && bleState.Get()) {
lv_obj_align(bleIcon, sidebar, LV_ALIGN_IN_TOP_MID, 8, 25); lv_obj_align(bleIcon, sidebar, LV_ALIGN_IN_TOP_MID, 8, 25);
lv_obj_align(notificationIcon, sidebar, LV_ALIGN_IN_TOP_MID, -8, 25); lv_obj_align(notificationIcon, sidebar, LV_ALIGN_IN_TOP_MID, -8, 25);
@ -347,7 +354,7 @@ void PineTimeStyle::AlignIcons() {
} }
} }
void PineTimeStyle::Refresh() { void WatchFacePineTimeStyle::Refresh() {
isCharging = batteryController.IsCharging(); isCharging = batteryController.IsCharging();
if (isCharging.IsUpdated()) { if (isCharging.IsUpdated()) {
if (isCharging.Get()) { if (isCharging.Get()) {
@ -364,7 +371,8 @@ void PineTimeStyle::Refresh() {
} }
bleState = bleController.IsConnected(); bleState = bleController.IsConnected();
if (bleState.IsUpdated()) { bleRadioEnabled = bleController.IsRadioEnabled();
if (bleState.IsUpdated() || bleRadioEnabled.IsUpdated()) {
lv_label_set_text_static(bleIcon, BleIcon::GetIcon(bleState.Get())); lv_label_set_text_static(bleIcon, BleIcon::GetIcon(bleState.Get()));
AlignIcons(); AlignIcons();
} }
@ -416,10 +424,10 @@ void PineTimeStyle::Refresh() {
} }
if ((year != currentYear) || (month != currentMonth) || (dayOfWeek != currentDayOfWeek) || (day != currentDay)) { if ((year != currentYear) || (month != currentMonth) || (dayOfWeek != currentDayOfWeek) || (day != currentDay)) {
lv_label_set_text_fmt(dateDayOfWeek, "%s", dateTimeController.DayOfWeekShortToString()); lv_label_set_text_static(dateDayOfWeek, dateTimeController.DayOfWeekShortToString());
lv_label_set_text_fmt(dateDay, "%d", day); lv_label_set_text_fmt(dateDay, "%d", day);
lv_obj_realign(dateDay); lv_obj_realign(dateDay);
lv_label_set_text_fmt(dateMonth, "%s", dateTimeController.MonthShortToString()); lv_label_set_text_static(dateMonth, dateTimeController.MonthShortToString());
currentYear = year; currentYear = year;
currentMonth = month; currentMonth = month;
@ -446,7 +454,7 @@ void PineTimeStyle::Refresh() {
} }
} }
void PineTimeStyle::UpdateSelected(lv_obj_t* object, lv_event_t event) { void WatchFacePineTimeStyle::UpdateSelected(lv_obj_t* object, lv_event_t event) {
auto valueTime = settingsController.GetPTSColorTime(); auto valueTime = settingsController.GetPTSColorTime();
auto valueBar = settingsController.GetPTSColorBar(); auto valueBar = settingsController.GetPTSColorBar();
auto valueBG = settingsController.GetPTSColorBG(); auto valueBG = settingsController.GetPTSColorBG();
@ -567,7 +575,7 @@ void PineTimeStyle::UpdateSelected(lv_obj_t* object, lv_event_t event) {
} }
} }
Pinetime::Controllers::Settings::Colors PineTimeStyle::GetNext(Pinetime::Controllers::Settings::Colors color) { Pinetime::Controllers::Settings::Colors WatchFacePineTimeStyle::GetNext(Pinetime::Controllers::Settings::Colors color) {
auto colorAsInt = static_cast<uint8_t>(color); auto colorAsInt = static_cast<uint8_t>(color);
Pinetime::Controllers::Settings::Colors nextColor; Pinetime::Controllers::Settings::Colors nextColor;
if (colorAsInt < 16) { if (colorAsInt < 16) {
@ -578,7 +586,7 @@ Pinetime::Controllers::Settings::Colors PineTimeStyle::GetNext(Pinetime::Control
return nextColor; return nextColor;
} }
Pinetime::Controllers::Settings::Colors PineTimeStyle::GetPrevious(Pinetime::Controllers::Settings::Colors color) { Pinetime::Controllers::Settings::Colors WatchFacePineTimeStyle::GetPrevious(Pinetime::Controllers::Settings::Colors color) {
auto colorAsInt = static_cast<uint8_t>(color); auto colorAsInt = static_cast<uint8_t>(color);
Pinetime::Controllers::Settings::Colors prevColor; Pinetime::Controllers::Settings::Colors prevColor;

View File

@ -7,6 +7,7 @@
#include "displayapp/screens/Screen.h" #include "displayapp/screens/Screen.h"
#include "displayapp/Colors.h" #include "displayapp/Colors.h"
#include "components/datetime/DateTimeController.h" #include "components/datetime/DateTimeController.h"
#include "components/ble/BleController.h"
namespace Pinetime { namespace Pinetime {
namespace Controllers { namespace Controllers {
@ -20,16 +21,16 @@ namespace Pinetime {
namespace Applications { namespace Applications {
namespace Screens { namespace Screens {
class PineTimeStyle : public Screen { class WatchFacePineTimeStyle : public Screen {
public: public:
PineTimeStyle(DisplayApp* app, WatchFacePineTimeStyle(DisplayApp* app,
Controllers::DateTime& dateTimeController, Controllers::DateTime& dateTimeController,
Controllers::Battery& batteryController, Controllers::Battery& batteryController,
Controllers::Ble& bleController, Controllers::Ble& bleController,
Controllers::NotificationManager& notificatioManager, Controllers::NotificationManager& notificatioManager,
Controllers::Settings& settingsController, Controllers::Settings& settingsController,
Controllers::MotionController& motionController); Controllers::MotionController& motionController);
~PineTimeStyle() override; ~WatchFacePineTimeStyle() override;
bool OnTouchEvent(TouchEvents event) override; bool OnTouchEvent(TouchEvents event) override;
bool OnButtonPushed() override; bool OnButtonPushed() override;
@ -43,14 +44,15 @@ namespace Pinetime {
uint8_t displayedMinute = -1; uint8_t displayedMinute = -1;
uint16_t currentYear = 1970; uint16_t currentYear = 1970;
Pinetime::Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown; Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown;
Pinetime::Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown; Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown;
uint8_t currentDay = 0; uint8_t currentDay = 0;
uint32_t savedTick = 0; uint32_t savedTick = 0;
DirtyValue<uint8_t> batteryPercentRemaining {}; DirtyValue<uint8_t> batteryPercentRemaining {};
DirtyValue<bool> isCharging {}; DirtyValue<bool> isCharging {};
DirtyValue<bool> bleState {}; DirtyValue<bool> bleState {};
DirtyValue<bool> bleRadioEnabled {};
DirtyValue<std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds>> currentDateTime {}; DirtyValue<std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds>> currentDateTime {};
DirtyValue<bool> motionSensorOk {}; DirtyValue<bool> motionSensorOk {};
DirtyValue<uint32_t> stepCount {}; DirtyValue<uint32_t> stepCount {};

View File

@ -0,0 +1,183 @@
#include <date/date.h>
#include <lvgl/lvgl.h>
#include "displayapp/screens/WatchFaceTerminal.h"
#include "displayapp/screens/BatteryIcon.h"
#include "displayapp/screens/NotificationIcon.h"
#include "displayapp/screens/Symbols.h"
#include "components/battery/BatteryController.h"
#include "components/ble/BleController.h"
#include "components/ble/NotificationManager.h"
#include "components/heartrate/HeartRateController.h"
#include "components/motion/MotionController.h"
#include "components/settings/Settings.h"
using namespace Pinetime::Applications::Screens;
WatchFaceTerminal::WatchFaceTerminal(DisplayApp* app,
Controllers::DateTime& dateTimeController,
Controllers::Battery& batteryController,
Controllers::Ble& bleController,
Controllers::NotificationManager& notificatioManager,
Controllers::Settings& settingsController,
Controllers::HeartRateController& heartRateController,
Controllers::MotionController& motionController)
: Screen(app),
currentDateTime {{}},
dateTimeController {dateTimeController},
batteryController {batteryController},
bleController {bleController},
notificatioManager {notificatioManager},
settingsController {settingsController},
heartRateController {heartRateController},
motionController {motionController} {
settingsController.SetClockFace(3);
batteryValue = lv_label_create(lv_scr_act(), nullptr);
lv_label_set_recolor(batteryValue, true);
lv_obj_align(batteryValue, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, -20);
connectState = lv_label_create(lv_scr_act(), nullptr);
lv_label_set_recolor(connectState, true);
lv_obj_align(connectState, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, 40);
notificationIcon = lv_label_create(lv_scr_act(), nullptr);
lv_obj_align(notificationIcon, nullptr, LV_ALIGN_IN_LEFT_MID, 0, -100);
label_date = lv_label_create(lv_scr_act(), nullptr);
lv_label_set_recolor(label_date, true);
lv_obj_align(label_date, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, -40);
label_prompt_1 = lv_label_create(lv_scr_act(), nullptr);
lv_obj_align(label_prompt_1, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, -80);
lv_label_set_text_static(label_prompt_1, "user@watch:~ $ now");
label_prompt_2 = lv_label_create(lv_scr_act(), nullptr);
lv_obj_align(label_prompt_2, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, 60);
lv_label_set_text_static(label_prompt_2, "user@watch:~ $");
label_time = lv_label_create(lv_scr_act(), nullptr);
lv_label_set_recolor(label_time, true);
lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, -60);
backgroundLabel = lv_label_create(lv_scr_act(), nullptr);
lv_obj_set_click(backgroundLabel, true);
lv_label_set_long_mode(backgroundLabel, LV_LABEL_LONG_CROP);
lv_obj_set_size(backgroundLabel, 240, 240);
lv_obj_set_pos(backgroundLabel, 0, 0);
lv_label_set_text_static(backgroundLabel, "");
heartbeatValue = lv_label_create(lv_scr_act(), nullptr);
lv_label_set_recolor(heartbeatValue, true);
lv_obj_align(heartbeatValue, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, 20);
stepValue = lv_label_create(lv_scr_act(), nullptr);
lv_label_set_recolor(stepValue, true);
lv_obj_align(stepValue, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 0, 0);
taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this);
Refresh();
}
WatchFaceTerminal::~WatchFaceTerminal() {
lv_task_del(taskRefresh);
lv_obj_clean(lv_scr_act());
}
void WatchFaceTerminal::Refresh() {
powerPresent = batteryController.IsPowerPresent();
batteryPercentRemaining = batteryController.PercentRemaining();
if (batteryPercentRemaining.IsUpdated() || powerPresent.IsUpdated()) {
lv_label_set_text_fmt(batteryValue, "[BATT]#387b54 %d%%", batteryPercentRemaining.Get());
if (batteryController.IsPowerPresent()) {
lv_label_ins_text(batteryValue, LV_LABEL_POS_LAST, " Charging");
}
}
bleState = bleController.IsConnected();
bleRadioEnabled = bleController.IsRadioEnabled();
if (bleState.IsUpdated() || bleRadioEnabled.IsUpdated()) {
if(!bleRadioEnabled.Get()) {
lv_label_set_text_static(connectState, "[STAT]#0082fc Disabled#");
} else {
if (bleState.Get()) {
lv_label_set_text_static(connectState, "[STAT]#0082fc Connected#");
} else {
lv_label_set_text_static(connectState, "[STAT]#0082fc Disconnected#");
}
}
}
notificationState = notificatioManager.AreNewNotificationsAvailable();
if (notificationState.IsUpdated()) {
if (notificationState.Get()) {
lv_label_set_text_static(notificationIcon, "You have mail.");
} else {
lv_label_set_text_static(notificationIcon, "");
}
}
currentDateTime = dateTimeController.CurrentDateTime();
if (currentDateTime.IsUpdated()) {
auto newDateTime = currentDateTime.Get();
auto dp = date::floor<date::days>(newDateTime);
auto time = date::make_time(newDateTime - dp);
auto yearMonthDay = date::year_month_day(dp);
auto year = static_cast<int>(yearMonthDay.year());
auto month = static_cast<Pinetime::Controllers::DateTime::Months>(static_cast<unsigned>(yearMonthDay.month()));
auto day = static_cast<unsigned>(yearMonthDay.day());
auto dayOfWeek = static_cast<Pinetime::Controllers::DateTime::Days>(date::weekday(yearMonthDay).iso_encoding());
uint8_t hour = time.hours().count();
uint8_t minute = time.minutes().count();
uint8_t second = time.seconds().count();
if (displayedHour != hour || displayedMinute != minute || displayedSecond != second) {
displayedHour = hour;
displayedMinute = minute;
displayedSecond = second;
if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) {
char ampmChar[3] = "AM";
if (hour == 0) {
hour = 12;
} else if (hour == 12) {
ampmChar[0] = 'P';
} else if (hour > 12) {
hour = hour - 12;
ampmChar[0] = 'P';
}
lv_label_set_text_fmt(label_time, "[TIME]#11cc55 %02d:%02d:%02d %s#", hour, minute, second, ampmChar);
} else {
lv_label_set_text_fmt(label_time, "[TIME]#11cc55 %02d:%02d:%02d", hour, minute, second);
}
}
if ((year != currentYear) || (month != currentMonth) || (dayOfWeek != currentDayOfWeek) || (day != currentDay)) {
lv_label_set_text_fmt(label_date, "[DATE]#007fff %04d.%02d.%02d#", short(year), char(month), char(day));
currentYear = year;
currentMonth = month;
currentDayOfWeek = dayOfWeek;
currentDay = day;
}
}
heartbeat = heartRateController.HeartRate();
heartbeatRunning = heartRateController.State() != Controllers::HeartRateController::States::Stopped;
if (heartbeat.IsUpdated() || heartbeatRunning.IsUpdated()) {
if (heartbeatRunning.Get()) {
lv_label_set_text_fmt(heartbeatValue, "[L_HR]#ee3311 %d bpm#", heartbeat.Get());
} else {
lv_label_set_text_static(heartbeatValue, "[L_HR]#ee3311 ---#");
}
}
stepCount = motionController.NbSteps();
motionSensorOk = motionController.IsSensorOk();
if (stepCount.IsUpdated() || motionSensorOk.IsUpdated()) {
lv_label_set_text_fmt(stepValue, "[STEP]#ee3377 %lu steps#", stepCount.Get());
}
}

View File

@ -0,0 +1,81 @@
#pragma once
#include <lvgl/src/lv_core/lv_obj.h>
#include <chrono>
#include <cstdint>
#include <memory>
#include "displayapp/screens/Screen.h"
#include "components/datetime/DateTimeController.h"
namespace Pinetime {
namespace Controllers {
class Settings;
class Battery;
class Ble;
class NotificationManager;
class HeartRateController;
class MotionController;
}
namespace Applications {
namespace Screens {
class WatchFaceTerminal : public Screen {
public:
WatchFaceTerminal(DisplayApp* app,
Controllers::DateTime& dateTimeController,
Controllers::Battery& batteryController,
Controllers::Ble& bleController,
Controllers::NotificationManager& notificatioManager,
Controllers::Settings& settingsController,
Controllers::HeartRateController& heartRateController,
Controllers::MotionController& motionController);
~WatchFaceTerminal() override;
void Refresh() override;
private:
uint8_t displayedHour = -1;
uint8_t displayedMinute = -1;
uint8_t displayedSecond = -1;
uint16_t currentYear = 1970;
Pinetime::Controllers::DateTime::Months currentMonth = Pinetime::Controllers::DateTime::Months::Unknown;
Pinetime::Controllers::DateTime::Days currentDayOfWeek = Pinetime::Controllers::DateTime::Days::Unknown;
uint8_t currentDay = 0;
DirtyValue<int> batteryPercentRemaining {};
DirtyValue<bool> powerPresent {};
DirtyValue<bool> bleState {};
DirtyValue<bool> bleRadioEnabled {};
DirtyValue<std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds>> currentDateTime {};
DirtyValue<bool> motionSensorOk {};
DirtyValue<uint32_t> stepCount {};
DirtyValue<uint8_t> heartbeat {};
DirtyValue<bool> heartbeatRunning {};
DirtyValue<bool> notificationState {};
lv_obj_t* label_time;
lv_obj_t* label_date;
lv_obj_t* label_prompt_1;
lv_obj_t* label_prompt_2;
lv_obj_t* backgroundLabel;
lv_obj_t* batteryValue;
lv_obj_t* heartbeatValue;
lv_obj_t* stepValue;
lv_obj_t* notificationIcon;
lv_obj_t* connectState;
Controllers::DateTime& dateTimeController;
Controllers::Battery& batteryController;
Controllers::Ble& bleController;
Controllers::NotificationManager& notificatioManager;
Controllers::Settings& settingsController;
Controllers::HeartRateController& heartRateController;
Controllers::MotionController& motionController;
lv_task_t* taskRefresh;
};
}
}
}

View File

@ -40,7 +40,7 @@ QuickSettings::QuickSettings(Pinetime::Applications::DisplayApp* app,
lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_IN_TOP_LEFT, 0, 0); lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_IN_TOP_LEFT, 0, 0);
batteryIcon = lv_label_create(lv_scr_act(), nullptr); batteryIcon = lv_label_create(lv_scr_act(), nullptr);
lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryController.PercentRemaining())); lv_label_set_text_static(batteryIcon, BatteryIcon::GetBatteryIcon(batteryController.PercentRemaining()));
lv_obj_align(batteryIcon, nullptr, LV_ALIGN_IN_TOP_RIGHT, 0, 0); lv_obj_align(batteryIcon, nullptr, LV_ALIGN_IN_TOP_RIGHT, 0, 0);
static constexpr uint8_t barHeight = 20 + innerDistance; static constexpr uint8_t barHeight = 20 + innerDistance;
@ -124,7 +124,7 @@ QuickSettings::~QuickSettings() {
void QuickSettings::UpdateScreen() { void QuickSettings::UpdateScreen() {
lv_label_set_text(label_time, dateTimeController.FormattedTime().c_str()); lv_label_set_text(label_time, dateTimeController.FormattedTime().c_str());
lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryController.PercentRemaining())); lv_label_set_text_static(batteryIcon, BatteryIcon::GetBatteryIcon(batteryController.PercentRemaining()));
} }
void QuickSettings::OnButtonEvent(lv_obj_t* object, lv_event_t event) { void QuickSettings::OnButtonEvent(lv_obj_t* object, lv_event_t event) {

View File

@ -0,0 +1,93 @@
#include "displayapp/screens/settings/SettingBluetooth.h"
#include <lvgl/lvgl.h>
#include "displayapp/DisplayApp.h"
#include "displayapp/Messages.h"
#include "displayapp/screens/Styles.h"
#include "displayapp/screens/Screen.h"
#include "displayapp/screens/Symbols.h"
using namespace Pinetime::Applications::Screens;
namespace {
static void OnBluetoothDisabledEvent(lv_obj_t* obj, lv_event_t event) {
auto* screen = static_cast<SettingBluetooth*>(obj->user_data);
screen->OnBluetoothDisabled(obj, event);
}
static void OnBluetoothEnabledEvent(lv_obj_t* obj, lv_event_t event) {
auto* screen = static_cast<SettingBluetooth*>(obj->user_data);
screen->OnBluetoothEnabled(obj, event);
}
}
SettingBluetooth::SettingBluetooth(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController)
: Screen(app), settingsController {settingsController} {
lv_obj_t* container1 = lv_cont_create(lv_scr_act(), nullptr);
lv_obj_set_style_local_bg_opa(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_TRANSP);
lv_obj_set_style_local_pad_all(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 10);
lv_obj_set_style_local_pad_inner(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 5);
lv_obj_set_style_local_border_width(container1, LV_CONT_PART_MAIN, LV_STATE_DEFAULT, 0);
lv_obj_set_pos(container1, 10, 60);
lv_obj_set_width(container1, LV_HOR_RES - 20);
lv_obj_set_height(container1, LV_VER_RES - 50);
lv_cont_set_layout(container1, LV_LAYOUT_COLUMN_LEFT);
lv_obj_t* title = lv_label_create(lv_scr_act(), nullptr);
lv_label_set_text_static(title, "Bluetooth");
lv_label_set_align(title, LV_LABEL_ALIGN_CENTER);
lv_obj_align(title, lv_scr_act(), LV_ALIGN_IN_TOP_MID, 15, 15);
lv_obj_t* icon = lv_label_create(lv_scr_act(), nullptr);
lv_obj_set_style_local_text_color(icon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_ORANGE);
lv_label_set_text_static(icon, Symbols::bluetooth);
lv_label_set_align(icon, LV_LABEL_ALIGN_CENTER);
lv_obj_align(icon, title, LV_ALIGN_OUT_LEFT_MID, -10, 0);
cbEnabled = lv_checkbox_create(container1, nullptr);
lv_checkbox_set_text(cbEnabled, " Enabled");
cbEnabled->user_data = this;
lv_obj_set_event_cb(cbEnabled, OnBluetoothEnabledEvent);
SetRadioButtonStyle(cbEnabled);
cbDisabled = lv_checkbox_create(container1, nullptr);
lv_checkbox_set_text(cbDisabled, " Disabled");
cbDisabled->user_data = this;
lv_obj_set_event_cb(cbDisabled, OnBluetoothDisabledEvent);
SetRadioButtonStyle(cbDisabled);
if (settingsController.GetBleRadioEnabled()) {
lv_checkbox_set_checked(cbEnabled, true);
priorMode = true;
} else {
lv_checkbox_set_checked(cbDisabled, true);
priorMode = false;
}
}
SettingBluetooth::~SettingBluetooth() {
lv_obj_clean(lv_scr_act());
// Do not call SaveSettings - see src/components/settings/Settings.h
if (priorMode != settingsController.GetBleRadioEnabled()) {
app->PushMessage(Pinetime::Applications::Display::Messages::BleRadioEnableToggle);
}
}
void SettingBluetooth::OnBluetoothDisabled(lv_obj_t* object, lv_event_t event) {
if (event == LV_EVENT_VALUE_CHANGED) {
lv_checkbox_set_checked(cbEnabled, false);
lv_checkbox_set_checked(cbDisabled, true);
settingsController.SetBleRadioEnabled(false);
}
}
void SettingBluetooth::OnBluetoothEnabled(lv_obj_t* object, lv_event_t event) {
if (event == LV_EVENT_VALUE_CHANGED) {
lv_checkbox_set_checked(cbEnabled, true);
lv_checkbox_set_checked(cbDisabled, false);
settingsController.SetBleRadioEnabled(true);
}
}

View File

@ -0,0 +1,31 @@
#pragma once
#include <array>
#include <cstdint>
#include <lvgl/lvgl.h>
#include "components/settings/Settings.h"
#include "displayapp/screens/Screen.h"
namespace Pinetime {
namespace Applications {
namespace Screens {
class SettingBluetooth : public Screen {
public:
SettingBluetooth(DisplayApp* app, Pinetime::Controllers::Settings& settingsController);
~SettingBluetooth() override;
void OnBluetoothEnabled(lv_obj_t* object, lv_event_t event);
void OnBluetoothDisabled(lv_obj_t* object, lv_event_t event);
private:
Controllers::Settings& settingsController;
lv_obj_t* cbEnabled;
lv_obj_t* cbDisabled;
bool priorMode;
};
}
}
}

View File

@ -20,7 +20,7 @@ namespace Pinetime {
private: private:
Controllers::Settings& settingsController; Controllers::Settings& settingsController;
uint8_t optionsTotal; uint8_t optionsTotal;
lv_obj_t* cbOption[2]; lv_obj_t* cbOption[3];
}; };
} }
} }

View File

@ -1,4 +1,4 @@
#include "SettingShakeThreshold.h" #include "displayapp/screens/settings/SettingShakeThreshold.h"
#include <lvgl/lvgl.h> #include <lvgl/lvgl.h>
#include "displayapp/DisplayApp.h" #include "displayapp/DisplayApp.h"
#include "displayapp/screens/Screen.h" #include "displayapp/screens/Screen.h"
@ -57,7 +57,7 @@ SettingShakeThreshold::SettingShakeThreshold(DisplayApp* app,
lv_obj_align(calButton, lv_scr_act(), LV_ALIGN_IN_BOTTOM_MID, 0, 0); lv_obj_align(calButton, lv_scr_act(), LV_ALIGN_IN_BOTTOM_MID, 0, 0);
lv_btn_set_checkable(calButton, true); lv_btn_set_checkable(calButton, true);
calLabel = lv_label_create(calButton, NULL); calLabel = lv_label_create(calButton, NULL);
lv_label_set_text(calLabel, "Calibrate"); lv_label_set_text_static(calLabel, "Calibrate");
lv_arc_set_value(positionArc, settingsController.GetShakeThreshold()); lv_arc_set_value(positionArc, settingsController.GetShakeThreshold());
@ -91,7 +91,7 @@ void SettingShakeThreshold::Refresh() {
calibrating = 2; calibrating = 2;
lv_obj_set_style_local_bg_color(calButton, LV_BTN_PART_MAIN, LV_STATE_CHECKED, LV_COLOR_RED); lv_obj_set_style_local_bg_color(calButton, LV_BTN_PART_MAIN, LV_STATE_CHECKED, LV_COLOR_RED);
lv_obj_set_style_local_bg_color(calButton, LV_BTN_PART_MAIN, LV_STATE_CHECKED, LV_COLOR_RED); lv_obj_set_style_local_bg_color(calButton, LV_BTN_PART_MAIN, LV_STATE_CHECKED, LV_COLOR_RED);
lv_label_set_text(calLabel, "Shake!!"); lv_label_set_text_static(calLabel, "Shake!");
} }
} }
if (calibrating == 2) { if (calibrating == 2) {
@ -121,14 +121,14 @@ void SettingShakeThreshold::UpdateSelected(lv_obj_t* object, lv_event_t event) {
lv_arc_set_value(positionArc, 0); lv_arc_set_value(positionArc, 0);
calibrating = 1; calibrating = 1;
vCalTime = xTaskGetTickCount(); vCalTime = xTaskGetTickCount();
lv_label_set_text(calLabel, "Ready!"); lv_label_set_text_static(calLabel, "Ready!");
lv_obj_set_click(positionArc, false); lv_obj_set_click(positionArc, false);
lv_obj_set_style_local_bg_color(calButton, LV_BTN_PART_MAIN, LV_STATE_CHECKED, LV_COLOR_GREEN); lv_obj_set_style_local_bg_color(calButton, LV_BTN_PART_MAIN, LV_STATE_CHECKED, LV_COLOR_GREEN);
lv_obj_set_style_local_bg_color(calButton, LV_BTN_PART_MAIN, LV_STATE_CHECKED, LV_COLOR_GREEN); lv_obj_set_style_local_bg_color(calButton, LV_BTN_PART_MAIN, LV_STATE_CHECKED, LV_COLOR_GREEN);
} else if (lv_btn_get_state(calButton) == LV_BTN_STATE_RELEASED) { } else if (lv_btn_get_state(calButton) == LV_BTN_STATE_RELEASED) {
calibrating = 0; calibrating = 0;
lv_obj_set_click(positionArc, true); lv_obj_set_click(positionArc, true);
lv_label_set_text(calLabel, "Calibrate"); lv_label_set_text_static(calLabel, "Calibrate");
} }
break; break;
} }

View File

@ -5,6 +5,7 @@
#include "components/settings/Settings.h" #include "components/settings/Settings.h"
#include "displayapp/screens/Screen.h" #include "displayapp/screens/Screen.h"
#include <components/motion/MotionController.h> #include <components/motion/MotionController.h>
#include "systemtask/SystemTask.h"
namespace Pinetime { namespace Pinetime {
namespace Applications { namespace Applications {

View File

@ -14,7 +14,7 @@ namespace {
} }
} }
constexpr std::array<const char*, 3> SettingWatchFace::options; constexpr std::array<const char*, 4> SettingWatchFace::options;
SettingWatchFace::SettingWatchFace(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController) SettingWatchFace::SettingWatchFace(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController)
: Screen(app), settingsController {settingsController} { : Screen(app), settingsController {settingsController} {

View File

@ -20,7 +20,7 @@ namespace Pinetime {
void UpdateSelected(lv_obj_t* object, lv_event_t event); void UpdateSelected(lv_obj_t* object, lv_event_t event);
private: private:
static constexpr std::array<const char*, 3> options = {" Digital face", " Analog face", " PineTimeStyle"}; static constexpr std::array<const char*, 4> options = {" Digital face", " Analog face", " PineTimeStyle", " Terminal"};
Controllers::Settings& settingsController; Controllers::Settings& settingsController;
lv_obj_t* cbOption[options.size()]; lv_obj_t* cbOption[options.size()];

View File

@ -21,7 +21,11 @@ Settings::Settings(Pinetime::Applications::DisplayApp* app, Pinetime::Controller
}, },
[this]() -> std::unique_ptr<Screen> { [this]() -> std::unique_ptr<Screen> {
return CreateScreen3(); return CreateScreen3();
}}, },
[this]() -> std::unique_ptr<Screen> {
return CreateScreen4();
},
},
Screens::ScreenListModes::UpDown} { Screens::ScreenListModes::UpDown} {
} }
@ -34,7 +38,6 @@ bool Settings::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
} }
std::unique_ptr<Screen> Settings::CreateScreen1() { std::unique_ptr<Screen> Settings::CreateScreen1() {
std::array<Screens::List::Applications, 4> applications {{ std::array<Screens::List::Applications, 4> applications {{
{Symbols::sun, "Display", Apps::SettingDisplay}, {Symbols::sun, "Display", Apps::SettingDisplay},
{Symbols::eye, "Wake Up", Apps::SettingWakeUp}, {Symbols::eye, "Wake Up", Apps::SettingWakeUp},
@ -42,17 +45,17 @@ std::unique_ptr<Screen> Settings::CreateScreen1() {
{Symbols::home, "Watch face", Apps::SettingWatchFace}, {Symbols::home, "Watch face", Apps::SettingWatchFace},
}}; }};
return std::make_unique<Screens::List>(0, 3, app, settingsController, applications); return std::make_unique<Screens::List>(0, 4, app, settingsController, applications);
} }
std::unique_ptr<Screen> Settings::CreateScreen2() { std::unique_ptr<Screen> Settings::CreateScreen2() {
std::array<Screens::List::Applications, 4> applications {{
std::array<Screens::List::Applications, 4> applications {{{Symbols::shoe, "Steps", Apps::SettingSteps}, {Symbols::shoe, "Steps", Apps::SettingSteps},
{Symbols::clock, "Set date", Apps::SettingSetDate}, {Symbols::clock, "Set date", Apps::SettingSetDate},
{Symbols::clock, "Set time", Apps::SettingSetTime}, {Symbols::clock, "Set time", Apps::SettingSetTime},
{Symbols::batteryHalf, "Battery", Apps::BatteryInfo}}}; {Symbols::batteryHalf, "Battery", Apps::BatteryInfo}}};
return std::make_unique<Screens::List>(1, 3, app, settingsController, applications); return std::make_unique<Screens::List>(1, 4, app, settingsController, applications);
} }
std::unique_ptr<Screen> Settings::CreateScreen3() { std::unique_ptr<Screen> Settings::CreateScreen3() {
@ -61,8 +64,20 @@ std::unique_ptr<Screen> Settings::CreateScreen3() {
{Symbols::clock, "Chimes", Apps::SettingChimes}, {Symbols::clock, "Chimes", Apps::SettingChimes},
{Symbols::tachometer, "Shake Calib.", Apps::SettingShakeThreshold}, {Symbols::tachometer, "Shake Calib.", Apps::SettingShakeThreshold},
{Symbols::check, "Firmware", Apps::FirmwareValidation}, {Symbols::check, "Firmware", Apps::FirmwareValidation},
{Symbols::list, "About", Apps::SysInfo} {Symbols::bluetooth, "Bluetooth", Apps::SettingBluetooth}
}}; }};
return std::make_unique<Screens::List>(2, 3, app, settingsController, applications); return std::make_unique<Screens::List>(2, 4, app, settingsController, applications);
}
std::unique_ptr<Screen> Settings::CreateScreen4() {
std::array<Screens::List::Applications, 4> applications {{
{Symbols::list, "About", Apps::SysInfo},
{Symbols::none, "None", Apps::None},
{Symbols::none, "None", Apps::None},
{Symbols::none, "None", Apps::None}
}};
return std::make_unique<Screens::List>(3, 4, app, settingsController, applications);
} }

View File

@ -19,11 +19,12 @@ namespace Pinetime {
private: private:
Controllers::Settings& settingsController; Controllers::Settings& settingsController;
ScreenList<3> screens; ScreenList<4> screens;
std::unique_ptr<Screen> CreateScreen1(); std::unique_ptr<Screen> CreateScreen1();
std::unique_ptr<Screen> CreateScreen2(); std::unique_ptr<Screen> CreateScreen2();
std::unique_ptr<Screen> CreateScreen3(); std::unique_ptr<Screen> CreateScreen3();
std::unique_ptr<Screen> CreateScreen4();
}; };
} }
} }

View File

@ -38,7 +38,7 @@ nimble_port_freertos_init(TaskFunction_t host_task_fn)
* since it has compatible prototype. * since it has compatible prototype.
*/ */
xTaskCreate(nimble_port_ll_task_func, "ll", configMINIMAL_STACK_SIZE + 200, xTaskCreate(nimble_port_ll_task_func, "ll", configMINIMAL_STACK_SIZE + 200,
NULL, configMAX_PRIORITIES - 1, &ll_task_h); NULL, 2, &ll_task_h);
#endif #endif
/* /*
@ -47,5 +47,5 @@ nimble_port_freertos_init(TaskFunction_t host_task_fn)
* default queue it is just easier to make separate task which does this. * default queue it is just easier to make separate task which does this.
*/ */
xTaskCreate(host_task_fn, "ble", configMINIMAL_STACK_SIZE + 600, xTaskCreate(host_task_fn, "ble", configMINIMAL_STACK_SIZE + 600,
NULL, tskIDLE_PRIORITY + 1, &host_task_h); NULL, 1, &host_task_h);
} }

View File

@ -33,6 +33,7 @@
#include "components/battery/BatteryController.h" #include "components/battery/BatteryController.h"
#include "components/ble/BleController.h" #include "components/ble/BleController.h"
#include "components/ble/NotificationManager.h" #include "components/ble/NotificationManager.h"
#include "components/brightness/BrightnessController.h"
#include "components/motor/MotorController.h" #include "components/motor/MotorController.h"
#include "components/datetime/DateTimeController.h" #include "components/datetime/DateTimeController.h"
#include "components/heartrate/HeartRateController.h" #include "components/heartrate/HeartRateController.h"
@ -114,6 +115,7 @@ Pinetime::Controllers::TimerController timerController;
Pinetime::Controllers::AlarmController alarmController {dateTimeController}; Pinetime::Controllers::AlarmController alarmController {dateTimeController};
Pinetime::Controllers::TouchHandler touchHandler(touchPanel, lvgl); Pinetime::Controllers::TouchHandler touchHandler(touchPanel, lvgl);
Pinetime::Controllers::ButtonHandler buttonHandler; Pinetime::Controllers::ButtonHandler buttonHandler;
Pinetime::Controllers::BrightnessController brightnessController {};
Pinetime::Applications::DisplayApp displayApp(lcd, Pinetime::Applications::DisplayApp displayApp(lcd,
lvgl, lvgl,
@ -129,6 +131,7 @@ Pinetime::Applications::DisplayApp displayApp(lcd,
motionController, motionController,
timerController, timerController,
alarmController, alarmController,
brightnessController,
touchHandler); touchHandler);
Pinetime::System::SystemTask systemTask(spi, Pinetime::System::SystemTask systemTask(spi,

View File

@ -31,6 +31,7 @@ namespace Pinetime {
BatteryPercentageUpdated, BatteryPercentageUpdated,
StartFileTransfer, StartFileTransfer,
StopFileTransfer, StopFileTransfer,
BleRadioEnableToggle
}; };
} }
} }

View File

@ -0,0 +1,26 @@
#include "systemtask/SystemTask.h"
#if configUSE_TRACE_FACILITY == 1
// FreeRtosMonitor
#include <FreeRTOS.h>
#include <task.h>
#include <nrf_log.h>
void Pinetime::System::SystemMonitor::Process() {
if (xTaskGetTickCount() - lastTick > 10000) {
NRF_LOG_INFO("---------------------------------------\nFree heap : %d", xPortGetFreeHeapSize());
TaskStatus_t tasksStatus[10];
auto nb = uxTaskGetSystemState(tasksStatus, 10, nullptr);
for (uint32_t i = 0; i < nb; i++) {
NRF_LOG_INFO("Task [%s] - %d", tasksStatus[i].pcTaskName, tasksStatus[i].usStackHighWaterMark);
if (tasksStatus[i].usStackHighWaterMark < 20)
NRF_LOG_INFO("WARNING!!! Task %s task is nearly full, only %dB available",
tasksStatus[i].pcTaskName,
tasksStatus[i].usStackHighWaterMark * 4);
}
lastTick = xTaskGetTickCount();
}
}
#else
// DummyMonitor
void Pinetime::System::SystemMonitor::Process() {}
#endif

View File

@ -1,44 +1,16 @@
#pragma once #pragma once
#include <FreeRTOS.h> #include <FreeRTOS.h> // declares configUSE_TRACE_FACILITY
#include <task.h> #include <task.h>
#include <nrf_log.h>
namespace Pinetime { namespace Pinetime {
namespace System { namespace System {
struct DummyMonitor {}; class SystemMonitor {
struct FreeRtosMonitor {};
template <class T> class SystemMonitor {
public: public:
SystemMonitor() = delete; void Process();
}; #if configUSE_TRACE_FACILITY == 1
template <> class SystemMonitor<DummyMonitor> {
public:
void Process() const {
}
};
template <> class SystemMonitor<FreeRtosMonitor> {
public:
void Process() const {
if (xTaskGetTickCount() - lastTick > 10000) {
NRF_LOG_INFO("---------------------------------------\nFree heap : %d", xPortGetFreeHeapSize());
auto nb = uxTaskGetSystemState(tasksStatus, 10, nullptr);
for (uint32_t i = 0; i < nb; i++) {
NRF_LOG_INFO("Task [%s] - %d", tasksStatus[i].pcTaskName, tasksStatus[i].usStackHighWaterMark);
if (tasksStatus[i].usStackHighWaterMark < 20)
NRF_LOG_INFO("WARNING!!! Task %s task is nearly full, only %dB available",
tasksStatus[i].pcTaskName,
tasksStatus[i].usStackHighWaterMark * 4);
}
lastTick = xTaskGetTickCount();
}
}
private: private:
mutable TickType_t lastTick = 0; mutable TickType_t lastTick = 0;
mutable TaskStatus_t tasksStatus[10]; #endif
}; };
} }
} }

View File

@ -1,19 +1,12 @@
#include "systemtask/SystemTask.h" #include "systemtask/SystemTask.h"
#define min // workaround: nimble's min/max macros conflict with libstdc++
#define max
#include <host/ble_gap.h>
#include <host/ble_gatt.h>
#include <host/ble_hs_adv.h>
#include <host/util/util.h>
#include <nimble/hci_common.h>
#undef max
#undef min
#include <hal/nrf_rtc.h> #include <hal/nrf_rtc.h>
#include <libraries/gpiote/app_gpiote.h> #include <libraries/gpiote/app_gpiote.h>
#include <libraries/log/nrf_log.h> #include <libraries/log/nrf_log.h>
#include "BootloaderVersion.h" #include "BootloaderVersion.h"
#include "components/battery/BatteryController.h"
#include "components/ble/BleController.h" #include "components/ble/BleController.h"
#include "displayapp/TouchEvents.h"
#include "drivers/Cst816s.h" #include "drivers/Cst816s.h"
#include "drivers/St7789.h" #include "drivers/St7789.h"
#include "drivers/InternalFlash.h" #include "drivers/InternalFlash.h"
@ -115,7 +108,7 @@ SystemTask::SystemTask(Drivers::SpiMaster& spi,
void SystemTask::Start() { void SystemTask::Start() {
systemTasksMsgQueue = xQueueCreate(10, 1); systemTasksMsgQueue = xQueueCreate(10, 1);
if (pdPASS != xTaskCreate(SystemTask::Process, "MAIN", 350, this, 0, &taskHandle)) { if (pdPASS != xTaskCreate(SystemTask::Process, "MAIN", 350, this, 1, &taskHandle)) {
APP_ERROR_HANDLER(NRF_ERROR_NO_MEM); APP_ERROR_HANDLER(NRF_ERROR_NO_MEM);
} }
} }
@ -262,7 +255,7 @@ void SystemTask::Work() {
displayApp.PushMessage(Pinetime::Applications::Display::Messages::GoToRunning); displayApp.PushMessage(Pinetime::Applications::Display::Messages::GoToRunning);
heartRateApp.PushMessage(Pinetime::Applications::HeartRateTask::Messages::WakeUp); heartRateApp.PushMessage(Pinetime::Applications::HeartRateTask::Messages::WakeUp);
if (!bleController.IsConnected()) { if (bleController.IsRadioEnabled() && !bleController.IsConnected()) {
nimbleController.RestartFastAdv(); nimbleController.RestartFastAdv();
} }
@ -273,10 +266,10 @@ void SystemTask::Work() {
case Messages::TouchWakeUp: { case Messages::TouchWakeUp: {
if (touchHandler.GetNewTouchInfo()) { if (touchHandler.GetNewTouchInfo()) {
auto gesture = touchHandler.GestureGet(); auto gesture = touchHandler.GestureGet();
if (gesture != Pinetime::Drivers::Cst816S::Gestures::None and if (gesture != Pinetime::Applications::TouchEvents::None and
((gesture == Pinetime::Drivers::Cst816S::Gestures::DoubleTap and ((gesture == Pinetime::Applications::TouchEvents::DoubleTap and
settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::DoubleTap)) or settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::DoubleTap)) or
(gesture == Pinetime::Drivers::Cst816S::Gestures::SingleTap and (gesture == Pinetime::Applications::TouchEvents::Tap and
settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::SingleTap)))) { settingsController.isWakeUpModeOn(Pinetime::Controllers::Settings::WakeUpMode::SingleTap)))) {
GoToRunning(); GoToRunning();
} }
@ -448,7 +441,13 @@ void SystemTask::Work() {
motorController.RunForDuration(35); motorController.RunForDuration(35);
displayApp.PushMessage(Pinetime::Applications::Display::Messages::ShowPairingKey); displayApp.PushMessage(Pinetime::Applications::Display::Messages::ShowPairingKey);
break; break;
case Messages::BleRadioEnableToggle:
if(settingsController.GetBleRadioEnabled()) {
nimbleController.EnableRadio();
} else {
nimbleController.DisableRadio();
}
break;
default: default:
break; break;
} }

View File

@ -13,7 +13,6 @@
#include <components/motion/MotionController.h> #include <components/motion/MotionController.h>
#include "systemtask/SystemMonitor.h" #include "systemtask/SystemMonitor.h"
#include "components/battery/BatteryController.h"
#include "components/ble/NimbleController.h" #include "components/ble/NimbleController.h"
#include "components/ble/NotificationManager.h" #include "components/ble/NotificationManager.h"
#include "components/motor/MotorController.h" #include "components/motor/MotorController.h"
@ -47,6 +46,7 @@ namespace Pinetime {
class Hrs3300; class Hrs3300;
} }
namespace Controllers { namespace Controllers {
class Battery;
class TouchHandler; class TouchHandler;
class ButtonHandler; class ButtonHandler;
} }
@ -148,11 +148,7 @@ namespace Pinetime {
bool stepCounterMustBeReset = false; bool stepCounterMustBeReset = false;
static constexpr TickType_t batteryMeasurementPeriod = pdMS_TO_TICKS(10 * 60 * 1000); static constexpr TickType_t batteryMeasurementPeriod = pdMS_TO_TICKS(10 * 60 * 1000);
#if configUSE_TRACE_FACILITY == 1 SystemMonitor monitor;
SystemMonitor<FreeRtosMonitor> monitor;
#else
SystemMonitor<DummyMonitor> monitor;
#endif
}; };
} }
} }

View File

@ -1,6 +1,36 @@
#include "touchhandler/TouchHandler.h" #include "touchhandler/TouchHandler.h"
#ifdef PINETIME_IS_RECOVERY
#include "displayapp/DummyLittleVgl.h"
#else
#include "displayapp/LittleVgl.h"
#endif
using namespace Pinetime::Controllers; using namespace Pinetime::Controllers;
using namespace Pinetime::Applications;
namespace {
TouchEvents ConvertGesture(Pinetime::Drivers::Cst816S::Gestures gesture) {
switch (gesture) {
case Pinetime::Drivers::Cst816S::Gestures::SingleTap:
return TouchEvents::Tap;
case Pinetime::Drivers::Cst816S::Gestures::LongPress:
return TouchEvents::LongTap;
case Pinetime::Drivers::Cst816S::Gestures::DoubleTap:
return TouchEvents::DoubleTap;
case Pinetime::Drivers::Cst816S::Gestures::SlideRight:
return TouchEvents::SwipeRight;
case Pinetime::Drivers::Cst816S::Gestures::SlideLeft:
return TouchEvents::SwipeLeft;
case Pinetime::Drivers::Cst816S::Gestures::SlideDown:
return TouchEvents::SwipeDown;
case Pinetime::Drivers::Cst816S::Gestures::SlideUp:
return TouchEvents::SwipeUp;
case Pinetime::Drivers::Cst816S::Gestures::None:
default:
return TouchEvents::None;
}
}
}
TouchHandler::TouchHandler(Drivers::Cst816S& touchPanel, Components::LittleVgl& lvgl) : touchPanel {touchPanel}, lvgl {lvgl} { TouchHandler::TouchHandler(Drivers::Cst816S& touchPanel, Components::LittleVgl& lvgl) : touchPanel {touchPanel}, lvgl {lvgl} {
} }
@ -12,9 +42,9 @@ void TouchHandler::CancelTap() {
} }
} }
Pinetime::Drivers::Cst816S::Gestures TouchHandler::GestureGet() { Pinetime::Applications::TouchEvents TouchHandler::GestureGet() {
auto returnGesture = gesture; auto returnGesture = gesture;
gesture = Drivers::Cst816S::Gestures::None; gesture = Pinetime::Applications::TouchEvents::None;
return returnGesture; return returnGesture;
} }
@ -33,11 +63,11 @@ bool TouchHandler::GetNewTouchInfo() {
info.gesture == Pinetime::Drivers::Cst816S::Gestures::SlideRight || info.gesture == Pinetime::Drivers::Cst816S::Gestures::SlideRight ||
info.gesture == Pinetime::Drivers::Cst816S::Gestures::LongPress) { info.gesture == Pinetime::Drivers::Cst816S::Gestures::LongPress) {
if (info.touching) { if (info.touching) {
gesture = info.gesture; gesture = ConvertGesture(info.gesture);
gestureReleased = false; gestureReleased = false;
} }
} else { } else {
gesture = info.gesture; gesture = ConvertGesture(info.gesture);
} }
} }
} }

View File

@ -1,6 +1,6 @@
#pragma once #pragma once
#include "drivers/Cst816s.h" #include "drivers/Cst816s.h"
#include "systemtask/SystemTask.h" #include "displayapp/TouchEvents.h"
namespace Pinetime { namespace Pinetime {
namespace Components { namespace Components {
@ -26,13 +26,13 @@ namespace Pinetime {
uint8_t GetY() const { uint8_t GetY() const {
return info.y; return info.y;
} }
Drivers::Cst816S::Gestures GestureGet(); Pinetime::Applications::TouchEvents GestureGet();
private: private:
Pinetime::Drivers::Cst816S::TouchInfos info; Pinetime::Drivers::Cst816S::TouchInfos info;
Pinetime::Drivers::Cst816S& touchPanel; Pinetime::Drivers::Cst816S& touchPanel;
Pinetime::Components::LittleVgl& lvgl; Pinetime::Components::LittleVgl& lvgl;
Pinetime::Drivers::Cst816S::Gestures gesture; Pinetime::Applications::TouchEvents gesture;
bool isCancelled = false; bool isCancelled = false;
bool gestureReleased = true; bool gestureReleased = true;
}; };