Merge branch 'develop' into wake-time
This commit is contained in:
commit
27366bdfdf
113 changed files with 1271 additions and 780 deletions
32
.github/workflows/main.yml
vendored
32
.github/workflows/main.yml
vendored
|
@ -9,13 +9,13 @@ name: Build PineTime Firmware
|
||||||
# When to run this Workflow...
|
# When to run this Workflow...
|
||||||
on:
|
on:
|
||||||
|
|
||||||
# Run this Workflow when files are updated (Pushed) in the "master" Branch
|
# Run this Workflow when files are updated (Pushed) in the "master" and "develop" Branch
|
||||||
push:
|
push:
|
||||||
branches: [ master ]
|
branches: [ master, develop ]
|
||||||
|
|
||||||
# Also run this Workflow when a Pull Request is created or updated in the "master" Branch
|
# Also run this Workflow when a Pull Request is created or updated in the "master" and "develop" Branch
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [ master ]
|
branches: [ master, develop ]
|
||||||
|
|
||||||
# Steps to run for the Workflow
|
# Steps to run for the Workflow
|
||||||
jobs:
|
jobs:
|
||||||
|
@ -44,7 +44,7 @@ jobs:
|
||||||
|
|
||||||
- name: Install Embedded Arm Toolchain arm-none-eabi-gcc
|
- name: Install Embedded Arm Toolchain arm-none-eabi-gcc
|
||||||
if: steps.cache-toolchain.outputs.cache-hit != 'true' # Install toolchain if not found in cache
|
if: steps.cache-toolchain.outputs.cache-hit != 'true' # Install toolchain if not found in cache
|
||||||
uses: fiam/arm-none-eabi-gcc@v1.0.2
|
uses: fiam/arm-none-eabi-gcc@v1.0.4
|
||||||
with:
|
with:
|
||||||
# GNU Embedded Toolchain for Arm release name, in the V-YYYY-qZ format (e.g. "9-2019-q4")
|
# GNU Embedded Toolchain for Arm release name, in the V-YYYY-qZ format (e.g. "9-2019-q4")
|
||||||
release: 9-2020-q2
|
release: 9-2020-q2
|
||||||
|
@ -83,10 +83,11 @@ jobs:
|
||||||
if: steps.cache-mcuboot.outputs.cache-hit != 'true' # Install MCUBoot if not found in cache
|
if: steps.cache-mcuboot.outputs.cache-hit != 'true' # Install MCUBoot if not found in cache
|
||||||
run: |
|
run: |
|
||||||
cd ${{ runner.temp }}
|
cd ${{ runner.temp }}
|
||||||
git clone --branch v1.5.0 https://github.com/JuulLabs-OSS/mcuboot
|
git clone --branch v1.7.2 https://github.com/mcu-tools/mcuboot
|
||||||
|
|
||||||
- name: Install imgtool dependencies
|
- name: Install imgtool dependencies
|
||||||
run: pip3 install --user -r ${{ runner.temp }}/mcuboot/scripts/requirements.txt
|
run: |
|
||||||
|
pip3 install --user -r ${{ runner.temp }}/mcuboot/scripts/requirements.txt
|
||||||
|
|
||||||
- name: Install adafruit-nrfutil
|
- name: Install adafruit-nrfutil
|
||||||
run: |
|
run: |
|
||||||
|
@ -99,6 +100,8 @@ jobs:
|
||||||
|
|
||||||
- name: Checkout source files
|
- name: Checkout source files
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
|
||||||
- name: Show files
|
- name: Show files
|
||||||
run: set ; pwd ; ls -l
|
run: set ; pwd ; ls -l
|
||||||
|
@ -110,7 +113,7 @@ jobs:
|
||||||
run: |
|
run: |
|
||||||
mkdir -p build
|
mkdir -p build
|
||||||
cd build
|
cd build
|
||||||
cmake -DARM_NONE_EABI_TOOLCHAIN_PATH=${{ runner.temp }}/arm-none-eabi -DNRF5_SDK_PATH=${{ runner.temp }}/nrf5_sdk -DUSE_OPENOCD=1 ../
|
cmake -DARM_NONE_EABI_TOOLCHAIN_PATH=${{ runner.temp }}/arm-none-eabi -DNRF5_SDK_PATH=${{ runner.temp }}/nrf5_sdk -DUSE_OPENOCD=1 -DBUILD_DFU=1 ../
|
||||||
|
|
||||||
#########################################################################################
|
#########################################################################################
|
||||||
# Make and Upload DFU Package
|
# Make and Upload DFU Package
|
||||||
|
@ -125,19 +128,10 @@ jobs:
|
||||||
cd build
|
cd build
|
||||||
make pinetime-mcuboot-app
|
make pinetime-mcuboot-app
|
||||||
|
|
||||||
- name: Create firmware image
|
- name: Unzip DFU package
|
||||||
run: |
|
run: |
|
||||||
# The generated firmware binary looks like "pinetime-mcuboot-app-0.8.2.bin"
|
|
||||||
ls -l build/src/pinetime-mcuboot-app*.bin
|
|
||||||
${{ runner.temp }}/mcuboot/scripts/imgtool.py create --align 4 --version 1.0.0 --header-size 32 --slot-size 475136 --pad-header build/src/pinetime-mcuboot-app*.bin build/src/pinetime-mcuboot-app-img.bin
|
|
||||||
${{ runner.temp }}/mcuboot/scripts/imgtool.py verify build/src/pinetime-mcuboot-app-img.bin
|
|
||||||
|
|
||||||
- name: Create DFU package
|
|
||||||
run: |
|
|
||||||
~/.local/bin/adafruit-nrfutil dfu genpkg --dev-type 0x0052 --application build/src/pinetime-mcuboot-app-img.bin build/src/pinetime-mcuboot-app-dfu.zip
|
|
||||||
unzip -v build/src/pinetime-mcuboot-app-dfu.zip
|
|
||||||
# Unzip the package because Upload Artifact will zip up the files
|
# Unzip the package because Upload Artifact will zip up the files
|
||||||
unzip build/src/pinetime-mcuboot-app-dfu.zip -d build/src/pinetime-mcuboot-app-dfu
|
unzip build/src/pinetime-mcuboot-app-dfu*.zip -d build/src/pinetime-mcuboot-app-dfu
|
||||||
|
|
||||||
- name: Upload DFU package
|
- name: Upload DFU package
|
||||||
uses: actions/upload-artifact@v2
|
uses: actions/upload-artifact@v2
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
cmake_minimum_required(VERSION 3.10)
|
cmake_minimum_required(VERSION 3.10)
|
||||||
project(pinetime VERSION 1.3.0 LANGUAGES C CXX ASM)
|
project(pinetime VERSION 1.4.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)
|
||||||
|
@ -51,6 +51,14 @@ if(BUILD_DFU)
|
||||||
set(BUILD_DFU true)
|
set(BUILD_DFU true)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
option(WATCH_COLMI_P8 "Build for the Colmi P8" OFF)
|
||||||
|
set(TARGET_DEVICE "PineTime")
|
||||||
|
|
||||||
|
if(WATCH_COLMI_P8)
|
||||||
|
set(TARGET_DEVICE "Colmi P8")
|
||||||
|
add_definitions(-DWATCH_P8)
|
||||||
|
endif()
|
||||||
|
|
||||||
set(PROJECT_GIT_COMMIT_HASH "")
|
set(PROJECT_GIT_COMMIT_HASH "")
|
||||||
|
|
||||||
execute_process(COMMAND git rev-parse --short HEAD
|
execute_process(COMMAND git rev-parse --short HEAD
|
||||||
|
@ -68,6 +76,7 @@ message(" * Version : " ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${P
|
||||||
message(" * Toolchain : " ${ARM_NONE_EABI_TOOLCHAIN_PATH})
|
message(" * Toolchain : " ${ARM_NONE_EABI_TOOLCHAIN_PATH})
|
||||||
message(" * GitRef(S) : " ${PROJECT_GIT_COMMIT_HASH})
|
message(" * GitRef(S) : " ${PROJECT_GIT_COMMIT_HASH})
|
||||||
message(" * NRF52 SDK : " ${NRF5_SDK_PATH})
|
message(" * NRF52 SDK : " ${NRF5_SDK_PATH})
|
||||||
|
message(" * Target device : " ${TARGET_DEVICE})
|
||||||
set(PROGRAMMER "???")
|
set(PROGRAMMER "???")
|
||||||
if(USE_JLINK)
|
if(USE_JLINK)
|
||||||
message(" * Programmer/debugger : JLINK")
|
message(" * Programmer/debugger : JLINK")
|
||||||
|
|
25
README.md
25
README.md
|
@ -1,20 +1,10 @@
|
||||||
# PineTime
|
# InfiniTime
|
||||||
|
|
||||||
[![Build PineTime Firmware](https://github.com/JF002/InfiniTime/workflows/Build%20PineTime%20Firmware/badge.svg?branch=master)](https://github.com/JF002/InfiniTime/actions)
|
[![Build PineTime Firmware](https://github.com/JF002/InfiniTime/workflows/Build%20PineTime%20Firmware/badge.svg?branch=master)](https://github.com/JF002/InfiniTime/actions)
|
||||||
|
|
||||||
> The PineTime is a free and open source smartwatch capable of running custom-built open operating systems. Some of the notable features include a heart rate monitor, a week-long battery as well as a capacitive touch IPS display that is legible in direct sunlight. It is a fully community driven side-project, which means that it will ultimately be up to the developers and end-users to determine when they deem the PineTime ready to ship.
|
|
||||||
|
|
||||||
> We envision the PineTime as a companion for not only your PinePhone but also for your favorite devices — any phone, tablet, or even PC.
|
|
||||||
|
|
||||||
*https://www.pine64.org/pinetime/*
|
|
||||||
|
|
||||||
The **Pinetime** smartwatch is built around the NRF52832 MCU (512KB Flash, 64KB RAM), a 240*240 LCD display driven by the ST7789 controller, an accelerometer, a heart rate sensor, and a vibration motor.
|
|
||||||
|
|
||||||
# InfiniTime
|
|
||||||
|
|
||||||
![InfiniTime logo](images/infinitime-logo.jpg "InfiniTime Logo")
|
![InfiniTime logo](images/infinitime-logo.jpg "InfiniTime Logo")
|
||||||
|
|
||||||
The goal of this project is to design an open-source firmware for the Pinetime smartwatch :
|
The goal of this project is to design an open-source firmware for the [Pinetime smartwatch](https://www.pine64.org/pinetime/) :
|
||||||
|
|
||||||
- Code written in **modern C++**;
|
- Code written in **modern C++**;
|
||||||
- Build system based on **CMake**;
|
- Build system based on **CMake**;
|
||||||
|
@ -22,6 +12,11 @@ The goal of this project is to design an open-source firmware for the Pinetime s
|
||||||
- Using **[LittleVGL/LVGL 7](https://lvgl.io/)** as UI library...
|
- Using **[LittleVGL/LVGL 7](https://lvgl.io/)** as UI library...
|
||||||
- ... and **[NimBLE 1.3.0](https://github.com/apache/mynewt-nimble)** as BLE stack.
|
- ... and **[NimBLE 1.3.0](https://github.com/apache/mynewt-nimble)** as BLE stack.
|
||||||
|
|
||||||
|
## New to InfiniTime?
|
||||||
|
|
||||||
|
- [Getting started with InfiniTime 1.0 (quick user guide, update bootloader and InfiniTime,...)](doc/gettingStarted/gettingStarted-1.0.md)
|
||||||
|
- [Flash, upgrade (OTA), time synchronization,...](doc/gettingStarted/ota-gadgetbridge-nrfconnect.md)
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
![Pinetime screens](images/1.0.0/collage.png "PinetimeScreens")
|
![Pinetime screens](images/1.0.0/collage.png "PinetimeScreens")
|
||||||
|
@ -70,16 +65,12 @@ As of now, here is the list of achievements of this project:
|
||||||
* [Amazfish](https://openrepos.net/content/piggz/amazfish) (on SailfishOS and Linux)
|
* [Amazfish](https://openrepos.net/content/piggz/amazfish) (on SailfishOS and Linux)
|
||||||
* [Siglo](https://github.com/alexr4535/siglo) (on Linux)
|
* [Siglo](https://github.com/alexr4535/siglo) (on Linux)
|
||||||
* **[Experimental]** [WebBLEWatch](https://hubmartin.github.io/WebBLEWatch/) Synchronize time directly from your web browser. [video](https://youtu.be/IakiuhVDdrY)
|
* **[Experimental]** [WebBLEWatch](https://hubmartin.github.io/WebBLEWatch/) Synchronize time directly from your web browser. [video](https://youtu.be/IakiuhVDdrY)
|
||||||
|
* **[Experimental]** [Infini-iOS](https://github.com/xan-m/Infini-iOS) (on iOS)
|
||||||
- OTA (Over-the-air) update via BLE
|
- OTA (Over-the-air) update via BLE
|
||||||
- [Bootloader](https://github.com/JF002/pinetime-mcuboot-bootloader) based on [MCUBoot](https://juullabs-oss.github.io/mcuboot/)
|
- [Bootloader](https://github.com/JF002/pinetime-mcuboot-bootloader) based on [MCUBoot](https://juullabs-oss.github.io/mcuboot/)
|
||||||
|
|
||||||
## Documentation
|
## Documentation
|
||||||
|
|
||||||
### Getting started
|
|
||||||
|
|
||||||
- [Getting started with InfiniTime 1.0 (quick user guide, update bootloader and InfiniTime,...)](doc/gettingStarted/gettingStarted-1.0.md)
|
|
||||||
- [Flash, upgrade (OTA), time synchronization,...](doc/gettingStarted/ota-gadgetbridge-nrfconnect.md)
|
|
||||||
|
|
||||||
### Develop
|
### Develop
|
||||||
|
|
||||||
- [Generate the fonts and symbols](src/displayapp/fonts/README.md)
|
- [Generate the fonts and symbols](src/displayapp/fonts/README.md)
|
||||||
|
|
|
@ -98,7 +98,7 @@ The script makes use of the following tools:
|
||||||
|
|
||||||
After setup you can use cmake as usual:
|
After setup you can use cmake as usual:
|
||||||
|
|
||||||
1. Generate the actual build files (out-of-source builds are strongly recomended):
|
1. Generate the actual build files (out-of-source builds are strongly recommended):
|
||||||
|
|
||||||
```commandline
|
```commandline
|
||||||
cmake -H. -B"cmake-build" -G "Unix Makefiles"
|
cmake -H. -B"cmake-build" -G "Unix Makefiles"
|
||||||
|
|
|
@ -28,6 +28,7 @@ CMake configures the project according to variables you specify the command line
|
||||||
**GDB_CLIENT_BIN_PATH**|Path to arm-none-eabi-gdb executable. Used only if `USE_GDB_CLIENT` is 1.|`-DGDB_CLIENT_BIN_PATH=/home/jf/nrf52/gcc-arm-none-eabi-9-2019-q4-major/bin/arm-none-eabi-gdb`
|
**GDB_CLIENT_BIN_PATH**|Path to arm-none-eabi-gdb executable. Used only if `USE_GDB_CLIENT` is 1.|`-DGDB_CLIENT_BIN_PATH=/home/jf/nrf52/gcc-arm-none-eabi-9-2019-q4-major/bin/arm-none-eabi-gdb`
|
||||||
**GDB_CLIENT_TARGET_REMOTE**|Target remote connection string. Used only if `USE_GDB_CLIENT` is 1.|`-DGDB_CLIENT_TARGET_REMOTE=/dev/ttyACM0`
|
**GDB_CLIENT_TARGET_REMOTE**|Target remote connection string. Used only if `USE_GDB_CLIENT` is 1.|`-DGDB_CLIENT_TARGET_REMOTE=/dev/ttyACM0`
|
||||||
**BUILD_DFU (\*\*)**|Build DFU files while building (needs [adafruit-nrfutil](https://github.com/adafruit/Adafruit_nRF52_nrfutil)).|`-DBUILD_DFU=1`
|
**BUILD_DFU (\*\*)**|Build DFU files while building (needs [adafruit-nrfutil](https://github.com/adafruit/Adafruit_nRF52_nrfutil)).|`-DBUILD_DFU=1`
|
||||||
|
**WATCH_COLMI_P8**|Use pin configuration for Colmi P8 watch|`-DWATCH_COLMI_P8=1`
|
||||||
|
|
||||||
####(**) Note about **CMAKE_BUILD_TYPE**:
|
####(**) Note about **CMAKE_BUILD_TYPE**:
|
||||||
By default, this variable is set to *Release*. It compiles the code with size and speed optimizations. We use this value for all the binaries we publish when we [release](https://github.com/JF002/InfiniTime/releases) new versions of InfiniTime.
|
By default, this variable is set to *Release*. It compiles the code with size and speed optimizations. We use this value for all the binaries we publish when we [release](https://github.com/JF002/InfiniTime/releases) new versions of InfiniTime.
|
||||||
|
|
|
@ -47,6 +47,8 @@ Read carefully the warning and tap **Install**:
|
||||||
|
|
||||||
Wait for the transfer to finish. Your PineTime should reset and reboot with the new version of InfiniTime!
|
Wait for the transfer to finish. Your PineTime should reset and reboot with the new version of InfiniTime!
|
||||||
|
|
||||||
|
Don't forget to **validate** your firmware. In the InfiniTime go to the settings (swipe right, select gear icon) and Firmware option and click **validate**. Otherwise after reboot the previous firmware will be used.
|
||||||
|
|
||||||
![Gadgetbridge 5](gadgetbridge5.jpg)
|
![Gadgetbridge 5](gadgetbridge5.jpg)
|
||||||
|
|
||||||
### Using NRFConnect
|
### Using NRFConnect
|
||||||
|
@ -64,6 +66,8 @@ Select **Distribution packet (ZIP)**:
|
||||||
|
|
||||||
Browse to the DFU file you downloaded previously, the DFU transfer will start automatically. When the transfer is finished, your PineTime will reset and restart on the new version of InfiniTime!
|
Browse to the DFU file you downloaded previously, the DFU transfer will start automatically. When the transfer is finished, your PineTime will reset and restart on the new version of InfiniTime!
|
||||||
|
|
||||||
|
Don't forget to **validate** your firmware. In the InfiniTime go to the settings (swipe right, select gear icon) and Firmware option and click **validate**. Otherwise after reboot the previous firmware will be used.
|
||||||
|
|
||||||
![NRFConnect 3](nrfconnect3.jpg)
|
![NRFConnect 3](nrfconnect3.jpg)
|
||||||
|
|
||||||
## How to flash InfiniTime using the SWD interface
|
## How to flash InfiniTime using the SWD interface
|
||||||
|
@ -88,6 +92,10 @@ If you are using OpenOCD with a STLinkV2, you can find more info [on this page](
|
||||||
### Using Gadgetbridge
|
### Using Gadgetbridge
|
||||||
Good news! Gadgetbridge **automatically** synchronizes the time when connecting to your PineTime!
|
Good news! Gadgetbridge **automatically** synchronizes the time when connecting to your PineTime!
|
||||||
|
|
||||||
|
### Using any Chromium-based web browser
|
||||||
|
You can use it from your PC, Mac, Android. Browsers now have BLE support.
|
||||||
|
https://hubmartin.github.io/WebBLEWatch/
|
||||||
|
|
||||||
### Using NRFConnect
|
### Using NRFConnect
|
||||||
You must enable the **CTS** *GATT server* into NRFConnect so that InfiniTime can synchronize the time with your smartphone.
|
You must enable the **CTS** *GATT server* into NRFConnect so that InfiniTime can synchronize the time with your smartphone.
|
||||||
|
|
||||||
|
|
|
@ -3,4 +3,4 @@ The versioning of this project is based on [Semantic versionning](https://semver
|
||||||
|
|
||||||
- The **patch** is incremented when we fix a bug on a **released** version (most of the time using a **hotfix** branch).
|
- The **patch** is incremented when we fix a bug on a **released** version (most of the time using a **hotfix** branch).
|
||||||
- The **minor** is incremented when we release a new version with new features. It corresponds to a merge of **develop** into **master**.
|
- The **minor** is incremented when we release a new version with new features. It corresponds to a merge of **develop** into **master**.
|
||||||
- The **major** should be incremented when a breaking change is made to the application. We still have to define what is a breaking change in the context of this project. For now, I suggest that it stays **0** until we have a fully functionning firmware suited for the final user.
|
- The **major** should be incremented when a breaking change is made to the application. We still have to define what is a breaking change in the context of this project. For now, I suggest that it stays **0** until we have a fully functioning firmware suited for the final user.
|
|
@ -92,6 +92,9 @@ set(SDK_SOURCE_FILES
|
||||||
set(TINYCRYPT_SRC
|
set(TINYCRYPT_SRC
|
||||||
libs/mynewt-nimble/ext/tinycrypt/src/aes_encrypt.c
|
libs/mynewt-nimble/ext/tinycrypt/src/aes_encrypt.c
|
||||||
libs/mynewt-nimble/ext/tinycrypt/src/utils.c
|
libs/mynewt-nimble/ext/tinycrypt/src/utils.c
|
||||||
|
libs/mynewt-nimble/ext/tinycrypt/src/cmac_mode.c
|
||||||
|
libs/mynewt-nimble/ext/tinycrypt/src/ecc.c
|
||||||
|
libs/mynewt-nimble/ext/tinycrypt/src/ecc_dh.c
|
||||||
)
|
)
|
||||||
|
|
||||||
set(NIMBLE_SRC
|
set(NIMBLE_SRC
|
||||||
|
@ -104,6 +107,10 @@ set(NIMBLE_SRC
|
||||||
libs/mynewt-nimble/nimble/host/src/ble_l2cap.c
|
libs/mynewt-nimble/nimble/host/src/ble_l2cap.c
|
||||||
libs/mynewt-nimble/nimble/host/src/ble_hs_mbuf.c
|
libs/mynewt-nimble/nimble/host/src/ble_hs_mbuf.c
|
||||||
libs/mynewt-nimble/nimble/host/src/ble_sm.c
|
libs/mynewt-nimble/nimble/host/src/ble_sm.c
|
||||||
|
libs/mynewt-nimble/nimble/host/src/ble_sm_cmd.c
|
||||||
|
libs/mynewt-nimble/nimble/host/src/ble_sm_lgcy.c
|
||||||
|
libs/mynewt-nimble/nimble/host/src/ble_sm_alg.c
|
||||||
|
libs/mynewt-nimble/nimble/host/src/ble_sm_sc.c
|
||||||
libs/mynewt-nimble/nimble/host/src/ble_gap.c
|
libs/mynewt-nimble/nimble/host/src/ble_gap.c
|
||||||
libs/mynewt-nimble/nimble/host/src/ble_gatts.c
|
libs/mynewt-nimble/nimble/host/src/ble_gatts.c
|
||||||
libs/mynewt-nimble/nimble/host/src/ble_gattc.c
|
libs/mynewt-nimble/nimble/host/src/ble_gattc.c
|
||||||
|
@ -127,10 +134,6 @@ set(NIMBLE_SRC
|
||||||
libs/mynewt-nimble/nimble/host/src/ble_hs_atomic.c
|
libs/mynewt-nimble/nimble/host/src/ble_hs_atomic.c
|
||||||
libs/mynewt-nimble/nimble/host/src/ble_hs_adv.c
|
libs/mynewt-nimble/nimble/host/src/ble_hs_adv.c
|
||||||
libs/mynewt-nimble/nimble/host/src/ble_hs_flow.c
|
libs/mynewt-nimble/nimble/host/src/ble_hs_flow.c
|
||||||
libs/mynewt-nimble/nimble/host/src/ble_sm.c
|
|
||||||
libs/mynewt-nimble/nimble/host/src/ble_sm_cmd.c
|
|
||||||
libs/mynewt-nimble/nimble/host/src/ble_sm_lgcy.c
|
|
||||||
libs/mynewt-nimble/nimble/host/src/ble_sm_alg.c
|
|
||||||
libs/mynewt-nimble/nimble/host/src/ble_hs_mqueue.c
|
libs/mynewt-nimble/nimble/host/src/ble_hs_mqueue.c
|
||||||
libs/mynewt-nimble/nimble/host/src/ble_hs_stop.c
|
libs/mynewt-nimble/nimble/host/src/ble_hs_stop.c
|
||||||
libs/mynewt-nimble/nimble/host/src/ble_hs_startup.c
|
libs/mynewt-nimble/nimble/host/src/ble_hs_startup.c
|
||||||
|
@ -418,6 +421,7 @@ list(APPEND SOURCE_FILES
|
||||||
displayapp/screens/BatteryInfo.cpp
|
displayapp/screens/BatteryInfo.cpp
|
||||||
displayapp/screens/Steps.cpp
|
displayapp/screens/Steps.cpp
|
||||||
displayapp/screens/Timer.cpp
|
displayapp/screens/Timer.cpp
|
||||||
|
displayapp/Colors.cpp
|
||||||
|
|
||||||
## Settings
|
## Settings
|
||||||
displayapp/screens/settings/QuickSettings.cpp
|
displayapp/screens/settings/QuickSettings.cpp
|
||||||
|
@ -427,6 +431,7 @@ list(APPEND SOURCE_FILES
|
||||||
displayapp/screens/settings/SettingWakeUp.cpp
|
displayapp/screens/settings/SettingWakeUp.cpp
|
||||||
displayapp/screens/settings/SettingDisplay.cpp
|
displayapp/screens/settings/SettingDisplay.cpp
|
||||||
displayapp/screens/settings/SettingSteps.cpp
|
displayapp/screens/settings/SettingSteps.cpp
|
||||||
|
displayapp/screens/settings/SettingPineTimeStyle.cpp
|
||||||
|
|
||||||
## Watch faces
|
## Watch faces
|
||||||
displayapp/icons/bg_clock.c
|
displayapp/icons/bg_clock.c
|
||||||
|
@ -495,6 +500,8 @@ list(APPEND SOURCE_FILES
|
||||||
components/heartrate/Biquad.cpp
|
components/heartrate/Biquad.cpp
|
||||||
components/heartrate/Ptagc.cpp
|
components/heartrate/Ptagc.cpp
|
||||||
components/heartrate/HeartRateController.cpp
|
components/heartrate/HeartRateController.cpp
|
||||||
|
|
||||||
|
touchhandler/TouchHandler.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
list(APPEND RECOVERY_SOURCE_FILES
|
list(APPEND RECOVERY_SOURCE_FILES
|
||||||
|
@ -552,6 +559,7 @@ list(APPEND RECOVERY_SOURCE_FILES
|
||||||
components/heartrate/Ptagc.cpp
|
components/heartrate/Ptagc.cpp
|
||||||
components/motor/MotorController.cpp
|
components/motor/MotorController.cpp
|
||||||
components/fs/FS.cpp
|
components/fs/FS.cpp
|
||||||
|
touchhandler/TouchHandler.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
list(APPEND RECOVERYLOADER_SOURCE_FILES
|
list(APPEND RECOVERYLOADER_SOURCE_FILES
|
||||||
|
@ -607,6 +615,7 @@ set(INCLUDE_FILES
|
||||||
displayapp/screens/Metronome.h
|
displayapp/screens/Metronome.h
|
||||||
displayapp/screens/Motion.h
|
displayapp/screens/Motion.h
|
||||||
displayapp/screens/Timer.h
|
displayapp/screens/Timer.h
|
||||||
|
displayapp/Colors.h
|
||||||
drivers/St7789.h
|
drivers/St7789.h
|
||||||
drivers/SpiNorFlash.h
|
drivers/SpiNorFlash.h
|
||||||
drivers/SpiMaster.h
|
drivers/SpiMaster.h
|
||||||
|
@ -615,6 +624,7 @@ set(INCLUDE_FILES
|
||||||
drivers/DebugPins.h
|
drivers/DebugPins.h
|
||||||
drivers/InternalFlash.h
|
drivers/InternalFlash.h
|
||||||
drivers/Hrs3300.h
|
drivers/Hrs3300.h
|
||||||
|
drivers/PinMap.h
|
||||||
drivers/Bma421.h
|
drivers/Bma421.h
|
||||||
drivers/Bma421_C/bma4.c
|
drivers/Bma421_C/bma4.c
|
||||||
drivers/Bma421_C/bma423.c
|
drivers/Bma421_C/bma423.c
|
||||||
|
@ -660,6 +670,7 @@ set(INCLUDE_FILES
|
||||||
components/heartrate/Ptagc.h
|
components/heartrate/Ptagc.h
|
||||||
components/heartrate/HeartRateController.h
|
components/heartrate/HeartRateController.h
|
||||||
components/motor/MotorController.h
|
components/motor/MotorController.h
|
||||||
|
touchhandler/TouchHandler.h
|
||||||
)
|
)
|
||||||
|
|
||||||
include_directories(
|
include_directories(
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
#include "BatteryController.h"
|
#include "BatteryController.h"
|
||||||
|
#include "drivers/PinMap.h"
|
||||||
#include <hal/nrf_gpio.h>
|
#include <hal/nrf_gpio.h>
|
||||||
#include <nrfx_saadc.h>
|
#include <nrfx_saadc.h>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
@ -9,15 +10,12 @@ Battery* Battery::instance = nullptr;
|
||||||
|
|
||||||
Battery::Battery() {
|
Battery::Battery() {
|
||||||
instance = this;
|
instance = this;
|
||||||
}
|
nrf_gpio_cfg_input(PinMap::Charging, static_cast<nrf_gpio_pin_pull_t> GPIO_PIN_CNF_PULL_Disabled);
|
||||||
|
|
||||||
void Battery::Init() {
|
|
||||||
nrf_gpio_cfg_input(chargingPin, static_cast<nrf_gpio_pin_pull_t> GPIO_PIN_CNF_PULL_Pullup);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Battery::Update() {
|
void Battery::Update() {
|
||||||
isCharging = !nrf_gpio_pin_read(chargingPin);
|
isCharging = !nrf_gpio_pin_read(PinMap::Charging);
|
||||||
isPowerPresent = !nrf_gpio_pin_read(powerPresentPin);
|
isPowerPresent = !nrf_gpio_pin_read(PinMap::PowerPresent);
|
||||||
|
|
||||||
if (isReading) {
|
if (isReading) {
|
||||||
return;
|
return;
|
||||||
|
@ -75,5 +73,11 @@ void Battery::SaadcEventHandler(nrfx_saadc_evt_t const* p_event) {
|
||||||
|
|
||||||
nrfx_saadc_uninit();
|
nrfx_saadc_uninit();
|
||||||
isReading = false;
|
isReading = false;
|
||||||
|
|
||||||
|
systemTask->PushMessage(System::Messages::BatteryMeasurementDone);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Battery::Register(Pinetime::System::SystemTask* systemTask) {
|
||||||
|
this->systemTask = systemTask;
|
||||||
|
}
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <drivers/include/nrfx_saadc.h>
|
#include <drivers/include/nrfx_saadc.h>
|
||||||
#include <array>
|
#include <systemtask/SystemTask.h>
|
||||||
#include <numeric>
|
|
||||||
|
|
||||||
namespace Pinetime {
|
namespace Pinetime {
|
||||||
namespace Controllers {
|
namespace Controllers {
|
||||||
|
@ -11,8 +10,8 @@ namespace Pinetime {
|
||||||
public:
|
public:
|
||||||
Battery();
|
Battery();
|
||||||
|
|
||||||
void Init();
|
|
||||||
void Update();
|
void Update();
|
||||||
|
void Register(System::SystemTask* systemTask);
|
||||||
|
|
||||||
uint8_t PercentRemaining() const {
|
uint8_t PercentRemaining() const {
|
||||||
return percentRemaining;
|
return percentRemaining;
|
||||||
|
@ -34,8 +33,6 @@ namespace Pinetime {
|
||||||
static Battery* instance;
|
static Battery* instance;
|
||||||
nrf_saadc_value_t saadc_value;
|
nrf_saadc_value_t saadc_value;
|
||||||
|
|
||||||
static constexpr uint32_t chargingPin = 12;
|
|
||||||
static constexpr uint32_t powerPresentPin = 19;
|
|
||||||
static constexpr nrf_saadc_input_t batteryVoltageAdcInput = NRF_SAADC_INPUT_AIN7;
|
static constexpr nrf_saadc_input_t batteryVoltageAdcInput = NRF_SAADC_INPUT_AIN7;
|
||||||
uint16_t voltage = 0;
|
uint16_t voltage = 0;
|
||||||
uint8_t percentRemaining = 0;
|
uint8_t percentRemaining = 0;
|
||||||
|
@ -49,6 +46,8 @@ namespace Pinetime {
|
||||||
static void AdcCallbackStatic(nrfx_saadc_evt_t const* event);
|
static void AdcCallbackStatic(nrfx_saadc_evt_t const* event);
|
||||||
|
|
||||||
bool isReading = false;
|
bool isReading = false;
|
||||||
|
|
||||||
|
Pinetime::System::SystemTask* systemTask = nullptr;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,6 +42,19 @@ NimbleController::NimbleController(Pinetime::System::SystemTask& systemTask,
|
||||||
serviceDiscovery({¤tTimeClient, &alertNotificationClient}) {
|
serviceDiscovery({¤tTimeClient, &alertNotificationClient}) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void nimble_on_reset(int reason) {
|
||||||
|
NRF_LOG_INFO("Resetting state; reason=%d\n", reason);
|
||||||
|
}
|
||||||
|
|
||||||
|
void nimble_on_sync(void) {
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
rc = ble_hs_util_ensure_addr(0);
|
||||||
|
ASSERT(rc == 0);
|
||||||
|
|
||||||
|
nptr->StartAdvertising();
|
||||||
|
}
|
||||||
|
|
||||||
int GAPEventCallback(struct ble_gap_event* event, void* arg) {
|
int GAPEventCallback(struct ble_gap_event* event, void* arg) {
|
||||||
auto nimbleController = static_cast<NimbleController*>(arg);
|
auto nimbleController = static_cast<NimbleController*>(arg);
|
||||||
return nimbleController->OnGAPEvent(event);
|
return nimbleController->OnGAPEvent(event);
|
||||||
|
@ -51,6 +64,10 @@ void NimbleController::Init() {
|
||||||
while (!ble_hs_synced()) {
|
while (!ble_hs_synced()) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nptr = this;
|
||||||
|
ble_hs_cfg.reset_cb = nimble_on_reset;
|
||||||
|
ble_hs_cfg.sync_cb = nimble_on_sync;
|
||||||
|
|
||||||
ble_svc_gap_init();
|
ble_svc_gap_init();
|
||||||
ble_svc_gatt_init();
|
ble_svc_gatt_init();
|
||||||
|
|
||||||
|
@ -64,28 +81,31 @@ void NimbleController::Init() {
|
||||||
batteryInformationService.Init();
|
batteryInformationService.Init();
|
||||||
immediateAlertService.Init();
|
immediateAlertService.Init();
|
||||||
heartRateService.Init();
|
heartRateService.Init();
|
||||||
int res;
|
|
||||||
res = ble_hs_util_ensure_addr(0);
|
int rc;
|
||||||
ASSERT(res == 0);
|
rc = ble_hs_util_ensure_addr(0);
|
||||||
res = ble_hs_id_infer_auto(0, &addrType);
|
ASSERT(rc == 0);
|
||||||
ASSERT(res == 0);
|
rc = ble_hs_id_infer_auto(0, &addrType);
|
||||||
res = ble_svc_gap_device_name_set(deviceName);
|
ASSERT(rc == 0);
|
||||||
ASSERT(res == 0);
|
rc = ble_svc_gap_device_name_set(deviceName);
|
||||||
|
ASSERT(rc == 0);
|
||||||
|
rc = ble_svc_gap_device_appearance_set(0xC2);
|
||||||
|
ASSERT(rc == 0);
|
||||||
Pinetime::Controllers::Ble::BleAddress address;
|
Pinetime::Controllers::Ble::BleAddress address;
|
||||||
res = ble_hs_id_copy_addr(addrType, address.data(), nullptr);
|
rc = ble_hs_id_copy_addr(addrType, address.data(), nullptr);
|
||||||
ASSERT(res == 0);
|
ASSERT(rc == 0);
|
||||||
bleController.AddressType((addrType == 0) ? Ble::AddressTypes::Public : Ble::AddressTypes::Random);
|
bleController.AddressType((addrType == 0) ? Ble::AddressTypes::Public : Ble::AddressTypes::Random);
|
||||||
bleController.Address(std::move(address));
|
bleController.Address(std::move(address));
|
||||||
|
|
||||||
res = ble_gatts_start();
|
rc = ble_gatts_start();
|
||||||
ASSERT(res == 0);
|
ASSERT(rc == 0);
|
||||||
|
|
||||||
|
if (!ble_gap_adv_active() && !bleController.IsConnected())
|
||||||
|
StartAdvertising();
|
||||||
}
|
}
|
||||||
|
|
||||||
void NimbleController::StartAdvertising() {
|
void NimbleController::StartAdvertising() {
|
||||||
if (bleController.IsConnected() || ble_gap_conn_active() || ble_gap_adv_active())
|
int rc;
|
||||||
return;
|
|
||||||
|
|
||||||
ble_svc_gap_device_name_set(deviceName);
|
|
||||||
|
|
||||||
/* set adv parameters */
|
/* set adv parameters */
|
||||||
struct ble_gap_adv_params adv_params;
|
struct ble_gap_adv_params adv_params;
|
||||||
|
@ -102,11 +122,17 @@ void NimbleController::StartAdvertising() {
|
||||||
|
|
||||||
adv_params.conn_mode = BLE_GAP_CONN_MODE_UND;
|
adv_params.conn_mode = BLE_GAP_CONN_MODE_UND;
|
||||||
adv_params.disc_mode = BLE_GAP_DISC_MODE_GEN;
|
adv_params.disc_mode = BLE_GAP_DISC_MODE_GEN;
|
||||||
|
/* fast advertise for 30 sec */
|
||||||
|
if (fastAdvCount < 15) {
|
||||||
|
adv_params.itvl_min = 32;
|
||||||
|
adv_params.itvl_max = 47;
|
||||||
|
fastAdvCount++;
|
||||||
|
} else {
|
||||||
|
adv_params.itvl_min = 1636;
|
||||||
|
adv_params.itvl_max = 1651;
|
||||||
|
}
|
||||||
|
|
||||||
fields.flags = BLE_HS_ADV_F_DISC_GEN | BLE_HS_ADV_F_BREDR_UNSUP;
|
fields.flags = BLE_HS_ADV_F_DISC_GEN | BLE_HS_ADV_F_BREDR_UNSUP;
|
||||||
// fields.uuids128 = BLE_UUID128(BLE_UUID128_DECLARE(
|
|
||||||
// 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
|
|
||||||
// 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff));
|
|
||||||
fields.uuids128 = &dfuServiceUuid;
|
fields.uuids128 = &dfuServiceUuid;
|
||||||
fields.num_uuids128 = 1;
|
fields.num_uuids128 = 1;
|
||||||
fields.uuids128_is_complete = 1;
|
fields.uuids128_is_complete = 1;
|
||||||
|
@ -116,28 +142,25 @@ void NimbleController::StartAdvertising() {
|
||||||
rsp_fields.name_len = strlen(deviceName);
|
rsp_fields.name_len = strlen(deviceName);
|
||||||
rsp_fields.name_is_complete = 1;
|
rsp_fields.name_is_complete = 1;
|
||||||
|
|
||||||
ble_gap_adv_set_fields(&fields);
|
rc = ble_gap_adv_set_fields(&fields);
|
||||||
// ASSERT(res == 0); // TODO this one sometimes fails with error 22 (notsync)
|
ASSERT(rc == 0);
|
||||||
|
|
||||||
ble_gap_adv_rsp_set_fields(&rsp_fields);
|
rc = ble_gap_adv_rsp_set_fields(&rsp_fields);
|
||||||
// ASSERT(res == 0);
|
ASSERT(rc == 0);
|
||||||
|
|
||||||
ble_gap_adv_start(addrType, NULL, 180000, &adv_params, GAPEventCallback, this);
|
rc = ble_gap_adv_start(addrType, NULL, 2000, &adv_params, GAPEventCallback, this);
|
||||||
// ASSERT(res == 0);// TODO I've disabled these ASSERT as they sometime asserts and reset the mcu.
|
ASSERT(rc == 0);
|
||||||
// For now, the advertising is restarted as soon as it ends. There may be a race condition
|
|
||||||
// that prevent the advertising from restarting reliably.
|
|
||||||
// I remove the assert to prevent this uncesseray crash, but in the long term, the management of
|
|
||||||
// the advertising should be improve (better error handling, and advertise for 3 minutes after
|
|
||||||
// the application has been woken up, for example.
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int NimbleController::OnGAPEvent(ble_gap_event* event) {
|
int NimbleController::OnGAPEvent(ble_gap_event* event) {
|
||||||
switch (event->type) {
|
switch (event->type) {
|
||||||
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("advertise complete; reason=%dn status=%d", event->adv_complete.reason, event->connect.status);
|
NRF_LOG_INFO("reason=%d; status=%d", event->adv_complete.reason, event->connect.status);
|
||||||
|
StartAdvertising();
|
||||||
break;
|
break;
|
||||||
case BLE_GAP_EVENT_CONNECT: {
|
|
||||||
|
case BLE_GAP_EVENT_CONNECT:
|
||||||
NRF_LOG_INFO("Advertising event : BLE_GAP_EVENT_CONNECT");
|
NRF_LOG_INFO("Advertising event : BLE_GAP_EVENT_CONNECT");
|
||||||
|
|
||||||
/* A new connection was established or a connection attempt failed. */
|
/* A new connection was established or a connection attempt failed. */
|
||||||
|
@ -145,35 +168,44 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) {
|
||||||
|
|
||||||
if (event->connect.status != 0) {
|
if (event->connect.status != 0) {
|
||||||
/* Connection failed; resume advertising. */
|
/* Connection failed; resume advertising. */
|
||||||
StartAdvertising();
|
currentTimeClient.Reset();
|
||||||
|
alertNotificationClient.Reset();
|
||||||
|
connectionHandle = BLE_HS_CONN_HANDLE_NONE;
|
||||||
bleController.Disconnect();
|
bleController.Disconnect();
|
||||||
|
fastAdvCount = 0;
|
||||||
|
StartAdvertising();
|
||||||
} else {
|
} else {
|
||||||
|
connectionHandle = event->connect.conn_handle;
|
||||||
bleController.Connect();
|
bleController.Connect();
|
||||||
systemTask.PushMessage(Pinetime::System::Messages::BleConnected);
|
systemTask.PushMessage(Pinetime::System::Messages::BleConnected);
|
||||||
connectionHandle = event->connect.conn_handle;
|
// Service discovery is deferred via systemtask
|
||||||
// Service discovery is deffered via systemtask
|
|
||||||
}
|
}
|
||||||
} break;
|
break;
|
||||||
|
|
||||||
case BLE_GAP_EVENT_DISCONNECT:
|
case BLE_GAP_EVENT_DISCONNECT:
|
||||||
NRF_LOG_INFO("Advertising event : BLE_GAP_EVENT_DISCONNECT");
|
NRF_LOG_INFO("Advertising event : BLE_GAP_EVENT_DISCONNECT");
|
||||||
NRF_LOG_INFO("disconnect; reason=%d", event->disconnect.reason);
|
NRF_LOG_INFO("disconnect reason=%d", event->disconnect.reason);
|
||||||
|
|
||||||
/* Connection terminated; resume advertising. */
|
/* Connection terminated; resume advertising. */
|
||||||
currentTimeClient.Reset();
|
currentTimeClient.Reset();
|
||||||
alertNotificationClient.Reset();
|
alertNotificationClient.Reset();
|
||||||
connectionHandle = BLE_HS_CONN_HANDLE_NONE;
|
connectionHandle = BLE_HS_CONN_HANDLE_NONE;
|
||||||
bleController.Disconnect();
|
bleController.Disconnect();
|
||||||
|
fastAdvCount = 0;
|
||||||
StartAdvertising();
|
StartAdvertising();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BLE_GAP_EVENT_CONN_UPDATE:
|
case BLE_GAP_EVENT_CONN_UPDATE:
|
||||||
NRF_LOG_INFO("Advertising event : BLE_GAP_EVENT_CONN_UPDATE");
|
NRF_LOG_INFO("Advertising event : BLE_GAP_EVENT_CONN_UPDATE");
|
||||||
/* The central has updated the connection parameters. */
|
/* The central has updated the connection parameters. */
|
||||||
NRF_LOG_INFO("connection updated; status=%d ", event->conn_update.status);
|
NRF_LOG_INFO("update status=%d ", event->conn_update.status);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BLE_GAP_EVENT_ENC_CHANGE:
|
case BLE_GAP_EVENT_ENC_CHANGE:
|
||||||
/* Encryption has been enabled or disabled for this connection. */
|
/* Encryption has been enabled or disabled for this connection. */
|
||||||
NRF_LOG_INFO("encryption change event; status=%d ", event->enc_change.status);
|
NRF_LOG_INFO("encryption change event; status=%d ", event->enc_change.status);
|
||||||
return 0;
|
break;
|
||||||
|
|
||||||
case BLE_GAP_EVENT_SUBSCRIBE:
|
case BLE_GAP_EVENT_SUBSCRIBE:
|
||||||
NRF_LOG_INFO("subscribe event; conn_handle=%d attr_handle=%d "
|
NRF_LOG_INFO("subscribe event; conn_handle=%d attr_handle=%d "
|
||||||
"reason=%d prevn=%d curn=%d previ=%d curi=???\n",
|
"reason=%d prevn=%d curn=%d previ=%d curi=???\n",
|
||||||
|
@ -183,10 +215,12 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) {
|
||||||
event->subscribe.prev_notify,
|
event->subscribe.prev_notify,
|
||||||
event->subscribe.cur_notify,
|
event->subscribe.cur_notify,
|
||||||
event->subscribe.prev_indicate);
|
event->subscribe.prev_indicate);
|
||||||
return 0;
|
break;
|
||||||
|
|
||||||
case BLE_GAP_EVENT_MTU:
|
case BLE_GAP_EVENT_MTU:
|
||||||
NRF_LOG_INFO("mtu update event; conn_handle=%d cid=%d mtu=%d\n", event->mtu.conn_handle, event->mtu.channel_id, event->mtu.value);
|
NRF_LOG_INFO("mtu update event; conn_handle=%d cid=%d mtu=%d\n",
|
||||||
return 0;
|
event->mtu.conn_handle, event->mtu.channel_id, event->mtu.value);
|
||||||
|
break;
|
||||||
|
|
||||||
case BLE_GAP_EVENT_REPEAT_PAIRING: {
|
case BLE_GAP_EVENT_REPEAT_PAIRING: {
|
||||||
/* We already have a bond with the peer, but it is attempting to
|
/* We already have a bond with the peer, but it is attempting to
|
||||||
|
@ -217,8 +251,7 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) {
|
||||||
notifSize);
|
notifSize);
|
||||||
|
|
||||||
alertNotificationClient.OnNotification(event);
|
alertNotificationClient.OnNotification(event);
|
||||||
return 0;
|
} break;
|
||||||
}
|
|
||||||
/* Attribute data is contained in event->notify_rx.attr_data. */
|
/* Attribute data is contained in event->notify_rx.attr_data. */
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -229,7 +262,9 @@ int NimbleController::OnGAPEvent(ble_gap_event* event) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void NimbleController::StartDiscovery() {
|
void NimbleController::StartDiscovery() {
|
||||||
|
if (connectionHandle != BLE_HS_CONN_HANDLE_NONE) {
|
||||||
serviceDiscovery.StartDiscovery(connectionHandle);
|
serviceDiscovery.StartDiscovery(connectionHandle);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
uint16_t NimbleController::connHandle() {
|
uint16_t NimbleController::connHandle() {
|
||||||
|
@ -237,7 +272,7 @@ uint16_t NimbleController::connHandle() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void NimbleController::NotifyBatteryLevel(uint8_t level) {
|
void NimbleController::NotifyBatteryLevel(uint8_t level) {
|
||||||
if(connectionHandle != BLE_HS_CONN_HANDLE_NONE) {
|
if (connectionHandle != BLE_HS_CONN_HANDLE_NONE) {
|
||||||
batteryInformationService.NotifyBatteryLevel(connectionHandle, level);
|
batteryInformationService.NotifyBatteryLevel(connectionHandle, level);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,6 +72,10 @@ namespace Pinetime {
|
||||||
uint16_t connHandle();
|
uint16_t connHandle();
|
||||||
void NotifyBatteryLevel(uint8_t level);
|
void NotifyBatteryLevel(uint8_t level);
|
||||||
|
|
||||||
|
void RestartFastAdv() {
|
||||||
|
fastAdvCount = 0;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static constexpr const char* deviceName = "InfiniTime";
|
static constexpr const char* deviceName = "InfiniTime";
|
||||||
Pinetime::System::SystemTask& systemTask;
|
Pinetime::System::SystemTask& systemTask;
|
||||||
|
@ -94,6 +98,7 @@ namespace Pinetime {
|
||||||
|
|
||||||
uint8_t addrType; // 1 = Random, 0 = PUBLIC
|
uint8_t addrType; // 1 = Random, 0 = PUBLIC
|
||||||
uint16_t connectionHandle = BLE_HS_CONN_HANDLE_NONE;
|
uint16_t connectionHandle = BLE_HS_CONN_HANDLE_NONE;
|
||||||
|
uint8_t fastAdvCount = 0;
|
||||||
|
|
||||||
ble_uuid128_t dfuServiceUuid {
|
ble_uuid128_t dfuServiceUuid {
|
||||||
.u {.type = BLE_UUID_TYPE_128},
|
.u {.type = BLE_UUID_TYPE_128},
|
||||||
|
@ -101,5 +106,7 @@ namespace Pinetime {
|
||||||
|
|
||||||
ServiceDiscovery serviceDiscovery;
|
ServiceDiscovery serviceDiscovery;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static NimbleController* nptr;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,13 +1,13 @@
|
||||||
#include "BrightnessController.h"
|
#include "BrightnessController.h"
|
||||||
#include <hal/nrf_gpio.h>
|
#include <hal/nrf_gpio.h>
|
||||||
#include "displayapp/screens/Symbols.h"
|
#include "displayapp/screens/Symbols.h"
|
||||||
|
#include "drivers/PinMap.h"
|
||||||
using namespace Pinetime::Controllers;
|
using namespace Pinetime::Controllers;
|
||||||
|
|
||||||
void BrightnessController::Init() {
|
void BrightnessController::Init() {
|
||||||
nrf_gpio_cfg_output(pinLcdBacklight1);
|
nrf_gpio_cfg_output(PinMap::LcdBacklightLow);
|
||||||
nrf_gpio_cfg_output(pinLcdBacklight2);
|
nrf_gpio_cfg_output(PinMap::LcdBacklightMedium);
|
||||||
nrf_gpio_cfg_output(pinLcdBacklight3);
|
nrf_gpio_cfg_output(PinMap::LcdBacklightHigh);
|
||||||
Set(level);
|
Set(level);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -16,24 +16,24 @@ void BrightnessController::Set(BrightnessController::Levels level) {
|
||||||
switch (level) {
|
switch (level) {
|
||||||
default:
|
default:
|
||||||
case Levels::High:
|
case Levels::High:
|
||||||
nrf_gpio_pin_clear(pinLcdBacklight1);
|
nrf_gpio_pin_clear(PinMap::LcdBacklightLow);
|
||||||
nrf_gpio_pin_clear(pinLcdBacklight2);
|
nrf_gpio_pin_clear(PinMap::LcdBacklightMedium);
|
||||||
nrf_gpio_pin_clear(pinLcdBacklight3);
|
nrf_gpio_pin_clear(PinMap::LcdBacklightHigh);
|
||||||
break;
|
break;
|
||||||
case Levels::Medium:
|
case Levels::Medium:
|
||||||
nrf_gpio_pin_clear(pinLcdBacklight1);
|
nrf_gpio_pin_clear(PinMap::LcdBacklightLow);
|
||||||
nrf_gpio_pin_clear(pinLcdBacklight2);
|
nrf_gpio_pin_clear(PinMap::LcdBacklightMedium);
|
||||||
nrf_gpio_pin_set(pinLcdBacklight3);
|
nrf_gpio_pin_set(PinMap::LcdBacklightHigh);
|
||||||
break;
|
break;
|
||||||
case Levels::Low:
|
case Levels::Low:
|
||||||
nrf_gpio_pin_clear(pinLcdBacklight1);
|
nrf_gpio_pin_clear(PinMap::LcdBacklightLow);
|
||||||
nrf_gpio_pin_set(pinLcdBacklight2);
|
nrf_gpio_pin_set(PinMap::LcdBacklightMedium);
|
||||||
nrf_gpio_pin_set(pinLcdBacklight3);
|
nrf_gpio_pin_set(PinMap::LcdBacklightHigh);
|
||||||
break;
|
break;
|
||||||
case Levels::Off:
|
case Levels::Off:
|
||||||
nrf_gpio_pin_set(pinLcdBacklight1);
|
nrf_gpio_pin_set(PinMap::LcdBacklightLow);
|
||||||
nrf_gpio_pin_set(pinLcdBacklight2);
|
nrf_gpio_pin_set(PinMap::LcdBacklightMedium);
|
||||||
nrf_gpio_pin_set(pinLcdBacklight3);
|
nrf_gpio_pin_set(PinMap::LcdBacklightHigh);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,9 +22,6 @@ namespace Pinetime {
|
||||||
const char* ToString();
|
const char* ToString();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static constexpr uint8_t pinLcdBacklight1 = 14;
|
|
||||||
static constexpr uint8_t pinLcdBacklight2 = 22;
|
|
||||||
static constexpr uint8_t pinLcdBacklight3 = 23;
|
|
||||||
Levels level = Levels::High;
|
Levels level = Levels::High;
|
||||||
Levels backupLevel = Levels::High;
|
Levels backupLevel = Levels::High;
|
||||||
};
|
};
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#include <hal/nrf_gpio.h>
|
#include <hal/nrf_gpio.h>
|
||||||
#include "systemtask/SystemTask.h"
|
#include "systemtask/SystemTask.h"
|
||||||
#include "app_timer.h"
|
#include "app_timer.h"
|
||||||
|
#include "drivers/PinMap.h"
|
||||||
|
|
||||||
APP_TIMER_DEF(shortVibTimer);
|
APP_TIMER_DEF(shortVibTimer);
|
||||||
APP_TIMER_DEF(longVibTimer);
|
APP_TIMER_DEF(longVibTimer);
|
||||||
|
@ -12,8 +13,8 @@ MotorController::MotorController(Controllers::Settings& settingsController) : se
|
||||||
}
|
}
|
||||||
|
|
||||||
void MotorController::Init() {
|
void MotorController::Init() {
|
||||||
nrf_gpio_cfg_output(pinMotor);
|
nrf_gpio_cfg_output(PinMap::Motor);
|
||||||
nrf_gpio_pin_set(pinMotor);
|
nrf_gpio_pin_set(PinMap::Motor);
|
||||||
app_timer_init();
|
app_timer_init();
|
||||||
|
|
||||||
app_timer_create(&shortVibTimer, APP_TIMER_MODE_SINGLE_SHOT, StopMotor);
|
app_timer_create(&shortVibTimer, APP_TIMER_MODE_SINGLE_SHOT, StopMotor);
|
||||||
|
@ -30,7 +31,7 @@ void MotorController::RunForDuration(uint8_t motorDuration) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
nrf_gpio_pin_clear(pinMotor);
|
nrf_gpio_pin_clear(PinMap::Motor);
|
||||||
app_timer_start(shortVibTimer, APP_TIMER_TICKS(motorDuration), nullptr);
|
app_timer_start(shortVibTimer, APP_TIMER_TICKS(motorDuration), nullptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -44,9 +45,9 @@ void MotorController::StartRinging() {
|
||||||
|
|
||||||
void MotorController::StopRinging() {
|
void MotorController::StopRinging() {
|
||||||
app_timer_stop(longVibTimer);
|
app_timer_stop(longVibTimer);
|
||||||
nrf_gpio_pin_set(pinMotor);
|
nrf_gpio_pin_set(PinMap::Motor);
|
||||||
}
|
}
|
||||||
|
|
||||||
void MotorController::StopMotor(void* p_context) {
|
void MotorController::StopMotor(void* p_context) {
|
||||||
nrf_gpio_pin_set(pinMotor);
|
nrf_gpio_pin_set(PinMap::Motor);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,12 +1,10 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include "app_timer.h"
|
|
||||||
#include "components/settings/Settings.h"
|
#include "components/settings/Settings.h"
|
||||||
|
|
||||||
namespace Pinetime {
|
namespace Pinetime {
|
||||||
namespace Controllers {
|
namespace Controllers {
|
||||||
static constexpr uint8_t pinMotor = 16;
|
|
||||||
|
|
||||||
class MotorController {
|
class MotorController {
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -17,6 +17,14 @@ namespace Pinetime {
|
||||||
DoubleTap = 1,
|
DoubleTap = 1,
|
||||||
RaiseWrist = 2,
|
RaiseWrist = 2,
|
||||||
};
|
};
|
||||||
|
enum class Colors : uint8_t {
|
||||||
|
White, Silver, Gray, Black, Red, Maroon, Yellow, Olive, Lime, Green, Cyan, Teal, Blue, Navy, Magenta, Purple, Orange
|
||||||
|
};
|
||||||
|
struct PineTimeStyle {
|
||||||
|
Colors ColorTime = Colors::Teal;
|
||||||
|
Colors ColorBar = Colors::Teal;
|
||||||
|
Colors ColorBG = Colors::Black;
|
||||||
|
};
|
||||||
|
|
||||||
Settings(Pinetime::Controllers::FS& fs);
|
Settings(Pinetime::Controllers::FS& fs);
|
||||||
|
|
||||||
|
@ -33,10 +41,38 @@ namespace Pinetime {
|
||||||
return settings.clockFace;
|
return settings.clockFace;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void SetPTSColorTime(Colors colorTime) {
|
||||||
|
if (colorTime != settings.PTS.ColorTime)
|
||||||
|
settingsChanged = true;
|
||||||
|
settings.PTS.ColorTime = colorTime;
|
||||||
|
};
|
||||||
|
Colors GetPTSColorTime() const {
|
||||||
|
return settings.PTS.ColorTime;
|
||||||
|
};
|
||||||
|
|
||||||
|
void SetPTSColorBar(Colors colorBar) {
|
||||||
|
if (colorBar != settings.PTS.ColorBar)
|
||||||
|
settingsChanged = true;
|
||||||
|
settings.PTS.ColorBar = colorBar;
|
||||||
|
};
|
||||||
|
Colors GetPTSColorBar() const {
|
||||||
|
return settings.PTS.ColorBar;
|
||||||
|
};
|
||||||
|
|
||||||
|
void SetPTSColorBG(Colors colorBG) {
|
||||||
|
if (colorBG != settings.PTS.ColorBG)
|
||||||
|
settingsChanged = true;
|
||||||
|
settings.PTS.ColorBG = colorBG;
|
||||||
|
};
|
||||||
|
Colors GetPTSColorBG() const {
|
||||||
|
return settings.PTS.ColorBG;
|
||||||
|
};
|
||||||
|
|
||||||
void SetAppMenu(uint8_t menu) {
|
void SetAppMenu(uint8_t menu) {
|
||||||
appMenu = menu;
|
appMenu = menu;
|
||||||
};
|
};
|
||||||
uint8_t GetAppMenu() {
|
|
||||||
|
uint8_t GetAppMenu() const {
|
||||||
return appMenu;
|
return appMenu;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -78,7 +114,7 @@ namespace Pinetime {
|
||||||
};
|
};
|
||||||
|
|
||||||
void setWakeUpMode(WakeUpMode wakeUp, bool enabled) {
|
void setWakeUpMode(WakeUpMode wakeUp, bool enabled) {
|
||||||
if (!isWakeUpModeOn(wakeUp)) {
|
if (enabled != isWakeUpModeOn(wakeUp)) {
|
||||||
settingsChanged = true;
|
settingsChanged = true;
|
||||||
}
|
}
|
||||||
settings.wakeUpMode.set(static_cast<size_t>(wakeUp), enabled);
|
settings.wakeUpMode.set(static_cast<size_t>(wakeUp), enabled);
|
||||||
|
@ -127,9 +163,8 @@ namespace Pinetime {
|
||||||
private:
|
private:
|
||||||
Pinetime::Controllers::FS& fs;
|
Pinetime::Controllers::FS& fs;
|
||||||
|
|
||||||
static constexpr uint32_t settingsVersion = 0x0001;
|
static constexpr uint32_t settingsVersion = 0x0002;
|
||||||
struct SettingsData {
|
struct SettingsData {
|
||||||
|
|
||||||
uint32_t version = settingsVersion;
|
uint32_t version = settingsVersion;
|
||||||
uint32_t stepsGoal = 10000;
|
uint32_t stepsGoal = 10000;
|
||||||
uint32_t screenTimeOut = 15000;
|
uint32_t screenTimeOut = 15000;
|
||||||
|
@ -139,6 +174,8 @@ namespace Pinetime {
|
||||||
|
|
||||||
uint8_t clockFace = 0;
|
uint8_t clockFace = 0;
|
||||||
|
|
||||||
|
PineTimeStyle PTS;
|
||||||
|
|
||||||
std::bitset<3> wakeUpMode {0};
|
std::bitset<3> wakeUpMode {0};
|
||||||
|
|
||||||
Controllers::BrightnessController::Levels brightLevel = Controllers::BrightnessController::Levels::Medium;
|
Controllers::BrightnessController::Levels brightLevel = Controllers::BrightnessController::Levels::Medium;
|
||||||
|
|
|
@ -30,7 +30,8 @@ namespace Pinetime {
|
||||||
SettingTimeFormat,
|
SettingTimeFormat,
|
||||||
SettingDisplay,
|
SettingDisplay,
|
||||||
SettingWakeUp,
|
SettingWakeUp,
|
||||||
SettingSteps
|
SettingSteps,
|
||||||
|
SettingPineTimeStyle
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
27
src/displayapp/Colors.cpp
Normal file
27
src/displayapp/Colors.cpp
Normal file
|
@ -0,0 +1,27 @@
|
||||||
|
#include "Colors.h"
|
||||||
|
|
||||||
|
using namespace Pinetime::Applications;
|
||||||
|
using namespace Pinetime::Controllers;
|
||||||
|
|
||||||
|
lv_color_t Pinetime::Applications::Convert(Pinetime::Controllers::Settings::Colors color) {
|
||||||
|
switch (color) {
|
||||||
|
case Pinetime::Controllers::Settings::Colors::White: return LV_COLOR_WHITE;
|
||||||
|
case Pinetime::Controllers::Settings::Colors::Silver: return LV_COLOR_SILVER;
|
||||||
|
case Pinetime::Controllers::Settings::Colors::Gray: return LV_COLOR_GRAY;
|
||||||
|
case Pinetime::Controllers::Settings::Colors::Black: return LV_COLOR_BLACK;
|
||||||
|
case Pinetime::Controllers::Settings::Colors::Red: return LV_COLOR_RED;
|
||||||
|
case Pinetime::Controllers::Settings::Colors::Maroon: return LV_COLOR_MAROON;
|
||||||
|
case Pinetime::Controllers::Settings::Colors::Yellow: return LV_COLOR_YELLOW;
|
||||||
|
case Pinetime::Controllers::Settings::Colors::Olive: return LV_COLOR_OLIVE;
|
||||||
|
case Pinetime::Controllers::Settings::Colors::Lime: return LV_COLOR_LIME;
|
||||||
|
case Pinetime::Controllers::Settings::Colors::Green: return LV_COLOR_GREEN;
|
||||||
|
case Pinetime::Controllers::Settings::Colors::Cyan: return LV_COLOR_CYAN;
|
||||||
|
case Pinetime::Controllers::Settings::Colors::Teal: return LV_COLOR_TEAL;
|
||||||
|
case Pinetime::Controllers::Settings::Colors::Blue: return LV_COLOR_BLUE;
|
||||||
|
case Pinetime::Controllers::Settings::Colors::Navy: return LV_COLOR_NAVY;
|
||||||
|
case Pinetime::Controllers::Settings::Colors::Magenta: return LV_COLOR_MAGENTA;
|
||||||
|
case Pinetime::Controllers::Settings::Colors::Purple: return LV_COLOR_PURPLE;
|
||||||
|
case Pinetime::Controllers::Settings::Colors::Orange: return LV_COLOR_ORANGE;
|
||||||
|
default: return LV_COLOR_WHITE;
|
||||||
|
}
|
||||||
|
}
|
10
src/displayapp/Colors.h
Normal file
10
src/displayapp/Colors.h
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <lvgl/src/lv_misc/lv_color.h>
|
||||||
|
#include <components/settings/Settings.h>
|
||||||
|
|
||||||
|
namespace Pinetime {
|
||||||
|
namespace Applications {
|
||||||
|
lv_color_t Convert(Controllers::Settings::Colors color);
|
||||||
|
}
|
||||||
|
}
|
|
@ -42,6 +42,7 @@
|
||||||
#include "displayapp/screens/settings/SettingWakeUp.h"
|
#include "displayapp/screens/settings/SettingWakeUp.h"
|
||||||
#include "displayapp/screens/settings/SettingDisplay.h"
|
#include "displayapp/screens/settings/SettingDisplay.h"
|
||||||
#include "displayapp/screens/settings/SettingSteps.h"
|
#include "displayapp/screens/settings/SettingSteps.h"
|
||||||
|
#include "displayapp/screens/settings/SettingPineTimeStyle.h"
|
||||||
|
|
||||||
#include "libs/lv_conf.h"
|
#include "libs/lv_conf.h"
|
||||||
|
|
||||||
|
@ -53,9 +54,8 @@ namespace {
|
||||||
return (SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk) != 0;
|
return (SCB->ICSR & SCB_ICSR_VECTACTIVE_Msk) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
TouchEvents Convert(Pinetime::Drivers::Cst816S::TouchInfos info) {
|
TouchEvents ConvertGesture(Pinetime::Drivers::Cst816S::Gestures gesture) {
|
||||||
if (info.isTouch) {
|
switch (gesture) {
|
||||||
switch (info.gesture) {
|
|
||||||
case Pinetime::Drivers::Cst816S::Gestures::SingleTap:
|
case Pinetime::Drivers::Cst816S::Gestures::SingleTap:
|
||||||
return TouchEvents::Tap;
|
return TouchEvents::Tap;
|
||||||
case Pinetime::Drivers::Cst816S::Gestures::LongPress:
|
case Pinetime::Drivers::Cst816S::Gestures::LongPress:
|
||||||
|
@ -75,8 +75,6 @@ namespace {
|
||||||
return TouchEvents::None;
|
return TouchEvents::None;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return TouchEvents::None;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
DisplayApp::DisplayApp(Drivers::St7789& lcd,
|
DisplayApp::DisplayApp(Drivers::St7789& lcd,
|
||||||
|
@ -91,7 +89,8 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd,
|
||||||
Controllers::Settings& settingsController,
|
Controllers::Settings& settingsController,
|
||||||
Pinetime::Controllers::MotorController& motorController,
|
Pinetime::Controllers::MotorController& motorController,
|
||||||
Pinetime::Controllers::MotionController& motionController,
|
Pinetime::Controllers::MotionController& motionController,
|
||||||
Pinetime::Controllers::TimerController& timerController)
|
Pinetime::Controllers::TimerController& timerController,
|
||||||
|
Pinetime::Controllers::TouchHandler& touchHandler)
|
||||||
: lcd {lcd},
|
: lcd {lcd},
|
||||||
lvgl {lvgl},
|
lvgl {lvgl},
|
||||||
touchPanel {touchPanel},
|
touchPanel {touchPanel},
|
||||||
|
@ -104,7 +103,8 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd,
|
||||||
settingsController {settingsController},
|
settingsController {settingsController},
|
||||||
motorController {motorController},
|
motorController {motorController},
|
||||||
motionController {motionController},
|
motionController {motionController},
|
||||||
timerController {timerController} {
|
timerController {timerController},
|
||||||
|
touchHandler {touchHandler} {
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisplayApp::Start() {
|
void DisplayApp::Start() {
|
||||||
|
@ -136,9 +136,6 @@ void DisplayApp::InitHw() {
|
||||||
brightnessController.Set(settingsController.GetBrightness());
|
brightnessController.Set(settingsController.GetBrightness());
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t acc = 0;
|
|
||||||
uint32_t count = 0;
|
|
||||||
bool toggle = true;
|
|
||||||
void DisplayApp::Refresh() {
|
void DisplayApp::Refresh() {
|
||||||
TickType_t queueTimeout;
|
TickType_t queueTimeout;
|
||||||
TickType_t delta;
|
TickType_t delta;
|
||||||
|
@ -194,9 +191,6 @@ void DisplayApp::Refresh() {
|
||||||
// clockScreen.SetBleConnectionState(bleController.IsConnected() ? Screens::Clock::BleConnectionStates::Connected :
|
// clockScreen.SetBleConnectionState(bleController.IsConnected() ? Screens::Clock::BleConnectionStates::Connected :
|
||||||
// Screens::Clock::BleConnectionStates::NotConnected);
|
// Screens::Clock::BleConnectionStates::NotConnected);
|
||||||
break;
|
break;
|
||||||
case Messages::UpdateBatteryLevel:
|
|
||||||
batteryController.Update();
|
|
||||||
break;
|
|
||||||
case Messages::NewNotification:
|
case Messages::NewNotification:
|
||||||
LoadApp(Apps::NotificationsPreview, DisplayApp::FullRefreshDirections::Down);
|
LoadApp(Apps::NotificationsPreview, DisplayApp::FullRefreshDirections::Down);
|
||||||
break;
|
break;
|
||||||
|
@ -212,8 +206,7 @@ void DisplayApp::Refresh() {
|
||||||
if (state != States::Running) {
|
if (state != States::Running) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
auto info = touchPanel.GetTouchInfo();
|
auto gesture = ConvertGesture(touchHandler.GestureGet());
|
||||||
auto gesture = Convert(info);
|
|
||||||
if (gesture == TouchEvents::None) {
|
if (gesture == TouchEvents::None) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -239,11 +232,9 @@ void DisplayApp::Refresh() {
|
||||||
LoadApp(returnToApp, returnDirection);
|
LoadApp(returnToApp, returnDirection);
|
||||||
brightnessController.Set(settingsController.GetBrightness());
|
brightnessController.Set(settingsController.GetBrightness());
|
||||||
brightnessController.Backup();
|
brightnessController.Backup();
|
||||||
} else if (touchMode == TouchModes::Gestures) {
|
|
||||||
if (gesture == TouchEvents::Tap) {
|
|
||||||
lvgl.SetNewTapEvent(info.x, info.y);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
touchHandler.CancelTap();
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case Messages::ButtonPushed:
|
case Messages::ButtonPushed:
|
||||||
|
@ -273,18 +264,13 @@ void DisplayApp::Refresh() {
|
||||||
nextApp = Apps::None;
|
nextApp = Apps::None;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (state != States::Idle && touchMode == TouchModes::Polling) {
|
if (touchHandler.IsTouching()) {
|
||||||
auto info = touchPanel.GetTouchInfo();
|
currentScreen->OnTouchEvent(touchHandler.GetX(), touchHandler.GetY());
|
||||||
if (info.action == 2) { // 2 = contact
|
|
||||||
if (!currentScreen->OnTouchEvent(info.x, info.y)) {
|
|
||||||
lvgl.SetNewTapEvent(info.x, info.y);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisplayApp::RunningState() {
|
void DisplayApp::RunningState() {
|
||||||
if (!currentScreen->Refresh()) {
|
if (!currentScreen->IsRunning()) {
|
||||||
LoadApp(returnToApp, returnDirection);
|
LoadApp(returnToApp, returnDirection);
|
||||||
}
|
}
|
||||||
lv_task_handler();
|
lv_task_handler();
|
||||||
|
@ -302,6 +288,7 @@ void DisplayApp::ReturnApp(Apps app, DisplayApp::FullRefreshDirections direction
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction) {
|
void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction) {
|
||||||
|
touchHandler.CancelTap();
|
||||||
currentScreen.reset(nullptr);
|
currentScreen.reset(nullptr);
|
||||||
SetFullRefresh(direction);
|
SetFullRefresh(direction);
|
||||||
|
|
||||||
|
@ -378,6 +365,10 @@ void DisplayApp::LoadApp(Apps app, DisplayApp::FullRefreshDirections direction)
|
||||||
currentScreen = std::make_unique<Screens::SettingSteps>(this, settingsController);
|
currentScreen = std::make_unique<Screens::SettingSteps>(this, settingsController);
|
||||||
ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown);
|
ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown);
|
||||||
break;
|
break;
|
||||||
|
case Apps::SettingPineTimeStyle:
|
||||||
|
currentScreen = std::make_unique<Screens::SettingPineTimeStyle>(this, settingsController);
|
||||||
|
ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown);
|
||||||
|
break;
|
||||||
case Apps::BatteryInfo:
|
case Apps::BatteryInfo:
|
||||||
currentScreen = std::make_unique<Screens::BatteryInfo>(this, batteryController);
|
currentScreen = std::make_unique<Screens::BatteryInfo>(this, batteryController);
|
||||||
ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown);
|
ReturnApp(Apps::Settings, FullRefreshDirections::Down, TouchEvents::SwipeDown);
|
||||||
|
@ -467,10 +458,6 @@ void DisplayApp::SetFullRefresh(DisplayApp::FullRefreshDirections direction) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DisplayApp::SetTouchMode(DisplayApp::TouchModes mode) {
|
|
||||||
touchMode = mode;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DisplayApp::PushMessageToSystemTask(Pinetime::System::Messages message) {
|
void DisplayApp::PushMessageToSystemTask(Pinetime::System::Messages message) {
|
||||||
if (systemTask != nullptr)
|
if (systemTask != nullptr)
|
||||||
systemTask->PushMessage(message);
|
systemTask->PushMessage(message);
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#include "components/settings/Settings.h"
|
#include "components/settings/Settings.h"
|
||||||
#include "displayapp/screens/Screen.h"
|
#include "displayapp/screens/Screen.h"
|
||||||
#include "components/timer/TimerController.h"
|
#include "components/timer/TimerController.h"
|
||||||
|
#include "touchhandler/TouchHandler.h"
|
||||||
#include "Messages.h"
|
#include "Messages.h"
|
||||||
|
|
||||||
namespace Pinetime {
|
namespace Pinetime {
|
||||||
|
@ -31,6 +32,7 @@ namespace Pinetime {
|
||||||
class NotificationManager;
|
class NotificationManager;
|
||||||
class HeartRateController;
|
class HeartRateController;
|
||||||
class MotionController;
|
class MotionController;
|
||||||
|
class TouchHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace System {
|
namespace System {
|
||||||
|
@ -41,7 +43,6 @@ namespace Pinetime {
|
||||||
public:
|
public:
|
||||||
enum class States { Idle, Running };
|
enum class States { Idle, Running };
|
||||||
enum class FullRefreshDirections { None, Up, Down, Left, Right, LeftAnim, RightAnim };
|
enum class FullRefreshDirections { None, Up, Down, Left, Right, LeftAnim, RightAnim };
|
||||||
enum class TouchModes { Gestures, Polling };
|
|
||||||
|
|
||||||
DisplayApp(Drivers::St7789& lcd,
|
DisplayApp(Drivers::St7789& lcd,
|
||||||
Components::LittleVgl& lvgl,
|
Components::LittleVgl& lvgl,
|
||||||
|
@ -55,14 +56,14 @@ namespace Pinetime {
|
||||||
Controllers::Settings& settingsController,
|
Controllers::Settings& settingsController,
|
||||||
Pinetime::Controllers::MotorController& motorController,
|
Pinetime::Controllers::MotorController& motorController,
|
||||||
Pinetime::Controllers::MotionController& motionController,
|
Pinetime::Controllers::MotionController& motionController,
|
||||||
Pinetime::Controllers::TimerController& timerController);
|
Pinetime::Controllers::TimerController& timerController,
|
||||||
|
Pinetime::Controllers::TouchHandler& touchHandler);
|
||||||
void Start();
|
void Start();
|
||||||
void PushMessage(Display::Messages msg);
|
void PushMessage(Display::Messages msg);
|
||||||
|
|
||||||
void StartApp(Apps app, DisplayApp::FullRefreshDirections direction);
|
void StartApp(Apps app, DisplayApp::FullRefreshDirections direction);
|
||||||
|
|
||||||
void SetFullRefresh(FullRefreshDirections direction);
|
void SetFullRefresh(FullRefreshDirections direction);
|
||||||
void SetTouchMode(TouchModes mode);
|
|
||||||
|
|
||||||
void Register(Pinetime::System::SystemTask* systemTask);
|
void Register(Pinetime::System::SystemTask* systemTask);
|
||||||
|
|
||||||
|
@ -81,6 +82,7 @@ namespace Pinetime {
|
||||||
Pinetime::Controllers::MotorController& motorController;
|
Pinetime::Controllers::MotorController& motorController;
|
||||||
Pinetime::Controllers::MotionController& motionController;
|
Pinetime::Controllers::MotionController& motionController;
|
||||||
Pinetime::Controllers::TimerController& timerController;
|
Pinetime::Controllers::TimerController& timerController;
|
||||||
|
Pinetime::Controllers::TouchHandler& touchHandler;
|
||||||
|
|
||||||
Pinetime::Controllers::FirmwareValidator validator;
|
Pinetime::Controllers::FirmwareValidator validator;
|
||||||
Controllers::BrightnessController brightnessController;
|
Controllers::BrightnessController brightnessController;
|
||||||
|
@ -100,8 +102,7 @@ namespace Pinetime {
|
||||||
FullRefreshDirections returnDirection = FullRefreshDirections::None;
|
FullRefreshDirections returnDirection = FullRefreshDirections::None;
|
||||||
TouchEvents returnTouchEvent = TouchEvents::None;
|
TouchEvents returnTouchEvent = TouchEvents::None;
|
||||||
|
|
||||||
TouchModes touchMode = TouchModes::Gestures;
|
TouchEvents GetGesture();
|
||||||
|
|
||||||
void RunningState();
|
void RunningState();
|
||||||
void IdleState();
|
void IdleState();
|
||||||
static void Process(void* instance);
|
static void Process(void* instance);
|
||||||
|
|
|
@ -3,7 +3,9 @@
|
||||||
#include <task.h>
|
#include <task.h>
|
||||||
#include <libraries/log/nrf_log.h>
|
#include <libraries/log/nrf_log.h>
|
||||||
#include <components/rle/RleDecoder.h>
|
#include <components/rle/RleDecoder.h>
|
||||||
|
#include <touchhandler/TouchHandler.h>
|
||||||
#include "displayapp/icons/infinitime/infinitime-nb.c"
|
#include "displayapp/icons/infinitime/infinitime-nb.c"
|
||||||
|
#include "components/ble/BleController.h"
|
||||||
|
|
||||||
using namespace Pinetime::Applications;
|
using namespace Pinetime::Applications;
|
||||||
|
|
||||||
|
@ -19,7 +21,8 @@ DisplayApp::DisplayApp(Drivers::St7789& lcd,
|
||||||
Controllers::Settings& settingsController,
|
Controllers::Settings& settingsController,
|
||||||
Pinetime::Controllers::MotorController& motorController,
|
Pinetime::Controllers::MotorController& motorController,
|
||||||
Pinetime::Controllers::MotionController& motionController,
|
Pinetime::Controllers::MotionController& motionController,
|
||||||
Pinetime::Controllers::TimerController& timerController)
|
Pinetime::Controllers::TimerController& timerController,
|
||||||
|
Pinetime::Controllers::TouchHandler& touchHandler)
|
||||||
: lcd {lcd}, bleController {bleController} {
|
: lcd {lcd}, bleController {bleController} {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,29 +6,38 @@
|
||||||
#include <bits/unique_ptr.h>
|
#include <bits/unique_ptr.h>
|
||||||
#include <queue.h>
|
#include <queue.h>
|
||||||
#include "components/gfx/Gfx.h"
|
#include "components/gfx/Gfx.h"
|
||||||
#include "components/battery/BatteryController.h"
|
|
||||||
#include "components/brightness/BrightnessController.h"
|
|
||||||
#include "components/ble/BleController.h"
|
|
||||||
#include "components/datetime/DateTimeController.h"
|
|
||||||
#include "components/ble/NotificationManager.h"
|
|
||||||
#include "components/firmwarevalidator/FirmwareValidator.h"
|
|
||||||
#include "drivers/Cst816s.h"
|
#include "drivers/Cst816s.h"
|
||||||
#include <date/date.h>
|
#include <date/date.h>
|
||||||
#include <drivers/Watchdog.h>
|
#include <drivers/Watchdog.h>
|
||||||
#include <components/heartrate/HeartRateController.h>
|
|
||||||
#include <components/motion/MotionController.h>
|
|
||||||
#include <components/motor/MotorController.h>
|
#include <components/motor/MotorController.h>
|
||||||
#include <components/settings/Settings.h>
|
|
||||||
#include "TouchEvents.h"
|
#include "TouchEvents.h"
|
||||||
#include "Apps.h"
|
#include "Apps.h"
|
||||||
#include "Messages.h"
|
#include "Messages.h"
|
||||||
#include "DummyLittleVgl.h"
|
#include "DummyLittleVgl.h"
|
||||||
#include "components/timer/TimerController.h"
|
|
||||||
|
|
||||||
namespace Pinetime {
|
namespace Pinetime {
|
||||||
|
namespace Drivers {
|
||||||
|
class St7789;
|
||||||
|
class Cst816S;
|
||||||
|
class WatchdogView;
|
||||||
|
}
|
||||||
|
namespace Controllers {
|
||||||
|
class Settings;
|
||||||
|
class Battery;
|
||||||
|
class Ble;
|
||||||
|
class DateTime;
|
||||||
|
class NotificationManager;
|
||||||
|
class HeartRateController;
|
||||||
|
class MotionController;
|
||||||
|
class TouchHandler;
|
||||||
|
class MotorController;
|
||||||
|
class TimerController;
|
||||||
|
}
|
||||||
|
|
||||||
namespace System {
|
namespace System {
|
||||||
class SystemTask;
|
class SystemTask;
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace Applications {
|
namespace Applications {
|
||||||
class DisplayApp {
|
class DisplayApp {
|
||||||
public:
|
public:
|
||||||
|
@ -44,7 +53,8 @@ namespace Pinetime {
|
||||||
Controllers::Settings& settingsController,
|
Controllers::Settings& settingsController,
|
||||||
Pinetime::Controllers::MotorController& motorController,
|
Pinetime::Controllers::MotorController& motorController,
|
||||||
Pinetime::Controllers::MotionController& motionController,
|
Pinetime::Controllers::MotionController& motionController,
|
||||||
Pinetime::Controllers::TimerController& timerController);
|
Pinetime::Controllers::TimerController& timerController,
|
||||||
|
Pinetime::Controllers::TouchHandler& touchHandler);
|
||||||
void Start();
|
void Start();
|
||||||
void PushMessage(Pinetime::Applications::Display::Messages msg);
|
void PushMessage(Pinetime::Applications::Display::Messages msg);
|
||||||
void Register(Pinetime::System::SystemTask* systemTask);
|
void Register(Pinetime::System::SystemTask* systemTask);
|
||||||
|
|
|
@ -32,6 +32,9 @@ namespace Pinetime {
|
||||||
}
|
}
|
||||||
void SetNewTapEvent(uint16_t x, uint16_t y) {
|
void SetNewTapEvent(uint16_t x, uint16_t y) {
|
||||||
}
|
}
|
||||||
|
void SetNewTouchPoint(uint16_t x, uint16_t y, bool contact) {
|
||||||
|
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -166,43 +166,21 @@ void LittleVgl::FlushDisplay(const lv_area_t* area, lv_color_t* color_p) {
|
||||||
lv_disp_flush_ready(&disp_drv);
|
lv_disp_flush_ready(&disp_drv);
|
||||||
}
|
}
|
||||||
|
|
||||||
void LittleVgl::SetNewTapEvent(uint16_t x, uint16_t y) {
|
void LittleVgl::SetNewTouchPoint(uint16_t x, uint16_t y, bool contact) {
|
||||||
tap_x = x;
|
tap_x = x;
|
||||||
tap_y = y;
|
tap_y = y;
|
||||||
tapped = true;
|
tapped = contact;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool LittleVgl::GetTouchPadInfo(lv_indev_data_t* ptr) {
|
bool LittleVgl::GetTouchPadInfo(lv_indev_data_t* ptr) {
|
||||||
if (tapped) {
|
|
||||||
ptr->point.x = tap_x;
|
ptr->point.x = tap_x;
|
||||||
ptr->point.y = tap_y;
|
ptr->point.y = tap_y;
|
||||||
|
if (tapped) {
|
||||||
ptr->state = LV_INDEV_STATE_PR;
|
ptr->state = LV_INDEV_STATE_PR;
|
||||||
tapped = false;
|
|
||||||
} else {
|
} else {
|
||||||
ptr->state = LV_INDEV_STATE_REL;
|
ptr->state = LV_INDEV_STATE_REL;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
/*
|
|
||||||
auto info = touchPanel.GetTouchInfo();
|
|
||||||
|
|
||||||
if((previousClick.x != info.x || previousClick.y != info.y) &&
|
|
||||||
(info.gesture == Drivers::Cst816S::Gestures::SingleTap)) {
|
|
||||||
// TODO For an unknown reason, the first touch is taken twice into account.
|
|
||||||
// 'firstTouch' is a quite'n'dirty workaound until I find a better solution
|
|
||||||
if(firstTouch) ptr->state = LV_INDEV_STATE_REL;
|
|
||||||
else ptr->state = LV_INDEV_STATE_PR;
|
|
||||||
firstTouch = false;
|
|
||||||
previousClick.x = info.x;
|
|
||||||
previousClick.y = info.y;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
ptr->state = LV_INDEV_STATE_REL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ptr->point.x = info.x;
|
|
||||||
ptr->point.y = info.y;
|
|
||||||
return false;
|
|
||||||
*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void LittleVgl::InitTheme() {
|
void LittleVgl::InitTheme() {
|
||||||
|
|
|
@ -24,7 +24,7 @@ namespace Pinetime {
|
||||||
void FlushDisplay(const lv_area_t* area, lv_color_t* color_p);
|
void FlushDisplay(const lv_area_t* area, lv_color_t* color_p);
|
||||||
bool GetTouchPadInfo(lv_indev_data_t* ptr);
|
bool GetTouchPadInfo(lv_indev_data_t* ptr);
|
||||||
void SetFullRefresh(FullRefreshDirections direction);
|
void SetFullRefresh(FullRefreshDirections direction);
|
||||||
void SetNewTapEvent(uint16_t x, uint16_t y);
|
void SetNewTouchPoint(uint16_t x, uint16_t y, bool contact);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void InitDisplay();
|
void InitDisplay();
|
||||||
|
|
|
@ -7,7 +7,6 @@ namespace Pinetime {
|
||||||
GoToRunning,
|
GoToRunning,
|
||||||
UpdateDateTime,
|
UpdateDateTime,
|
||||||
UpdateBleConnection,
|
UpdateBleConnection,
|
||||||
UpdateBatteryLevel,
|
|
||||||
TouchEvent,
|
TouchEvent,
|
||||||
ButtonPushed,
|
ButtonPushed,
|
||||||
NewNotification,
|
NewNotification,
|
||||||
|
|
|
@ -34,12 +34,6 @@ ApplicationList::~ApplicationList() {
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ApplicationList::Refresh() {
|
|
||||||
if (running)
|
|
||||||
running = screens.Refresh();
|
|
||||||
return running;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ApplicationList::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
|
bool ApplicationList::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
|
||||||
return screens.OnTouchEvent(event);
|
return screens.OnTouchEvent(event);
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,6 @@ namespace Pinetime {
|
||||||
Pinetime::Controllers::Battery& batteryController,
|
Pinetime::Controllers::Battery& batteryController,
|
||||||
Controllers::DateTime& dateTimeController);
|
Controllers::DateTime& dateTimeController);
|
||||||
~ApplicationList() override;
|
~ApplicationList() override;
|
||||||
bool Refresh() override;
|
|
||||||
bool OnTouchEvent(TouchEvents event) override;
|
bool OnTouchEvent(TouchEvents event) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -4,11 +4,6 @@
|
||||||
|
|
||||||
using namespace Pinetime::Applications::Screens;
|
using namespace Pinetime::Applications::Screens;
|
||||||
|
|
||||||
static void lv_update_task(struct _lv_task_t* task) {
|
|
||||||
auto user_data = static_cast<BatteryInfo*>(task->user_data);
|
|
||||||
user_data->UpdateScreen();
|
|
||||||
}
|
|
||||||
|
|
||||||
BatteryInfo::BatteryInfo(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Battery& batteryController)
|
BatteryInfo::BatteryInfo(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Battery& batteryController)
|
||||||
: Screen(app), batteryController {batteryController} {
|
: Screen(app), batteryController {batteryController} {
|
||||||
|
|
||||||
|
@ -49,18 +44,16 @@ BatteryInfo::BatteryInfo(Pinetime::Applications::DisplayApp* app, Pinetime::Cont
|
||||||
lv_obj_set_pos(backgroundLabel, 0, 0);
|
lv_obj_set_pos(backgroundLabel, 0, 0);
|
||||||
lv_label_set_text_static(backgroundLabel, "");
|
lv_label_set_text_static(backgroundLabel, "");
|
||||||
|
|
||||||
taskUpdate = lv_task_create(lv_update_task, 5000, LV_TASK_PRIO_LOW, this);
|
taskRefresh = lv_task_create(RefreshTaskCallback, 5000, LV_TASK_PRIO_MID, this);
|
||||||
UpdateScreen();
|
Refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
BatteryInfo::~BatteryInfo() {
|
BatteryInfo::~BatteryInfo() {
|
||||||
lv_task_del(taskUpdate);
|
lv_task_del(taskRefresh);
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
}
|
}
|
||||||
|
|
||||||
void BatteryInfo::UpdateScreen() {
|
void BatteryInfo::Refresh() {
|
||||||
|
|
||||||
batteryController.Update();
|
|
||||||
|
|
||||||
batteryPercent = batteryController.PercentRemaining();
|
batteryPercent = batteryController.PercentRemaining();
|
||||||
batteryVoltage = batteryController.Voltage();
|
batteryVoltage = batteryController.Voltage();
|
||||||
|
@ -85,7 +78,3 @@ void BatteryInfo::UpdateScreen() {
|
||||||
lv_label_set_text_fmt(voltage, "%1i.%02i volts", batteryVoltage / 1000, batteryVoltage % 1000 / 10);
|
lv_label_set_text_fmt(voltage, "%1i.%02i volts", batteryVoltage / 1000, batteryVoltage % 1000 / 10);
|
||||||
lv_bar_set_value(charging_bar, batteryPercent, LV_ANIM_ON);
|
lv_bar_set_value(charging_bar, batteryPercent, LV_ANIM_ON);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool BatteryInfo::Refresh() {
|
|
||||||
return running;
|
|
||||||
}
|
|
||||||
|
|
|
@ -19,9 +19,7 @@ namespace Pinetime {
|
||||||
BatteryInfo(DisplayApp* app, Pinetime::Controllers::Battery& batteryController);
|
BatteryInfo(DisplayApp* app, Pinetime::Controllers::Battery& batteryController);
|
||||||
~BatteryInfo() override;
|
~BatteryInfo() override;
|
||||||
|
|
||||||
bool Refresh() override;
|
void Refresh() override;
|
||||||
|
|
||||||
void UpdateScreen();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Pinetime::Controllers::Battery& batteryController;
|
Pinetime::Controllers::Battery& batteryController;
|
||||||
|
@ -31,7 +29,7 @@ namespace Pinetime {
|
||||||
lv_obj_t* charging_bar;
|
lv_obj_t* charging_bar;
|
||||||
lv_obj_t* status;
|
lv_obj_t* status;
|
||||||
|
|
||||||
lv_task_t* taskUpdate;
|
lv_task_t* taskRefresh;
|
||||||
|
|
||||||
uint8_t batteryPercent = 0;
|
uint8_t batteryPercent = 0;
|
||||||
uint16_t batteryVoltage = 0;
|
uint16_t batteryVoltage = 0;
|
||||||
|
|
|
@ -30,10 +30,6 @@ Brightness::~Brightness() {
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Brightness::Refresh() {
|
|
||||||
return running;
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* Brightness::LevelToString(Pinetime::Controllers::BrightnessController::Levels level) {
|
const char* Brightness::LevelToString(Pinetime::Controllers::BrightnessController::Levels level) {
|
||||||
switch (level) {
|
switch (level) {
|
||||||
case Pinetime::Controllers::BrightnessController::Levels::Off:
|
case Pinetime::Controllers::BrightnessController::Levels::Off:
|
||||||
|
|
|
@ -12,7 +12,6 @@ namespace Pinetime {
|
||||||
public:
|
public:
|
||||||
Brightness(DisplayApp* app, Controllers::BrightnessController& brightness);
|
Brightness(DisplayApp* app, Controllers::BrightnessController& brightness);
|
||||||
~Brightness() override;
|
~Brightness() override;
|
||||||
bool Refresh() override;
|
|
||||||
|
|
||||||
bool OnTouchEvent(TouchEvents event) override;
|
bool OnTouchEvent(TouchEvents event) override;
|
||||||
|
|
||||||
|
|
|
@ -50,11 +50,6 @@ Clock::~Clock() {
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Clock::Refresh() {
|
|
||||||
screen->Refresh();
|
|
||||||
return running;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Clock::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
|
bool Clock::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
|
||||||
return screen->OnTouchEvent(event);
|
return screen->OnTouchEvent(event);
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,8 +31,6 @@ namespace Pinetime {
|
||||||
Controllers::MotionController& motionController);
|
Controllers::MotionController& motionController);
|
||||||
~Clock() override;
|
~Clock() override;
|
||||||
|
|
||||||
bool Refresh() override;
|
|
||||||
|
|
||||||
bool OnTouchEvent(TouchEvents event) override;
|
bool OnTouchEvent(TouchEvents event) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -30,14 +30,16 @@ FirmwareUpdate::FirmwareUpdate(Pinetime::Applications::DisplayApp* app, Pinetime
|
||||||
lv_label_set_text(percentLabel, "Waiting...");
|
lv_label_set_text(percentLabel, "Waiting...");
|
||||||
lv_obj_set_auto_realign(percentLabel, true);
|
lv_obj_set_auto_realign(percentLabel, true);
|
||||||
lv_obj_align(percentLabel, bar1, LV_ALIGN_OUT_TOP_MID, 0, 60);
|
lv_obj_align(percentLabel, bar1, LV_ALIGN_OUT_TOP_MID, 0, 60);
|
||||||
|
taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this);
|
||||||
startTime = xTaskGetTickCount();
|
startTime = xTaskGetTickCount();
|
||||||
}
|
}
|
||||||
|
|
||||||
FirmwareUpdate::~FirmwareUpdate() {
|
FirmwareUpdate::~FirmwareUpdate() {
|
||||||
|
lv_task_del(taskRefresh);
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FirmwareUpdate::Refresh() {
|
void FirmwareUpdate::Refresh() {
|
||||||
switch (bleController.State()) {
|
switch (bleController.State()) {
|
||||||
default:
|
default:
|
||||||
case Pinetime::Controllers::Ble::FirmwareUpdateStates::Idle:
|
case Pinetime::Controllers::Ble::FirmwareUpdateStates::Idle:
|
||||||
|
@ -73,7 +75,6 @@ bool FirmwareUpdate::Refresh() {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return running;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FirmwareUpdate::DisplayProgression() const {
|
void FirmwareUpdate::DisplayProgression() const {
|
||||||
|
|
|
@ -16,7 +16,7 @@ namespace Pinetime {
|
||||||
FirmwareUpdate(DisplayApp* app, Pinetime::Controllers::Ble& bleController);
|
FirmwareUpdate(DisplayApp* app, Pinetime::Controllers::Ble& bleController);
|
||||||
~FirmwareUpdate() override;
|
~FirmwareUpdate() override;
|
||||||
|
|
||||||
bool Refresh() override;
|
void Refresh() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
enum class States { Idle, Running, Validated, Error };
|
enum class States { Idle, Running, Validated, Error };
|
||||||
|
@ -36,6 +36,7 @@ namespace Pinetime {
|
||||||
|
|
||||||
void UpdateError();
|
void UpdateError();
|
||||||
|
|
||||||
|
lv_task_t* taskRefresh;
|
||||||
TickType_t startTime;
|
TickType_t startTime;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,15 +63,11 @@ FirmwareValidation::~FirmwareValidation() {
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FirmwareValidation::Refresh() {
|
|
||||||
return running;
|
|
||||||
}
|
|
||||||
|
|
||||||
void FirmwareValidation::OnButtonEvent(lv_obj_t* object, lv_event_t event) {
|
void FirmwareValidation::OnButtonEvent(lv_obj_t* object, lv_event_t event) {
|
||||||
if (object == buttonValidate && event == LV_EVENT_PRESSED) {
|
if (object == buttonValidate && event == LV_EVENT_CLICKED) {
|
||||||
validator.Validate();
|
validator.Validate();
|
||||||
running = false;
|
running = false;
|
||||||
} else if (object == buttonReset && event == LV_EVENT_PRESSED) {
|
} else if (object == buttonReset && event == LV_EVENT_CLICKED) {
|
||||||
validator.Reset();
|
validator.Reset();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,8 +16,6 @@ namespace Pinetime {
|
||||||
FirmwareValidation(DisplayApp* app, Pinetime::Controllers::FirmwareValidator& validator);
|
FirmwareValidation(DisplayApp* app, Pinetime::Controllers::FirmwareValidator& validator);
|
||||||
~FirmwareValidation() override;
|
~FirmwareValidation() override;
|
||||||
|
|
||||||
bool Refresh() override;
|
|
||||||
|
|
||||||
void OnButtonEvent(lv_obj_t* object, lv_event_t event);
|
void OnButtonEvent(lv_obj_t* object, lv_event_t event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -65,10 +65,6 @@ void FlashLight::OnClickEvent(lv_obj_t* obj, lv_event_t event) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool FlashLight::Refresh() {
|
|
||||||
return running;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool FlashLight::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
|
bool FlashLight::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,8 +16,6 @@ namespace Pinetime {
|
||||||
FlashLight(DisplayApp* app, System::SystemTask& systemTask, Controllers::BrightnessController& brightness);
|
FlashLight(DisplayApp* app, System::SystemTask& systemTask, Controllers::BrightnessController& brightness);
|
||||||
~FlashLight() override;
|
~FlashLight() override;
|
||||||
|
|
||||||
bool Refresh() override;
|
|
||||||
|
|
||||||
bool OnTouchEvent(Pinetime::Applications::TouchEvents event) override;
|
bool OnTouchEvent(Pinetime::Applications::TouchEvents event) override;
|
||||||
void OnClickEvent(lv_obj_t* obj, lv_event_t event);
|
void OnClickEvent(lv_obj_t* obj, lv_event_t event);
|
||||||
|
|
||||||
|
|
|
@ -64,14 +64,17 @@ HeartRate::HeartRate(Pinetime::Applications::DisplayApp* app,
|
||||||
UpdateStartStopButton(isHrRunning);
|
UpdateStartStopButton(isHrRunning);
|
||||||
if (isHrRunning)
|
if (isHrRunning)
|
||||||
systemTask.PushMessage(Pinetime::System::Messages::DisableSleeping);
|
systemTask.PushMessage(Pinetime::System::Messages::DisableSleeping);
|
||||||
|
|
||||||
|
taskRefresh = lv_task_create(RefreshTaskCallback, 100, LV_TASK_PRIO_MID, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
HeartRate::~HeartRate() {
|
HeartRate::~HeartRate() {
|
||||||
|
lv_task_del(taskRefresh);
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
systemTask.PushMessage(Pinetime::System::Messages::EnableSleeping);
|
systemTask.PushMessage(Pinetime::System::Messages::EnableSleeping);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool HeartRate::Refresh() {
|
void HeartRate::Refresh() {
|
||||||
|
|
||||||
auto state = heartRateController.State();
|
auto state = heartRateController.State();
|
||||||
switch (state) {
|
switch (state) {
|
||||||
|
@ -86,8 +89,6 @@ bool HeartRate::Refresh() {
|
||||||
|
|
||||||
lv_label_set_text(label_status, ToString(state));
|
lv_label_set_text(label_status, ToString(state));
|
||||||
lv_obj_align(label_status, label_hr, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
|
lv_obj_align(label_status, label_hr, LV_ALIGN_OUT_BOTTOM_MID, 0, 10);
|
||||||
|
|
||||||
return running;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void HeartRate::OnStartStopEvent(lv_event_t event) {
|
void HeartRate::OnStartStopEvent(lv_event_t event) {
|
||||||
|
|
|
@ -20,7 +20,7 @@ namespace Pinetime {
|
||||||
HeartRate(DisplayApp* app, Controllers::HeartRateController& HeartRateController, System::SystemTask& systemTask);
|
HeartRate(DisplayApp* app, Controllers::HeartRateController& HeartRateController, System::SystemTask& systemTask);
|
||||||
~HeartRate() override;
|
~HeartRate() override;
|
||||||
|
|
||||||
bool Refresh() override;
|
void Refresh() override;
|
||||||
|
|
||||||
void OnStartStopEvent(lv_event_t event);
|
void OnStartStopEvent(lv_event_t event);
|
||||||
|
|
||||||
|
@ -33,6 +33,8 @@ namespace Pinetime {
|
||||||
lv_obj_t* label_status;
|
lv_obj_t* label_status;
|
||||||
lv_obj_t* btn_startStop;
|
lv_obj_t* btn_startStop;
|
||||||
lv_obj_t* label_startStop;
|
lv_obj_t* label_startStop;
|
||||||
|
|
||||||
|
lv_task_t* taskRefresh;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,20 +5,13 @@
|
||||||
using namespace Pinetime::Applications::Screens;
|
using namespace Pinetime::Applications::Screens;
|
||||||
|
|
||||||
InfiniPaint::InfiniPaint(Pinetime::Applications::DisplayApp* app, Pinetime::Components::LittleVgl& lvgl) : Screen(app), lvgl {lvgl} {
|
InfiniPaint::InfiniPaint(Pinetime::Applications::DisplayApp* app, Pinetime::Components::LittleVgl& lvgl) : Screen(app), lvgl {lvgl} {
|
||||||
app->SetTouchMode(DisplayApp::TouchModes::Polling);
|
|
||||||
std::fill(b, b + bufferSize, selectColor);
|
std::fill(b, b + bufferSize, selectColor);
|
||||||
}
|
}
|
||||||
|
|
||||||
InfiniPaint::~InfiniPaint() {
|
InfiniPaint::~InfiniPaint() {
|
||||||
// Reset the touchmode
|
|
||||||
app->SetTouchMode(DisplayApp::TouchModes::Gestures);
|
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool InfiniPaint::Refresh() {
|
|
||||||
return running;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool InfiniPaint::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
|
bool InfiniPaint::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case Pinetime::Applications::TouchEvents::LongTap:
|
case Pinetime::Applications::TouchEvents::LongTap:
|
||||||
|
|
|
@ -17,8 +17,6 @@ namespace Pinetime {
|
||||||
|
|
||||||
~InfiniPaint() override;
|
~InfiniPaint() override;
|
||||||
|
|
||||||
bool Refresh() override;
|
|
||||||
|
|
||||||
bool OnTouchEvent(TouchEvents event) override;
|
bool OnTouchEvent(TouchEvents event) override;
|
||||||
|
|
||||||
bool OnTouchEvent(uint16_t x, uint16_t y) override;
|
bool OnTouchEvent(uint16_t x, uint16_t y) override;
|
||||||
|
|
|
@ -36,7 +36,3 @@ Label::Label(uint8_t screenID, uint8_t numScreens, Pinetime::Applications::Displ
|
||||||
Label::~Label() {
|
Label::~Label() {
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Label::Refresh() {
|
|
||||||
return running;
|
|
||||||
}
|
|
||||||
|
|
|
@ -12,8 +12,6 @@ namespace Pinetime {
|
||||||
Label(uint8_t screenID, uint8_t numScreens, DisplayApp* app, lv_obj_t* labelText);
|
Label(uint8_t screenID, uint8_t numScreens, DisplayApp* app, lv_obj_t* labelText);
|
||||||
~Label() override;
|
~Label() override;
|
||||||
|
|
||||||
bool Refresh() override;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
lv_obj_t* labelText = nullptr;
|
lv_obj_t* labelText = nullptr;
|
||||||
lv_point_t pageIndicatorBasePoints[2];
|
lv_point_t pageIndicatorBasePoints[2];
|
||||||
|
|
|
@ -98,13 +98,8 @@ List::~List() {
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool List::Refresh() {
|
|
||||||
|
|
||||||
return running;
|
|
||||||
}
|
|
||||||
|
|
||||||
void List::OnButtonEvent(lv_obj_t* object, lv_event_t event) {
|
void List::OnButtonEvent(lv_obj_t* object, lv_event_t event) {
|
||||||
if (event == LV_EVENT_RELEASED) {
|
if (event == LV_EVENT_CLICKED) {
|
||||||
for (int i = 0; i < MAXLISTITEMS; i++) {
|
for (int i = 0; i < MAXLISTITEMS; i++) {
|
||||||
if (apps[i] != Apps::None && object == itemApps[i]) {
|
if (apps[i] != Apps::None && object == itemApps[i]) {
|
||||||
app->StartApp(apps[i], DisplayApp::FullRefreshDirections::Up);
|
app->StartApp(apps[i], DisplayApp::FullRefreshDirections::Up);
|
||||||
|
|
|
@ -27,8 +27,6 @@ namespace Pinetime {
|
||||||
std::array<Applications, MAXLISTITEMS>& applications);
|
std::array<Applications, MAXLISTITEMS>& applications);
|
||||||
~List() override;
|
~List() override;
|
||||||
|
|
||||||
bool Refresh() override;
|
|
||||||
|
|
||||||
void OnButtonEvent(lv_obj_t* object, lv_event_t event);
|
void OnButtonEvent(lv_obj_t* object, lv_event_t event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -20,17 +20,17 @@ Meter::Meter(Pinetime::Applications::DisplayApp* app) : Screen(app) {
|
||||||
|
|
||||||
lv_obj_set_size(lmeter, 200, 200);
|
lv_obj_set_size(lmeter, 200, 200);
|
||||||
lv_obj_align(lmeter, nullptr, LV_ALIGN_CENTER, 0, 0);
|
lv_obj_align(lmeter, nullptr, LV_ALIGN_CENTER, 0, 0);
|
||||||
|
|
||||||
|
taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
Meter::~Meter() {
|
Meter::~Meter() {
|
||||||
|
lv_task_del(taskRefresh);
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Meter::Refresh() {
|
void Meter::Refresh() {
|
||||||
lv_linemeter_set_value(lmeter, value++); /*Set the current value*/
|
lv_linemeter_set_value(lmeter, value++); /*Set the current value*/
|
||||||
if (value >= 60)
|
if (value >= 60)
|
||||||
value = 0;
|
value = 0;
|
||||||
|
|
||||||
return running;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,13 +14,15 @@ namespace Pinetime {
|
||||||
Meter(DisplayApp* app);
|
Meter(DisplayApp* app);
|
||||||
~Meter() override;
|
~Meter() override;
|
||||||
|
|
||||||
bool Refresh() override;
|
void Refresh() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
lv_style_t style_lmeter;
|
lv_style_t style_lmeter;
|
||||||
lv_obj_t* lmeter;
|
lv_obj_t* lmeter;
|
||||||
|
|
||||||
uint32_t value = 0;
|
uint32_t value = 0;
|
||||||
|
|
||||||
|
lv_task_t* taskRefresh;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -67,16 +67,16 @@ Metronome::Metronome(DisplayApp* app, Controllers::MotorController& motorControl
|
||||||
lv_obj_align(playPause, lv_scr_act(), LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0);
|
lv_obj_align(playPause, lv_scr_act(), LV_ALIGN_IN_BOTTOM_RIGHT, 0, 0);
|
||||||
lv_obj_set_style_local_value_str(playPause, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, Symbols::play);
|
lv_obj_set_style_local_value_str(playPause, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, Symbols::play);
|
||||||
|
|
||||||
app->SetTouchMode(DisplayApp::TouchModes::Polling);
|
taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
Metronome::~Metronome() {
|
Metronome::~Metronome() {
|
||||||
app->SetTouchMode(DisplayApp::TouchModes::Gestures);
|
lv_task_del(taskRefresh);
|
||||||
systemTask.PushMessage(System::Messages::EnableSleeping);
|
systemTask.PushMessage(System::Messages::EnableSleeping);
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Metronome::Refresh() {
|
void Metronome::Refresh() {
|
||||||
if (metronomeStarted) {
|
if (metronomeStarted) {
|
||||||
if (xTaskGetTickCount() - startTime > 60 * configTICK_RATE_HZ / bpm) {
|
if (xTaskGetTickCount() - startTime > 60 * configTICK_RATE_HZ / bpm) {
|
||||||
startTime += 60 * configTICK_RATE_HZ / bpm;
|
startTime += 60 * configTICK_RATE_HZ / bpm;
|
||||||
|
@ -89,7 +89,6 @@ bool Metronome::Refresh() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return running;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Metronome::OnEvent(lv_obj_t* obj, lv_event_t event) {
|
void Metronome::OnEvent(lv_obj_t* obj, lv_event_t event) {
|
||||||
|
|
|
@ -11,7 +11,7 @@ namespace Pinetime {
|
||||||
public:
|
public:
|
||||||
Metronome(DisplayApp* app, Controllers::MotorController& motorController, System::SystemTask& systemTask);
|
Metronome(DisplayApp* app, Controllers::MotorController& motorController, System::SystemTask& systemTask);
|
||||||
~Metronome() override;
|
~Metronome() override;
|
||||||
bool Refresh() override;
|
void Refresh() override;
|
||||||
void OnEvent(lv_obj_t* obj, lv_event_t event);
|
void OnEvent(lv_obj_t* obj, lv_event_t event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -28,6 +28,8 @@ namespace Pinetime {
|
||||||
lv_obj_t *bpmArc, *bpmTap, *bpmValue;
|
lv_obj_t *bpmArc, *bpmTap, *bpmValue;
|
||||||
lv_obj_t *bpbDropdown, *currentBpbText;
|
lv_obj_t *bpbDropdown, *currentBpbText;
|
||||||
lv_obj_t *playPause;
|
lv_obj_t *playPause;
|
||||||
|
|
||||||
|
lv_task_t* taskRefresh;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,13 +36,16 @@ Motion::Motion(Pinetime::Applications::DisplayApp* app, Controllers::MotionContr
|
||||||
labelStep = lv_label_create(lv_scr_act(), NULL);
|
labelStep = lv_label_create(lv_scr_act(), NULL);
|
||||||
lv_obj_align(labelStep, chart, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0);
|
lv_obj_align(labelStep, chart, LV_ALIGN_IN_BOTTOM_LEFT, 0, 0);
|
||||||
lv_label_set_text(labelStep, "Steps ---");
|
lv_label_set_text(labelStep, "Steps ---");
|
||||||
|
|
||||||
|
taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
Motion::~Motion() {
|
Motion::~Motion() {
|
||||||
|
lv_task_del(taskRefresh);
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Motion::Refresh() {
|
void Motion::Refresh() {
|
||||||
lv_chart_set_next(chart, ser1, motionController.X());
|
lv_chart_set_next(chart, ser1, motionController.X());
|
||||||
lv_chart_set_next(chart, ser2, motionController.Y());
|
lv_chart_set_next(chart, ser2, motionController.Y());
|
||||||
lv_chart_set_next(chart, ser3, motionController.Z());
|
lv_chart_set_next(chart, ser3, motionController.Z());
|
||||||
|
@ -55,6 +58,4 @@ bool Motion::Refresh() {
|
||||||
motionController.Y() / 0x10,
|
motionController.Y() / 0x10,
|
||||||
motionController.Z() / 0x10);
|
motionController.Z() / 0x10);
|
||||||
lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_MID, 0, 10);
|
lv_obj_align(label, NULL, LV_ALIGN_IN_TOP_MID, 0, 10);
|
||||||
|
|
||||||
return running;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@ namespace Pinetime {
|
||||||
Motion(DisplayApp* app, Controllers::MotionController& motionController);
|
Motion(DisplayApp* app, Controllers::MotionController& motionController);
|
||||||
~Motion() override;
|
~Motion() override;
|
||||||
|
|
||||||
bool Refresh() override;
|
void Refresh() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Controllers::MotionController& motionController;
|
Controllers::MotionController& motionController;
|
||||||
|
@ -28,6 +28,7 @@ namespace Pinetime {
|
||||||
lv_obj_t* label;
|
lv_obj_t* label;
|
||||||
|
|
||||||
lv_obj_t* labelStep;
|
lv_obj_t* labelStep;
|
||||||
|
lv_task_t* taskRefresh;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -139,14 +139,17 @@ Music::Music(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Mus
|
||||||
frameB = false;
|
frameB = false;
|
||||||
|
|
||||||
musicService.event(Controllers::MusicService::EVENT_MUSIC_OPEN);
|
musicService.event(Controllers::MusicService::EVENT_MUSIC_OPEN);
|
||||||
|
|
||||||
|
taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
Music::~Music() {
|
Music::~Music() {
|
||||||
|
lv_task_del(taskRefresh);
|
||||||
lv_style_reset(&btn_style);
|
lv_style_reset(&btn_style);
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Music::Refresh() {
|
void Music::Refresh() {
|
||||||
if (artist != musicService.getArtist()) {
|
if (artist != musicService.getArtist()) {
|
||||||
artist = musicService.getArtist();
|
artist = musicService.getArtist();
|
||||||
currentLength = 0;
|
currentLength = 0;
|
||||||
|
@ -210,8 +213,6 @@ bool Music::Refresh() {
|
||||||
} else {
|
} else {
|
||||||
lv_label_set_text(txtPlayPause, Symbols::play);
|
lv_label_set_text(txtPlayPause, Symbols::play);
|
||||||
}
|
}
|
||||||
|
|
||||||
return running;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Music::UpdateLength() {
|
void Music::UpdateLength() {
|
||||||
|
|
|
@ -35,7 +35,7 @@ namespace Pinetime {
|
||||||
|
|
||||||
~Music() override;
|
~Music() override;
|
||||||
|
|
||||||
bool Refresh() override;
|
void Refresh() override;
|
||||||
|
|
||||||
void OnObjectEvent(lv_obj_t* obj, lv_event_t event);
|
void OnObjectEvent(lv_obj_t* obj, lv_event_t event);
|
||||||
|
|
||||||
|
@ -79,6 +79,8 @@ namespace Pinetime {
|
||||||
|
|
||||||
bool playing;
|
bool playing;
|
||||||
|
|
||||||
|
lv_task_t* taskRefresh;
|
||||||
|
|
||||||
/** Watchapp */
|
/** Watchapp */
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -161,13 +161,16 @@ Navigation::Navigation(Pinetime::Applications::DisplayApp* app, Pinetime::Contro
|
||||||
lv_bar_set_anim_time(barProgress, 500);
|
lv_bar_set_anim_time(barProgress, 500);
|
||||||
lv_bar_set_range(barProgress, 0, 100);
|
lv_bar_set_range(barProgress, 0, 100);
|
||||||
lv_bar_set_value(barProgress, 0, LV_ANIM_OFF);
|
lv_bar_set_value(barProgress, 0, LV_ANIM_OFF);
|
||||||
|
|
||||||
|
taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
Navigation::~Navigation() {
|
Navigation::~Navigation() {
|
||||||
|
lv_task_del(taskRefresh);
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Navigation::Refresh() {
|
void Navigation::Refresh() {
|
||||||
if (flag != navService.getFlag()) {
|
if (flag != navService.getFlag()) {
|
||||||
flag = navService.getFlag();
|
flag = navService.getFlag();
|
||||||
lv_label_set_text(imgFlag, iconForName(flag));
|
lv_label_set_text(imgFlag, iconForName(flag));
|
||||||
|
@ -192,8 +195,4 @@ bool Navigation::Refresh() {
|
||||||
lv_obj_set_style_local_bg_color(barProgress, LV_BAR_PART_INDIC, LV_STATE_DEFAULT, LV_COLOR_ORANGE);
|
lv_obj_set_style_local_bg_color(barProgress, LV_BAR_PART_INDIC, LV_STATE_DEFAULT, LV_COLOR_ORANGE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return running;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@ namespace Pinetime {
|
||||||
Navigation(DisplayApp* app, Pinetime::Controllers::NavigationService& nav);
|
Navigation(DisplayApp* app, Pinetime::Controllers::NavigationService& nav);
|
||||||
~Navigation() override;
|
~Navigation() override;
|
||||||
|
|
||||||
bool Refresh() override;
|
void Refresh() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
lv_obj_t* imgFlag;
|
lv_obj_t* imgFlag;
|
||||||
|
@ -49,6 +49,8 @@ namespace Pinetime {
|
||||||
std::string narrative;
|
std::string narrative;
|
||||||
std::string manDist;
|
std::string manDist;
|
||||||
int progress;
|
int progress;
|
||||||
|
|
||||||
|
lv_task_t* taskRefresh;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,15 +52,18 @@ Notifications::Notifications(DisplayApp* app,
|
||||||
timeoutTickCountEnd = timeoutTickCountStart + (5 * 1024);
|
timeoutTickCountEnd = timeoutTickCountStart + (5 * 1024);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
Notifications::~Notifications() {
|
Notifications::~Notifications() {
|
||||||
|
lv_task_del(taskRefresh);
|
||||||
// make sure we stop any vibrations before exiting
|
// make sure we stop any vibrations before exiting
|
||||||
Controllers::MotorController::StopRinging();
|
Controllers::MotorController::StopRinging();
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Notifications::Refresh() {
|
void Notifications::Refresh() {
|
||||||
if (mode == Modes::Preview && timeoutLine != nullptr) {
|
if (mode == Modes::Preview && timeoutLine != nullptr) {
|
||||||
auto tick = xTaskGetTickCount();
|
auto tick = xTaskGetTickCount();
|
||||||
int32_t pos = 240 - ((tick - timeoutTickCountStart) / ((timeoutTickCountEnd - timeoutTickCountStart) / 240));
|
int32_t pos = 240 - ((tick - timeoutTickCountStart) / ((timeoutTickCountEnd - timeoutTickCountStart) / 240));
|
||||||
|
@ -70,7 +73,6 @@ bool Notifications::Refresh() {
|
||||||
timeoutLinePoints[1].x = pos;
|
timeoutLinePoints[1].x = pos;
|
||||||
lv_line_set_points(timeoutLine, timeoutLinePoints, 2);
|
lv_line_set_points(timeoutLine, timeoutLinePoints, 2);
|
||||||
}
|
}
|
||||||
return running && currentItem->IsRunning();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Notifications::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
|
bool Notifications::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
|
||||||
|
@ -150,7 +152,7 @@ Notifications::NotificationItem::NotificationItem(const char* title,
|
||||||
uint8_t notifNb,
|
uint8_t notifNb,
|
||||||
Modes mode,
|
Modes mode,
|
||||||
Pinetime::Controllers::AlertNotificationService& alertNotificationService)
|
Pinetime::Controllers::AlertNotificationService& alertNotificationService)
|
||||||
: notifNr {notifNr}, notifNb {notifNb}, mode {mode}, alertNotificationService {alertNotificationService} {
|
: mode {mode}, alertNotificationService {alertNotificationService} {
|
||||||
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));
|
||||||
|
|
|
@ -24,7 +24,7 @@ namespace Pinetime {
|
||||||
Modes mode);
|
Modes mode);
|
||||||
~Notifications() override;
|
~Notifications() override;
|
||||||
|
|
||||||
bool Refresh() override;
|
void Refresh() override;
|
||||||
bool OnTouchEvent(Pinetime::Applications::TouchEvents event) override;
|
bool OnTouchEvent(Pinetime::Applications::TouchEvents event) override;
|
||||||
|
|
||||||
class NotificationItem {
|
class NotificationItem {
|
||||||
|
@ -43,21 +43,13 @@ namespace Pinetime {
|
||||||
void OnCallButtonEvent(lv_obj_t*, lv_event_t event);
|
void OnCallButtonEvent(lv_obj_t*, lv_event_t event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint8_t notifNr = 0;
|
|
||||||
uint8_t notifNb = 0;
|
|
||||||
char pageText[4];
|
|
||||||
|
|
||||||
lv_obj_t* container1;
|
lv_obj_t* container1;
|
||||||
lv_obj_t* t1;
|
|
||||||
lv_obj_t* l1;
|
|
||||||
lv_obj_t* l2;
|
|
||||||
lv_obj_t* bt_accept;
|
lv_obj_t* bt_accept;
|
||||||
lv_obj_t* bt_mute;
|
lv_obj_t* bt_mute;
|
||||||
lv_obj_t* bt_reject;
|
lv_obj_t* bt_reject;
|
||||||
lv_obj_t* label_accept;
|
lv_obj_t* label_accept;
|
||||||
lv_obj_t* label_mute;
|
lv_obj_t* label_mute;
|
||||||
lv_obj_t* label_reject;
|
lv_obj_t* label_reject;
|
||||||
lv_obj_t* bottomPlaceholder;
|
|
||||||
Modes mode;
|
Modes mode;
|
||||||
Pinetime::Controllers::AlertNotificationService& alertNotificationService;
|
Pinetime::Controllers::AlertNotificationService& alertNotificationService;
|
||||||
bool running = true;
|
bool running = true;
|
||||||
|
@ -79,6 +71,8 @@ namespace Pinetime {
|
||||||
lv_obj_t* timeoutLine = nullptr;
|
lv_obj_t* timeoutLine = nullptr;
|
||||||
uint32_t timeoutTickCountStart;
|
uint32_t timeoutTickCountStart;
|
||||||
uint32_t timeoutTickCountEnd;
|
uint32_t timeoutTickCountEnd;
|
||||||
|
|
||||||
|
lv_task_t* taskRefresh;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,8 +5,6 @@
|
||||||
using namespace Pinetime::Applications::Screens;
|
using namespace Pinetime::Applications::Screens;
|
||||||
|
|
||||||
Paddle::Paddle(Pinetime::Applications::DisplayApp* app, Pinetime::Components::LittleVgl& lvgl) : Screen(app), lvgl {lvgl} {
|
Paddle::Paddle(Pinetime::Applications::DisplayApp* app, Pinetime::Components::LittleVgl& lvgl) : Screen(app), lvgl {lvgl} {
|
||||||
app->SetTouchMode(DisplayApp::TouchModes::Polling);
|
|
||||||
|
|
||||||
background = lv_obj_create(lv_scr_act(), nullptr);
|
background = lv_obj_create(lv_scr_act(), nullptr);
|
||||||
lv_obj_set_size(background, LV_HOR_RES + 1, LV_VER_RES);
|
lv_obj_set_size(background, LV_HOR_RES + 1, LV_VER_RES);
|
||||||
lv_obj_set_pos(background, -1, 0);
|
lv_obj_set_pos(background, -1, 0);
|
||||||
|
@ -29,15 +27,16 @@ Paddle::Paddle(Pinetime::Applications::DisplayApp* app, Pinetime::Components::Li
|
||||||
lv_obj_set_style_local_bg_color(ball, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE);
|
lv_obj_set_style_local_bg_color(ball, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE);
|
||||||
lv_obj_set_style_local_radius(ball, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE);
|
lv_obj_set_style_local_radius(ball, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_RADIUS_CIRCLE);
|
||||||
lv_obj_set_size(ball, ballSize, ballSize);
|
lv_obj_set_size(ball, ballSize, ballSize);
|
||||||
|
|
||||||
|
taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
Paddle::~Paddle() {
|
Paddle::~Paddle() {
|
||||||
// Reset the touchmode
|
lv_task_del(taskRefresh);
|
||||||
app->SetTouchMode(DisplayApp::TouchModes::Gestures);
|
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Paddle::Refresh() {
|
void Paddle::Refresh() {
|
||||||
ballX += dx;
|
ballX += dx;
|
||||||
ballY += dy;
|
ballY += dy;
|
||||||
|
|
||||||
|
@ -69,7 +68,6 @@ bool Paddle::Refresh() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
lv_label_set_text_fmt(points, "%04d", score);
|
lv_label_set_text_fmt(points, "%04d", score);
|
||||||
return running;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Paddle::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
|
bool Paddle::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
|
||||||
|
|
|
@ -16,7 +16,7 @@ namespace Pinetime {
|
||||||
Paddle(DisplayApp* app, Pinetime::Components::LittleVgl& lvgl);
|
Paddle(DisplayApp* app, Pinetime::Components::LittleVgl& lvgl);
|
||||||
~Paddle() override;
|
~Paddle() override;
|
||||||
|
|
||||||
bool Refresh() override;
|
void Refresh() override;
|
||||||
|
|
||||||
bool OnTouchEvent(TouchEvents event) override;
|
bool OnTouchEvent(TouchEvents event) override;
|
||||||
bool OnTouchEvent(uint16_t x, uint16_t y) override;
|
bool OnTouchEvent(uint16_t x, uint16_t y) override;
|
||||||
|
@ -40,6 +40,8 @@ namespace Pinetime {
|
||||||
lv_obj_t* paddle;
|
lv_obj_t* paddle;
|
||||||
lv_obj_t* ball;
|
lv_obj_t* ball;
|
||||||
lv_obj_t* background;
|
lv_obj_t* background;
|
||||||
|
|
||||||
|
lv_task_t* taskRefresh;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#include <date/date.h>
|
#include <date/date.h>
|
||||||
#include <lvgl/lvgl.h>
|
#include <lvgl/lvgl.h>
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
#include <displayapp/Colors.h>
|
||||||
#include "BatteryIcon.h"
|
#include "BatteryIcon.h"
|
||||||
#include "BleIcon.h"
|
#include "BleIcon.h"
|
||||||
#include "NotificationIcon.h"
|
#include "NotificationIcon.h"
|
||||||
|
@ -51,7 +52,8 @@ PineTimeStyle::PineTimeStyle(DisplayApp* app,
|
||||||
notificatioManager {notificatioManager},
|
notificatioManager {notificatioManager},
|
||||||
settingsController {settingsController},
|
settingsController {settingsController},
|
||||||
motionController {motionController} {
|
motionController {motionController} {
|
||||||
/* This sets the watchface number to return to after leaving the menu */
|
|
||||||
|
// This sets the watchface number to return to after leaving the menu
|
||||||
settingsController.SetClockFace(2);
|
settingsController.SetClockFace(2);
|
||||||
|
|
||||||
displayedChar[0] = 0;
|
displayedChar[0] = 0;
|
||||||
|
@ -60,40 +62,40 @@ PineTimeStyle::PineTimeStyle(DisplayApp* app,
|
||||||
displayedChar[3] = 0;
|
displayedChar[3] = 0;
|
||||||
displayedChar[4] = 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, lv_color_hex(0x000000));
|
lv_obj_set_style_local_bg_color(timebar, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, Convert(settingsController.GetPTSColorBG()));
|
||||||
lv_obj_set_style_local_radius(timebar, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 0);
|
lv_obj_set_style_local_radius(timebar, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 0);
|
||||||
lv_obj_set_size(timebar, 200, 240);
|
lv_obj_set_size(timebar, 200, 240);
|
||||||
lv_obj_align(timebar, lv_scr_act(), LV_ALIGN_IN_TOP_LEFT, 5, 0);
|
lv_obj_align(timebar, lv_scr_act(), LV_ALIGN_IN_TOP_LEFT, 5, 0);
|
||||||
|
|
||||||
/* Display the time */
|
// Display the time
|
||||||
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, lv_color_hex(0x008080));
|
lv_obj_set_style_local_text_color(timeDD1, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, Convert(settingsController.GetPTSColorTime()));
|
||||||
lv_label_set_text(timeDD1, "12");
|
lv_label_set_text(timeDD1, "12");
|
||||||
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, lv_color_hex(0x008080));
|
lv_obj_set_style_local_text_color(timeDD2, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, Convert(settingsController.GetPTSColorTime()));
|
||||||
lv_label_set_text(timeDD2, "34");
|
lv_label_set_text(timeDD2, "34");
|
||||||
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, lv_color_hex(0x008080));
|
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(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
|
||||||
sidebar = lv_obj_create(lv_scr_act(), nullptr);
|
sidebar = lv_obj_create(lv_scr_act(), nullptr);
|
||||||
lv_obj_set_style_local_bg_color(sidebar, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x008080));
|
lv_obj_set_style_local_bg_color(sidebar, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, Convert(settingsController.GetPTSColorBar()));
|
||||||
lv_obj_set_style_local_radius(sidebar, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 0);
|
lv_obj_set_style_local_radius(sidebar, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 0);
|
||||||
lv_obj_set_size(sidebar, 40, 240);
|
lv_obj_set_size(sidebar, 40, 240);
|
||||||
lv_obj_align(sidebar, lv_scr_act(), LV_ALIGN_IN_TOP_RIGHT, 0, 0);
|
lv_obj_align(sidebar, lv_scr_act(), LV_ALIGN_IN_TOP_RIGHT, 0, 0);
|
||||||
|
|
||||||
/* 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_hex(0x000000));
|
lv_obj_set_style_local_text_color(batteryIcon, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x000000));
|
||||||
lv_label_set_text(batteryIcon, Symbols::batteryFull);
|
lv_label_set_text(batteryIcon, Symbols::batteryFull);
|
||||||
|
@ -111,7 +113,7 @@ PineTimeStyle::PineTimeStyle(DisplayApp* app,
|
||||||
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_obj_align(notificationIcon, sidebar, LV_ALIGN_IN_TOP_MID, 0, 40);
|
lv_obj_align(notificationIcon, sidebar, LV_ALIGN_IN_TOP_MID, 0, 40);
|
||||||
|
|
||||||
/* Calendar icon */
|
// Calendar icon
|
||||||
calendarOuter = lv_obj_create(lv_scr_act(), nullptr);
|
calendarOuter = lv_obj_create(lv_scr_act(), nullptr);
|
||||||
lv_obj_set_style_local_bg_color(calendarOuter, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x000000));
|
lv_obj_set_style_local_bg_color(calendarOuter, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x000000));
|
||||||
lv_obj_set_style_local_radius(calendarOuter, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 0);
|
lv_obj_set_style_local_radius(calendarOuter, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 0);
|
||||||
|
@ -148,7 +150,7 @@ PineTimeStyle::PineTimeStyle(DisplayApp* app,
|
||||||
lv_obj_set_size(calendarCrossBar2, 8, 3);
|
lv_obj_set_size(calendarCrossBar2, 8, 3);
|
||||||
lv_obj_align(calendarCrossBar2, calendarBar2, LV_ALIGN_IN_BOTTOM_MID, 0, 0);
|
lv_obj_align(calendarCrossBar2, calendarBar2, LV_ALIGN_IN_BOTTOM_MID, 0, 0);
|
||||||
|
|
||||||
/* 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_hex(0x000000));
|
lv_obj_set_style_local_text_color(dateDayOfWeek, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x000000));
|
||||||
lv_label_set_text(dateDayOfWeek, "THU");
|
lv_label_set_text(dateDayOfWeek, "THU");
|
||||||
|
@ -184,7 +186,7 @@ PineTimeStyle::PineTimeStyle(DisplayApp* app,
|
||||||
lv_obj_set_style_local_line_width(stepGauge, LV_GAUGE_PART_MAIN, LV_STATE_DEFAULT, 4);
|
lv_obj_set_style_local_line_width(stepGauge, LV_GAUGE_PART_MAIN, LV_STATE_DEFAULT, 4);
|
||||||
lv_obj_set_style_local_line_color(stepGauge, LV_GAUGE_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
|
lv_obj_set_style_local_line_color(stepGauge, LV_GAUGE_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
|
||||||
lv_obj_set_style_local_line_opa(stepGauge, LV_GAUGE_PART_NEEDLE, LV_STATE_DEFAULT, LV_OPA_COVER);
|
lv_obj_set_style_local_line_opa(stepGauge, LV_GAUGE_PART_NEEDLE, LV_STATE_DEFAULT, LV_OPA_COVER);
|
||||||
lv_obj_set_style_local_line_width(stepGauge, LV_GAUGE_PART_NEEDLE, LV_STATE_DEFAULT, 4);
|
lv_obj_set_style_local_line_width(stepGauge, LV_GAUGE_PART_NEEDLE, LV_STATE_DEFAULT, 3);
|
||||||
lv_obj_set_style_local_pad_inner(stepGauge, LV_GAUGE_PART_NEEDLE, LV_STATE_DEFAULT, 4);
|
lv_obj_set_style_local_pad_inner(stepGauge, LV_GAUGE_PART_NEEDLE, LV_STATE_DEFAULT, 4);
|
||||||
|
|
||||||
backgroundLabel = lv_label_create(lv_scr_act(), nullptr);
|
backgroundLabel = lv_label_create(lv_scr_act(), nullptr);
|
||||||
|
@ -193,13 +195,17 @@ PineTimeStyle::PineTimeStyle(DisplayApp* app,
|
||||||
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(backgroundLabel, "");
|
||||||
|
|
||||||
|
taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this);
|
||||||
|
Refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
PineTimeStyle::~PineTimeStyle() {
|
PineTimeStyle::~PineTimeStyle() {
|
||||||
|
lv_task_del(taskRefresh);
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool PineTimeStyle::Refresh() {
|
void PineTimeStyle::Refresh() {
|
||||||
batteryPercentRemaining = batteryController.PercentRemaining();
|
batteryPercentRemaining = batteryController.PercentRemaining();
|
||||||
if (batteryPercentRemaining.IsUpdated()) {
|
if (batteryPercentRemaining.IsUpdated()) {
|
||||||
auto batteryPercent = batteryPercentRemaining.Get();
|
auto batteryPercent = batteryPercentRemaining.Get();
|
||||||
|
@ -303,6 +309,4 @@ bool PineTimeStyle::Refresh() {
|
||||||
lv_obj_set_style_local_scale_grad_color(stepGauge, LV_GAUGE_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE);
|
lv_obj_set_style_local_scale_grad_color(stepGauge, LV_GAUGE_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_WHITE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return running;
|
|
||||||
}
|
}
|
|
@ -30,7 +30,7 @@ namespace Pinetime {
|
||||||
Controllers::MotionController& motionController);
|
Controllers::MotionController& motionController);
|
||||||
~PineTimeStyle() override;
|
~PineTimeStyle() override;
|
||||||
|
|
||||||
bool Refresh() override;
|
void Refresh() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
char displayedChar[5];
|
char displayedChar[5];
|
||||||
|
@ -75,6 +75,8 @@ namespace Pinetime {
|
||||||
Controllers::NotificationManager& notificatioManager;
|
Controllers::NotificationManager& notificatioManager;
|
||||||
Controllers::Settings& settingsController;
|
Controllers::Settings& settingsController;
|
||||||
Controllers::MotionController& motionController;
|
Controllers::MotionController& motionController;
|
||||||
|
|
||||||
|
lv_task_t* taskRefresh;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,2 +1,6 @@
|
||||||
#include "Screen.h"
|
#include "Screen.h"
|
||||||
using namespace Pinetime::Applications::Screens;
|
using namespace Pinetime::Applications::Screens;
|
||||||
|
|
||||||
|
void Screen::RefreshTaskCallback(lv_task_t* task) {
|
||||||
|
static_cast<Screen*>(task->user_data)->Refresh();
|
||||||
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include "../TouchEvents.h"
|
#include "../TouchEvents.h"
|
||||||
|
#include <lvgl/lvgl.h>
|
||||||
|
|
||||||
namespace Pinetime {
|
namespace Pinetime {
|
||||||
namespace Applications {
|
namespace Applications {
|
||||||
|
@ -38,25 +39,20 @@ namespace Pinetime {
|
||||||
};
|
};
|
||||||
|
|
||||||
class Screen {
|
class Screen {
|
||||||
|
private:
|
||||||
|
virtual void Refresh() {
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit Screen(DisplayApp* app) : app {app} {
|
explicit Screen(DisplayApp* app) : app {app} {
|
||||||
}
|
}
|
||||||
virtual ~Screen() = default;
|
virtual ~Screen() = default;
|
||||||
|
|
||||||
/**
|
static void RefreshTaskCallback(lv_task_t* task);
|
||||||
* Most of the time, apps only react to events (touch events, for example).
|
|
||||||
* In this case you don't need to do anything in this method.
|
bool IsRunning() const {
|
||||||
*
|
return running;
|
||||||
* For example, InfiniPaint does nothing in Refresh().
|
}
|
||||||
* But, if you want to update your display periodically, draw an animation...
|
|
||||||
* you cannot do it in a touch event handler because these handlers are not
|
|
||||||
* called if the user does not touch the screen.
|
|
||||||
*
|
|
||||||
* That's why Refresh() is there: update the display periodically.
|
|
||||||
*
|
|
||||||
* @return false if the app can be closed, true if it must continue to run
|
|
||||||
**/
|
|
||||||
virtual bool Refresh() = 0;
|
|
||||||
|
|
||||||
/** @return false if the button hasn't been handled by the app, true if it has been handled */
|
/** @return false if the button hasn't been handled by the app, true if it has been handled */
|
||||||
virtual bool OnButtonPushed() {
|
virtual bool OnButtonPushed() {
|
||||||
|
@ -64,6 +60,7 @@ namespace Pinetime {
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return false if the event hasn't been handled by the app, true if it has been handled */
|
/** @return false if the event hasn't been handled by the app, true if it has been handled */
|
||||||
|
// Returning true will cancel lvgl tap
|
||||||
virtual bool OnTouchEvent(TouchEvents event) {
|
virtual bool OnTouchEvent(TouchEvents event) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,11 +30,6 @@ namespace Pinetime {
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Refresh() override {
|
|
||||||
running = current->Refresh();
|
|
||||||
return running;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool OnTouchEvent(TouchEvents event) override {
|
bool OnTouchEvent(TouchEvents event) override {
|
||||||
|
|
||||||
if (mode == ScreenListModes::UpDown) {
|
if (mode == ScreenListModes::UpDown) {
|
||||||
|
|
|
@ -47,20 +47,20 @@ Steps::Steps(Pinetime::Applications::DisplayApp* app,
|
||||||
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_static(backgroundLabel, "");
|
lv_label_set_text_static(backgroundLabel, "");
|
||||||
|
|
||||||
|
taskRefresh = lv_task_create(RefreshTaskCallback, 100, LV_TASK_PRIO_MID, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
Steps::~Steps() {
|
Steps::~Steps() {
|
||||||
|
lv_task_del(taskRefresh);
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Steps::Refresh() {
|
void Steps::Refresh() {
|
||||||
|
|
||||||
stepsCount = motionController.NbSteps();
|
stepsCount = motionController.NbSteps();
|
||||||
|
|
||||||
lv_label_set_text_fmt(lSteps, "%li", stepsCount);
|
lv_label_set_text_fmt(lSteps, "%li", stepsCount);
|
||||||
lv_obj_align(lSteps, nullptr, LV_ALIGN_CENTER, 0, -20);
|
lv_obj_align(lSteps, nullptr, LV_ALIGN_CENTER, 0, -20);
|
||||||
|
|
||||||
lv_arc_set_value(stepsArc, int16_t(500 * stepsCount / settingsController.GetStepsGoal()));
|
lv_arc_set_value(stepsArc, int16_t(500 * stepsCount / settingsController.GetStepsGoal()));
|
||||||
|
|
||||||
return running;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,23 +16,22 @@ namespace Pinetime {
|
||||||
|
|
||||||
class Steps : public Screen {
|
class Steps : public Screen {
|
||||||
public:
|
public:
|
||||||
Steps(DisplayApp* app, Controllers::MotionController& motionController, Controllers::Settings &settingsController);
|
Steps(DisplayApp* app, Controllers::MotionController& motionController, Controllers::Settings& settingsController);
|
||||||
~Steps() override;
|
~Steps() override;
|
||||||
|
|
||||||
bool Refresh() override;
|
void Refresh() override;
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
Controllers::MotionController& motionController;
|
Controllers::MotionController& motionController;
|
||||||
Controllers::Settings& settingsController;
|
Controllers::Settings& settingsController;
|
||||||
|
|
||||||
lv_obj_t * lSteps;
|
lv_obj_t* lSteps;
|
||||||
lv_obj_t * lStepsIcon;
|
lv_obj_t* lStepsIcon;
|
||||||
lv_obj_t * stepsArc;
|
lv_obj_t* stepsArc;
|
||||||
|
|
||||||
uint32_t stepsCount;
|
uint32_t stepsCount;
|
||||||
|
|
||||||
|
lv_task_t* taskRefresh;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,7 +48,6 @@ static void stop_lap_event_handler(lv_obj_t* obj, lv_event_t event) {
|
||||||
StopWatch::StopWatch(DisplayApp* app, System::SystemTask& systemTask)
|
StopWatch::StopWatch(DisplayApp* app, System::SystemTask& systemTask)
|
||||||
: Screen(app),
|
: Screen(app),
|
||||||
systemTask {systemTask},
|
systemTask {systemTask},
|
||||||
running {true},
|
|
||||||
currentState {States::Init},
|
currentState {States::Init},
|
||||||
startTime {},
|
startTime {},
|
||||||
oldTimeElapsed {},
|
oldTimeElapsed {},
|
||||||
|
@ -101,9 +100,12 @@ StopWatch::StopWatch(DisplayApp* app, System::SystemTask& systemTask)
|
||||||
lv_obj_set_style_local_text_color(lapTwoText, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_YELLOW);
|
lv_obj_set_style_local_text_color(lapTwoText, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_YELLOW);
|
||||||
lv_obj_align(lapTwoText, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 50, 55);
|
lv_obj_align(lapTwoText, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 50, 55);
|
||||||
lv_label_set_text(lapTwoText, "");
|
lv_label_set_text(lapTwoText, "");
|
||||||
|
|
||||||
|
taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
StopWatch::~StopWatch() {
|
StopWatch::~StopWatch() {
|
||||||
|
lv_task_del(taskRefresh);
|
||||||
systemTask.PushMessage(Pinetime::System::Messages::EnableSleeping);
|
systemTask.PushMessage(Pinetime::System::Messages::EnableSleeping);
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
}
|
}
|
||||||
|
@ -149,7 +151,7 @@ void StopWatch::pause() {
|
||||||
systemTask.PushMessage(Pinetime::System::Messages::EnableSleeping);
|
systemTask.PushMessage(Pinetime::System::Messages::EnableSleeping);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool StopWatch::Refresh() {
|
void StopWatch::Refresh() {
|
||||||
if (currentState == States::Running) {
|
if (currentState == States::Running) {
|
||||||
timeElapsed = calculateDelta(startTime, xTaskGetTickCount());
|
timeElapsed = calculateDelta(startTime, xTaskGetTickCount());
|
||||||
currentTimeSeparated = convertTicksToTimeSegments((oldTimeElapsed + timeElapsed));
|
currentTimeSeparated = convertTicksToTimeSegments((oldTimeElapsed + timeElapsed));
|
||||||
|
@ -157,11 +159,10 @@ bool StopWatch::Refresh() {
|
||||||
lv_label_set_text_fmt(time, "%02d:%02d", currentTimeSeparated.mins, currentTimeSeparated.secs);
|
lv_label_set_text_fmt(time, "%02d:%02d", currentTimeSeparated.mins, currentTimeSeparated.secs);
|
||||||
lv_label_set_text_fmt(msecTime, "%02d", currentTimeSeparated.hundredths);
|
lv_label_set_text_fmt(msecTime, "%02d", currentTimeSeparated.hundredths);
|
||||||
}
|
}
|
||||||
return running;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void StopWatch::playPauseBtnEventHandler(lv_event_t event) {
|
void StopWatch::playPauseBtnEventHandler(lv_event_t event) {
|
||||||
if (event != LV_EVENT_PRESSED) {
|
if (event != LV_EVENT_CLICKED) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (currentState == States::Init) {
|
if (currentState == States::Init) {
|
||||||
|
@ -174,7 +175,7 @@ void StopWatch::playPauseBtnEventHandler(lv_event_t event) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void StopWatch::stopLapBtnEventHandler(lv_event_t event) {
|
void StopWatch::stopLapBtnEventHandler(lv_event_t event) {
|
||||||
if (event != LV_EVENT_PRESSED) {
|
if (event != LV_EVENT_CLICKED) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// If running, then this button is used to save laps
|
// If running, then this button is used to save laps
|
||||||
|
@ -196,8 +197,7 @@ void StopWatch::stopLapBtnEventHandler(lv_event_t event) {
|
||||||
bool StopWatch::OnButtonPushed() {
|
bool StopWatch::OnButtonPushed() {
|
||||||
if (currentState == States::Running) {
|
if (currentState == States::Running) {
|
||||||
pause();
|
pause();
|
||||||
} else {
|
|
||||||
running = false;
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,7 +64,7 @@ namespace Pinetime::Applications::Screens {
|
||||||
public:
|
public:
|
||||||
StopWatch(DisplayApp* app, System::SystemTask& systemTask);
|
StopWatch(DisplayApp* app, System::SystemTask& systemTask);
|
||||||
~StopWatch() override;
|
~StopWatch() override;
|
||||||
bool Refresh() override;
|
void Refresh() override;
|
||||||
|
|
||||||
void playPauseBtnEventHandler(lv_event_t event);
|
void playPauseBtnEventHandler(lv_event_t event);
|
||||||
void stopLapBtnEventHandler(lv_event_t event);
|
void stopLapBtnEventHandler(lv_event_t event);
|
||||||
|
@ -77,7 +77,6 @@ namespace Pinetime::Applications::Screens {
|
||||||
private:
|
private:
|
||||||
Pinetime::System::SystemTask& systemTask;
|
Pinetime::System::SystemTask& systemTask;
|
||||||
TickType_t timeElapsed;
|
TickType_t timeElapsed;
|
||||||
bool running;
|
|
||||||
States currentState;
|
States currentState;
|
||||||
TickType_t startTime;
|
TickType_t startTime;
|
||||||
TickType_t oldTimeElapsed;
|
TickType_t oldTimeElapsed;
|
||||||
|
@ -86,5 +85,7 @@ namespace Pinetime::Applications::Screens {
|
||||||
int lapNr = 0;
|
int lapNr = 0;
|
||||||
lv_obj_t *time, *msecTime, *btnPlayPause, *btnStopLap, *txtPlayPause, *txtStopLap;
|
lv_obj_t *time, *msecTime, *btnPlayPause, *btnStopLap, *txtPlayPause, *txtStopLap;
|
||||||
lv_obj_t *lapOneText, *lapTwoText;
|
lv_obj_t *lapOneText, *lapTwoText;
|
||||||
|
|
||||||
|
lv_task_t* taskRefresh;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,13 +65,6 @@ SystemInfo::~SystemInfo() {
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SystemInfo::Refresh() {
|
|
||||||
if (running) {
|
|
||||||
screens.Refresh();
|
|
||||||
}
|
|
||||||
return running;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SystemInfo::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
|
bool SystemInfo::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
|
||||||
return screens.OnTouchEvent(event);
|
return screens.OnTouchEvent(event);
|
||||||
}
|
}
|
||||||
|
@ -207,7 +200,7 @@ bool SystemInfo::sortById(const TaskStatus_t& lhs, const TaskStatus_t& rhs) {
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<Screen> SystemInfo::CreateScreen4() {
|
std::unique_ptr<Screen> SystemInfo::CreateScreen4() {
|
||||||
TaskStatus_t tasksStatus[7];
|
TaskStatus_t tasksStatus[10];
|
||||||
lv_obj_t* infoTask = lv_table_create(lv_scr_act(), NULL);
|
lv_obj_t* infoTask = lv_table_create(lv_scr_act(), NULL);
|
||||||
lv_table_set_col_cnt(infoTask, 4);
|
lv_table_set_col_cnt(infoTask, 4);
|
||||||
lv_table_set_row_cnt(infoTask, 8);
|
lv_table_set_row_cnt(infoTask, 8);
|
||||||
|
@ -222,9 +215,9 @@ std::unique_ptr<Screen> SystemInfo::CreateScreen4() {
|
||||||
lv_table_set_cell_value(infoTask, 0, 3, "Free");
|
lv_table_set_cell_value(infoTask, 0, 3, "Free");
|
||||||
lv_table_set_col_width(infoTask, 3, 90);
|
lv_table_set_col_width(infoTask, 3, 90);
|
||||||
|
|
||||||
auto nb = uxTaskGetSystemState(tasksStatus, 7, nullptr);
|
auto nb = uxTaskGetSystemState(tasksStatus, sizeof(tasksStatus) / sizeof(tasksStatus[0]), nullptr);
|
||||||
std::sort(tasksStatus, tasksStatus + nb, sortById);
|
std::sort(tasksStatus, tasksStatus + nb, sortById);
|
||||||
for (uint8_t i = 0; i < nb; i++) {
|
for (uint8_t i = 0; i < nb && i < 7; i++) {
|
||||||
|
|
||||||
lv_table_set_cell_value(infoTask, i + 1, 0, std::to_string(tasksStatus[i].xTaskNumber).c_str());
|
lv_table_set_cell_value(infoTask, i + 1, 0, std::to_string(tasksStatus[i].xTaskNumber).c_str());
|
||||||
char state[2] = {0};
|
char state[2] = {0};
|
||||||
|
|
|
@ -30,7 +30,6 @@ namespace Pinetime {
|
||||||
Pinetime::Drivers::WatchdogView& watchdog,
|
Pinetime::Drivers::WatchdogView& watchdog,
|
||||||
Pinetime::Controllers::MotionController& motionController);
|
Pinetime::Controllers::MotionController& motionController);
|
||||||
~SystemInfo() override;
|
~SystemInfo() override;
|
||||||
bool Refresh() override;
|
|
||||||
bool OnTouchEvent(TouchEvents event) override;
|
bool OnTouchEvent(TouchEvents event) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -95,6 +95,7 @@ Tile::Tile(uint8_t screenID,
|
||||||
lv_obj_set_style_local_pad_inner(btnm1, LV_BTNMATRIX_PART_BG, LV_STATE_DEFAULT, 10);
|
lv_obj_set_style_local_pad_inner(btnm1, LV_BTNMATRIX_PART_BG, LV_STATE_DEFAULT, 10);
|
||||||
|
|
||||||
for (uint8_t i = 0; i < 6; i++) {
|
for (uint8_t i = 0; i < 6; i++) {
|
||||||
|
lv_btnmatrix_set_btn_ctrl(btnm1, i, LV_BTNMATRIX_CTRL_CLICK_TRIG);
|
||||||
if (applications[i].application == Apps::None) {
|
if (applications[i].application == Apps::None) {
|
||||||
lv_btnmatrix_set_btn_ctrl(btnm1, i, LV_BTNMATRIX_CTRL_DISABLED);
|
lv_btnmatrix_set_btn_ctrl(btnm1, i, LV_BTNMATRIX_CTRL_DISABLED);
|
||||||
}
|
}
|
||||||
|
@ -122,10 +123,6 @@ void Tile::UpdateScreen() {
|
||||||
lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryController.PercentRemaining()));
|
lv_label_set_text(batteryIcon, BatteryIcon::GetBatteryIcon(batteryController.PercentRemaining()));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Tile::Refresh() {
|
|
||||||
return running;
|
|
||||||
}
|
|
||||||
|
|
||||||
void Tile::OnValueChangedEvent(lv_obj_t* obj, uint32_t buttonId) {
|
void Tile::OnValueChangedEvent(lv_obj_t* obj, uint32_t buttonId) {
|
||||||
if(obj != btnm1) return;
|
if(obj != btnm1) return;
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,6 @@ namespace Pinetime {
|
||||||
|
|
||||||
~Tile() override;
|
~Tile() override;
|
||||||
|
|
||||||
bool Refresh() override;
|
|
||||||
void UpdateScreen();
|
void UpdateScreen();
|
||||||
void OnValueChangedEvent(lv_obj_t* obj, uint32_t buttonId);
|
void OnValueChangedEvent(lv_obj_t* obj, uint32_t buttonId);
|
||||||
|
|
||||||
|
|
|
@ -4,10 +4,8 @@
|
||||||
#include "Symbols.h"
|
#include "Symbols.h"
|
||||||
#include "lvgl/lvgl.h"
|
#include "lvgl/lvgl.h"
|
||||||
|
|
||||||
|
|
||||||
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);
|
Timer* screen = static_cast<Timer*>(obj->user_data);
|
||||||
screen->OnButtonEvent(obj, event);
|
screen->OnButtonEvent(obj, event);
|
||||||
|
@ -49,14 +47,10 @@ void Timer::createButtons() {
|
||||||
lv_obj_set_width(btnSecondsDown, 60);
|
lv_obj_set_width(btnSecondsDown, 60);
|
||||||
txtSDown = lv_label_create(btnSecondsDown, nullptr);
|
txtSDown = lv_label_create(btnSecondsDown, nullptr);
|
||||||
lv_label_set_text(txtSDown, "-");
|
lv_label_set_text(txtSDown, "-");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Timer::Timer(DisplayApp* app, Controllers::TimerController& timerController)
|
Timer::Timer(DisplayApp* app, Controllers::TimerController& timerController)
|
||||||
: Screen(app),
|
: Screen(app), running {true}, timerController {timerController} {
|
||||||
running{true},
|
|
||||||
timerController{timerController} {
|
|
||||||
|
|
||||||
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);
|
||||||
|
@ -80,19 +74,19 @@ Timer::Timer(DisplayApp* app, Controllers::TimerController& timerController)
|
||||||
createButtons();
|
createButtons();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
Timer::~Timer() {
|
Timer::~Timer() {
|
||||||
|
lv_task_del(taskRefresh);
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Timer::Refresh() {
|
void Timer::Refresh() {
|
||||||
if (timerController.IsRunning()) {
|
if (timerController.IsRunning()) {
|
||||||
uint32_t seconds = timerController.GetTimeRemaining() / 1000;
|
uint32_t seconds = timerController.GetTimeRemaining() / 1000;
|
||||||
lv_label_set_text_fmt(time, "%02lu:%02lu", seconds / 60, seconds % 60);
|
lv_label_set_text_fmt(time, "%02lu:%02lu", seconds / 60, seconds % 60);
|
||||||
}
|
}
|
||||||
return running;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Timer::OnButtonEvent(lv_obj_t* obj, lv_event_t event) {
|
void Timer::OnButtonEvent(lv_obj_t* obj, lv_event_t event) {
|
||||||
|
@ -118,7 +112,6 @@ void Timer::OnButtonEvent(lv_obj_t* obj, lv_event_t event) {
|
||||||
btnMinutesDown = nullptr;
|
btnMinutesDown = nullptr;
|
||||||
lv_obj_del(btnMinutesUp);
|
lv_obj_del(btnMinutesUp);
|
||||||
btnMinutesUp = nullptr;
|
btnMinutesUp = nullptr;
|
||||||
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!timerController.IsRunning()) {
|
if (!timerController.IsRunning()) {
|
||||||
|
@ -153,17 +146,12 @@ void Timer::OnButtonEvent(lv_obj_t* obj, lv_event_t event) {
|
||||||
secondsToSet--;
|
secondsToSet--;
|
||||||
}
|
}
|
||||||
lv_label_set_text_fmt(time, "%02d:%02d", minutesToSet, secondsToSet);
|
lv_label_set_text_fmt(time, "%02d:%02d", minutesToSet, secondsToSet);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
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);
|
||||||
|
|
|
@ -9,26 +9,21 @@
|
||||||
|
|
||||||
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;
|
||||||
|
|
||||||
bool 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:
|
||||||
|
|
||||||
bool running;
|
bool running;
|
||||||
uint8_t secondsToSet = 0;
|
uint8_t secondsToSet = 0;
|
||||||
uint8_t minutesToSet = 0;
|
uint8_t minutesToSet = 0;
|
||||||
|
@ -36,7 +31,9 @@ namespace Pinetime::Applications::Screens {
|
||||||
|
|
||||||
void createButtons();
|
void createButtons();
|
||||||
|
|
||||||
lv_obj_t* time, * msecTime, * btnPlayPause, * txtPlayPause, * btnMinutesUp, * btnMinutesDown, * btnSecondsUp, * btnSecondsDown, * txtMUp,
|
lv_obj_t *time, *msecTime, *btnPlayPause, *txtPlayPause, *btnMinutesUp, *btnMinutesDown, *btnSecondsUp, *btnSecondsDown, *txtMUp,
|
||||||
* txtMDown, * txtSUp, * txtSDown;
|
*txtMDown, *txtSUp, *txtSDown;
|
||||||
|
|
||||||
|
lv_task_t* taskRefresh;
|
||||||
};
|
};
|
||||||
}
|
}
|
|
@ -102,10 +102,6 @@ Twos::~Twos() {
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Twos::Refresh() {
|
|
||||||
return running;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Twos::placeNewTile() {
|
bool Twos::placeNewTile() {
|
||||||
std::vector<std::pair<int, int>> availableCells;
|
std::vector<std::pair<int, int>> availableCells;
|
||||||
for (int row = 0; row < 4; row++) {
|
for (int row = 0; row < 4; row++) {
|
||||||
|
|
|
@ -14,7 +14,6 @@ namespace Pinetime {
|
||||||
public:
|
public:
|
||||||
Twos(DisplayApp* app);
|
Twos(DisplayApp* app);
|
||||||
~Twos() override;
|
~Twos() override;
|
||||||
bool Refresh() override;
|
|
||||||
|
|
||||||
bool OnTouchEvent(TouchEvents event) override;
|
bool OnTouchEvent(TouchEvents event) override;
|
||||||
|
|
||||||
|
|
|
@ -118,10 +118,13 @@ WatchFaceAnalog::WatchFaceAnalog(Pinetime::Applications::DisplayApp* app,
|
||||||
lv_style_set_line_rounded(&hour_line_style_trace, LV_STATE_DEFAULT, false);
|
lv_style_set_line_rounded(&hour_line_style_trace, LV_STATE_DEFAULT, false);
|
||||||
lv_obj_add_style(hour_body_trace, LV_LINE_PART_MAIN, &hour_line_style_trace);
|
lv_obj_add_style(hour_body_trace, LV_LINE_PART_MAIN, &hour_line_style_trace);
|
||||||
|
|
||||||
|
taskRefresh = lv_task_create(RefreshTaskCallback, LV_DISP_DEF_REFR_PERIOD, LV_TASK_PRIO_MID, this);
|
||||||
UpdateClock();
|
UpdateClock();
|
||||||
}
|
}
|
||||||
|
|
||||||
WatchFaceAnalog::~WatchFaceAnalog() {
|
WatchFaceAnalog::~WatchFaceAnalog() {
|
||||||
|
lv_task_del(taskRefresh);
|
||||||
|
|
||||||
lv_style_reset(&hour_line_style);
|
lv_style_reset(&hour_line_style);
|
||||||
lv_style_reset(&hour_line_style_trace);
|
lv_style_reset(&hour_line_style_trace);
|
||||||
lv_style_reset(&minute_line_style);
|
lv_style_reset(&minute_line_style);
|
||||||
|
@ -173,7 +176,7 @@ void WatchFaceAnalog::UpdateClock() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WatchFaceAnalog::Refresh() {
|
void WatchFaceAnalog::Refresh() {
|
||||||
batteryPercentRemaining = batteryController.PercentRemaining();
|
batteryPercentRemaining = batteryController.PercentRemaining();
|
||||||
if (batteryPercentRemaining.IsUpdated()) {
|
if (batteryPercentRemaining.IsUpdated()) {
|
||||||
auto batteryPercent = batteryPercentRemaining.Get();
|
auto batteryPercent = batteryPercentRemaining.Get();
|
||||||
|
@ -203,6 +206,4 @@ bool WatchFaceAnalog::Refresh() {
|
||||||
currentDay = day;
|
currentDay = day;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,7 +32,7 @@ namespace Pinetime {
|
||||||
|
|
||||||
~WatchFaceAnalog() override;
|
~WatchFaceAnalog() override;
|
||||||
|
|
||||||
bool Refresh() override;
|
void Refresh() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
uint8_t sHour, sMinute, sSecond;
|
uint8_t sHour, sMinute, sSecond;
|
||||||
|
@ -81,6 +81,8 @@ namespace Pinetime {
|
||||||
Controllers::Settings& settingsController;
|
Controllers::Settings& settingsController;
|
||||||
|
|
||||||
void UpdateClock();
|
void UpdateClock();
|
||||||
|
|
||||||
|
lv_task_t* taskRefresh;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -91,13 +91,17 @@ WatchFaceDigital::WatchFaceDigital(DisplayApp* app,
|
||||||
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(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);
|
||||||
|
Refresh();
|
||||||
}
|
}
|
||||||
|
|
||||||
WatchFaceDigital::~WatchFaceDigital() {
|
WatchFaceDigital::~WatchFaceDigital() {
|
||||||
|
lv_task_del(taskRefresh);
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WatchFaceDigital::Refresh() {
|
void WatchFaceDigital::Refresh() {
|
||||||
batteryPercentRemaining = batteryController.PercentRemaining();
|
batteryPercentRemaining = batteryController.PercentRemaining();
|
||||||
if (batteryPercentRemaining.IsUpdated()) {
|
if (batteryPercentRemaining.IsUpdated()) {
|
||||||
auto batteryPercent = batteryPercentRemaining.Get();
|
auto batteryPercent = batteryPercentRemaining.Get();
|
||||||
|
@ -219,6 +223,4 @@ bool WatchFaceDigital::Refresh() {
|
||||||
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);
|
||||||
lv_obj_align(stepIcon, stepValue, LV_ALIGN_OUT_LEFT_MID, -5, 0);
|
lv_obj_align(stepIcon, stepValue, LV_ALIGN_OUT_LEFT_MID, -5, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return running;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,7 +33,7 @@ namespace Pinetime {
|
||||||
Controllers::MotionController& motionController);
|
Controllers::MotionController& motionController);
|
||||||
~WatchFaceDigital() override;
|
~WatchFaceDigital() override;
|
||||||
|
|
||||||
bool Refresh() override;
|
void Refresh() override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
char displayedChar[5] {};
|
char displayedChar[5] {};
|
||||||
|
@ -72,6 +72,8 @@ namespace Pinetime {
|
||||||
Controllers::Settings& settingsController;
|
Controllers::Settings& settingsController;
|
||||||
Controllers::HeartRateController& heartRateController;
|
Controllers::HeartRateController& heartRateController;
|
||||||
Controllers::MotionController& motionController;
|
Controllers::MotionController& motionController;
|
||||||
|
|
||||||
|
lv_task_t* taskRefresh;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -128,12 +128,12 @@ void QuickSettings::UpdateScreen() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void QuickSettings::OnButtonEvent(lv_obj_t* object, lv_event_t event) {
|
void QuickSettings::OnButtonEvent(lv_obj_t* object, lv_event_t event) {
|
||||||
if (object == btn2 && event == LV_EVENT_PRESSED) {
|
if (object == btn2 && event == LV_EVENT_CLICKED) {
|
||||||
|
|
||||||
running = false;
|
running = false;
|
||||||
app->StartApp(Apps::FlashLight, DisplayApp::FullRefreshDirections::None);
|
app->StartApp(Apps::FlashLight, DisplayApp::FullRefreshDirections::None);
|
||||||
|
|
||||||
} else if (object == btn1 && event == LV_EVENT_PRESSED) {
|
} else if (object == btn1 && event == LV_EVENT_CLICKED) {
|
||||||
|
|
||||||
brightness.Step();
|
brightness.Step();
|
||||||
lv_label_set_text_static(btn1_lvl, brightness.GetIcon());
|
lv_label_set_text_static(btn1_lvl, brightness.GetIcon());
|
||||||
|
@ -150,13 +150,9 @@ void QuickSettings::OnButtonEvent(lv_obj_t* object, lv_event_t event) {
|
||||||
lv_label_set_text_static(btn3_lvl, Symbols::notificationsOff);
|
lv_label_set_text_static(btn3_lvl, Symbols::notificationsOff);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else if (object == btn4 && event == LV_EVENT_PRESSED) {
|
} else if (object == btn4 && event == LV_EVENT_CLICKED) {
|
||||||
running = false;
|
running = false;
|
||||||
settingsController.SetSettingsMenu(0);
|
settingsController.SetSettingsMenu(0);
|
||||||
app->StartApp(Apps::Settings, DisplayApp::FullRefreshDirections::Up);
|
app->StartApp(Apps::Settings, DisplayApp::FullRefreshDirections::Up);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool QuickSettings::Refresh() {
|
|
||||||
return running;
|
|
||||||
}
|
|
||||||
|
|
|
@ -27,8 +27,6 @@ namespace Pinetime {
|
||||||
|
|
||||||
~QuickSettings() override;
|
~QuickSettings() override;
|
||||||
|
|
||||||
bool Refresh() override;
|
|
||||||
|
|
||||||
void OnButtonEvent(lv_obj_t* object, lv_event_t event);
|
void OnButtonEvent(lv_obj_t* object, lv_event_t event);
|
||||||
|
|
||||||
void UpdateScreen();
|
void UpdateScreen();
|
||||||
|
|
|
@ -80,12 +80,8 @@ SettingDisplay::~SettingDisplay() {
|
||||||
settingsController.SaveSettings();
|
settingsController.SaveSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SettingDisplay::Refresh() {
|
|
||||||
return running;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SettingDisplay::UpdateSelected(lv_obj_t* object, lv_event_t event) {
|
void SettingDisplay::UpdateSelected(lv_obj_t* object, lv_event_t event) {
|
||||||
if (event == LV_EVENT_VALUE_CHANGED) {
|
if (event == LV_EVENT_CLICKED) {
|
||||||
for (int i = 0; i < optionsTotal; i++) {
|
for (int i = 0; i < optionsTotal; i++) {
|
||||||
if (object == cbOption[i]) {
|
if (object == cbOption[i]) {
|
||||||
lv_checkbox_set_checked(cbOption[i], true);
|
lv_checkbox_set_checked(cbOption[i], true);
|
||||||
|
|
|
@ -15,7 +15,6 @@ namespace Pinetime {
|
||||||
SettingDisplay(DisplayApp* app, Pinetime::Controllers::Settings& settingsController);
|
SettingDisplay(DisplayApp* app, Pinetime::Controllers::Settings& settingsController);
|
||||||
~SettingDisplay() override;
|
~SettingDisplay() override;
|
||||||
|
|
||||||
bool Refresh() override;
|
|
||||||
void UpdateSelected(lv_obj_t* object, lv_event_t event);
|
void UpdateSelected(lv_obj_t* object, lv_event_t event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
318
src/displayapp/screens/settings/SettingPineTimeStyle.cpp
Normal file
318
src/displayapp/screens/settings/SettingPineTimeStyle.cpp
Normal file
|
@ -0,0 +1,318 @@
|
||||||
|
#include "SettingPineTimeStyle.h"
|
||||||
|
#include <lvgl/lvgl.h>
|
||||||
|
#include <displayapp/Colors.h>
|
||||||
|
#include "displayapp/DisplayApp.h"
|
||||||
|
#include "displayapp/screens/Symbols.h"
|
||||||
|
|
||||||
|
using namespace Pinetime::Applications::Screens;
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
static void event_handler(lv_obj_t* obj, lv_event_t event) {
|
||||||
|
SettingPineTimeStyle* screen = static_cast<SettingPineTimeStyle*>(obj->user_data);
|
||||||
|
screen->UpdateSelected(obj, event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SettingPineTimeStyle::SettingPineTimeStyle(Pinetime::Applications::DisplayApp* app, Pinetime::Controllers::Settings& settingsController)
|
||||||
|
: Screen(app), settingsController {settingsController} {
|
||||||
|
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_radius(timebar, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 0);
|
||||||
|
lv_obj_set_size(timebar, 200, 240);
|
||||||
|
lv_obj_align(timebar, lv_scr_act(), LV_ALIGN_IN_TOP_LEFT, 5, 0);
|
||||||
|
|
||||||
|
// Display the time
|
||||||
|
|
||||||
|
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_color(timeDD1, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, Convert(settingsController.GetPTSColorTime()));
|
||||||
|
lv_label_set_text(timeDD1, "12");
|
||||||
|
lv_obj_align(timeDD1, timebar, LV_ALIGN_IN_TOP_MID, 5, 5);
|
||||||
|
|
||||||
|
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_color(timeDD2, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, Convert(settingsController.GetPTSColorTime()));
|
||||||
|
lv_label_set_text(timeDD2, "34");
|
||||||
|
lv_obj_align(timeDD2, timebar, LV_ALIGN_IN_BOTTOM_MID, 5, -5);
|
||||||
|
|
||||||
|
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_line_space(timeAMPM, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, -3);
|
||||||
|
lv_label_set_text(timeAMPM, "A\nM");
|
||||||
|
lv_obj_align(timeAMPM, timebar, LV_ALIGN_IN_BOTTOM_LEFT, 2, -20);
|
||||||
|
|
||||||
|
// Create a 40px wide bar down the right side of the screen
|
||||||
|
|
||||||
|
sidebar = lv_obj_create(lv_scr_act(), nullptr);
|
||||||
|
lv_obj_set_style_local_bg_color(sidebar, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, Convert(settingsController.GetPTSColorBar()));
|
||||||
|
lv_obj_set_style_local_radius(sidebar, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 0);
|
||||||
|
lv_obj_set_size(sidebar, 40, 240);
|
||||||
|
lv_obj_align(sidebar, lv_scr_act(), LV_ALIGN_IN_TOP_RIGHT, 0, 0);
|
||||||
|
|
||||||
|
// Display icons
|
||||||
|
|
||||||
|
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_hex(0x000000));
|
||||||
|
lv_label_set_text(batteryIcon, Symbols::batteryFull);
|
||||||
|
lv_obj_align(batteryIcon, sidebar, LV_ALIGN_IN_TOP_MID, 0, 2);
|
||||||
|
|
||||||
|
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_label_set_text(bleIcon, Symbols::bluetooth);
|
||||||
|
lv_obj_align(bleIcon, sidebar, LV_ALIGN_IN_TOP_MID, 0, 25);
|
||||||
|
|
||||||
|
// Calendar icon
|
||||||
|
|
||||||
|
calendarOuter = lv_obj_create(lv_scr_act(), nullptr);
|
||||||
|
lv_obj_set_style_local_bg_color(calendarOuter, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x000000));
|
||||||
|
lv_obj_set_style_local_radius(calendarOuter, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 0);
|
||||||
|
lv_obj_set_size(calendarOuter, 34, 34);
|
||||||
|
lv_obj_align(calendarOuter, sidebar, LV_ALIGN_CENTER, 0, 0);
|
||||||
|
|
||||||
|
calendarInner = lv_obj_create(lv_scr_act(), nullptr);
|
||||||
|
lv_obj_set_style_local_bg_color(calendarInner, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0xffffff));
|
||||||
|
lv_obj_set_style_local_radius(calendarInner, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 0);
|
||||||
|
lv_obj_set_size(calendarInner, 27, 27);
|
||||||
|
lv_obj_align(calendarInner, calendarOuter, LV_ALIGN_CENTER, 0, 0);
|
||||||
|
|
||||||
|
calendarBar1 = lv_obj_create(lv_scr_act(), nullptr);
|
||||||
|
lv_obj_set_style_local_bg_color(calendarBar1, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x000000));
|
||||||
|
lv_obj_set_style_local_radius(calendarBar1, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 0);
|
||||||
|
lv_obj_set_size(calendarBar1, 3, 12);
|
||||||
|
lv_obj_align(calendarBar1, calendarOuter, LV_ALIGN_IN_TOP_MID, -6, -3);
|
||||||
|
|
||||||
|
calendarBar2 = lv_obj_create(lv_scr_act(), nullptr);
|
||||||
|
lv_obj_set_style_local_bg_color(calendarBar2, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x000000));
|
||||||
|
lv_obj_set_style_local_radius(calendarBar2, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 0);
|
||||||
|
lv_obj_set_size(calendarBar2, 3, 12);
|
||||||
|
lv_obj_align(calendarBar2, calendarOuter, LV_ALIGN_IN_TOP_MID, 6, -3);
|
||||||
|
|
||||||
|
calendarCrossBar1 = lv_obj_create(lv_scr_act(), nullptr);
|
||||||
|
lv_obj_set_style_local_bg_color(calendarCrossBar1, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x000000));
|
||||||
|
lv_obj_set_style_local_radius(calendarCrossBar1, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 0);
|
||||||
|
lv_obj_set_size(calendarCrossBar1, 8, 3);
|
||||||
|
lv_obj_align(calendarCrossBar1, calendarBar1, LV_ALIGN_IN_BOTTOM_MID, 0, 0);
|
||||||
|
|
||||||
|
calendarCrossBar2 = lv_obj_create(lv_scr_act(), nullptr);
|
||||||
|
lv_obj_set_style_local_bg_color(calendarCrossBar2, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, lv_color_hex(0x000000));
|
||||||
|
lv_obj_set_style_local_radius(calendarCrossBar2, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, 0);
|
||||||
|
lv_obj_set_size(calendarCrossBar2, 8, 3);
|
||||||
|
lv_obj_align(calendarCrossBar2, calendarBar2, LV_ALIGN_IN_BOTTOM_MID, 0, 0);
|
||||||
|
|
||||||
|
// Display date
|
||||||
|
|
||||||
|
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_hex(0x000000));
|
||||||
|
lv_label_set_text(dateDayOfWeek, "THU");
|
||||||
|
lv_obj_align(dateDayOfWeek, sidebar, LV_ALIGN_CENTER, 0, -34);
|
||||||
|
|
||||||
|
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_hex(0x000000));
|
||||||
|
lv_label_set_text(dateDay, "25");
|
||||||
|
lv_obj_align(dateDay, sidebar, LV_ALIGN_CENTER, 0, 3);
|
||||||
|
|
||||||
|
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_hex(0x000000));
|
||||||
|
lv_label_set_text(dateMonth, "MAR");
|
||||||
|
lv_obj_align(dateMonth, sidebar, LV_ALIGN_CENTER, 0, 32);
|
||||||
|
|
||||||
|
// Step count gauge
|
||||||
|
needle_colors[0] = LV_COLOR_WHITE;
|
||||||
|
stepGauge = lv_gauge_create(lv_scr_act(), nullptr);
|
||||||
|
lv_gauge_set_needle_count(stepGauge, 1, needle_colors);
|
||||||
|
lv_obj_set_size(stepGauge, 40, 40);
|
||||||
|
lv_obj_align(stepGauge, sidebar, LV_ALIGN_IN_BOTTOM_MID, 0, 0);
|
||||||
|
lv_gauge_set_scale(stepGauge, 360, 11, 0);
|
||||||
|
lv_gauge_set_angle_offset(stepGauge, 180);
|
||||||
|
lv_gauge_set_critical_value(stepGauge, (100));
|
||||||
|
lv_gauge_set_range(stepGauge, 0, (100));
|
||||||
|
lv_gauge_set_value(stepGauge, 0, 0);
|
||||||
|
|
||||||
|
lv_obj_set_style_local_pad_right(stepGauge, LV_GAUGE_PART_MAIN, LV_STATE_DEFAULT, 3);
|
||||||
|
lv_obj_set_style_local_pad_left(stepGauge, LV_GAUGE_PART_MAIN, LV_STATE_DEFAULT, 3);
|
||||||
|
lv_obj_set_style_local_pad_bottom(stepGauge, LV_GAUGE_PART_MAIN, LV_STATE_DEFAULT, 3);
|
||||||
|
lv_obj_set_style_local_line_opa(stepGauge, LV_GAUGE_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_COVER);
|
||||||
|
lv_obj_set_style_local_scale_width(stepGauge, LV_GAUGE_PART_MAIN, LV_STATE_DEFAULT, 4);
|
||||||
|
lv_obj_set_style_local_line_width(stepGauge, LV_GAUGE_PART_MAIN, LV_STATE_DEFAULT, 4);
|
||||||
|
lv_obj_set_style_local_line_color(stepGauge, LV_GAUGE_PART_MAIN, LV_STATE_DEFAULT, LV_COLOR_BLACK);
|
||||||
|
lv_obj_set_style_local_line_opa(stepGauge, LV_GAUGE_PART_NEEDLE, LV_STATE_DEFAULT, LV_OPA_COVER);
|
||||||
|
lv_obj_set_style_local_line_width(stepGauge, LV_GAUGE_PART_NEEDLE, LV_STATE_DEFAULT, 3);
|
||||||
|
lv_obj_set_style_local_pad_inner(stepGauge, LV_GAUGE_PART_NEEDLE, LV_STATE_DEFAULT, 4);
|
||||||
|
|
||||||
|
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, "");
|
||||||
|
|
||||||
|
btnNextTime = lv_btn_create(lv_scr_act(), nullptr);
|
||||||
|
btnNextTime->user_data = this;
|
||||||
|
lv_obj_set_size(btnNextTime, 60, 60);
|
||||||
|
lv_obj_align(btnNextTime, lv_scr_act(), LV_ALIGN_IN_RIGHT_MID, -15, -80);
|
||||||
|
lv_obj_set_style_local_bg_opa(btnNextTime, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_30);
|
||||||
|
lv_obj_set_style_local_value_str(btnNextTime, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, ">");
|
||||||
|
lv_obj_set_event_cb(btnNextTime, event_handler);
|
||||||
|
|
||||||
|
btnPrevTime = lv_btn_create(lv_scr_act(), nullptr);
|
||||||
|
btnPrevTime->user_data = this;
|
||||||
|
lv_obj_set_size(btnPrevTime, 60, 60);
|
||||||
|
lv_obj_align(btnPrevTime, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 15, -80);
|
||||||
|
lv_obj_set_style_local_bg_opa(btnPrevTime, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_30);
|
||||||
|
lv_obj_set_style_local_value_str(btnPrevTime, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, "<");
|
||||||
|
lv_obj_set_event_cb(btnPrevTime, event_handler);
|
||||||
|
|
||||||
|
btnNextBar = lv_btn_create(lv_scr_act(), nullptr);
|
||||||
|
btnNextBar->user_data = this;
|
||||||
|
lv_obj_set_size(btnNextBar, 60, 60);
|
||||||
|
lv_obj_align(btnNextBar, lv_scr_act(), LV_ALIGN_IN_RIGHT_MID, -15, 0);
|
||||||
|
lv_obj_set_style_local_bg_opa(btnNextBar, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_30);
|
||||||
|
lv_obj_set_style_local_value_str(btnNextBar, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, ">");
|
||||||
|
lv_obj_set_event_cb(btnNextBar, event_handler);
|
||||||
|
|
||||||
|
btnPrevBar = lv_btn_create(lv_scr_act(), nullptr);
|
||||||
|
btnPrevBar->user_data = this;
|
||||||
|
lv_obj_set_size(btnPrevBar, 60, 60);
|
||||||
|
lv_obj_align(btnPrevBar, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 15, 0);
|
||||||
|
lv_obj_set_style_local_bg_opa(btnPrevBar, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_30);
|
||||||
|
lv_obj_set_style_local_value_str(btnPrevBar, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, "<");
|
||||||
|
lv_obj_set_event_cb(btnPrevBar, event_handler);
|
||||||
|
|
||||||
|
btnNextBG = lv_btn_create(lv_scr_act(), nullptr);
|
||||||
|
btnNextBG->user_data = this;
|
||||||
|
lv_obj_set_size(btnNextBG, 60, 60);
|
||||||
|
lv_obj_align(btnNextBG, lv_scr_act(), LV_ALIGN_IN_RIGHT_MID, -15, 80);
|
||||||
|
lv_obj_set_style_local_bg_opa(btnNextBG, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_30);
|
||||||
|
lv_obj_set_style_local_value_str(btnNextBG, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, ">");
|
||||||
|
lv_obj_set_event_cb(btnNextBG, event_handler);
|
||||||
|
|
||||||
|
btnPrevBG = lv_btn_create(lv_scr_act(), nullptr);
|
||||||
|
btnPrevBG->user_data = this;
|
||||||
|
lv_obj_set_size(btnPrevBG, 60, 60);
|
||||||
|
lv_obj_align(btnPrevBG, lv_scr_act(), LV_ALIGN_IN_LEFT_MID, 15, 80);
|
||||||
|
lv_obj_set_style_local_bg_opa(btnPrevBG, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_30);
|
||||||
|
lv_obj_set_style_local_value_str(btnPrevBG, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, "<");
|
||||||
|
lv_obj_set_event_cb(btnPrevBG, event_handler);
|
||||||
|
|
||||||
|
btnReset = lv_btn_create(lv_scr_act(), nullptr);
|
||||||
|
btnReset->user_data = this;
|
||||||
|
lv_obj_set_size(btnReset, 60, 60);
|
||||||
|
lv_obj_align(btnReset, lv_scr_act(), LV_ALIGN_CENTER, 0, 80);
|
||||||
|
lv_obj_set_style_local_bg_opa(btnReset, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_30);
|
||||||
|
lv_obj_set_style_local_value_str(btnReset, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, "Rst");
|
||||||
|
lv_obj_set_event_cb(btnReset, event_handler);
|
||||||
|
|
||||||
|
btnRandom = lv_btn_create(lv_scr_act(), nullptr);
|
||||||
|
btnRandom->user_data = this;
|
||||||
|
lv_obj_set_size(btnRandom, 60, 60);
|
||||||
|
lv_obj_align(btnRandom, lv_scr_act(), LV_ALIGN_CENTER, 0, 0);
|
||||||
|
lv_obj_set_style_local_bg_opa(btnRandom, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, LV_OPA_30);
|
||||||
|
lv_obj_set_style_local_value_str(btnRandom, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, "Rnd");
|
||||||
|
lv_obj_set_event_cb(btnRandom, event_handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
SettingPineTimeStyle::~SettingPineTimeStyle() {
|
||||||
|
lv_obj_clean(lv_scr_act());
|
||||||
|
settingsController.SaveSettings();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SettingPineTimeStyle::UpdateSelected(lv_obj_t* object, lv_event_t event) {
|
||||||
|
auto valueTime = settingsController.GetPTSColorTime();
|
||||||
|
auto valueBar = settingsController.GetPTSColorBar();
|
||||||
|
auto valueBG = settingsController.GetPTSColorBG();
|
||||||
|
|
||||||
|
if (event == LV_EVENT_CLICKED) {
|
||||||
|
if (object == btnNextTime) {
|
||||||
|
valueTime = GetNext(valueTime);
|
||||||
|
|
||||||
|
settingsController.SetPTSColorTime(valueTime);
|
||||||
|
lv_obj_set_style_local_text_color(timeDD1, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, Convert(valueTime));
|
||||||
|
lv_obj_set_style_local_text_color(timeDD2, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, Convert(valueTime));
|
||||||
|
lv_obj_set_style_local_text_color(timeAMPM, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, Convert(valueTime));
|
||||||
|
}
|
||||||
|
if (object == btnPrevTime) {
|
||||||
|
valueTime = GetPrevious(valueTime);
|
||||||
|
settingsController.SetPTSColorTime(valueTime);
|
||||||
|
lv_obj_set_style_local_text_color(timeDD1, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, Convert(valueTime));
|
||||||
|
lv_obj_set_style_local_text_color(timeDD2, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, Convert(valueTime));
|
||||||
|
lv_obj_set_style_local_text_color(timeAMPM, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, Convert(valueTime));
|
||||||
|
}
|
||||||
|
if (object == btnNextBar) {
|
||||||
|
valueBar = GetNext(valueBar);
|
||||||
|
if(valueBar == Controllers::Settings::Colors::Black)
|
||||||
|
valueBar = GetNext(valueBar);
|
||||||
|
settingsController.SetPTSColorBar(valueBar);
|
||||||
|
lv_obj_set_style_local_bg_color(sidebar, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, Convert(valueBar));
|
||||||
|
}
|
||||||
|
if (object == btnPrevBar) {
|
||||||
|
valueBar = GetPrevious(valueBar);
|
||||||
|
if(valueBar == Controllers::Settings::Colors::Black)
|
||||||
|
valueBar = GetPrevious(valueBar);
|
||||||
|
settingsController.SetPTSColorBar(valueBar);
|
||||||
|
lv_obj_set_style_local_bg_color(sidebar, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, Convert(valueBar));
|
||||||
|
}
|
||||||
|
if (object == btnNextBG) {
|
||||||
|
valueBG = GetNext(valueBG);
|
||||||
|
settingsController.SetPTSColorBG(valueBG);
|
||||||
|
lv_obj_set_style_local_bg_color(timebar, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, Convert(valueBG));
|
||||||
|
}
|
||||||
|
if (object == btnPrevBG) {
|
||||||
|
valueBG = GetPrevious(valueBG);
|
||||||
|
settingsController.SetPTSColorBG(valueBG);
|
||||||
|
lv_obj_set_style_local_bg_color(timebar, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, Convert(valueBG));
|
||||||
|
}
|
||||||
|
if (object == btnReset) {
|
||||||
|
settingsController.SetPTSColorTime(Controllers::Settings::Colors::Teal);
|
||||||
|
lv_obj_set_style_local_text_color(timeDD1, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, Convert(Controllers::Settings::Colors::Teal));
|
||||||
|
lv_obj_set_style_local_text_color(timeDD2, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, Convert(Controllers::Settings::Colors::Teal));
|
||||||
|
lv_obj_set_style_local_text_color(timeAMPM, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, Convert(Controllers::Settings::Colors::Teal));
|
||||||
|
settingsController.SetPTSColorBar(Controllers::Settings::Colors::Teal);
|
||||||
|
lv_obj_set_style_local_bg_color(sidebar, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, Convert(Controllers::Settings::Colors::Teal));
|
||||||
|
settingsController.SetPTSColorBG(Controllers::Settings::Colors::Black);
|
||||||
|
lv_obj_set_style_local_bg_color(timebar, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, Convert(Controllers::Settings::Colors::Black));
|
||||||
|
}
|
||||||
|
if (object == btnRandom) {
|
||||||
|
uint8_t randTime = rand() % 17;
|
||||||
|
uint8_t randBar = rand() % 17;
|
||||||
|
uint8_t randBG = rand() % 17;
|
||||||
|
// Check if the time color is the same as its background, or if the sidebar is black. If so, change them to more useful values.
|
||||||
|
if (randTime == randBG) {
|
||||||
|
randBG += 1;
|
||||||
|
}
|
||||||
|
if (randBar == 3) {
|
||||||
|
randBar -= 1;
|
||||||
|
}
|
||||||
|
settingsController.SetPTSColorTime(static_cast<Controllers::Settings::Colors>(randTime));
|
||||||
|
lv_obj_set_style_local_text_color(timeDD1, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, Convert(static_cast<Controllers::Settings::Colors>(randTime)));
|
||||||
|
lv_obj_set_style_local_text_color(timeDD2, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, Convert(static_cast<Controllers::Settings::Colors>(randTime)));
|
||||||
|
lv_obj_set_style_local_text_color(timeAMPM, LV_LABEL_PART_MAIN, LV_STATE_DEFAULT, Convert(static_cast<Controllers::Settings::Colors>(randTime)));
|
||||||
|
settingsController.SetPTSColorBar(static_cast<Controllers::Settings::Colors>(randBar));
|
||||||
|
lv_obj_set_style_local_bg_color(sidebar, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, Convert(static_cast<Controllers::Settings::Colors>(randBar)));
|
||||||
|
settingsController.SetPTSColorBG(static_cast<Controllers::Settings::Colors>(randBG));
|
||||||
|
lv_obj_set_style_local_bg_color(timebar, LV_BTN_PART_MAIN, LV_STATE_DEFAULT, Convert(static_cast<Controllers::Settings::Colors>(randBG)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Pinetime::Controllers::Settings::Colors SettingPineTimeStyle::GetNext(Pinetime::Controllers::Settings::Colors color) {
|
||||||
|
auto colorAsInt = static_cast<uint8_t>(color);
|
||||||
|
Pinetime::Controllers::Settings::Colors nextColor;
|
||||||
|
if (colorAsInt < 16) {
|
||||||
|
nextColor = static_cast<Controllers::Settings::Colors>(colorAsInt + 1);
|
||||||
|
} else {
|
||||||
|
nextColor = static_cast<Controllers::Settings::Colors>(0);
|
||||||
|
}
|
||||||
|
return nextColor;
|
||||||
|
}
|
||||||
|
|
||||||
|
Pinetime::Controllers::Settings::Colors SettingPineTimeStyle::GetPrevious(Pinetime::Controllers::Settings::Colors color) {
|
||||||
|
auto colorAsInt = static_cast<uint8_t>(color);
|
||||||
|
Pinetime::Controllers::Settings::Colors prevColor;
|
||||||
|
|
||||||
|
if (colorAsInt > 0) {
|
||||||
|
prevColor = static_cast<Controllers::Settings::Colors>(colorAsInt - 1);
|
||||||
|
} else {
|
||||||
|
prevColor = static_cast<Controllers::Settings::Colors>(16);
|
||||||
|
}
|
||||||
|
return prevColor;
|
||||||
|
}
|
56
src/displayapp/screens/settings/SettingPineTimeStyle.h
Normal file
56
src/displayapp/screens/settings/SettingPineTimeStyle.h
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
#include <lvgl/lvgl.h>
|
||||||
|
#include "components/settings/Settings.h"
|
||||||
|
#include "displayapp/screens/Screen.h"
|
||||||
|
|
||||||
|
namespace Pinetime {
|
||||||
|
|
||||||
|
namespace Applications {
|
||||||
|
namespace Screens {
|
||||||
|
|
||||||
|
class SettingPineTimeStyle : public Screen{
|
||||||
|
public:
|
||||||
|
SettingPineTimeStyle(DisplayApp* app, Pinetime::Controllers::Settings &settingsController);
|
||||||
|
~SettingPineTimeStyle() override;
|
||||||
|
|
||||||
|
void UpdateSelected(lv_obj_t *object, lv_event_t event);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Controllers::Settings& settingsController;
|
||||||
|
|
||||||
|
Pinetime::Controllers::Settings::Colors GetNext(Controllers::Settings::Colors color);
|
||||||
|
Pinetime::Controllers::Settings::Colors GetPrevious(Controllers::Settings::Colors color);
|
||||||
|
|
||||||
|
lv_obj_t * btnNextTime;
|
||||||
|
lv_obj_t * btnPrevTime;
|
||||||
|
lv_obj_t * btnNextBar;
|
||||||
|
lv_obj_t * btnPrevBar;
|
||||||
|
lv_obj_t * btnNextBG;
|
||||||
|
lv_obj_t * btnPrevBG;
|
||||||
|
lv_obj_t * btnReset;
|
||||||
|
lv_obj_t * btnRandom;
|
||||||
|
lv_obj_t * timebar;
|
||||||
|
lv_obj_t * sidebar;
|
||||||
|
lv_obj_t * timeDD1;
|
||||||
|
lv_obj_t * timeDD2;
|
||||||
|
lv_obj_t * timeAMPM;
|
||||||
|
lv_obj_t * dateDayOfWeek;
|
||||||
|
lv_obj_t * dateDay;
|
||||||
|
lv_obj_t * dateMonth;
|
||||||
|
lv_obj_t * backgroundLabel;
|
||||||
|
lv_obj_t * batteryIcon;
|
||||||
|
lv_obj_t * bleIcon;
|
||||||
|
lv_obj_t * calendarOuter;
|
||||||
|
lv_obj_t * calendarInner;
|
||||||
|
lv_obj_t * calendarBar1;
|
||||||
|
lv_obj_t * calendarBar2;
|
||||||
|
lv_obj_t * calendarCrossBar1;
|
||||||
|
lv_obj_t * calendarCrossBar2;
|
||||||
|
lv_obj_t * stepGauge;
|
||||||
|
lv_color_t needle_colors[1];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -70,11 +70,6 @@ SettingSteps::~SettingSteps() {
|
||||||
settingsController.SaveSettings();
|
settingsController.SaveSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SettingSteps::Refresh() {
|
|
||||||
return running;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void SettingSteps::UpdateSelected(lv_obj_t *object, lv_event_t event) {
|
void SettingSteps::UpdateSelected(lv_obj_t *object, lv_event_t event) {
|
||||||
uint32_t value = settingsController.GetStepsGoal();
|
uint32_t value = settingsController.GetStepsGoal();
|
||||||
if(object == btnPlus && (event == LV_EVENT_PRESSED)) {
|
if(object == btnPlus && (event == LV_EVENT_PRESSED)) {
|
||||||
|
|
|
@ -10,22 +10,19 @@ namespace Pinetime {
|
||||||
namespace Applications {
|
namespace Applications {
|
||||||
namespace Screens {
|
namespace Screens {
|
||||||
|
|
||||||
class SettingSteps : public Screen{
|
class SettingSteps : public Screen {
|
||||||
public:
|
public:
|
||||||
SettingSteps(DisplayApp* app, Pinetime::Controllers::Settings &settingsController);
|
SettingSteps(DisplayApp* app, Pinetime::Controllers::Settings& settingsController);
|
||||||
~SettingSteps() override;
|
~SettingSteps() override;
|
||||||
|
|
||||||
bool Refresh() override;
|
void UpdateSelected(lv_obj_t* object, lv_event_t event);
|
||||||
void UpdateSelected(lv_obj_t *object, lv_event_t event);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
Controllers::Settings& settingsController;
|
Controllers::Settings& settingsController;
|
||||||
|
|
||||||
lv_obj_t * stepValue;
|
lv_obj_t* stepValue;
|
||||||
lv_obj_t * btnPlus;
|
lv_obj_t* btnPlus;
|
||||||
lv_obj_t * btnMinus;
|
lv_obj_t* btnMinus;
|
||||||
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,10 +64,6 @@ SettingTimeFormat::~SettingTimeFormat() {
|
||||||
settingsController.SaveSettings();
|
settingsController.SaveSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SettingTimeFormat::Refresh() {
|
|
||||||
return running;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SettingTimeFormat::UpdateSelected(lv_obj_t* object, lv_event_t event) {
|
void SettingTimeFormat::UpdateSelected(lv_obj_t* object, lv_event_t event) {
|
||||||
if (event == LV_EVENT_VALUE_CHANGED) {
|
if (event == LV_EVENT_VALUE_CHANGED) {
|
||||||
for (int i = 0; i < optionsTotal; i++) {
|
for (int i = 0; i < optionsTotal; i++) {
|
||||||
|
|
|
@ -15,7 +15,6 @@ namespace Pinetime {
|
||||||
SettingTimeFormat(DisplayApp* app, Pinetime::Controllers::Settings& settingsController);
|
SettingTimeFormat(DisplayApp* app, Pinetime::Controllers::Settings& settingsController);
|
||||||
~SettingTimeFormat() override;
|
~SettingTimeFormat() override;
|
||||||
|
|
||||||
bool Refresh() override;
|
|
||||||
void UpdateSelected(lv_obj_t* object, lv_event_t event);
|
void UpdateSelected(lv_obj_t* object, lv_event_t event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -72,10 +72,6 @@ SettingWakeUp::~SettingWakeUp() {
|
||||||
settingsController.SaveSettings();
|
settingsController.SaveSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SettingWakeUp::Refresh() {
|
|
||||||
return running;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SettingWakeUp::UpdateSelected(lv_obj_t* object, lv_event_t event) {
|
void SettingWakeUp::UpdateSelected(lv_obj_t* object, lv_event_t event) {
|
||||||
using WakeUpMode = Pinetime::Controllers::Settings::WakeUpMode;
|
using WakeUpMode = Pinetime::Controllers::Settings::WakeUpMode;
|
||||||
if (event == LV_EVENT_VALUE_CHANGED && !ignoringEvents) {
|
if (event == LV_EVENT_VALUE_CHANGED && !ignoringEvents) {
|
||||||
|
|
|
@ -15,7 +15,6 @@ namespace Pinetime {
|
||||||
SettingWakeUp(DisplayApp* app, Pinetime::Controllers::Settings& settingsController);
|
SettingWakeUp(DisplayApp* app, Pinetime::Controllers::Settings& settingsController);
|
||||||
~SettingWakeUp() override;
|
~SettingWakeUp() override;
|
||||||
|
|
||||||
bool Refresh() override;
|
|
||||||
void UpdateSelected(lv_obj_t* object, lv_event_t event);
|
void UpdateSelected(lv_obj_t* object, lv_event_t event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -75,10 +75,6 @@ SettingWatchFace::~SettingWatchFace() {
|
||||||
settingsController.SaveSettings();
|
settingsController.SaveSettings();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SettingWatchFace::Refresh() {
|
|
||||||
return running;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SettingWatchFace::UpdateSelected(lv_obj_t* object, lv_event_t event) {
|
void SettingWatchFace::UpdateSelected(lv_obj_t* object, lv_event_t event) {
|
||||||
if (event == LV_EVENT_VALUE_CHANGED) {
|
if (event == LV_EVENT_VALUE_CHANGED) {
|
||||||
for (uint8_t i = 0; i < optionsTotal; i++) {
|
for (uint8_t i = 0; i < optionsTotal; i++) {
|
||||||
|
|
|
@ -15,7 +15,6 @@ namespace Pinetime {
|
||||||
SettingWatchFace(DisplayApp* app, Pinetime::Controllers::Settings& settingsController);
|
SettingWatchFace(DisplayApp* app, Pinetime::Controllers::Settings& settingsController);
|
||||||
~SettingWatchFace() override;
|
~SettingWatchFace() override;
|
||||||
|
|
||||||
bool Refresh() override;
|
|
||||||
void UpdateSelected(lv_obj_t* object, lv_event_t event);
|
void UpdateSelected(lv_obj_t* object, lv_event_t event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
|
@ -18,6 +18,9 @@ Settings::Settings(Pinetime::Applications::DisplayApp* app, Pinetime::Controller
|
||||||
},
|
},
|
||||||
[this]() -> std::unique_ptr<Screen> {
|
[this]() -> std::unique_ptr<Screen> {
|
||||||
return CreateScreen2();
|
return CreateScreen2();
|
||||||
|
},
|
||||||
|
[this]() -> std::unique_ptr<Screen> {
|
||||||
|
return CreateScreen3();
|
||||||
}},
|
}},
|
||||||
Screens::ScreenListModes::UpDown} {
|
Screens::ScreenListModes::UpDown} {
|
||||||
}
|
}
|
||||||
|
@ -26,13 +29,6 @@ Settings::~Settings() {
|
||||||
lv_obj_clean(lv_scr_act());
|
lv_obj_clean(lv_scr_act());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Settings::Refresh() {
|
|
||||||
|
|
||||||
if (running)
|
|
||||||
running = screens.Refresh();
|
|
||||||
return running;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool Settings::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
|
bool Settings::OnTouchEvent(Pinetime::Applications::TouchEvents event) {
|
||||||
return screens.OnTouchEvent(event);
|
return screens.OnTouchEvent(event);
|
||||||
}
|
}
|
||||||
|
@ -46,7 +42,7 @@ 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, 2, app, settingsController, applications);
|
return std::make_unique<Screens::List>(0, 3, app, settingsController, applications);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::unique_ptr<Screen> Settings::CreateScreen2() {
|
std::unique_ptr<Screen> Settings::CreateScreen2() {
|
||||||
|
@ -54,9 +50,21 @@ std::unique_ptr<Screen> Settings::CreateScreen2() {
|
||||||
std::array<Screens::List::Applications, 4> applications {{
|
std::array<Screens::List::Applications, 4> applications {{
|
||||||
{Symbols::shoe, "Steps", Apps::SettingSteps},
|
{Symbols::shoe, "Steps", Apps::SettingSteps},
|
||||||
{Symbols::batteryHalf, "Battery", Apps::BatteryInfo},
|
{Symbols::batteryHalf, "Battery", Apps::BatteryInfo},
|
||||||
|
{Symbols::paintbrush, "PTS Colors", Apps::SettingPineTimeStyle},
|
||||||
{Symbols::check, "Firmware", Apps::FirmwareValidation},
|
{Symbols::check, "Firmware", Apps::FirmwareValidation},
|
||||||
{Symbols::list, "About", Apps::SysInfo},
|
|
||||||
}};
|
}};
|
||||||
|
|
||||||
return std::make_unique<Screens::List>(1, 2, app, settingsController, applications);
|
return std::make_unique<Screens::List>(1, 3, app, settingsController, applications);
|
||||||
|
}
|
||||||
|
|
||||||
|
std::unique_ptr<Screen> Settings::CreateScreen3() {
|
||||||
|
|
||||||
|
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>(2, 3, app, settingsController, applications);
|
||||||
}
|
}
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue