Merge branch 'develop' of JF/PineTime into master
This commit is contained in:
commit
187ea0f06d
8
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
8
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
blank_issues_enabled: true
|
||||||
|
contact_links:
|
||||||
|
- name: PineTime community chat (Matrix)
|
||||||
|
url: https://app.element.io/#/room/#pinetime:matrix.org
|
||||||
|
about: Please ask questions about PineTime here.
|
||||||
|
- name: PineTime developers chat (Matrix)
|
||||||
|
url: https://app.element.io/#/room/#pinetime-dev:matrix.org
|
||||||
|
about: Please ask questions about PineTime development here.
|
74
.github/workflows/lv_sim.yml
vendored
Normal file
74
.github/workflows/lv_sim.yml
vendored
Normal 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
|
@ -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)
|
||||||
@ -100,7 +100,7 @@ else()
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
set(VERSION_EDIT_WARNING "// Do not edit this file, it is automatically generated by CMAKE!")
|
set(VERSION_EDIT_WARNING "// Do not edit this file, it is automatically generated by CMAKE!")
|
||||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/Version.h.in ${CMAKE_CURRENT_SOURCE_DIR}/src/Version.h)
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/src/Version.h.in ${CMAKE_CURRENT_BINARY_DIR}/src/Version.h)
|
||||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/docker/post_build.sh.in ${CMAKE_CURRENT_BINARY_DIR}/post_build.sh)
|
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/docker/post_build.sh.in ${CMAKE_CURRENT_BINARY_DIR}/post_build.sh)
|
||||||
|
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -9,5 +9,6 @@
|
|||||||
- Top bar takes at least 20px + padding
|
- Top bar takes at least 20px + padding
|
||||||
- Top bar right icons move 8px to the left when using a page indicator
|
- Top bar right icons move 8px to the left when using a page indicator
|
||||||
- A black background helps to hide the screen border, allowing the UI to look less cramped when utilizing the entire display area.
|
- A black background helps to hide the screen border, allowing the UI to look less cramped when utilizing the entire display area.
|
||||||
|
- A switch should be twice as wide as it is tall.
|
||||||
|
|
||||||

|

|
||||||
|
@ -449,11 +449,13 @@ 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/WatchFaceTerminal.cpp
|
||||||
displayapp/screens/PineTimeStyle.cpp
|
displayapp/screens/PineTimeStyle.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
|
||||||
@ -612,6 +616,7 @@ list(APPEND RECOVERYLOADER_SOURCE_FILES
|
|||||||
|
|
||||||
set(INCLUDE_FILES
|
set(INCLUDE_FILES
|
||||||
|
|
||||||
|
${CMAKE_CURRENT_BINARY_DIR}/src/Version.h
|
||||||
BootloaderVersion.h
|
BootloaderVersion.h
|
||||||
logging/Logger.h
|
logging/Logger.h
|
||||||
logging/NrfLogger.h
|
logging/NrfLogger.h
|
||||||
@ -625,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
|
||||||
@ -710,6 +714,7 @@ set(INCLUDE_FILES
|
|||||||
)
|
)
|
||||||
|
|
||||||
include_directories(
|
include_directories(
|
||||||
|
${CMAKE_BINARY_DIR}/src # include generated files like Version.h
|
||||||
.
|
.
|
||||||
../
|
../
|
||||||
libs/
|
libs/
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
#include "ButtonHandler.h"
|
#include "buttonhandler/ButtonHandler.h"
|
||||||
|
|
||||||
using namespace Pinetime::Controllers;
|
using namespace Pinetime::Controllers;
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "ButtonActions.h"
|
#include "buttonhandler/ButtonActions.h"
|
||||||
#include "systemtask/SystemTask.h"
|
#include "systemtask/SystemTask.h"
|
||||||
#include <FreeRTOS.h>
|
#include <FreeRTOS.h>
|
||||||
#include <timers.h>
|
#include <timers.h>
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -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},
|
||||||
@ -76,6 +77,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;
|
||||||
@ -184,7 +186,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);
|
||||||
StartAdvertising();
|
if (bleController.IsRadioEnabled() && !bleController.IsConnected()) {
|
||||||
|
StartAdvertising();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BLE_GAP_EVENT_CONNECT:
|
case BLE_GAP_EVENT_CONNECT:
|
||||||
@ -220,9 +224,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;
|
||||||
bleController.Disconnect();
|
if(bleController.IsConnected()) {
|
||||||
fastAdvCount = 0;
|
bleController.Disconnect();
|
||||||
StartAdvertising();
|
fastAdvCount = 0;
|
||||||
|
StartAdvertising();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BLE_GAP_EVENT_CONN_UPDATE:
|
case BLE_GAP_EVENT_CONN_UPDATE:
|
||||||
@ -278,7 +284,28 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) {
|
|||||||
if (event->passkey.params.action == BLE_SM_IOACT_DISP) {
|
if (event->passkey.params.action == BLE_SM_IOACT_DISP) {
|
||||||
struct ble_sm_io pkey = {0};
|
struct ble_sm_io pkey = {0};
|
||||||
pkey.action = event->passkey.params.action;
|
pkey.action = event->passkey.params.action;
|
||||||
pkey.passkey = ble_ll_rand() % 1000000;
|
|
||||||
|
/*
|
||||||
|
* Passkey is a 6 digits code (1'000'000 possibilities).
|
||||||
|
* It is important every possible value has an equal probability
|
||||||
|
* of getting generated. Simply applying a modulo creates a bias
|
||||||
|
* since 2^32 is not a multiple of 1'000'000.
|
||||||
|
* To prevent that, we can reject values greater than 999'999.
|
||||||
|
*
|
||||||
|
* Rejecting values would happen a lot since 2^32-1 is way greater
|
||||||
|
* than 1'000'000. An optimisation is to use a multiple of 1'000'000.
|
||||||
|
* The greatest multiple of 1'000'000 lesser than 2^32-1 is
|
||||||
|
* 4'294'000'000.
|
||||||
|
*
|
||||||
|
* Great explanation at:
|
||||||
|
* https://research.kudelskisecurity.com/2020/07/28/the-definitive-guide-to-modulo-bias-and-how-to-avoid-it/
|
||||||
|
*/
|
||||||
|
uint32_t passkey_rand;
|
||||||
|
do {
|
||||||
|
passkey_rand = ble_ll_rand();
|
||||||
|
} while (passkey_rand > 4293999999);
|
||||||
|
pkey.passkey = passkey_rand % 1000000;
|
||||||
|
|
||||||
bleController.SetPairingKey(pkey.passkey);
|
bleController.SetPairingKey(pkey.passkey);
|
||||||
systemTask.PushMessage(Pinetime::System::Messages::OnPairing);
|
systemTask.PushMessage(Pinetime::System::Messages::OnPairing);
|
||||||
ble_sm_inject_io(event->passkey.conn_handle, &pkey);
|
ble_sm_inject_io(event->passkey.conn_handle, &pkey);
|
||||||
@ -376,6 +403,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};
|
||||||
|
@ -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,12 +84,12 @@ 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::Controllers::NotificationManager& notificationManager;
|
NotificationManager& notificationManager;
|
||||||
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;
|
||||||
|
@ -11,6 +11,9 @@ namespace {
|
|||||||
char const* MonthsStringLow[] = {"--", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
|
char const* MonthsStringLow[] = {"--", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DateTime::DateTime(Controllers::Settings& settingsController) : settingsController {settingsController} {
|
||||||
|
}
|
||||||
|
|
||||||
void DateTime::SetCurrentTime(std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds> t) {
|
void DateTime::SetCurrentTime(std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds> t) {
|
||||||
this->currentDateTime = t;
|
this->currentDateTime = t;
|
||||||
UpdateTime(previousSystickCounter); // Update internal state without updating the time
|
UpdateTime(previousSystickCounter); // Update internal state without updating the time
|
||||||
@ -36,6 +39,8 @@ void DateTime::SetTime(
|
|||||||
UpdateTime(systickCounter);
|
UpdateTime(systickCounter);
|
||||||
NRF_LOG_INFO("* %d %d %d ", this->hour, this->minute, this->second);
|
NRF_LOG_INFO("* %d %d %d ", this->hour, this->minute, this->second);
|
||||||
NRF_LOG_INFO("* %d %d %d ", this->day, this->month, this->year);
|
NRF_LOG_INFO("* %d %d %d ", this->day, this->month, this->year);
|
||||||
|
|
||||||
|
systemTask->PushMessage(System::Messages::OnNewTime);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DateTime::UpdateTime(uint32_t systickCounter) {
|
void DateTime::UpdateTime(uint32_t systickCounter) {
|
||||||
@ -103,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)];
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,3 +123,24 @@ const char* DateTime::MonthShortToStringLow(Months month) {
|
|||||||
void DateTime::Register(Pinetime::System::SystemTask* systemTask) {
|
void DateTime::Register(Pinetime::System::SystemTask* systemTask) {
|
||||||
this->systemTask = systemTask;
|
this->systemTask = systemTask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
using ClockType = Pinetime::Controllers::Settings::ClockType;
|
||||||
|
std::string DateTime::FormattedTime() {
|
||||||
|
// Return time as a string in 12- or 24-hour format
|
||||||
|
char buff[9];
|
||||||
|
if (settingsController.GetClockType() == ClockType::H12) {
|
||||||
|
uint8_t hour12;
|
||||||
|
const char* amPmStr;
|
||||||
|
if (hour < 12) {
|
||||||
|
hour12 = (hour == 0) ? 12 : hour;
|
||||||
|
amPmStr = "AM";
|
||||||
|
} else {
|
||||||
|
hour12 = (hour == 12) ? 12 : hour - 12;
|
||||||
|
amPmStr = "PM";
|
||||||
|
}
|
||||||
|
sprintf(buff, "%i:%02i %s", hour12, minute, amPmStr);
|
||||||
|
} else {
|
||||||
|
sprintf(buff, "%02i:%02i", hour, minute);
|
||||||
|
}
|
||||||
|
return std::string(buff);
|
||||||
|
}
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
|
#include <string>
|
||||||
|
#include "components/settings/Settings.h"
|
||||||
|
|
||||||
namespace Pinetime {
|
namespace Pinetime {
|
||||||
namespace System {
|
namespace System {
|
||||||
@ -10,6 +12,7 @@ namespace Pinetime {
|
|||||||
namespace Controllers {
|
namespace Controllers {
|
||||||
class DateTime {
|
class DateTime {
|
||||||
public:
|
public:
|
||||||
|
DateTime(Controllers::Settings& settingsController);
|
||||||
enum class Days : uint8_t { Unknown, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday };
|
enum class Days : uint8_t { Unknown, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday };
|
||||||
enum class Months : uint8_t {
|
enum class Months : uint8_t {
|
||||||
Unknown,
|
Unknown,
|
||||||
@ -58,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 {
|
||||||
@ -71,6 +74,7 @@ namespace Pinetime {
|
|||||||
|
|
||||||
void Register(System::SystemTask* systemTask);
|
void Register(System::SystemTask* systemTask);
|
||||||
void SetCurrentTime(std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds> t);
|
void SetCurrentTime(std::chrono::time_point<std::chrono::system_clock, std::chrono::nanoseconds> t);
|
||||||
|
std::string FormattedTime();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint16_t year = 0;
|
uint16_t year = 0;
|
||||||
@ -89,6 +93,7 @@ namespace Pinetime {
|
|||||||
bool isHourAlreadyNotified = true;
|
bool isHourAlreadyNotified = true;
|
||||||
bool isHalfHourAlreadyNotified = true;
|
bool isHalfHourAlreadyNotified = true;
|
||||||
System::SystemTask* systemTask = nullptr;
|
System::SystemTask* systemTask = nullptr;
|
||||||
|
Controllers::Settings& settingsController;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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"
|
||||||
|
|
||||||
|
@ -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);
|
||||||
|
@ -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));
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <bitset>
|
#include <bitset>
|
||||||
#include "components/datetime/DateTimeController.h"
|
|
||||||
#include "components/brightness/BrightnessController.h"
|
#include "components/brightness/BrightnessController.h"
|
||||||
#include "components/fs/FS.h"
|
#include "components/fs/FS.h"
|
||||||
|
|
||||||
@ -19,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;
|
||||||
@ -171,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;
|
||||||
@ -211,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();
|
||||||
|
@ -38,6 +38,7 @@ namespace Pinetime {
|
|||||||
SettingSetTime,
|
SettingSetTime,
|
||||||
SettingChimes,
|
SettingChimes,
|
||||||
SettingShakeThreshold,
|
SettingShakeThreshold,
|
||||||
|
SettingBluetooth,
|
||||||
Error
|
Error
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -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"
|
||||||
|
|
||||||
@ -97,6 +98,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 +114,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 +207,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);
|
||||||
}
|
}
|
||||||
@ -290,6 +293,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 +306,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) {
|
||||||
@ -367,19 +373,19 @@ void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction)
|
|||||||
|
|
||||||
case Apps::Notifications:
|
case Apps::Notifications:
|
||||||
currentScreen = std::make_unique<Screens::Notifications>(
|
currentScreen = std::make_unique<Screens::Notifications>(
|
||||||
this, notificationManager, systemTask->nimble().alertService(), motorController, Screens::Notifications::Modes::Normal);
|
this, notificationManager, systemTask->nimble().alertService(), motorController, *systemTask, Screens::Notifications::Modes::Normal);
|
||||||
ReturnApp(Apps::Clock, FullRefreshDirections::Up, TouchEvents::SwipeUp);
|
ReturnApp(Apps::Clock, FullRefreshDirections::Up, TouchEvents::SwipeUp);
|
||||||
break;
|
break;
|
||||||
case Apps::NotificationsPreview:
|
case Apps::NotificationsPreview:
|
||||||
currentScreen = std::make_unique<Screens::Notifications>(
|
currentScreen = std::make_unique<Screens::Notifications>(
|
||||||
this, notificationManager, systemTask->nimble().alertService(), motorController, Screens::Notifications::Modes::Preview);
|
this, notificationManager, systemTask->nimble().alertService(), motorController, *systemTask, Screens::Notifications::Modes::Preview);
|
||||||
ReturnApp(Apps::Clock, FullRefreshDirections::Up, TouchEvents::SwipeUp);
|
ReturnApp(Apps::Clock, FullRefreshDirections::Up, TouchEvents::SwipeUp);
|
||||||
break;
|
break;
|
||||||
case Apps::Timer:
|
case Apps::Timer:
|
||||||
currentScreen = std::make_unique<Screens::Timer>(this, timerController);
|
currentScreen = std::make_unique<Screens::Timer>(this, timerController);
|
||||||
break;
|
break;
|
||||||
case Apps::Alarm:
|
case Apps::Alarm:
|
||||||
currentScreen = std::make_unique<Screens::Alarm>(this, alarmController);
|
currentScreen = std::make_unique<Screens::Alarm>(this, alarmController, settingsController, *systemTask);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// Settings
|
// Settings
|
||||||
@ -417,7 +423,7 @@ void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction)
|
|||||||
ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown);
|
ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown);
|
||||||
break;
|
break;
|
||||||
case Apps::SettingSetTime:
|
case Apps::SettingSetTime:
|
||||||
currentScreen = std::make_unique<Screens::SettingSetTime>(this, dateTimeController);
|
currentScreen = std::make_unique<Screens::SettingSetTime>(this, dateTimeController, settingsController);
|
||||||
ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown);
|
ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown);
|
||||||
break;
|
break;
|
||||||
case Apps::SettingChimes:
|
case Apps::SettingChimes:
|
||||||
@ -425,7 +431,11 @@ void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction)
|
|||||||
ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown);
|
ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown);
|
||||||
break;
|
break;
|
||||||
case Apps::SettingShakeThreshold:
|
case Apps::SettingShakeThreshold:
|
||||||
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);
|
||||||
|
break;
|
||||||
|
case Apps::SettingBluetooth:
|
||||||
|
currentScreen = std::make_unique<Screens::SettingBluetooth>(this, settingsController);
|
||||||
ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown);
|
ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown);
|
||||||
break;
|
break;
|
||||||
case Apps::BatteryInfo:
|
case Apps::BatteryInfo:
|
||||||
|
@ -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;
|
||||||
|
|
||||||
|
@ -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} {
|
||||||
|
|
||||||
|
@ -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(); };
|
||||||
|
@ -21,7 +21,8 @@ namespace Pinetime {
|
|||||||
RestoreBrightness,
|
RestoreBrightness,
|
||||||
ShowPairingKey,
|
ShowPairingKey,
|
||||||
AlarmTriggered,
|
AlarmTriggered,
|
||||||
Clock
|
Clock,
|
||||||
|
BleRadioEnableToggle
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Binary file not shown.
BIN
src/displayapp/fonts/JetBrainsMono-ExtraBold.ttf
Normal file
BIN
src/displayapp/fonts/JetBrainsMono-ExtraBold.ttf
Normal file
Binary file not shown.
BIN
src/displayapp/fonts/JetBrainsMono-Regular.ttf
Normal file
BIN
src/displayapp/fonts/JetBrainsMono-Regular.ttf
Normal file
Binary file not shown.
@ -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`
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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*/
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -199,17 +199,17 @@ static void basic_init(void) {
|
|||||||
|
|
||||||
style_init_reset(&style_sw_bg);
|
style_init_reset(&style_sw_bg);
|
||||||
lv_style_set_bg_opa(&style_sw_bg, LV_STATE_DEFAULT, LV_OPA_COVER);
|
lv_style_set_bg_opa(&style_sw_bg, LV_STATE_DEFAULT, LV_OPA_COVER);
|
||||||
lv_style_set_bg_color(&style_sw_bg, LV_STATE_DEFAULT, LV_PINETIME_LIGHT_GRAY);
|
lv_style_set_bg_color(&style_sw_bg, LV_STATE_DEFAULT, LV_PINETIME_BLUE);
|
||||||
lv_style_set_radius(&style_sw_bg, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE);
|
lv_style_set_radius(&style_sw_bg, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE);
|
||||||
lv_style_set_value_color(&style_sw_bg, LV_STATE_DEFAULT, LV_PINETIME_BLUE);
|
|
||||||
|
|
||||||
style_init_reset(&style_sw_indic);
|
style_init_reset(&style_sw_indic);
|
||||||
lv_style_set_bg_opa(&style_sw_indic, LV_STATE_DEFAULT, LV_OPA_COVER);
|
lv_style_set_bg_opa(&style_sw_indic, LV_STATE_DEFAULT, LV_OPA_COVER);
|
||||||
lv_style_set_bg_color(&style_sw_indic, LV_STATE_DEFAULT, LV_PINETIME_GREEN);
|
lv_style_set_bg_color(&style_sw_indic, LV_STATE_DEFAULT, LV_COLOR_GREEN);
|
||||||
|
|
||||||
style_init_reset(&style_sw_knob);
|
style_init_reset(&style_sw_knob);
|
||||||
lv_style_set_bg_opa(&style_sw_knob, LV_STATE_DEFAULT, LV_OPA_COVER);
|
lv_style_set_bg_opa(&style_sw_knob, LV_STATE_DEFAULT, LV_OPA_COVER);
|
||||||
lv_style_set_bg_color(&style_sw_knob, LV_STATE_DEFAULT, LV_PINETIME_WHITE);
|
lv_style_set_bg_color(&style_sw_knob, LV_STATE_DEFAULT, LV_COLOR_SILVER);
|
||||||
|
lv_style_set_bg_color(&style_sw_knob, LV_STATE_CHECKED, LV_COLOR_WHITE);
|
||||||
lv_style_set_radius(&style_sw_knob, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE);
|
lv_style_set_radius(&style_sw_knob, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE);
|
||||||
lv_style_set_pad_top(&style_sw_knob, LV_STATE_DEFAULT, -4);
|
lv_style_set_pad_top(&style_sw_knob, LV_STATE_DEFAULT, -4);
|
||||||
lv_style_set_pad_bottom(&style_sw_knob, LV_STATE_DEFAULT, -4);
|
lv_style_set_pad_bottom(&style_sw_knob, LV_STATE_DEFAULT, -4);
|
||||||
|
@ -23,7 +23,7 @@ extern "C" {
|
|||||||
#define LV_PINETIME_LIGHT lv_color_hex(0xf3f8fe)
|
#define LV_PINETIME_LIGHT lv_color_hex(0xf3f8fe)
|
||||||
#define LV_PINETIME_GRAY lv_color_hex(0x8a8a8a)
|
#define LV_PINETIME_GRAY lv_color_hex(0x8a8a8a)
|
||||||
#define LV_PINETIME_LIGHT_GRAY lv_color_hex(0xc4c4c4)
|
#define LV_PINETIME_LIGHT_GRAY lv_color_hex(0xc4c4c4)
|
||||||
#define LV_PINETIME_BLUE lv_color_hex(0x2f3243) // 006fb6
|
#define LV_PINETIME_BLUE lv_color_hex(0x2f3540)
|
||||||
#define LV_PINETIME_GREEN lv_color_hex(0x4cb242)
|
#define LV_PINETIME_GREEN lv_color_hex(0x4cb242)
|
||||||
#define LV_PINETIME_RED lv_color_hex(0xd51732)
|
#define LV_PINETIME_RED lv_color_hex(0xd51732)
|
||||||
|
|
||||||
|
@ -23,12 +23,20 @@ using namespace Pinetime::Applications::Screens;
|
|||||||
using Pinetime::Controllers::AlarmController;
|
using Pinetime::Controllers::AlarmController;
|
||||||
|
|
||||||
static void btnEventHandler(lv_obj_t* obj, lv_event_t event) {
|
static void btnEventHandler(lv_obj_t* obj, lv_event_t event) {
|
||||||
Alarm* screen = static_cast<Alarm*>(obj->user_data);
|
auto* screen = static_cast<Alarm*>(obj->user_data);
|
||||||
screen->OnButtonEvent(obj, event);
|
screen->OnButtonEvent(obj, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
Alarm::Alarm(DisplayApp* app, Controllers::AlarmController& alarmController)
|
static void StopAlarmTaskCallback(lv_task_t* task) {
|
||||||
: Screen(app), running {true}, alarmController {alarmController} {
|
auto* screen = static_cast<Alarm*>(task->user_data);
|
||||||
|
screen->StopAlerting();
|
||||||
|
}
|
||||||
|
|
||||||
|
Alarm::Alarm(DisplayApp* app,
|
||||||
|
Controllers::AlarmController& alarmController,
|
||||||
|
Pinetime::Controllers::Settings& settingsController,
|
||||||
|
System::SystemTask& systemTask)
|
||||||
|
: Screen(app), alarmController {alarmController}, settingsController {settingsController}, 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);
|
||||||
@ -40,6 +48,13 @@ Alarm::Alarm(DisplayApp* app, Controllers::AlarmController& alarmController)
|
|||||||
|
|
||||||
lv_obj_align(time, lv_scr_act(), LV_ALIGN_CENTER, 0, -25);
|
lv_obj_align(time, lv_scr_act(), LV_ALIGN_CENTER, 0, -25);
|
||||||
|
|
||||||
|
lblampm = lv_label_create(lv_scr_act(), nullptr);
|
||||||
|
lv_obj_set_style_local_text_font(lblampm, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_bold_20);
|
||||||
|
lv_obj_set_style_local_text_color(lblampm, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY);
|
||||||
|
lv_label_set_text_static(lblampm, " ");
|
||||||
|
lv_label_set_align(lblampm, LV_LABEL_ALIGN_CENTER);
|
||||||
|
lv_obj_align(lblampm, lv_scr_act(), LV_ALIGN_CENTER, 0, 30);
|
||||||
|
|
||||||
btnHoursUp = lv_btn_create(lv_scr_act(), nullptr);
|
btnHoursUp = lv_btn_create(lv_scr_act(), nullptr);
|
||||||
btnHoursUp->user_data = this;
|
btnHoursUp->user_data = this;
|
||||||
lv_obj_set_event_cb(btnHoursUp, btnEventHandler);
|
lv_obj_set_event_cb(btnHoursUp, btnEventHandler);
|
||||||
@ -72,13 +87,15 @@ Alarm::Alarm(DisplayApp* app, Controllers::AlarmController& alarmController)
|
|||||||
txtMinDown = lv_label_create(btnMinutesDown, nullptr);
|
txtMinDown = lv_label_create(btnMinutesDown, nullptr);
|
||||||
lv_label_set_text_static(txtMinDown, "-");
|
lv_label_set_text_static(txtMinDown, "-");
|
||||||
|
|
||||||
btnEnable = lv_btn_create(lv_scr_act(), nullptr);
|
btnStop = lv_btn_create(lv_scr_act(), nullptr);
|
||||||
btnEnable->user_data = this;
|
btnStop->user_data = this;
|
||||||
lv_obj_set_event_cb(btnEnable, btnEventHandler);
|
lv_obj_set_event_cb(btnStop, btnEventHandler);
|
||||||
lv_obj_set_size(btnEnable, 115, 50);
|
lv_obj_set_size(btnStop, 115, 50);
|
||||||
lv_obj_align(btnEnable, lv_scr_act(), LV_ALIGN_IN_BOTTOM_LEFT, 0, 0);
|
lv_obj_align(btnStop, lv_scr_act(), LV_ALIGN_IN_BOTTOM_LEFT, 0, 0);
|
||||||
txtEnable = lv_label_create(btnEnable, nullptr);
|
lv_obj_set_style_local_bg_color(btnStop, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_RED);
|
||||||
SetEnableButtonState();
|
txtStop = lv_label_create(btnStop, nullptr);
|
||||||
|
lv_label_set_text_static(txtStop, Symbols::stop);
|
||||||
|
lv_obj_set_hidden(btnStop, true);
|
||||||
|
|
||||||
btnRecur = lv_btn_create(lv_scr_act(), nullptr);
|
btnRecur = lv_btn_create(lv_scr_act(), nullptr);
|
||||||
btnRecur->user_data = this;
|
btnRecur->user_data = this;
|
||||||
@ -95,24 +112,35 @@ Alarm::Alarm(DisplayApp* app, Controllers::AlarmController& alarmController)
|
|||||||
lv_obj_align(btnInfo, lv_scr_act(), LV_ALIGN_CENTER, 0, -85);
|
lv_obj_align(btnInfo, lv_scr_act(), LV_ALIGN_CENTER, 0, -85);
|
||||||
txtInfo = lv_label_create(btnInfo, nullptr);
|
txtInfo = lv_label_create(btnInfo, nullptr);
|
||||||
lv_label_set_text_static(txtInfo, "i");
|
lv_label_set_text_static(txtInfo, "i");
|
||||||
|
|
||||||
|
enableSwitch = lv_switch_create(lv_scr_act(), nullptr);
|
||||||
|
enableSwitch->user_data = this;
|
||||||
|
lv_obj_set_event_cb(enableSwitch, btnEventHandler);
|
||||||
|
lv_obj_set_size(enableSwitch, 100, 50);
|
||||||
|
// Align to the center of 115px from edge
|
||||||
|
lv_obj_align(enableSwitch, lv_scr_act(), LV_ALIGN_IN_BOTTOM_LEFT, 7, 0);
|
||||||
|
|
||||||
|
UpdateAlarmTime();
|
||||||
|
|
||||||
|
if (alarmController.State() == Controllers::AlarmController::AlarmState::Alerting) {
|
||||||
|
SetAlerting();
|
||||||
|
} else {
|
||||||
|
SetSwitchState(LV_ANIM_OFF);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Alarm::~Alarm() {
|
Alarm::~Alarm() {
|
||||||
|
if (alarmController.State() == AlarmController::AlarmState::Alerting) {
|
||||||
|
StopAlerting();
|
||||||
|
}
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Alarm::OnButtonEvent(lv_obj_t* obj, lv_event_t event) {
|
void Alarm::OnButtonEvent(lv_obj_t* obj, lv_event_t event) {
|
||||||
using Pinetime::Controllers::AlarmController;
|
using Pinetime::Controllers::AlarmController;
|
||||||
if (event == LV_EVENT_CLICKED) {
|
if (event == LV_EVENT_CLICKED) {
|
||||||
if (obj == btnEnable) {
|
if (obj == btnStop) {
|
||||||
if (alarmController.State() == AlarmController::AlarmState::Alerting) {
|
StopAlerting();
|
||||||
alarmController.StopAlerting();
|
|
||||||
} else if (alarmController.State() == AlarmController::AlarmState::Set) {
|
|
||||||
alarmController.DisableAlarm();
|
|
||||||
} else {
|
|
||||||
alarmController.ScheduleAlarm();
|
|
||||||
}
|
|
||||||
SetEnableButtonState();
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (obj == btnInfo) {
|
if (obj == btnInfo) {
|
||||||
@ -123,11 +151,19 @@ void Alarm::OnButtonEvent(lv_obj_t* obj, lv_event_t event) {
|
|||||||
HideInfo();
|
HideInfo();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (obj == enableSwitch) {
|
||||||
|
if (lv_switch_get_state(enableSwitch)) {
|
||||||
|
alarmController.ScheduleAlarm();
|
||||||
|
} else {
|
||||||
|
alarmController.DisableAlarm();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
// If any other button was pressed, disable the alarm
|
// If any other button was pressed, disable the alarm
|
||||||
// this is to make it clear that the alarm won't be set until it is turned back on
|
// this is to make it clear that the alarm won't be set until it is turned back on
|
||||||
if (alarmController.State() == AlarmController::AlarmState::Set) {
|
if (alarmController.State() == AlarmController::AlarmState::Set) {
|
||||||
alarmController.DisableAlarm();
|
alarmController.DisableAlarm();
|
||||||
SetEnableButtonState();
|
lv_switch_off(enableSwitch, LV_ANIM_ON);
|
||||||
}
|
}
|
||||||
if (obj == btnMinutesUp) {
|
if (obj == btnMinutesUp) {
|
||||||
if (alarmMinutes >= 59) {
|
if (alarmMinutes >= 59) {
|
||||||
@ -176,31 +212,73 @@ bool Alarm::OnButtonPushed() {
|
|||||||
HideInfo();
|
HideInfo();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
if (alarmController.State() == AlarmController::AlarmState::Alerting) {
|
||||||
|
StopAlerting();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Alarm::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
|
||||||
|
// Don't allow closing the screen by swiping while the alarm is alerting
|
||||||
|
return alarmController.State() == AlarmController::AlarmState::Alerting && event == TouchEvents::SwipeDown;
|
||||||
|
}
|
||||||
|
|
||||||
void Alarm::UpdateAlarmTime() {
|
void Alarm::UpdateAlarmTime() {
|
||||||
lv_label_set_text_fmt(time, "%02d:%02d", alarmHours, alarmMinutes);
|
if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) {
|
||||||
|
switch (alarmHours) {
|
||||||
|
case 0:
|
||||||
|
lv_label_set_text_static(lblampm, "AM");
|
||||||
|
lv_label_set_text_fmt(time, "%02d:%02d", 12, alarmMinutes);
|
||||||
|
break;
|
||||||
|
case 1 ... 11:
|
||||||
|
lv_label_set_text_static(lblampm, "AM");
|
||||||
|
lv_label_set_text_fmt(time, "%02d:%02d", alarmHours, alarmMinutes);
|
||||||
|
break;
|
||||||
|
case 12:
|
||||||
|
lv_label_set_text_static(lblampm, "PM");
|
||||||
|
lv_label_set_text_fmt(time, "%02d:%02d", 12, alarmMinutes);
|
||||||
|
break;
|
||||||
|
case 13 ... 23:
|
||||||
|
lv_label_set_text_static(lblampm, "PM");
|
||||||
|
lv_label_set_text_fmt(time, "%02d:%02d", alarmHours - 12, alarmMinutes);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
lv_label_set_text_fmt(time, "%02d:%02d", alarmHours, alarmMinutes);
|
||||||
|
}
|
||||||
alarmController.SetAlarmTime(alarmHours, alarmMinutes);
|
alarmController.SetAlarmTime(alarmHours, alarmMinutes);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Alarm::SetAlerting() {
|
void Alarm::SetAlerting() {
|
||||||
SetEnableButtonState();
|
lv_obj_set_hidden(enableSwitch, true);
|
||||||
|
lv_obj_set_hidden(btnStop, false);
|
||||||
|
taskStopAlarm = lv_task_create(StopAlarmTaskCallback, pdMS_TO_TICKS(60 * 1000), LV_TASK_PRIO_MID, this);
|
||||||
|
systemTask.PushMessage(System::Messages::DisableSleeping);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Alarm::SetEnableButtonState() {
|
void Alarm::StopAlerting() {
|
||||||
|
alarmController.StopAlerting();
|
||||||
|
SetSwitchState(LV_ANIM_OFF);
|
||||||
|
if (taskStopAlarm != nullptr) {
|
||||||
|
lv_task_del(taskStopAlarm);
|
||||||
|
taskStopAlarm = nullptr;
|
||||||
|
}
|
||||||
|
systemTask.PushMessage(System::Messages::EnableSleeping);
|
||||||
|
lv_obj_set_hidden(enableSwitch, false);
|
||||||
|
lv_obj_set_hidden(btnStop, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Alarm::SetSwitchState(lv_anim_enable_t anim) {
|
||||||
switch (alarmController.State()) {
|
switch (alarmController.State()) {
|
||||||
case AlarmController::AlarmState::Set:
|
case AlarmController::AlarmState::Set:
|
||||||
lv_label_set_text(txtEnable, "ON");
|
lv_switch_on(enableSwitch, anim);
|
||||||
lv_obj_set_style_local_bg_color(btnEnable, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GREEN);
|
|
||||||
break;
|
break;
|
||||||
case AlarmController::AlarmState::Not_Set:
|
case AlarmController::AlarmState::Not_Set:
|
||||||
lv_label_set_text(txtEnable, "OFF");
|
lv_switch_off(enableSwitch, anim);
|
||||||
lv_obj_set_style_local_bg_color(btnEnable, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_GRAY);
|
break;
|
||||||
|
default:
|
||||||
break;
|
break;
|
||||||
case AlarmController::AlarmState::Alerting:
|
|
||||||
lv_label_set_text(txtEnable, Symbols::stop);
|
|
||||||
lv_obj_set_style_local_bg_color(btnEnable, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_RED);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,26 +27,33 @@ namespace Pinetime {
|
|||||||
namespace Screens {
|
namespace Screens {
|
||||||
class Alarm : public Screen {
|
class Alarm : public Screen {
|
||||||
public:
|
public:
|
||||||
Alarm(DisplayApp* app, Controllers::AlarmController& alarmController);
|
Alarm(DisplayApp* app,
|
||||||
|
Controllers::AlarmController& alarmController,
|
||||||
|
Pinetime::Controllers::Settings& settingsController,
|
||||||
|
System::SystemTask& systemTask);
|
||||||
~Alarm() override;
|
~Alarm() override;
|
||||||
void SetAlerting();
|
void SetAlerting();
|
||||||
void OnButtonEvent(lv_obj_t* obj, lv_event_t event);
|
void OnButtonEvent(lv_obj_t* obj, lv_event_t event);
|
||||||
bool OnButtonPushed() override;
|
bool OnButtonPushed() override;
|
||||||
|
bool OnTouchEvent(TouchEvents event) override;
|
||||||
|
void StopAlerting();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool running;
|
|
||||||
uint8_t alarmHours;
|
uint8_t alarmHours;
|
||||||
uint8_t alarmMinutes;
|
uint8_t alarmMinutes;
|
||||||
Controllers::AlarmController& alarmController;
|
Controllers::AlarmController& alarmController;
|
||||||
|
Controllers::Settings& settingsController;
|
||||||
|
System::SystemTask& systemTask;
|
||||||
|
|
||||||
lv_obj_t *time, *btnEnable, *txtEnable, *btnMinutesUp, *btnMinutesDown, *btnHoursUp, *btnHoursDown, *txtMinUp, *txtMinDown,
|
lv_obj_t *time, *lblampm, *btnStop, *txtStop, *btnMinutesUp, *btnMinutesDown, *btnHoursUp, *btnHoursDown, *txtMinUp,
|
||||||
*txtHrUp, *txtHrDown, *btnRecur, *txtRecur, *btnInfo, *txtInfo;
|
*txtMinDown, *txtHrUp, *txtHrDown, *btnRecur, *txtRecur, *btnInfo, *txtInfo, *enableSwitch;
|
||||||
lv_obj_t* txtMessage = nullptr;
|
lv_obj_t* txtMessage = nullptr;
|
||||||
lv_obj_t* btnMessage = nullptr;
|
lv_obj_t* btnMessage = nullptr;
|
||||||
|
lv_task_t* taskStopAlarm = nullptr;
|
||||||
|
|
||||||
enum class EnableButtonState { On, Off, Alerting };
|
enum class EnableButtonState { On, Off, Alerting };
|
||||||
void SetEnableButtonState();
|
|
||||||
void SetRecurButtonState();
|
void SetRecurButtonState();
|
||||||
|
void SetSwitchState(lv_anim_enable_t anim);
|
||||||
void SetAlarm();
|
void SetAlarm();
|
||||||
void ShowInfo();
|
void ShowInfo();
|
||||||
void HideInfo();
|
void HideInfo();
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
|
@ -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 {
|
||||||
@ -9,4 +11,4 @@ namespace Pinetime {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,6 +9,7 @@
|
|||||||
#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/PineTimeStyle.h"
|
||||||
|
|
||||||
@ -41,6 +42,9 @@ Clock::Clock(DisplayApp* app,
|
|||||||
case 2:
|
case 2:
|
||||||
return PineTimeStyleScreen();
|
return PineTimeStyleScreen();
|
||||||
break;
|
break;
|
||||||
|
case 3:
|
||||||
|
return WatchFaceTerminalScreen();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return WatchFaceDigitalScreen();
|
return WatchFaceDigitalScreen();
|
||||||
}()} {
|
}()} {
|
||||||
@ -76,11 +80,17 @@ std::unique_ptr<Screen> Clock::WatchFaceAnalogScreen() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<Screen> Clock::PineTimeStyleScreen() {
|
std::unique_ptr<Screen> Clock::PineTimeStyleScreen() {
|
||||||
return std::make_unique<Screens::PineTimeStyle>(app,
|
return std::make_unique<Screens::PineTimeStyle>(
|
||||||
dateTimeController,
|
app, dateTimeController, batteryController, bleController, notificatioManager, settingsController, motionController);
|
||||||
batteryController,
|
}
|
||||||
bleController,
|
|
||||||
notificatioManager,
|
std::unique_ptr<Screen> Clock::WatchFaceTerminalScreen() {
|
||||||
settingsController,
|
return std::make_unique<Screens::WatchFaceTerminal>(app,
|
||||||
motionController);
|
dateTimeController,
|
||||||
|
batteryController,
|
||||||
|
bleController,
|
||||||
|
notificatioManager,
|
||||||
|
settingsController,
|
||||||
|
heartRateController,
|
||||||
|
motionController);
|
||||||
}
|
}
|
||||||
|
@ -47,6 +47,7 @@ namespace Pinetime {
|
|||||||
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> PineTimeStyleScreen();
|
||||||
|
std::unique_ptr<Screen> WatchFaceTerminalScreen();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
@ -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;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
@ -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();
|
||||||
|
|
||||||
@ -69,7 +69,7 @@ namespace Pinetime {
|
|||||||
std::string track;
|
std::string track;
|
||||||
|
|
||||||
/** Total length in seconds */
|
/** Total length in seconds */
|
||||||
int totalLength;
|
int totalLength = 0;
|
||||||
/** Current length in seconds */
|
/** Current length in seconds */
|
||||||
int currentLength;
|
int currentLength;
|
||||||
/** Last length */
|
/** Last length */
|
||||||
|
@ -12,8 +12,14 @@ Notifications::Notifications(DisplayApp* app,
|
|||||||
Pinetime::Controllers::NotificationManager& notificationManager,
|
Pinetime::Controllers::NotificationManager& notificationManager,
|
||||||
Pinetime::Controllers::AlertNotificationService& alertNotificationService,
|
Pinetime::Controllers::AlertNotificationService& alertNotificationService,
|
||||||
Pinetime::Controllers::MotorController& motorController,
|
Pinetime::Controllers::MotorController& motorController,
|
||||||
|
System::SystemTask& systemTask,
|
||||||
Modes mode)
|
Modes mode)
|
||||||
: Screen(app), notificationManager {notificationManager}, alertNotificationService {alertNotificationService}, mode {mode} {
|
: Screen(app),
|
||||||
|
notificationManager {notificationManager},
|
||||||
|
alertNotificationService {alertNotificationService},
|
||||||
|
motorController {motorController},
|
||||||
|
systemTask {systemTask},
|
||||||
|
mode {mode} {
|
||||||
notificationManager.ClearNewNotificationFlag();
|
notificationManager.ClearNewNotificationFlag();
|
||||||
auto notification = notificationManager.GetLastNotification();
|
auto notification = notificationManager.GetLastNotification();
|
||||||
if (notification.valid) {
|
if (notification.valid) {
|
||||||
@ -24,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",
|
||||||
@ -33,24 +40,27 @@ 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) {
|
||||||
|
systemTask.PushMessage(System::Messages::DisableSleeping);
|
||||||
if (notification.category == Controllers::NotificationManager::Categories::IncomingCall) {
|
if (notification.category == Controllers::NotificationManager::Categories::IncomingCall) {
|
||||||
motorController.StartRinging();
|
motorController.StartRinging();
|
||||||
} else {
|
} else {
|
||||||
motorController.RunForDuration(35);
|
motorController.RunForDuration(35);
|
||||||
timeoutLine = lv_line_create(lv_scr_act(), nullptr);
|
|
||||||
|
|
||||||
lv_obj_set_style_local_line_width(timeoutLine, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, 3);
|
|
||||||
lv_obj_set_style_local_line_color(timeoutLine, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE);
|
|
||||||
lv_obj_set_style_local_line_rounded(timeoutLine, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, true);
|
|
||||||
|
|
||||||
lv_line_set_points(timeoutLine, timeoutLinePoints, 2);
|
|
||||||
timeoutTickCountStart = xTaskGetTickCount();
|
|
||||||
timeoutTickCountEnd = timeoutTickCountStart + (5 * 1024);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
timeoutLine = lv_line_create(lv_scr_act(), nullptr);
|
||||||
|
|
||||||
|
lv_obj_set_style_local_line_width(timeoutLine, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, 3);
|
||||||
|
lv_obj_set_style_local_line_color(timeoutLine, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE);
|
||||||
|
lv_obj_set_style_local_line_rounded(timeoutLine, LV_LINE_PART_MAIN, LV_STATE_DEFAULT, true);
|
||||||
|
|
||||||
|
lv_line_set_points(timeoutLine, timeoutLinePoints, 2);
|
||||||
|
timeoutTickCountStart = xTaskGetTickCount();
|
||||||
|
interacted = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
||||||
@ -59,24 +69,41 @@ 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);
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Notifications::Refresh() {
|
void Notifications::Refresh() {
|
||||||
if (mode == Modes::Preview && timeoutLine != nullptr) {
|
if (mode == Modes::Preview && timeoutLine != nullptr) {
|
||||||
auto tick = xTaskGetTickCount();
|
TickType_t tick = xTaskGetTickCount();
|
||||||
int32_t pos = 240 - ((tick - timeoutTickCountStart) / ((timeoutTickCountEnd - timeoutTickCountStart) / 240));
|
int32_t pos = 240 - ((tick - timeoutTickCountStart) / (timeoutLength / 240));
|
||||||
if (pos < 0)
|
if (pos <= 0) {
|
||||||
running = false;
|
running = false;
|
||||||
|
} else {
|
||||||
|
timeoutLinePoints[1].x = pos;
|
||||||
|
lv_line_set_points(timeoutLine, timeoutLinePoints, 2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
running = currentItem->IsRunning() && running;
|
||||||
|
}
|
||||||
|
|
||||||
timeoutLinePoints[1].x = pos;
|
void Notifications::OnPreviewInteraction() {
|
||||||
lv_line_set_points(timeoutLine, timeoutLinePoints, 2);
|
systemTask.PushMessage(System::Messages::EnableSleeping);
|
||||||
|
motorController.StopRinging();
|
||||||
|
if (timeoutLine != nullptr) {
|
||||||
|
lv_obj_del(timeoutLine);
|
||||||
|
timeoutLine = nullptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Notifications::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
|
bool Notifications::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
|
||||||
if (mode != Modes::Normal) {
|
if (mode != Modes::Normal) {
|
||||||
|
if (!interacted && event == TouchEvents::Tap) {
|
||||||
|
interacted = true;
|
||||||
|
OnPreviewInteraction();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -101,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: {
|
||||||
@ -126,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:
|
||||||
@ -147,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));
|
||||||
@ -168,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
|
||||||
while (pchar != nullptr) {
|
lv_label_set_text(alert_type, title);
|
||||||
*pchar = ' ';
|
char *pchar = strchr(lv_label_get_text(alert_type), '\n');
|
||||||
pchar = strchr(pchar + 1, '\n');
|
while (pchar != nullptr) {
|
||||||
|
*pchar = ' ';
|
||||||
|
pchar = strchr(pchar + 1, '\n');
|
||||||
|
}
|
||||||
|
lv_label_refr_text(alert_type);
|
||||||
}
|
}
|
||||||
lv_label_set_text(alert_type, title);
|
|
||||||
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);
|
||||||
@ -245,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();
|
||||||
|
@ -1,11 +1,13 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <lvgl/lvgl.h>
|
#include <lvgl/lvgl.h>
|
||||||
|
#include <FreeRTOS.h>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include "displayapp/screens/Screen.h"
|
#include "displayapp/screens/Screen.h"
|
||||||
#include "components/ble/NotificationManager.h"
|
#include "components/ble/NotificationManager.h"
|
||||||
#include "components/motor/MotorController.h"
|
#include "components/motor/MotorController.h"
|
||||||
|
#include "systemtask/SystemTask.h"
|
||||||
|
|
||||||
namespace Pinetime {
|
namespace Pinetime {
|
||||||
namespace Controllers {
|
namespace Controllers {
|
||||||
@ -21,11 +23,13 @@ namespace Pinetime {
|
|||||||
Pinetime::Controllers::NotificationManager& notificationManager,
|
Pinetime::Controllers::NotificationManager& notificationManager,
|
||||||
Pinetime::Controllers::AlertNotificationService& alertNotificationService,
|
Pinetime::Controllers::AlertNotificationService& alertNotificationService,
|
||||||
Pinetime::Controllers::MotorController& motorController,
|
Pinetime::Controllers::MotorController& motorController,
|
||||||
|
System::SystemTask& systemTask,
|
||||||
Modes mode);
|
Modes mode);
|
||||||
~Notifications() override;
|
~Notifications() override;
|
||||||
|
|
||||||
void Refresh() override;
|
void Refresh() override;
|
||||||
bool OnTouchEvent(Pinetime::Applications::TouchEvents event) override;
|
bool OnTouchEvent(Pinetime::Applications::TouchEvents event) override;
|
||||||
|
void OnPreviewInteraction();
|
||||||
|
|
||||||
class NotificationItem {
|
class NotificationItem {
|
||||||
public:
|
public:
|
||||||
@ -35,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;
|
||||||
@ -52,16 +57,15 @@ 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;
|
||||||
Modes mode = Modes::Normal;
|
Modes mode = Modes::Normal;
|
||||||
std::unique_ptr<NotificationItem> currentItem;
|
std::unique_ptr<NotificationItem> currentItem;
|
||||||
Controllers::NotificationManager::Notification::Id currentId;
|
Controllers::NotificationManager::Notification::Id currentId;
|
||||||
@ -69,8 +73,9 @@ namespace Pinetime {
|
|||||||
|
|
||||||
lv_point_t timeoutLinePoints[2] {{0, 1}, {239, 1}};
|
lv_point_t timeoutLinePoints[2] {{0, 1}, {239, 1}};
|
||||||
lv_obj_t* timeoutLine = nullptr;
|
lv_obj_t* timeoutLine = nullptr;
|
||||||
uint32_t timeoutTickCountStart;
|
TickType_t timeoutTickCountStart;
|
||||||
uint32_t timeoutTickCountEnd;
|
static const TickType_t timeoutLength = pdMS_TO_TICKS(7000);
|
||||||
|
bool interacted = true;
|
||||||
|
|
||||||
lv_task_t* taskRefresh;
|
lv_task_t* taskRefresh;
|
||||||
};
|
};
|
||||||
|
@ -42,6 +42,13 @@ namespace {
|
|||||||
auto* screen = static_cast<PineTimeStyle*>(obj->user_data);
|
auto* screen = static_cast<PineTimeStyle*>(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,
|
PineTimeStyle::PineTimeStyle(DisplayApp* app,
|
||||||
@ -60,12 +67,6 @@ PineTimeStyle::PineTimeStyle(DisplayApp* app,
|
|||||||
settingsController {settingsController},
|
settingsController {settingsController},
|
||||||
motionController {motionController} {
|
motionController {motionController} {
|
||||||
|
|
||||||
displayedChar[0] = 0;
|
|
||||||
displayedChar[1] = 0;
|
|
||||||
displayedChar[2] = 0;
|
|
||||||
displayedChar[3] = 0;
|
|
||||||
displayedChar[4] = 0;
|
|
||||||
|
|
||||||
// Create a 200px wide background rectangle
|
// Create a 200px wide background rectangle
|
||||||
timebar = lv_obj_create(lv_scr_act(), nullptr);
|
timebar = lv_obj_create(lv_scr_act(), nullptr);
|
||||||
lv_obj_set_style_local_bg_color(timebar, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, Convert(settingsController.GetPTSColorBG()));
|
lv_obj_set_style_local_bg_color(timebar, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, Convert(settingsController.GetPTSColorBG()));
|
||||||
@ -77,19 +78,19 @@ PineTimeStyle::PineTimeStyle(DisplayApp* app,
|
|||||||
timeDD1 = lv_label_create(lv_scr_act(), nullptr);
|
timeDD1 = lv_label_create(lv_scr_act(), nullptr);
|
||||||
lv_obj_set_style_local_text_font(timeDD1, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &open_sans_light);
|
lv_obj_set_style_local_text_font(timeDD1, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &open_sans_light);
|
||||||
lv_obj_set_style_local_text_color(timeDD1, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, Convert(settingsController.GetPTSColorTime()));
|
lv_obj_set_style_local_text_color(timeDD1, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, Convert(settingsController.GetPTSColorTime()));
|
||||||
lv_label_set_text(timeDD1, "00");
|
lv_label_set_text_static(timeDD1, "00");
|
||||||
lv_obj_align(timeDD1, timebar, LV_ALIGN_IN_TOP_MID, 5, 5);
|
lv_obj_align(timeDD1, timebar, LV_ALIGN_IN_TOP_MID, 5, 5);
|
||||||
|
|
||||||
timeDD2 = lv_label_create(lv_scr_act(), nullptr);
|
timeDD2 = lv_label_create(lv_scr_act(), nullptr);
|
||||||
lv_obj_set_style_local_text_font(timeDD2, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &open_sans_light);
|
lv_obj_set_style_local_text_font(timeDD2, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &open_sans_light);
|
||||||
lv_obj_set_style_local_text_color(timeDD2, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, Convert(settingsController.GetPTSColorTime()));
|
lv_obj_set_style_local_text_color(timeDD2, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, Convert(settingsController.GetPTSColorTime()));
|
||||||
lv_label_set_text(timeDD2, "00");
|
lv_label_set_text_static(timeDD2, "00");
|
||||||
lv_obj_align(timeDD2, timebar, LV_ALIGN_IN_BOTTOM_MID, 5, -5);
|
lv_obj_align(timeDD2, timebar, LV_ALIGN_IN_BOTTOM_MID, 5, -5);
|
||||||
|
|
||||||
timeAMPM = lv_label_create(lv_scr_act(), nullptr);
|
timeAMPM = lv_label_create(lv_scr_act(), nullptr);
|
||||||
lv_obj_set_style_local_text_color(timeAMPM, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, Convert(settingsController.GetPTSColorTime()));
|
lv_obj_set_style_local_text_color(timeAMPM, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, Convert(settingsController.GetPTSColorTime()));
|
||||||
lv_obj_set_style_local_text_line_space(timeAMPM, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, -3);
|
lv_obj_set_style_local_text_line_space(timeAMPM, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, -3);
|
||||||
lv_label_set_text(timeAMPM, "");
|
lv_label_set_text_static(timeAMPM, "");
|
||||||
lv_obj_align(timeAMPM, timebar, LV_ALIGN_IN_BOTTOM_LEFT, 2, -20);
|
lv_obj_align(timeAMPM, timebar, LV_ALIGN_IN_BOTTOM_LEFT, 2, -20);
|
||||||
|
|
||||||
// Create a 40px wide bar down the right side of the screen
|
// Create a 40px wide bar down the right side of the screen
|
||||||
@ -102,17 +103,17 @@ PineTimeStyle::PineTimeStyle(DisplayApp* app,
|
|||||||
// Display icons
|
// Display icons
|
||||||
batteryIcon = lv_label_create(lv_scr_act(), nullptr);
|
batteryIcon = lv_label_create(lv_scr_act(), nullptr);
|
||||||
lv_obj_set_style_local_text_color(batteryIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
|
lv_obj_set_style_local_text_color(batteryIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
|
||||||
lv_label_set_text(batteryIcon, Symbols::batteryFull);
|
lv_label_set_text_static(batteryIcon, Symbols::batteryFull);
|
||||||
lv_obj_align(batteryIcon, sidebar, LV_ALIGN_IN_TOP_MID, 0, 2);
|
lv_obj_align(batteryIcon, sidebar, LV_ALIGN_IN_TOP_MID, 0, 2);
|
||||||
lv_obj_set_auto_realign(batteryIcon, true);
|
lv_obj_set_auto_realign(batteryIcon, true);
|
||||||
|
|
||||||
bleIcon = lv_label_create(lv_scr_act(), nullptr);
|
bleIcon = lv_label_create(lv_scr_act(), nullptr);
|
||||||
lv_obj_set_style_local_text_color(bleIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x000000));
|
lv_obj_set_style_local_text_color(bleIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x000000));
|
||||||
lv_label_set_text(bleIcon, "");
|
lv_label_set_text_static(bleIcon, "");
|
||||||
|
|
||||||
notificationIcon = lv_label_create(lv_scr_act(), nullptr);
|
notificationIcon = lv_label_create(lv_scr_act(), nullptr);
|
||||||
lv_obj_set_style_local_text_color(notificationIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x000000));
|
lv_obj_set_style_local_text_color(notificationIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x000000));
|
||||||
lv_label_set_text(notificationIcon, "");
|
lv_label_set_text_static(notificationIcon, "");
|
||||||
|
|
||||||
// Calendar icon
|
// Calendar icon
|
||||||
calendarOuter = lv_obj_create(lv_scr_act(), nullptr);
|
calendarOuter = lv_obj_create(lv_scr_act(), nullptr);
|
||||||
@ -154,17 +155,17 @@ PineTimeStyle::PineTimeStyle(DisplayApp* app,
|
|||||||
// Display date
|
// Display date
|
||||||
dateDayOfWeek = lv_label_create(lv_scr_act(), nullptr);
|
dateDayOfWeek = lv_label_create(lv_scr_act(), nullptr);
|
||||||
lv_obj_set_style_local_text_color(dateDayOfWeek, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
|
lv_obj_set_style_local_text_color(dateDayOfWeek, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
|
||||||
lv_label_set_text(dateDayOfWeek, "THU");
|
lv_label_set_text_static(dateDayOfWeek, "THU");
|
||||||
lv_obj_align(dateDayOfWeek, sidebar, LV_ALIGN_CENTER, 0, -34);
|
lv_obj_align(dateDayOfWeek, sidebar, LV_ALIGN_CENTER, 0, -34);
|
||||||
|
|
||||||
dateDay = lv_label_create(lv_scr_act(), nullptr);
|
dateDay = lv_label_create(lv_scr_act(), nullptr);
|
||||||
lv_obj_set_style_local_text_color(dateDay, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
|
lv_obj_set_style_local_text_color(dateDay, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
|
||||||
lv_label_set_text(dateDay, "25");
|
lv_label_set_text_static(dateDay, "25");
|
||||||
lv_obj_align(dateDay, sidebar, LV_ALIGN_CENTER, 0, 3);
|
lv_obj_align(dateDay, sidebar, LV_ALIGN_CENTER, 0, 3);
|
||||||
|
|
||||||
dateMonth = lv_label_create(lv_scr_act(), nullptr);
|
dateMonth = lv_label_create(lv_scr_act(), nullptr);
|
||||||
lv_obj_set_style_local_text_color(dateMonth, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
|
lv_obj_set_style_local_text_color(dateMonth, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
|
||||||
lv_label_set_text(dateMonth, "MAR");
|
lv_label_set_text_static(dateMonth, "MAR");
|
||||||
lv_obj_align(dateMonth, sidebar, LV_ALIGN_CENTER, 0, 32);
|
lv_obj_align(dateMonth, sidebar, LV_ALIGN_CENTER, 0, 32);
|
||||||
|
|
||||||
// Step count gauge
|
// Step count gauge
|
||||||
@ -199,7 +200,7 @@ PineTimeStyle::PineTimeStyle(DisplayApp* 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, "");
|
||||||
|
|
||||||
btnNextTime = lv_btn_create(lv_scr_act(), nullptr);
|
btnNextTime = lv_btn_create(lv_scr_act(), nullptr);
|
||||||
btnNextTime->user_data = this;
|
btnNextTime->user_data = this;
|
||||||
@ -339,9 +340,10 @@ bool PineTimeStyle::OnButtonPushed() {
|
|||||||
|
|
||||||
void PineTimeStyle::SetBatteryIcon() {
|
void PineTimeStyle::SetBatteryIcon() {
|
||||||
auto batteryPercent = batteryPercentRemaining.Get();
|
auto batteryPercent = batteryPercentRemaining.Get();
|
||||||
lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryPercent));
|
lv_label_set_text_static(batteryIcon, BatteryIcon::GetBatteryIcon(batteryPercent));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void PineTimeStyle::AlignIcons() {
|
void PineTimeStyle::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);
|
||||||
@ -357,7 +359,7 @@ void PineTimeStyle::Refresh() {
|
|||||||
isCharging = batteryController.IsCharging();
|
isCharging = batteryController.IsCharging();
|
||||||
if (isCharging.IsUpdated()) {
|
if (isCharging.IsUpdated()) {
|
||||||
if (isCharging.Get()) {
|
if (isCharging.Get()) {
|
||||||
lv_label_set_text(batteryIcon, Symbols::plug);
|
lv_label_set_text_static(batteryIcon, Symbols::plug);
|
||||||
} else {
|
} else {
|
||||||
SetBatteryIcon();
|
SetBatteryIcon();
|
||||||
}
|
}
|
||||||
@ -370,14 +372,15 @@ void PineTimeStyle::Refresh() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
bleState = bleController.IsConnected();
|
bleState = bleController.IsConnected();
|
||||||
if (bleState.IsUpdated()) {
|
bleRadioEnabled = bleController.IsRadioEnabled();
|
||||||
|
if (bleState.IsUpdated() || bleRadioEnabled.IsUpdated()) {
|
||||||
lv_label_set_text(bleIcon, BleIcon::GetIcon(bleState.Get()));
|
lv_label_set_text(bleIcon, BleIcon::GetIcon(bleState.Get()));
|
||||||
AlignIcons();
|
AlignIcons();
|
||||||
}
|
}
|
||||||
|
|
||||||
notificationState = notificatioManager.AreNewNotificationsAvailable();
|
notificationState = notificatioManager.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()));
|
||||||
AlignIcons();
|
AlignIcons();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -394,45 +397,31 @@ void PineTimeStyle::Refresh() {
|
|||||||
auto day = static_cast<unsigned>(yearMonthDay.day());
|
auto day = static_cast<unsigned>(yearMonthDay.day());
|
||||||
auto dayOfWeek = static_cast<Pinetime::Controllers::DateTime::Days>(date::weekday(yearMonthDay).iso_encoding());
|
auto dayOfWeek = static_cast<Pinetime::Controllers::DateTime::Days>(date::weekday(yearMonthDay).iso_encoding());
|
||||||
|
|
||||||
int hour = time.hours().count();
|
uint8_t hour = time.hours().count();
|
||||||
auto minute = time.minutes().count();
|
uint8_t minute = time.minutes().count();
|
||||||
|
|
||||||
char minutesChar[3];
|
if (displayedHour != hour || displayedMinute != minute) {
|
||||||
sprintf(minutesChar, "%02d", static_cast<int>(minute));
|
displayedHour = hour;
|
||||||
|
displayedMinute = minute;
|
||||||
char hoursChar[3];
|
|
||||||
char ampmChar[5];
|
|
||||||
if (settingsController.GetClockType() == Controllers::Settings::ClockType::H24) {
|
|
||||||
sprintf(hoursChar, "%02d", hour);
|
|
||||||
} else {
|
|
||||||
if (hour == 0 && hour != 12) {
|
|
||||||
hour = 12;
|
|
||||||
sprintf(ampmChar, "A\nM");
|
|
||||||
} else if (hour == 12 && hour != 0) {
|
|
||||||
hour = 12;
|
|
||||||
sprintf(ampmChar, "P\nM");
|
|
||||||
} else if (hour < 12 && hour != 0) {
|
|
||||||
sprintf(ampmChar, "A\nM");
|
|
||||||
} else if (hour > 12 && hour != 0) {
|
|
||||||
hour = hour - 12;
|
|
||||||
sprintf(ampmChar, "P\nM");
|
|
||||||
}
|
|
||||||
sprintf(hoursChar, "%02d", hour);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hoursChar[0] != displayedChar[0] or hoursChar[1] != displayedChar[1] or minutesChar[0] != displayedChar[2] or
|
|
||||||
minutesChar[1] != displayedChar[3]) {
|
|
||||||
displayedChar[0] = hoursChar[0];
|
|
||||||
displayedChar[1] = hoursChar[1];
|
|
||||||
displayedChar[2] = minutesChar[0];
|
|
||||||
displayedChar[3] = minutesChar[1];
|
|
||||||
|
|
||||||
if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) {
|
if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) {
|
||||||
|
char ampmChar[4] = "A\nM";
|
||||||
|
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(timeAMPM, ampmChar);
|
lv_label_set_text(timeAMPM, ampmChar);
|
||||||
|
// Should be padded with blank spaces, but the space character doesn't exist in the font
|
||||||
|
lv_label_set_text_fmt(timeDD1, "%02d", hour);
|
||||||
|
lv_label_set_text_fmt(timeDD2, "%02d", minute);
|
||||||
|
} else {
|
||||||
|
lv_label_set_text_fmt(timeDD1, "%02d", hour);
|
||||||
|
lv_label_set_text_fmt(timeDD2, "%02d", minute);
|
||||||
}
|
}
|
||||||
|
|
||||||
lv_label_set_text_fmt(timeDD1, "%s", hoursChar);
|
|
||||||
lv_label_set_text_fmt(timeDD2, "%s", minutesChar);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((year != currentYear) || (month != currentMonth) || (dayOfWeek != currentDayOfWeek) || (day != currentDay)) {
|
if ((year != currentYear) || (month != currentMonth) || (dayOfWeek != currentDayOfWeek) || (day != currentDay)) {
|
||||||
|
@ -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 {
|
||||||
@ -39,17 +40,19 @@ namespace Pinetime {
|
|||||||
void UpdateSelected(lv_obj_t *object, lv_event_t event);
|
void UpdateSelected(lv_obj_t *object, lv_event_t event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
char displayedChar[5];
|
uint8_t displayedHour = -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 {};
|
||||||
|
@ -1,13 +1,10 @@
|
|||||||
#include "StopWatch.h"
|
#include "displayapp/screens/StopWatch.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>
|
||||||
#include "projdefs.h"
|
#include <FreeRTOS.h>
|
||||||
#include "FreeRTOSConfig.h"
|
#include <task.h>
|
||||||
#include "task.h"
|
|
||||||
|
|
||||||
#include <tuple>
|
|
||||||
|
|
||||||
using namespace Pinetime::Applications::Screens;
|
using namespace Pinetime::Applications::Screens;
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
#include "components/datetime/DateTimeController.h"
|
#include "components/datetime/DateTimeController.h"
|
||||||
#include "displayapp/LittleVgl.h"
|
#include "displayapp/LittleVgl.h"
|
||||||
|
|
||||||
#include "FreeRTOS.h"
|
#include <FreeRTOS.h>
|
||||||
#include "portmacro_cmsis.h"
|
#include "portmacro_cmsis.h"
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
|
@ -33,7 +33,7 @@ Tile::Tile(uint8_t screenID,
|
|||||||
|
|
||||||
// Time
|
// Time
|
||||||
label_time = lv_label_create(lv_scr_act(), nullptr);
|
label_time = lv_label_create(lv_scr_act(), nullptr);
|
||||||
lv_label_set_text_fmt(label_time, "%02i:%02i", dateTimeController.Hours(), dateTimeController.Minutes());
|
lv_label_set_text(label_time, dateTimeController.FormattedTime().c_str());
|
||||||
lv_label_set_align(label_time, LV_LABEL_ALIGN_CENTER);
|
lv_label_set_align(label_time, LV_LABEL_ALIGN_CENTER);
|
||||||
lv_obj_align(label_time, nullptr, LV_ALIGN_IN_TOP_LEFT, 0, 0);
|
lv_obj_align(label_time, nullptr, LV_ALIGN_IN_TOP_LEFT, 0, 0);
|
||||||
|
|
||||||
@ -119,7 +119,7 @@ Tile::~Tile() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Tile::UpdateScreen() {
|
void Tile::UpdateScreen() {
|
||||||
lv_label_set_text_fmt(label_time, "%02i:%02i", dateTimeController.Hours(), dateTimeController.Minutes());
|
lv_label_set_text(label_time, dateTimeController.FormattedTime().c_str());
|
||||||
lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryController.PercentRemaining()));
|
lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryController.PercentRemaining()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
@ -51,6 +50,12 @@ void Timer::createButtons() {
|
|||||||
|
|
||||||
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(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);
|
||||||
@ -71,7 +76,7 @@ Timer::Timer(DisplayApp* app, Controllers::TimerController& timerController)
|
|||||||
lv_label_set_text(txtPlayPause, Symbols::pause);
|
lv_label_set_text(txtPlayPause, Symbols::pause);
|
||||||
} else {
|
} else {
|
||||||
lv_label_set_text(txtPlayPause, Symbols::play);
|
lv_label_set_text(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);
|
||||||
@ -98,7 +103,7 @@ void Timer::OnButtonEvent(lv_obj_t* obj, lv_event_t event) {
|
|||||||
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(txtPlayPause, Symbols::pause);
|
||||||
@ -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(time, "00:00");
|
||||||
lv_label_set_text(txtPlayPause, Symbols::play);
|
lv_label_set_text(txtPlayPause, Symbols::play);
|
||||||
secondsToSet = 0;
|
secondsToSet = 0;
|
||||||
minutesToSet = 0;
|
minutesToSet = 0;
|
||||||
createButtons();
|
CreateButtons();
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
@ -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;
|
||||||
@ -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;
|
||||||
@ -215,9 +214,9 @@ void WatchFaceAnalog::Refresh() {
|
|||||||
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();
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
@ -32,25 +32,24 @@ 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(batteryIcon, Symbols::batteryFull);
|
lv_label_set_text_static(batteryIcon, Symbols::batteryFull);
|
||||||
lv_obj_align(batteryIcon, lv_scr_act(), LV_ALIGN_IN_TOP_RIGHT, 0, 0);
|
lv_obj_align(batteryIcon, lv_scr_act(), LV_ALIGN_IN_TOP_RIGHT, 0, 0);
|
||||||
|
|
||||||
batteryPlug = lv_label_create(lv_scr_act(), nullptr);
|
batteryPlug = lv_label_create(lv_scr_act(), nullptr);
|
||||||
lv_obj_set_style_local_text_color(batteryPlug, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0xFF0000));
|
lv_obj_set_style_local_text_color(batteryPlug, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0xFF0000));
|
||||||
lv_label_set_text(batteryPlug, Symbols::plug);
|
lv_label_set_text_static(batteryPlug, Symbols::plug);
|
||||||
lv_obj_align(batteryPlug, batteryIcon, LV_ALIGN_OUT_LEFT_MID, -5, 0);
|
lv_obj_align(batteryPlug, batteryIcon, LV_ALIGN_OUT_LEFT_MID, -5, 0);
|
||||||
|
|
||||||
bleIcon = lv_label_create(lv_scr_act(), nullptr);
|
bleIcon = lv_label_create(lv_scr_act(), nullptr);
|
||||||
lv_obj_set_style_local_text_color(bleIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x0082FC));
|
lv_obj_set_style_local_text_color(bleIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x0082FC));
|
||||||
lv_label_set_text(bleIcon, Symbols::bluetooth);
|
lv_label_set_text_static(bleIcon, Symbols::bluetooth);
|
||||||
lv_obj_align(bleIcon, batteryPlug, LV_ALIGN_OUT_LEFT_MID, -5, 0);
|
lv_obj_align(bleIcon, batteryPlug, LV_ALIGN_OUT_LEFT_MID, -5, 0);
|
||||||
|
|
||||||
notificationIcon = lv_label_create(lv_scr_act(), nullptr);
|
notificationIcon = lv_label_create(lv_scr_act(), nullptr);
|
||||||
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, nullptr, LV_ALIGN_IN_TOP_LEFT, 0, 0);
|
lv_obj_align(notificationIcon, nullptr, LV_ALIGN_IN_TOP_LEFT, 0, 0);
|
||||||
|
|
||||||
label_date = lv_label_create(lv_scr_act(), nullptr);
|
label_date = lv_label_create(lv_scr_act(), nullptr);
|
||||||
@ -71,26 +70,26 @@ WatchFaceDigital::WatchFaceDigital(DisplayApp* 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, "");
|
||||||
|
|
||||||
heartbeatIcon = lv_label_create(lv_scr_act(), nullptr);
|
heartbeatIcon = lv_label_create(lv_scr_act(), nullptr);
|
||||||
lv_label_set_text(heartbeatIcon, Symbols::heartBeat);
|
lv_label_set_text_static(heartbeatIcon, Symbols::heartBeat);
|
||||||
lv_obj_set_style_local_text_color(heartbeatIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0xCE1B1B));
|
lv_obj_set_style_local_text_color(heartbeatIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0xCE1B1B));
|
||||||
lv_obj_align(heartbeatIcon, lv_scr_act(), LV_ALIGN_IN_BOTTOM_LEFT, 0, 0);
|
lv_obj_align(heartbeatIcon, lv_scr_act(), LV_ALIGN_IN_BOTTOM_LEFT, 0, 0);
|
||||||
|
|
||||||
heartbeatValue = lv_label_create(lv_scr_act(), nullptr);
|
heartbeatValue = lv_label_create(lv_scr_act(), nullptr);
|
||||||
lv_obj_set_style_local_text_color(heartbeatValue, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0xCE1B1B));
|
lv_obj_set_style_local_text_color(heartbeatValue, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0xCE1B1B));
|
||||||
lv_label_set_text(heartbeatValue, "");
|
lv_label_set_text_static(heartbeatValue, "");
|
||||||
lv_obj_align(heartbeatValue, heartbeatIcon, LV_ALIGN_OUT_RIGHT_MID, 5, 0);
|
lv_obj_align(heartbeatValue, heartbeatIcon, LV_ALIGN_OUT_RIGHT_MID, 5, 0);
|
||||||
|
|
||||||
stepValue = lv_label_create(lv_scr_act(), nullptr);
|
stepValue = lv_label_create(lv_scr_act(), nullptr);
|
||||||
lv_obj_set_style_local_text_color(stepValue, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x00FFE7));
|
lv_obj_set_style_local_text_color(stepValue, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x00FFE7));
|
||||||
lv_label_set_text(stepValue, "0");
|
lv_label_set_text_static(stepValue, "0");
|
||||||
lv_obj_align(stepValue, lv_scr_act(), LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0);
|
lv_obj_align(stepValue, lv_scr_act(), LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0);
|
||||||
|
|
||||||
stepIcon = lv_label_create(lv_scr_act(), nullptr);
|
stepIcon = lv_label_create(lv_scr_act(), nullptr);
|
||||||
lv_obj_set_style_local_text_color(stepIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x00FFE7));
|
lv_obj_set_style_local_text_color(stepIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x00FFE7));
|
||||||
lv_label_set_text(stepIcon, Symbols::shoe);
|
lv_label_set_text_static(stepIcon, Symbols::shoe);
|
||||||
lv_obj_align(stepIcon, stepValue, LV_ALIGN_OUT_LEFT_MID, -5, 0);
|
lv_obj_align(stepIcon, stepValue, LV_ALIGN_OUT_LEFT_MID, -5, 0);
|
||||||
|
|
||||||
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);
|
||||||
@ -105,7 +104,7 @@ WatchFaceDigital::~WatchFaceDigital() {
|
|||||||
void WatchFaceDigital::Refresh() {
|
void WatchFaceDigital::Refresh() {
|
||||||
powerPresent = batteryController.IsPowerPresent();
|
powerPresent = batteryController.IsPowerPresent();
|
||||||
if (powerPresent.IsUpdated()) {
|
if (powerPresent.IsUpdated()) {
|
||||||
lv_label_set_text(batteryPlug, BatteryIcon::GetPlugIcon(powerPresent.Get()));
|
lv_label_set_text_static(batteryPlug, BatteryIcon::GetPlugIcon(powerPresent.Get()));
|
||||||
}
|
}
|
||||||
|
|
||||||
batteryPercentRemaining = batteryController.PercentRemaining();
|
batteryPercentRemaining = batteryController.PercentRemaining();
|
||||||
@ -116,20 +115,21 @@ void WatchFaceDigital::Refresh() {
|
|||||||
} 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));
|
||||||
}
|
}
|
||||||
|
|
||||||
bleState = bleController.IsConnected();
|
bleState = bleController.IsConnected();
|
||||||
if (bleState.IsUpdated()) {
|
bleRadioEnabled = bleController.IsRadioEnabled();
|
||||||
|
if (bleState.IsUpdated() || bleRadioEnabled.IsUpdated()) {
|
||||||
lv_label_set_text(bleIcon, BleIcon::GetIcon(bleState.Get()));
|
lv_label_set_text(bleIcon, BleIcon::GetIcon(bleState.Get()));
|
||||||
}
|
}
|
||||||
lv_obj_align(batteryIcon, lv_scr_act(), LV_ALIGN_IN_TOP_RIGHT, 0, 0);
|
lv_obj_realign(batteryIcon);
|
||||||
lv_obj_align(batteryPlug, batteryIcon, LV_ALIGN_OUT_LEFT_MID, -5, 0);
|
lv_obj_realign(batteryPlug);
|
||||||
lv_obj_align(bleIcon, batteryPlug, LV_ALIGN_OUT_LEFT_MID, -5, 0);
|
lv_obj_realign(bleIcon);
|
||||||
|
|
||||||
notificationState = notificatioManager.AreNewNotificationsAvailable();
|
notificationState = notificatioManager.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();
|
||||||
@ -146,62 +146,41 @@ void WatchFaceDigital::Refresh() {
|
|||||||
auto day = static_cast<unsigned>(yearMonthDay.day());
|
auto day = static_cast<unsigned>(yearMonthDay.day());
|
||||||
auto dayOfWeek = static_cast<Pinetime::Controllers::DateTime::Days>(date::weekday(yearMonthDay).iso_encoding());
|
auto dayOfWeek = static_cast<Pinetime::Controllers::DateTime::Days>(date::weekday(yearMonthDay).iso_encoding());
|
||||||
|
|
||||||
int hour = time.hours().count();
|
uint8_t hour = time.hours().count();
|
||||||
auto minute = time.minutes().count();
|
uint8_t minute = time.minutes().count();
|
||||||
|
|
||||||
char minutesChar[3];
|
if (displayedHour != hour || displayedMinute != minute) {
|
||||||
sprintf(minutesChar, "%02d", static_cast<int>(minute));
|
displayedHour = hour;
|
||||||
|
displayedMinute = minute;
|
||||||
char hoursChar[3];
|
|
||||||
char ampmChar[3];
|
|
||||||
if (settingsController.GetClockType() == Controllers::Settings::ClockType::H24) {
|
|
||||||
sprintf(hoursChar, "%02d", hour);
|
|
||||||
} else {
|
|
||||||
if (hour == 0 && hour != 12) {
|
|
||||||
hour = 12;
|
|
||||||
sprintf(ampmChar, "AM");
|
|
||||||
} else if (hour == 12 && hour != 0) {
|
|
||||||
hour = 12;
|
|
||||||
sprintf(ampmChar, "PM");
|
|
||||||
} else if (hour < 12 && hour != 0) {
|
|
||||||
sprintf(ampmChar, "AM");
|
|
||||||
} else if (hour > 12 && hour != 0) {
|
|
||||||
hour = hour - 12;
|
|
||||||
sprintf(ampmChar, "PM");
|
|
||||||
}
|
|
||||||
sprintf(hoursChar, "%02d", hour);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((hoursChar[0] != displayedChar[0]) or (hoursChar[1] != displayedChar[1]) or (minutesChar[0] != displayedChar[2]) or
|
|
||||||
(minutesChar[1] != displayedChar[3])) {
|
|
||||||
displayedChar[0] = hoursChar[0];
|
|
||||||
displayedChar[1] = hoursChar[1];
|
|
||||||
displayedChar[2] = minutesChar[0];
|
|
||||||
displayedChar[3] = minutesChar[1];
|
|
||||||
|
|
||||||
if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) {
|
if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) {
|
||||||
lv_label_set_text(label_time_ampm, ampmChar);
|
char ampmChar[3] = "AM";
|
||||||
if (hoursChar[0] == '0') {
|
if (hour == 0) {
|
||||||
hoursChar[0] = ' ';
|
hour = 12;
|
||||||
|
} else if (hour == 12) {
|
||||||
|
ampmChar[0] = 'P';
|
||||||
|
} else if (hour > 12) {
|
||||||
|
hour = hour - 12;
|
||||||
|
ampmChar[0] = 'P';
|
||||||
}
|
}
|
||||||
}
|
lv_label_set_text(label_time_ampm, ampmChar);
|
||||||
|
lv_label_set_text_fmt(label_time, "%2d:%02d", hour, minute);
|
||||||
lv_label_set_text_fmt(label_time, "%s:%s", hoursChar, minutesChar);
|
|
||||||
|
|
||||||
if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) {
|
|
||||||
lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_IN_RIGHT_MID, 0, 0);
|
lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_IN_RIGHT_MID, 0, 0);
|
||||||
} else {
|
} else {
|
||||||
|
lv_label_set_text_fmt(label_time, "%02d:%02d", hour, minute);
|
||||||
lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_CENTER, 0, 0);
|
lv_obj_align(label_time, lv_scr_act(), LV_ALIGN_CENTER, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((year != currentYear) || (month != currentMonth) || (dayOfWeek != currentDayOfWeek) || (day != currentDay)) {
|
if ((year != currentYear) || (month != currentMonth) || (dayOfWeek != currentDayOfWeek) || (day != currentDay)) {
|
||||||
if (settingsController.GetClockType() == Controllers::Settings::ClockType::H24) {
|
if (settingsController.GetClockType() == Controllers::Settings::ClockType::H24) {
|
||||||
lv_label_set_text_fmt(label_date, "%s %d %s %d", dateTimeController.DayOfWeekShortToString(), day, dateTimeController.MonthShortToString(), year);
|
lv_label_set_text_fmt(
|
||||||
|
label_date, "%s %d %s %d", dateTimeController.DayOfWeekShortToString(), day, dateTimeController.MonthShortToString(), year);
|
||||||
} else {
|
} else {
|
||||||
lv_label_set_text_fmt(label_date, "%s %s %d %d", dateTimeController.DayOfWeekShortToString(), dateTimeController.MonthShortToString(), day, year);
|
lv_label_set_text_fmt(
|
||||||
|
label_date, "%s %s %d %d", dateTimeController.DayOfWeekShortToString(), dateTimeController.MonthShortToString(), day, year);
|
||||||
}
|
}
|
||||||
lv_obj_align(label_date, lv_scr_act(), LV_ALIGN_CENTER, 0, 60);
|
lv_obj_realign(label_date);
|
||||||
|
|
||||||
currentYear = year;
|
currentYear = year;
|
||||||
currentMonth = month;
|
currentMonth = month;
|
||||||
@ -221,15 +200,15 @@ void WatchFaceDigital::Refresh() {
|
|||||||
lv_label_set_text_static(heartbeatValue, "");
|
lv_label_set_text_static(heartbeatValue, "");
|
||||||
}
|
}
|
||||||
|
|
||||||
lv_obj_align(heartbeatIcon, lv_scr_act(), LV_ALIGN_IN_BOTTOM_LEFT, 0, 0);
|
lv_obj_realign(heartbeatIcon);
|
||||||
lv_obj_align(heartbeatValue, heartbeatIcon, LV_ALIGN_OUT_RIGHT_MID, 5, 0);
|
lv_obj_realign(heartbeatValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
stepCount = motionController.NbSteps();
|
stepCount = motionController.NbSteps();
|
||||||
motionSensorOk = motionController.IsSensorOk();
|
motionSensorOk = motionController.IsSensorOk();
|
||||||
if (stepCount.IsUpdated() || motionSensorOk.IsUpdated()) {
|
if (stepCount.IsUpdated() || motionSensorOk.IsUpdated()) {
|
||||||
lv_label_set_text_fmt(stepValue, "%lu", stepCount.Get());
|
lv_label_set_text_fmt(stepValue, "%lu", stepCount.Get());
|
||||||
lv_obj_align(stepValue, lv_scr_act(), LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0);
|
lv_obj_realign(stepValue);
|
||||||
lv_obj_align(stepIcon, stepValue, LV_ALIGN_OUT_LEFT_MID, -5, 0);
|
lv_obj_realign(stepIcon);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
@ -35,16 +36,18 @@ namespace Pinetime {
|
|||||||
void Refresh() override;
|
void Refresh() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
char displayedChar[5] {};
|
uint8_t displayedHour = -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 {};
|
||||||
|
183
src/displayapp/screens/WatchFaceTerminal.cpp
Normal file
183
src/displayapp/screens/WatchFaceTerminal.cpp
Normal 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());
|
||||||
|
}
|
||||||
|
}
|
81
src/displayapp/screens/WatchFaceTerminal.h
Normal file
81
src/displayapp/screens/WatchFaceTerminal.h
Normal 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;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -35,7 +35,7 @@ QuickSettings::QuickSettings(Pinetime::Applications::DisplayApp* app,
|
|||||||
|
|
||||||
// Time
|
// Time
|
||||||
label_time = lv_label_create(lv_scr_act(), nullptr);
|
label_time = lv_label_create(lv_scr_act(), nullptr);
|
||||||
lv_label_set_text_fmt(label_time, "%02i:%02i", dateTimeController.Hours(), dateTimeController.Minutes());
|
lv_label_set_text(label_time, dateTimeController.FormattedTime().c_str());
|
||||||
lv_label_set_align(label_time, LV_LABEL_ALIGN_CENTER);
|
lv_label_set_align(label_time, LV_LABEL_ALIGN_CENTER);
|
||||||
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);
|
||||||
|
|
||||||
@ -123,7 +123,7 @@ QuickSettings::~QuickSettings() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void QuickSettings::UpdateScreen() {
|
void QuickSettings::UpdateScreen() {
|
||||||
lv_label_set_text_fmt(label_time, "%02i:%02i", dateTimeController.Hours(), dateTimeController.Minutes());
|
lv_label_set_text(label_time, dateTimeController.FormattedTime().c_str());
|
||||||
lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryController.PercentRemaining()));
|
lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryController.PercentRemaining()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
93
src/displayapp/screens/settings/SettingBluetooth.cpp
Normal file
93
src/displayapp/screens/settings/SettingBluetooth.cpp
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
31
src/displayapp/screens/settings/SettingBluetooth.h
Normal file
31
src/displayapp/screens/settings/SettingBluetooth.h
Normal 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;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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];
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include <nrf_log.h>
|
#include <nrf_log.h>
|
||||||
#include "displayapp/DisplayApp.h"
|
#include "displayapp/DisplayApp.h"
|
||||||
#include "displayapp/screens/Symbols.h"
|
#include "displayapp/screens/Symbols.h"
|
||||||
|
#include "components/settings/Settings.h"
|
||||||
|
|
||||||
using namespace Pinetime::Applications::Screens;
|
using namespace Pinetime::Applications::Screens;
|
||||||
|
|
||||||
@ -16,23 +17,24 @@ namespace {
|
|||||||
constexpr int16_t POS_Y_MINUS = 40;
|
constexpr int16_t POS_Y_MINUS = 40;
|
||||||
constexpr int16_t OFS_Y_COLON = -2;
|
constexpr int16_t OFS_Y_COLON = -2;
|
||||||
|
|
||||||
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<SettingSetTime *>(obj->user_data);
|
auto* screen = static_cast<SettingSetTime*>(obj->user_data);
|
||||||
screen->HandleButtonPress(obj, event);
|
screen->HandleButtonPress(obj, event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SettingSetTime::SettingSetTime(Pinetime::Applications::DisplayApp *app, Pinetime::Controllers::DateTime &dateTimeController) :
|
SettingSetTime::SettingSetTime(Pinetime::Applications::DisplayApp* app,
|
||||||
Screen(app),
|
Pinetime::Controllers::DateTime& dateTimeController,
|
||||||
dateTimeController {dateTimeController} {
|
Pinetime::Controllers::Settings& settingsController)
|
||||||
lv_obj_t * title = lv_label_create(lv_scr_act(), nullptr);
|
: Screen(app), dateTimeController {dateTimeController}, settingsController {settingsController} {
|
||||||
|
lv_obj_t* title = lv_label_create(lv_scr_act(), nullptr);
|
||||||
lv_label_set_text_static(title, "Set current time");
|
lv_label_set_text_static(title, "Set current time");
|
||||||
lv_label_set_align(title, LV_LABEL_ALIGN_CENTER);
|
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_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_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_obj_set_style_local_text_color(icon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_ORANGE);
|
||||||
|
|
||||||
lv_label_set_text_static(icon, Symbols::clock);
|
lv_label_set_text_static(icon, Symbols::clock);
|
||||||
lv_label_set_align(icon, LV_LABEL_ALIGN_CENTER);
|
lv_label_set_align(icon, LV_LABEL_ALIGN_CENTER);
|
||||||
lv_obj_align(icon, title, LV_ALIGN_OUT_LEFT_MID, -10, 0);
|
lv_obj_align(icon, title, LV_ALIGN_OUT_LEFT_MID, -10, 0);
|
||||||
@ -45,7 +47,7 @@ SettingSetTime::SettingSetTime(Pinetime::Applications::DisplayApp *app, Pinetime
|
|||||||
lv_obj_align(lblHours, lv_scr_act(), LV_ALIGN_CENTER, POS_X_HOURS, POS_Y_TEXT);
|
lv_obj_align(lblHours, lv_scr_act(), LV_ALIGN_CENTER, POS_X_HOURS, POS_Y_TEXT);
|
||||||
lv_obj_set_auto_realign(lblHours, true);
|
lv_obj_set_auto_realign(lblHours, true);
|
||||||
|
|
||||||
lv_obj_t * lblColon1 = lv_label_create(lv_scr_act(), nullptr);
|
lv_obj_t* lblColon1 = lv_label_create(lv_scr_act(), nullptr);
|
||||||
lv_obj_set_style_local_text_font(lblColon1, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_42);
|
lv_obj_set_style_local_text_font(lblColon1, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_42);
|
||||||
lv_label_set_text_static(lblColon1, ":");
|
lv_label_set_text_static(lblColon1, ":");
|
||||||
lv_label_set_align(lblColon1, LV_LABEL_ALIGN_CENTER);
|
lv_label_set_align(lblColon1, LV_LABEL_ALIGN_CENTER);
|
||||||
@ -59,18 +61,24 @@ SettingSetTime::SettingSetTime(Pinetime::Applications::DisplayApp *app, Pinetime
|
|||||||
lv_obj_align(lblMinutes, lv_scr_act(), LV_ALIGN_CENTER, POS_X_MINUTES, POS_Y_TEXT);
|
lv_obj_align(lblMinutes, lv_scr_act(), LV_ALIGN_CENTER, POS_X_MINUTES, POS_Y_TEXT);
|
||||||
lv_obj_set_auto_realign(lblMinutes, true);
|
lv_obj_set_auto_realign(lblMinutes, true);
|
||||||
|
|
||||||
lv_obj_t * lblColon2 = lv_label_create(lv_scr_act(), nullptr);
|
lv_obj_t* lblColon2 = lv_label_create(lv_scr_act(), nullptr);
|
||||||
lv_obj_set_style_local_text_font(lblColon2, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_42);
|
lv_obj_set_style_local_text_font(lblColon2, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_42);
|
||||||
lv_label_set_text_static(lblColon2, ":");
|
lv_label_set_text_static(lblColon2, ":");
|
||||||
lv_label_set_align(lblColon2, LV_LABEL_ALIGN_CENTER);
|
lv_label_set_align(lblColon2, LV_LABEL_ALIGN_CENTER);
|
||||||
lv_obj_align(lblColon2, lv_scr_act(), LV_ALIGN_CENTER, (POS_X_MINUTES + POS_X_SECONDS) / 2, POS_Y_TEXT + OFS_Y_COLON);
|
lv_obj_align(lblColon2, lv_scr_act(), LV_ALIGN_CENTER, (POS_X_MINUTES + POS_X_SECONDS) / 2, POS_Y_TEXT + OFS_Y_COLON);
|
||||||
|
|
||||||
lv_obj_t * lblSeconds = lv_label_create(lv_scr_act(), nullptr);
|
lv_obj_t* lblSeconds = lv_label_create(lv_scr_act(), nullptr);
|
||||||
lv_obj_set_style_local_text_font(lblSeconds, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_42);
|
lv_obj_set_style_local_text_font(lblSeconds, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_42);
|
||||||
lv_label_set_text_static(lblSeconds, "00");
|
lv_label_set_text_static(lblSeconds, "00");
|
||||||
lv_label_set_align(lblSeconds, LV_LABEL_ALIGN_CENTER);
|
lv_label_set_align(lblSeconds, LV_LABEL_ALIGN_CENTER);
|
||||||
lv_obj_align(lblSeconds, lv_scr_act(), LV_ALIGN_CENTER, POS_X_SECONDS, POS_Y_TEXT);
|
lv_obj_align(lblSeconds, lv_scr_act(), LV_ALIGN_CENTER, POS_X_SECONDS, POS_Y_TEXT);
|
||||||
|
|
||||||
|
lblampm = lv_label_create(lv_scr_act(), nullptr);
|
||||||
|
lv_obj_set_style_local_text_font(lblampm, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, &jetbrains_mono_bold_20);
|
||||||
|
lv_label_set_text_static(lblampm, " ");
|
||||||
|
lv_label_set_align(lblampm, LV_LABEL_ALIGN_CENTER);
|
||||||
|
lv_obj_align(lblampm, lv_scr_act(), LV_ALIGN_CENTER, POS_X_SECONDS, POS_Y_PLUS);
|
||||||
|
|
||||||
btnHoursPlus = lv_btn_create(lv_scr_act(), nullptr);
|
btnHoursPlus = lv_btn_create(lv_scr_act(), nullptr);
|
||||||
btnHoursPlus->user_data = this;
|
btnHoursPlus->user_data = this;
|
||||||
lv_obj_set_size(btnHoursPlus, 50, 40);
|
lv_obj_set_size(btnHoursPlus, 50, 40);
|
||||||
@ -105,38 +113,69 @@ SettingSetTime::SettingSetTime(Pinetime::Applications::DisplayApp *app, Pinetime
|
|||||||
lv_obj_align(btnSetTime, lv_scr_act(), LV_ALIGN_IN_BOTTOM_MID, 0, 0);
|
lv_obj_align(btnSetTime, lv_scr_act(), LV_ALIGN_IN_BOTTOM_MID, 0, 0);
|
||||||
lv_obj_set_style_local_value_str(btnSetTime, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, "Set");
|
lv_obj_set_style_local_value_str(btnSetTime, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, "Set");
|
||||||
lv_obj_set_event_cb(btnSetTime, event_handler);
|
lv_obj_set_event_cb(btnSetTime, event_handler);
|
||||||
|
|
||||||
|
SetHourLabels();
|
||||||
}
|
}
|
||||||
|
|
||||||
SettingSetTime::~SettingSetTime() {
|
SettingSetTime::~SettingSetTime() {
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
}
|
}
|
||||||
|
|
||||||
void SettingSetTime::HandleButtonPress(lv_obj_t *object, lv_event_t event) {
|
void SettingSetTime::SetHourLabels() {
|
||||||
|
if (settingsController.GetClockType() == Controllers::Settings::ClockType::H12) {
|
||||||
|
switch (hoursValue) {
|
||||||
|
case 0:
|
||||||
|
lv_label_set_text_static(lblHours, "12");
|
||||||
|
lv_label_set_text_static(lblampm, "AM");
|
||||||
|
break;
|
||||||
|
case 1 ... 11:
|
||||||
|
lv_label_set_text_fmt(lblHours, "%02d", hoursValue);
|
||||||
|
lv_label_set_text_static(lblampm, "AM");
|
||||||
|
break;
|
||||||
|
case 12:
|
||||||
|
lv_label_set_text_static(lblHours, "12");
|
||||||
|
lv_label_set_text_static(lblampm, "PM");
|
||||||
|
break;
|
||||||
|
case 13 ... 23:
|
||||||
|
lv_label_set_text_fmt(lblHours, "%02d", hoursValue - 12);
|
||||||
|
lv_label_set_text_static(lblampm, "PM");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
lv_label_set_text_fmt(lblHours, "%02d", hoursValue);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SettingSetTime::HandleButtonPress(lv_obj_t* object, lv_event_t event) {
|
||||||
if (event != LV_EVENT_CLICKED)
|
if (event != LV_EVENT_CLICKED)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (object == btnHoursPlus) {
|
if (object == btnHoursPlus) {
|
||||||
hoursValue++;
|
hoursValue++;
|
||||||
if (hoursValue > 23)
|
if (hoursValue > 23) {
|
||||||
hoursValue = 0;
|
hoursValue = 0;
|
||||||
lv_label_set_text_fmt(lblHours, "%02d", hoursValue);
|
}
|
||||||
|
SetHourLabels();
|
||||||
lv_btn_set_state(btnSetTime, LV_BTN_STATE_RELEASED);
|
lv_btn_set_state(btnSetTime, LV_BTN_STATE_RELEASED);
|
||||||
} else if (object == btnHoursMinus) {
|
} else if (object == btnHoursMinus) {
|
||||||
hoursValue--;
|
hoursValue--;
|
||||||
if (hoursValue < 0)
|
if (hoursValue < 0) {
|
||||||
hoursValue = 23;
|
hoursValue = 23;
|
||||||
lv_label_set_text_fmt(lblHours, "%02d", hoursValue);
|
}
|
||||||
|
SetHourLabels();
|
||||||
lv_btn_set_state(btnSetTime, LV_BTN_STATE_RELEASED);
|
lv_btn_set_state(btnSetTime, LV_BTN_STATE_RELEASED);
|
||||||
} else if (object == btnMinutesPlus) {
|
} else if (object == btnMinutesPlus) {
|
||||||
minutesValue++;
|
minutesValue++;
|
||||||
if (minutesValue > 59)
|
if (minutesValue > 59) {
|
||||||
minutesValue = 0;
|
minutesValue = 0;
|
||||||
|
}
|
||||||
lv_label_set_text_fmt(lblMinutes, "%02d", minutesValue);
|
lv_label_set_text_fmt(lblMinutes, "%02d", minutesValue);
|
||||||
lv_btn_set_state(btnSetTime, LV_BTN_STATE_RELEASED);
|
lv_btn_set_state(btnSetTime, LV_BTN_STATE_RELEASED);
|
||||||
} else if (object == btnMinutesMinus) {
|
} else if (object == btnMinutesMinus) {
|
||||||
minutesValue--;
|
minutesValue--;
|
||||||
if (minutesValue < 0)
|
if (minutesValue < 0) {
|
||||||
minutesValue = 59;
|
minutesValue = 59;
|
||||||
|
}
|
||||||
lv_label_set_text_fmt(lblMinutes, "%02d", minutesValue);
|
lv_label_set_text_fmt(lblMinutes, "%02d", minutesValue);
|
||||||
lv_btn_set_state(btnSetTime, LV_BTN_STATE_RELEASED);
|
lv_btn_set_state(btnSetTime, LV_BTN_STATE_RELEASED);
|
||||||
} else if (object == btnSetTime) {
|
} else if (object == btnSetTime) {
|
||||||
|
@ -3,30 +3,37 @@
|
|||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <lvgl/lvgl.h>
|
#include <lvgl/lvgl.h>
|
||||||
#include "components/datetime/DateTimeController.h"
|
#include "components/datetime/DateTimeController.h"
|
||||||
|
#include "components/settings/Settings.h"
|
||||||
#include "displayapp/screens/Screen.h"
|
#include "displayapp/screens/Screen.h"
|
||||||
|
|
||||||
namespace Pinetime {
|
namespace Pinetime {
|
||||||
namespace Applications {
|
namespace Applications {
|
||||||
namespace Screens {
|
namespace Screens {
|
||||||
class SettingSetTime : public Screen{
|
class SettingSetTime : public Screen {
|
||||||
public:
|
public:
|
||||||
SettingSetTime(DisplayApp* app, Pinetime::Controllers::DateTime &dateTimeController);
|
SettingSetTime(DisplayApp* app,
|
||||||
~SettingSetTime() override;
|
Pinetime::Controllers::DateTime& dateTimeController,
|
||||||
|
Pinetime::Controllers::Settings& settingsController);
|
||||||
|
~SettingSetTime() override;
|
||||||
|
|
||||||
void HandleButtonPress(lv_obj_t *object, lv_event_t event);
|
void HandleButtonPress(lv_obj_t* object, lv_event_t event);
|
||||||
|
|
||||||
private:
|
|
||||||
Controllers::DateTime& dateTimeController;
|
|
||||||
|
|
||||||
int hoursValue;
|
private:
|
||||||
int minutesValue;
|
Controllers::DateTime& dateTimeController;
|
||||||
lv_obj_t * lblHours;
|
Controllers::Settings& settingsController;
|
||||||
lv_obj_t * lblMinutes;
|
|
||||||
lv_obj_t * btnHoursPlus;
|
void SetHourLabels();
|
||||||
lv_obj_t * btnHoursMinus;
|
|
||||||
lv_obj_t * btnMinutesPlus;
|
int hoursValue;
|
||||||
lv_obj_t * btnMinutesMinus;
|
int minutesValue;
|
||||||
lv_obj_t * btnSetTime;
|
lv_obj_t* lblHours;
|
||||||
|
lv_obj_t* lblMinutes;
|
||||||
|
lv_obj_t* lblampm;
|
||||||
|
lv_obj_t* btnHoursPlus;
|
||||||
|
lv_obj_t* btnHoursMinus;
|
||||||
|
lv_obj_t* btnMinutesPlus;
|
||||||
|
lv_obj_t* btnMinutesMinus;
|
||||||
|
lv_obj_t* btnSetTime;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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"
|
||||||
|
@ -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 {
|
||||||
|
@ -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} {
|
||||||
|
@ -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()];
|
||||||
|
@ -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 {{
|
||||||
|
{Symbols::shoe, "Steps", Apps::SettingSteps},
|
||||||
|
{Symbols::clock, "Set date", Apps::SettingSetDate},
|
||||||
|
{Symbols::clock, "Set time", Apps::SettingSetTime},
|
||||||
|
{Symbols::batteryHalf, "Battery", Apps::BatteryInfo}}};
|
||||||
|
|
||||||
std::array<Screens::List::Applications, 4> applications {{{Symbols::shoe, "Steps", Apps::SettingSteps},
|
return std::make_unique<Screens::List>(1, 4, app, settingsController, applications);
|
||||||
{Symbols::clock, "Set date", Apps::SettingSetDate},
|
|
||||||
{Symbols::clock, "Set time", Apps::SettingSetTime},
|
|
||||||
{Symbols::batteryHalf, "Battery", Apps::BatteryInfo}}};
|
|
||||||
|
|
||||||
return std::make_unique<Screens::List>(1, 3, 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);
|
||||||
}
|
}
|
||||||
|
@ -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();
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -36,8 +36,8 @@ void Hrs3300::Init() {
|
|||||||
// HRS and ALS both in 16-bit mode
|
// HRS and ALS both in 16-bit mode
|
||||||
WriteRegister(static_cast<uint8_t>(Registers::Res), 0x88);
|
WriteRegister(static_cast<uint8_t>(Registers::Res), 0x88);
|
||||||
|
|
||||||
// 64x gain
|
// 8x gain, non default, reduced value for better readings
|
||||||
WriteRegister(static_cast<uint8_t>(Registers::Hgain), 0x10);
|
WriteRegister(static_cast<uint8_t>(Registers::Hgain), 0xc);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Hrs3300::Enable() {
|
void Hrs3300::Enable() {
|
||||||
@ -54,18 +54,18 @@ void Hrs3300::Disable() {
|
|||||||
WriteRegister(static_cast<uint8_t>(Registers::Enable), value);
|
WriteRegister(static_cast<uint8_t>(Registers::Enable), value);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t Hrs3300::ReadHrs() {
|
uint32_t Hrs3300::ReadHrs() {
|
||||||
auto m = ReadRegister(static_cast<uint8_t>(Registers::C0DataM));
|
auto m = ReadRegister(static_cast<uint8_t>(Registers::C0DataM));
|
||||||
auto h = ReadRegister(static_cast<uint8_t>(Registers::C0DataH));
|
auto h = ReadRegister(static_cast<uint8_t>(Registers::C0DataH));
|
||||||
auto l = ReadRegister(static_cast<uint8_t>(Registers::C0dataL));
|
auto l = ReadRegister(static_cast<uint8_t>(Registers::C0dataL));
|
||||||
return (m << 8) | ((h & 0x0f) << 4) | (l & 0x0f) | ((l & 0x30) << 12);
|
return ((l & 0x30) << 12) | (m << 8) | ((h & 0x0f) << 4) | (l & 0x0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t Hrs3300::ReadAls() {
|
uint32_t Hrs3300::ReadAls() {
|
||||||
auto m = ReadRegister(static_cast<uint8_t>(Registers::C1dataM));
|
auto m = ReadRegister(static_cast<uint8_t>(Registers::C1dataM));
|
||||||
auto h = ReadRegister(static_cast<uint8_t>(Registers::C1dataH));
|
auto h = ReadRegister(static_cast<uint8_t>(Registers::C1dataH));
|
||||||
auto l = ReadRegister(static_cast<uint8_t>(Registers::C1dataL));
|
auto l = ReadRegister(static_cast<uint8_t>(Registers::C1dataL));
|
||||||
return (m << 3) | ((h & 0x3f) << 11) | (l & 0x07);
|
return ((h & 0x3f) << 11) | (m << 3) | (l & 0x07);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Hrs3300::SetGain(uint8_t gain) {
|
void Hrs3300::SetGain(uint8_t gain) {
|
||||||
|
@ -30,8 +30,8 @@ namespace Pinetime {
|
|||||||
void Init();
|
void Init();
|
||||||
void Enable();
|
void Enable();
|
||||||
void Disable();
|
void Disable();
|
||||||
uint16_t ReadHrs();
|
uint32_t ReadHrs();
|
||||||
uint16_t ReadAls();
|
uint32_t ReadAls();
|
||||||
void SetGain(uint8_t gain);
|
void SetGain(uint8_t gain);
|
||||||
void SetDrive(uint8_t drive);
|
void SetDrive(uint8_t drive);
|
||||||
|
|
||||||
|
@ -65,8 +65,7 @@ void HeartRateTask::Work() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (measurementStarted) {
|
if (measurementStarted) {
|
||||||
auto hrs = heartRateSensor.ReadHrs();
|
ppg.Preprocess(static_cast<float>(heartRateSensor.ReadHrs()));
|
||||||
ppg.Preprocess(hrs);
|
|
||||||
auto bpm = ppg.HeartRate();
|
auto bpm = ppg.HeartRate();
|
||||||
|
|
||||||
if (lastBpm == 0 && bpm == 0)
|
if (lastBpm == 0 && bpm == 0)
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
13
src/main.cpp
13
src/main.cpp
@ -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"
|
||||||
@ -101,7 +102,11 @@ Pinetime::Controllers::Ble bleController;
|
|||||||
Pinetime::Controllers::HeartRateController heartRateController;
|
Pinetime::Controllers::HeartRateController heartRateController;
|
||||||
Pinetime::Applications::HeartRateTask heartRateApp(heartRateSensor, heartRateController);
|
Pinetime::Applications::HeartRateTask heartRateApp(heartRateSensor, heartRateController);
|
||||||
|
|
||||||
Pinetime::Controllers::DateTime dateTimeController;
|
Pinetime::Controllers::FS fs {spiNorFlash};
|
||||||
|
Pinetime::Controllers::Settings settingsController {fs};
|
||||||
|
Pinetime::Controllers::MotorController motorController {};
|
||||||
|
|
||||||
|
Pinetime::Controllers::DateTime dateTimeController {settingsController};
|
||||||
Pinetime::Drivers::Watchdog watchdog;
|
Pinetime::Drivers::Watchdog watchdog;
|
||||||
Pinetime::Drivers::WatchdogView watchdogView(watchdog);
|
Pinetime::Drivers::WatchdogView watchdogView(watchdog);
|
||||||
Pinetime::Controllers::NotificationManager notificationManager;
|
Pinetime::Controllers::NotificationManager notificationManager;
|
||||||
@ -110,10 +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::Controllers::FS fs {spiNorFlash};
|
|
||||||
Pinetime::Controllers::Settings settingsController {fs};
|
|
||||||
Pinetime::Controllers::MotorController motorController {};
|
|
||||||
|
|
||||||
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,
|
||||||
|
@ -31,6 +31,7 @@ namespace Pinetime {
|
|||||||
BatteryPercentageUpdated,
|
BatteryPercentageUpdated,
|
||||||
StartFileTransfer,
|
StartFileTransfer,
|
||||||
StopFileTransfer,
|
StopFileTransfer,
|
||||||
|
BleRadioEnableToggle
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
26
src/systemtask/SystemMonitor.cpp
Normal file
26
src/systemtask/SystemMonitor.cpp
Normal 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
|
@ -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
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,18 +1,10 @@
|
|||||||
#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 "drivers/Cst816s.h"
|
#include "drivers/Cst816s.h"
|
||||||
#include "drivers/St7789.h"
|
#include "drivers/St7789.h"
|
||||||
@ -115,7 +107,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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -197,13 +189,13 @@ void SystemTask::Work() {
|
|||||||
// Touchscreen
|
// Touchscreen
|
||||||
nrf_gpio_cfg_sense_input(PinMap::Cst816sIrq,
|
nrf_gpio_cfg_sense_input(PinMap::Cst816sIrq,
|
||||||
static_cast<nrf_gpio_pin_pull_t>(GPIO_PIN_CNF_PULL_Pullup),
|
static_cast<nrf_gpio_pin_pull_t>(GPIO_PIN_CNF_PULL_Pullup),
|
||||||
static_cast<nrf_gpio_pin_sense_t> GPIO_PIN_CNF_SENSE_Low);
|
static_cast<nrf_gpio_pin_sense_t>(GPIO_PIN_CNF_SENSE_Low));
|
||||||
|
|
||||||
pinConfig.skip_gpio_setup = true;
|
pinConfig.skip_gpio_setup = true;
|
||||||
pinConfig.hi_accuracy = false;
|
pinConfig.hi_accuracy = false;
|
||||||
pinConfig.is_watcher = false;
|
pinConfig.is_watcher = false;
|
||||||
pinConfig.sense = static_cast<nrf_gpiote_polarity_t>(NRF_GPIOTE_POLARITY_HITOLO);
|
pinConfig.sense = static_cast<nrf_gpiote_polarity_t>(NRF_GPIOTE_POLARITY_HITOLO);
|
||||||
pinConfig.pull = static_cast<nrf_gpio_pin_pull_t> GPIO_PIN_CNF_PULL_Pullup;
|
pinConfig.pull = static_cast<nrf_gpio_pin_pull_t>(GPIO_PIN_CNF_PULL_Pullup);
|
||||||
|
|
||||||
nrfx_gpiote_in_init(PinMap::Cst816sIrq, &pinConfig, nrfx_gpiote_evt_handler);
|
nrfx_gpiote_in_init(PinMap::Cst816sIrq, &pinConfig, nrfx_gpiote_evt_handler);
|
||||||
|
|
||||||
@ -239,6 +231,7 @@ void SystemTask::Work() {
|
|||||||
if (!bleController.IsFirmwareUpdating()) {
|
if (!bleController.IsFirmwareUpdating()) {
|
||||||
doNotGoToSleep = false;
|
doNotGoToSleep = false;
|
||||||
}
|
}
|
||||||
|
ReloadIdleTimer();
|
||||||
break;
|
break;
|
||||||
case Messages::DisableSleeping:
|
case Messages::DisableSleeping:
|
||||||
doNotGoToSleep = true;
|
doNotGoToSleep = true;
|
||||||
@ -261,7 +254,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();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -295,6 +288,9 @@ void SystemTask::Work() {
|
|||||||
case Messages::OnNewTime:
|
case Messages::OnNewTime:
|
||||||
ReloadIdleTimer();
|
ReloadIdleTimer();
|
||||||
displayApp.PushMessage(Pinetime::Applications::Display::Messages::UpdateDateTime);
|
displayApp.PushMessage(Pinetime::Applications::Display::Messages::UpdateDateTime);
|
||||||
|
if (alarmController.State() == Controllers::AlarmController::AlarmState::Set) {
|
||||||
|
alarmController.ScheduleAlarm();
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
case Messages::OnNewNotification:
|
case Messages::OnNewNotification:
|
||||||
if (settingsController.GetNotificationStatus() == Pinetime::Controllers::Settings::Notification::ON) {
|
if (settingsController.GetNotificationStatus() == Pinetime::Controllers::Settings::Notification::ON) {
|
||||||
@ -444,7 +440,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;
|
||||||
}
|
}
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
#include <FreeRTOS.h>
|
#include <FreeRTOS.h>
|
||||||
|
#include <queue.h>
|
||||||
#include <task.h>
|
#include <task.h>
|
||||||
#include <timers.h>
|
#include <timers.h>
|
||||||
#include <heartratetask/HeartRateTask.h>
|
#include <heartratetask/HeartRateTask.h>
|
||||||
@ -12,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"
|
||||||
@ -46,6 +46,7 @@ namespace Pinetime {
|
|||||||
class Hrs3300;
|
class Hrs3300;
|
||||||
}
|
}
|
||||||
namespace Controllers {
|
namespace Controllers {
|
||||||
|
class Battery;
|
||||||
class TouchHandler;
|
class TouchHandler;
|
||||||
class ButtonHandler;
|
class ButtonHandler;
|
||||||
}
|
}
|
||||||
@ -147,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
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user