This commit is contained in:
Th3maz1ng 2023-03-31 10:28:39 +02:00
commit 2650cf85f9
109 changed files with 9855 additions and 6082 deletions

6
.gitignore vendored
View File

@ -1,5 +1,9 @@
#Exclude the W800 SDK bin folder from the the git repository #Exclude the W800 SDK bin folder from the the git repository
src/W800 SDK v1.00.08/bin/ src/W800_SDK_v1.00.10/bin/
src/W800_SDK_v1.00.10/tools/w800/wm_getver.exe
src/W800_SDK_v1.00.10/tools/w800/w800_secboot.img
src/W800_SDK_v1.00.10/.vscode/
#Exclude the lvgl simulator bin and obj folders from the the git repository #Exclude the lvgl simulator bin and obj folders from the the git repository
src/lvgl_win_sim/lv_port_win_codeblocks/bin src/lvgl_win_sim/lv_port_win_codeblocks/bin

View File

@ -1,4 +1,4 @@
MIT No Attribution Copyright <YEARr> <COPYRIGHT HOLDER> MIT W800 SmartWatch Copyright 2023 Anatole SCHRAMM-HENRY
Permission is hereby granted, free of charge, to any person obtaining a copy Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal of this software and associated documentation files (the "Software"), to deal

168
README.md
View File

@ -9,14 +9,83 @@ So let's go !
The W800 is a pretty interesting chip with impressive characteristics for its price (around 1$) : The W800 is a pretty interesting chip with impressive characteristics for its price (around 1$) :
### Core : ### Core :
* 32bit XT804 CPU * 32bit XT804 CPU
* 240 Mhz frequency * 240 Mhz max clock
### Memory : ### Memory :
* 2 MB on chip flash * 2 MB on chip flash
* 288 KB RAM * 288 KB RAM, ~130 KB available to the user
### Wireless connectivity : ### Wireless connectivity :
* Bluetooth EDR(Classic) and BLE 4.2 * Bluetooth EDR(Classic) and BLE 4.2
* WiFi 2.4Ghz 802.11 b/g/n * WiFi 2.4Ghz 802.11 b/g/n
### SDK & OS
* FreeRTOS v10.4.1
* BLE stack : NimBLE
* TCP IP stack : lwip v2.1.3
## Getting started :
### So, you'd like to try this project yourself ?
### Here are the steps to follow, in order to build the firmware and flash the board :
#### On Windows :
1) Start by cloning this repository.
**Put it in a path that doesn't contain any spaces** ie : "C:\Users\Bob\Desktop\projects" for example.
2) Once cloning is done, you will need to install the [MSYS2](https://www.msys2.org/) tool/environment. This tool is needed to compile the project using **Make**.
3) Open a terminal by clicking on the **MSYS2** icon and execute the following commands to prepare the environment :
1) Update packages :
```bash
pacman -Syu
```
2) Install make :
```bash
pacman -S msys/make
```
3) Install automake :
```bash
pacman -S msys/automake
```
4) Install autoconf :
```bash
pacman -S msys/autoconf
```
5) Install gcc :
```bash
pacman -S msys/gcc
```
6) Install git :
```bash
pacman -S msys/git
```
7) Install utils needed for menuconfig :
```bash
pacman -S msys/ncurses-devel
pacman -S msys/gettext-devel
```
4) You now, need to download the toolchain required to compile and link the app [here](http://82.157.145.101/download/toolkits/winnermicro/w806/csky-elfabiv2-tools-mingw-minilibc-20210423.tar.gz) and extract it somewhere you remember on your hardrive.
5) Now, go back to the MSYS terminal window and move to the **src/W800_SDK_v1.00.10/** directory which is located in the cloned repository, using the **cd** command.
6) Then, execute the **make menuconfig** command, this should greet you with a crude configuration window.
Move to the **Toolchain Configuration -->** option using the arrows and hit enter.
Using the same controls, move to the **toolchain path** and **set the location** to where you extracted the toolchain in step 4.
7) To be able to flash the board, you will also need to set the used com port in the **Download Configuration --->** option.
**TIPS : set the download rate to : 2000000**, this should speed up the flashing process.
8) Now save your configuration and exit.
9) Finally, type :
```bash
#This will remove all builded object to start from a clean environment (Needed only once)
make distclean
#This will only compile the library part of the firmware
make lib
#This will compile the actual firmware using the libraries and produce the .bin file
make
#This will flash the board using the previously generated .bin file
make down
#This will do both previous commands in one (build and flash)
make flash
```
## Sensors : ## Sensors :
The goal is to embed the following sensors in the watch : The goal is to embed the following sensors in the watch :
@ -40,7 +109,7 @@ Possible choices :
* ~~A piezo buzzer~~ : dropped, maybe in next version. * ~~A piezo buzzer~~ : dropped, maybe in next version.
## Power source : ## Power source :
* 1 cell lipo 450 mAh battery. * A single 450 mAh cell lipo battery.
* A charge/discharge controller. * A charge/discharge controller.
## Screen + touch element : ## Screen + touch element :
@ -57,7 +126,7 @@ using a magnetic 4 pin plug.
|------------|----------|------|----------|-------------|--------------|---------| |------------|----------|------|----------|-------------|--------------|---------|
||PB_20|I/O|**UART0_RX**/PWM1/UART1_CTS/I²C_SCL|U/D|**USB/Serial TX flash pin**|| ||PB_20|I/O|**UART0_RX**/PWM1/UART1_CTS/I²C_SCL|U/D|**USB/Serial TX flash pin**||
||PB_19|I/O|**UART0_TX**/PWM0/UART1_RTS/**I²C_SDA**|U/D|**USB/Serial RX flash pin** and **BMA456, Touch Panel, HMC5883L and BMP280 SDA pins**|| ||PB_19|I/O|**UART0_TX**/PWM0/UART1_RTS/**I²C_SDA**|U/D|**USB/Serial RX flash pin** and **BMA456, Touch Panel, HMC5883L and BMP280 SDA pins**||
||WAKEUP|I|**External Wake Up Pin**|D|**BMA456 IRQ line** and **Touch Panel IRQ line** through NAND Gate|The chip is waken up when the pin is HIGH| ||WAKEUP|I|**External Wake Up Pin**|D|**BMA456 IRQ 1 line** and **Touch Panel IRQ line** through NAND Gate|The chip is waken up when the pin is HIGH|
||RESET|I|Reset Pin|D|**Micro switch** and **USB/Serial RTS pin**|| ||RESET|I|Reset Pin|D|**Micro switch** and **USB/Serial RTS pin**||
||XTAL_OUT|O|External crystal output|||| ||XTAL_OUT|O|External crystal output||||
||XTAL_IN|I|External crystal input|||| ||XTAL_IN|I|External crystal input||||
@ -89,49 +158,55 @@ using a magnetic 4 pin plug.
||PB_11|**I/O**|I²S_DO/MMC_D3/HSPI_DO/SDIO_D3|U/D|**BMA456 IRQ 2 line**|| ||PB_11|**I/O**|I²S_DO/MMC_D3/HSPI_DO/SDIO_D3|U/D|**BMA456 IRQ 2 line**||
||GND|P|Ground (Central Pad)|||| ||GND|P|Ground (Central Pad)||||
## What is done/working so far :
## What is done/working so far - HARDWARE :
* Schematic :
* First version of the schematic is done an available [here](design/Kicad/W800_Smart_Watch/W800_Smart_Watch.pdf).
* 2 layer PCB version 1.0 design is done based on the schematic. Waiting for the PCBs from JLCPCB.
* Wake up interrupts handling :
* Wrist tilt MCU wake up working
* LCD touch wake up
* MCU sleep feature :
* Sleep and Standby modes working but implemented in a crude way.
Can and should be improved.
* PIFA antenna tested, performance isn't the best but it is working well for what it will be used for (BLE).
## What is done/working so far - SOFTWARE :
* LVGL 8.3.3 running on the SOC using DMA. * LVGL 8.3.3 running on the SOC using DMA.
* Supported LCD drivers : * Supported LCD drivers :
* ILI9341 in 4-line serial mode (8 bits) with D/C pin * ILI9341 in 4-line serial mode (8 bits) with D/C pin
* ST7789 in 4-line serial mode (8 bits) with D/C pin * ST7789 in 4-line serial mode (8 bits) with D/C pin
* GC9A01 in 4-line serial mode (8 bits) with D/C pin * GC9A01 in 4-line serial mode (8 bits) with D/C pin
* Supported LCD touch screen : * Supported LCD touch screen :
* CST816D capacitive touch ic. * CST816D I2C capacitive touch ic.
* Three screens designed and working with LVGL : * Four screens designed and working with LVGL :
* 1 watch face based on a casio watch. * 1 watch face based on a casio watch.
* 1 menu list screen with icons. * 1 menu screen with a list of icons.
* 1 setting screen with basic settings (date and time + display brightness) (work in progress). * 1 setting screen with basic settings (date and time + display brightness) (work in progress).
* 1 compass application using the QMC5883L.
* Debug UART on PB_2 (output only) * Debug UART on PB_2 (output only)
* Wake up interrupts handling :
* Wrist tilt MCU wake up working
* LCD touch wake up
* Sensors/Actuators : * Sensors/Actuators :
* QMC5883L driver working * QMC5883L driver working
* BMA456 driver working * BMA456 driver working
* BMP280 driver working (temperature + pressure) * BMP280 driver working (temperature + pressure + altitude)
* Battery voltage sense using ADC is working * Battery voltage sense using ADC is working
* Vibration motor controlled by PWM working * Vibration motor controlled by PWM working
* Update the W800 SDK from version 1.00.08 to version 1.00.10 released in January of 2023.
## To do - HARDWARE:
* [ ] Add the MAX30102 Heart Rate Monitor to the current design.
* [ ] Fix the issue with the DW01A chip, should be as easy as to replace the 100nf C12 cap with a lower value, let's say 80nf.
## To do - SOFTWARE
* [X] Finish to design the settings page.
* [X] Implement watch settings persistency using the integrated flash memory
* [ ] Implement a good algorithm to handle adaptiv MCU clock
to save power
* Drivers:
* [ ] Write/port the MAX30102 Heart Rate Monitor driver to the project.
* [ ] Add a wake up alarm app (using the vibration motor).
* [ ] Add BLE functionality.
## To do :
* Write I2C drivers for the :
* [X] BMA456
* [X] Wrist tilt detection
* [X] BMP280
* [X] Temperature
* [X] Pressure
* [X] QMC5883L
* [X] Write the init sequence for the GC9A01 LCD driver.
* [X] Make LCD display + touch work.
* [X] Design and test battery voltage sensing circuit -> voltage divider bridge because ADC input can sense 2.5V Max.
* [ ] Finish to design the settings page.
* [ ] Implement a good algorithm to handle adaptiv MCU clock to save power
* [X] Test the charge circuit.
* [X] Handle watch auto sleep feature with wake up on screen touch + wrist tilt (POC could be improved).
* Design and test the :
* [X] vibration motor circuit
* [X] Draw the schematic, the first revision of the schematic is available [here](design/Kicad/W800_Smart_Watch/W800_Smart_Watch.pdf).
* [X] Design the PCB (routing, placement etc..) on a 2 layer PCB - done.
* [ ] Update the W800 SDK from version 1.00.08 to version 1.00.10 released in January of 2023.
## Achieved power consumption recap: ## Achieved power consumption recap:
(Need to work on sleep current :-( ) (Need to work on sleep current :-( )
@ -151,3 +226,32 @@ using a magnetic 4 pin plug.
### The back : ### The back :
![](http://82.64.196.164/images/git/rendering_back.png) ![](http://82.64.196.164/images/git/rendering_back.png)
## Update 21/03/2023 : PCBs were received from JLCPCB and this what they look like :
![](http://82.64.196.164/images/git/W800_pcb_1.png)
![](http://82.64.196.164/images/git/W800_pcb_2.png)
## And the watch running :
![](http://82.64.196.164/images/git/W800_running.png)
### **Almost everything works :**
* BMA456 ✓
* BMP280 ✓
* QMC5883L ✓
* Screen + touch panel ✓
* CH340E for chip programming ✓
* Vibration motor ✓
* Charge IC ✓
### **To sort out :**
* DW01A chip not driving the double N mosfet as expected :-(
* Round lipo battery not having the capacity advertised, will have to change it :-(
## Next steps :
* Finish to design and print the casing.
* Find an other battery 450 mAh or bigger would be great.
* Add BLE.
* Write and release a usable firmware for every day use.
## If you are interested by the project or if you just want to say hi, you can contact me at the email address : bugreport[at]laposte.net .

View File

@ -1,12 +1,12 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(6.0.10)* G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(6.0.10)*
G04 #@! TF.CreationDate,2023-02-26T11:53:10+01:00* G04 #@! TF.CreationDate,2023-03-04T08:18:26+01:00*
G04 #@! TF.ProjectId,W800_Smart_Watch,57383030-5f53-46d6-9172-745f57617463,rev?* G04 #@! TF.ProjectId,W800_Smart_Watch,57383030-5f53-46d6-9172-745f57617463,rev?*
G04 #@! TF.SameCoordinates,Original* G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Soldermask,Bot* G04 #@! TF.FileFunction,Soldermask,Bot*
G04 #@! TF.FilePolarity,Negative* G04 #@! TF.FilePolarity,Negative*
%FSLAX46Y46*% %FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-02-26 11:53:10* G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-03-04 08:18:26*
%MOMM*% %MOMM*%
%LPD*% %LPD*%
G01* G01*
@ -29,17 +29,17 @@ G04 Aperture macros list*
20,1,$1+$1,$6,$7,$8,$9,0* 20,1,$1+$1,$6,$7,$8,$9,0*
20,1,$1+$1,$8,$9,$2,$3,0*% 20,1,$1+$1,$8,$9,$2,$3,0*%
G04 Aperture macros list end* G04 Aperture macros list end*
%ADD10C,1.000000*% %ADD10RoundRect,0.140000X0.140000X0.170000X-0.140000X0.170000X-0.140000X-0.170000X0.140000X-0.170000X0*%
%ADD11RoundRect,0.140000X0.140000X0.170000X-0.140000X0.170000X-0.140000X-0.170000X0.140000X-0.170000X0*% %ADD11RoundRect,0.135000X-0.185000X0.135000X-0.185000X-0.135000X0.185000X-0.135000X0.185000X0.135000X0*%
%ADD12RoundRect,0.135000X-0.185000X0.135000X-0.185000X-0.135000X0.185000X-0.135000X0.185000X0.135000X0*% %ADD12RoundRect,0.225000X0.250000X-0.225000X0.250000X0.225000X-0.250000X0.225000X-0.250000X-0.225000X0*%
%ADD13RoundRect,0.225000X0.250000X-0.225000X0.250000X0.225000X-0.250000X0.225000X-0.250000X-0.225000X0*% %ADD13RoundRect,0.140000X-0.170000X0.140000X-0.170000X-0.140000X0.170000X-0.140000X0.170000X0.140000X0*%
%ADD14RoundRect,0.140000X-0.170000X0.140000X-0.170000X-0.140000X0.170000X-0.140000X0.170000X0.140000X0*% %ADD14RoundRect,0.250000X0.475000X-0.250000X0.475000X0.250000X-0.475000X0.250000X-0.475000X-0.250000X0*%
%ADD15RoundRect,0.250000X0.475000X-0.250000X0.475000X0.250000X-0.475000X0.250000X-0.475000X-0.250000X0*% %ADD15RoundRect,0.140000X0.170000X-0.140000X0.170000X0.140000X-0.170000X0.140000X-0.170000X-0.140000X0*%
%ADD16RoundRect,0.140000X0.170000X-0.140000X0.170000X0.140000X-0.170000X0.140000X-0.170000X-0.140000X0*% %ADD16R,1.200000X1.500000*%
%ADD17R,1.200000X1.500000*% %ADD17RoundRect,0.135000X-0.135000X-0.185000X0.135000X-0.185000X0.135000X0.185000X-0.135000X0.185000X0*%
%ADD18RoundRect,0.135000X-0.135000X-0.185000X0.135000X-0.185000X0.135000X0.185000X-0.135000X0.185000X0*% %ADD18RoundRect,0.150000X-0.150000X0.512500X-0.150000X-0.512500X0.150000X-0.512500X0.150000X0.512500X0*%
%ADD19RoundRect,0.150000X-0.150000X0.512500X-0.150000X-0.512500X0.150000X-0.512500X0.150000X0.512500X0*% %ADD19RoundRect,0.150000X0.150000X-0.512500X0.150000X0.512500X-0.150000X0.512500X-0.150000X-0.512500X0*%
%ADD20RoundRect,0.150000X0.150000X-0.512500X0.150000X0.512500X-0.150000X0.512500X-0.150000X-0.512500X0*% %ADD20C,1.000000*%
%ADD21RoundRect,0.150000X-0.587500X-0.150000X0.587500X-0.150000X0.587500X0.150000X-0.587500X0.150000X0*% %ADD21RoundRect,0.150000X-0.587500X-0.150000X0.587500X-0.150000X0.587500X0.150000X-0.587500X0.150000X0*%
%ADD22RoundRect,0.200000X0.275000X-0.200000X0.275000X0.200000X-0.275000X0.200000X-0.275000X-0.200000X0*% %ADD22RoundRect,0.200000X0.275000X-0.200000X0.275000X0.200000X-0.275000X0.200000X-0.275000X-0.200000X0*%
%ADD23RoundRect,0.225000X0.225000X0.250000X-0.225000X0.250000X-0.225000X-0.250000X0.225000X-0.250000X0*% %ADD23RoundRect,0.225000X0.225000X0.250000X-0.225000X0.250000X-0.225000X-0.250000X0.225000X-0.250000X0*%
@ -57,60 +57,57 @@ G04 Aperture macros list end*
%ADD35RoundRect,0.250000X0.450000X-0.262500X0.450000X0.262500X-0.450000X0.262500X-0.450000X-0.262500X0*% %ADD35RoundRect,0.250000X0.450000X-0.262500X0.450000X0.262500X-0.450000X0.262500X-0.450000X-0.262500X0*%
G04 APERTURE END LIST* G04 APERTURE END LIST*
D10* D10*
X153000000Y-98200000D03*
X147000000Y-94200000D03*
X147000000Y-98800000D03*
X147000000Y-91940000D03*
D11*
X161516000Y-115316000D03* X161516000Y-115316000D03*
X160556000Y-115316000D03* X160556000Y-115316000D03*
D12* D11*
X159512000Y-87120000D03* X159512000Y-87120000D03*
X159512000Y-88140000D03* X159512000Y-88140000D03*
D13* D12*
X167100000Y-93775000D03* X167100000Y-93775000D03*
X167100000Y-92225000D03* X167100000Y-92225000D03*
D14* D13*
X163068000Y-89210000D03* X163068000Y-89210000D03*
X163068000Y-90170000D03* X163068000Y-90170000D03*
D15* D14*
X157734000Y-106116380D03* X157734000Y-106116380D03*
X157734000Y-104216380D03* X157734000Y-104216380D03*
D16* D15*
X162605000Y-93680000D03* X162605000Y-93680000D03*
X162605000Y-92720000D03* X162605000Y-92720000D03*
X163621000Y-93680000D03* X163621000Y-93680000D03*
X163621000Y-92720000D03* X163621000Y-92720000D03*
D17* D16*
X169530000Y-106190000D03* X169530000Y-106190000D03*
X164330000Y-106190000D03* X164330000Y-106190000D03*
D18* D17*
X160780000Y-110490000D03* X160780000Y-110490000D03*
X161800000Y-110490000D03* X161800000Y-110490000D03*
D19* D18*
X145354000Y-86360000D03* X145354000Y-86360000D03*
X146304000Y-86360000D03* X146304000Y-86360000D03*
X147254000Y-86360000D03* X147254000Y-86360000D03*
X147254000Y-88635000D03* X147254000Y-88635000D03*
X145354000Y-88635000D03* X145354000Y-88635000D03*
D18* D17*
X161542000Y-96520000D03* X161542000Y-96520000D03*
X162562000Y-96520000D03* X162562000Y-96520000D03*
D14* D13*
X159258000Y-115344000D03* X159258000Y-115344000D03*
X159258000Y-116304000D03* X159258000Y-116304000D03*
D20* D19*
X157922000Y-113405500D03* X157922000Y-113405500D03*
X156972000Y-113405500D03* X156972000Y-113405500D03*
X156022000Y-113405500D03* X156022000Y-113405500D03*
X156022000Y-111130500D03* X156022000Y-111130500D03*
X157922000Y-111130500D03* X157922000Y-111130500D03*
D16* D15*
X159258000Y-113510000D03* X159258000Y-113510000D03*
X159258000Y-112550000D03* X159258000Y-112550000D03*
D12* D11*
X161563000Y-92690000D03* X161563000Y-92690000D03*
X161563000Y-93710000D03* X161563000Y-93710000D03*
D20*
X147000000Y-91940000D03*
D21* D21*
X165632500Y-103490000D03* X165632500Y-103490000D03*
X165632500Y-101590000D03* X165632500Y-101590000D03*
@ -141,7 +138,7 @@ X146472000Y-111236000D03*
D25* D25*
X160782000Y-114302000D03* X160782000Y-114302000D03*
X160782000Y-113282000D03* X160782000Y-113282000D03*
D12* D11*
X143690000Y-91610000D03* X143690000Y-91610000D03*
X143690000Y-92630000D03* X143690000Y-92630000D03*
X144730000Y-90050000D03* X144730000Y-90050000D03*
@ -152,30 +149,30 @@ X152670000Y-111250000D03*
D24* D24*
X143156400Y-107746800D03* X143156400Y-107746800D03*
X142136400Y-107746800D03* X142136400Y-107746800D03*
D12* D11*
X154686000Y-112774000D03* X154686000Y-112774000D03*
X154686000Y-113794000D03* X154686000Y-113794000D03*
D27* D27*
X148590000Y-112334000D03* X148590000Y-112334000D03*
X148590000Y-114234000D03* X148590000Y-114234000D03*
D16* D15*
X166370000Y-112748000D03* X166370000Y-112748000D03*
X166370000Y-111788000D03* X166370000Y-111788000D03*
D11* D10*
X161262000Y-117348000D03* X161262000Y-117348000D03*
X160302000Y-117348000D03* X160302000Y-117348000D03*
D28* D28*
X164084000Y-114614000D03* X164084000Y-114614000D03*
X164084000Y-109414000D03* X164084000Y-109414000D03*
D10* D20*
X149250400Y-105664000D03* X149250400Y-105664000D03*
D25* D25*
X164637000Y-93710000D03* X164637000Y-93710000D03*
X164637000Y-92690000D03* X164637000Y-92690000D03*
D14* D13*
X162052000Y-89210000D03* X162052000Y-89210000D03*
X162052000Y-90170000D03* X162052000Y-90170000D03*
D12* D11*
X166370000Y-108710000D03* X166370000Y-108710000D03*
X166370000Y-109730000D03* X166370000Y-109730000D03*
D29* D29*
@ -187,15 +184,19 @@ X152746000Y-118985000D03*
D31* D31*
X150246000Y-115210000D03* X150246000Y-115210000D03*
X154046000Y-115210000D03* X154046000Y-115210000D03*
D10* D20*
X155041600Y-105664000D03* X155041600Y-105664000D03*
D24* D24*
X149606000Y-109728000D03* X149606000Y-109728000D03*
X148586000Y-109728000D03* X148586000Y-109728000D03*
D20*
X147000000Y-98800000D03*
D32* D32*
X160274000Y-96012000D03* X160274000Y-96012000D03*
X158374000Y-96012000D03* X158374000Y-96012000D03*
X159324000Y-94137000D03* X159324000Y-94137000D03*
D20*
X153000000Y-98200000D03*
D24* D24*
X163832000Y-103886000D03* X163832000Y-103886000D03*
X162812000Y-103886000D03* X162812000Y-103886000D03*
@ -205,27 +206,29 @@ X161800000Y-87120000D03*
D33* D33*
X155222000Y-102616000D03* X155222000Y-102616000D03*
X156182000Y-102616000D03* X156182000Y-102616000D03*
D16* D15*
X161290000Y-106018000D03* X161290000Y-106018000D03*
X161290000Y-105058000D03* X161290000Y-105058000D03*
D14* D13*
X159258000Y-110518000D03* X159258000Y-110518000D03*
X159258000Y-111478000D03* X159258000Y-111478000D03*
D34* D34*
X139860000Y-107160000D03* X139860000Y-107160000D03*
X139860000Y-109260000D03* X139860000Y-109260000D03*
D14* D13*
X150114000Y-112324000D03* X150114000Y-112324000D03*
X150114000Y-113284000D03* X150114000Y-113284000D03*
D24* D24*
X149606000Y-110744000D03* X149606000Y-110744000D03*
X148586000Y-110744000D03* X148586000Y-110744000D03*
D12* D11*
X164100000Y-89190000D03* X164100000Y-89190000D03*
X164100000Y-90210000D03* X164100000Y-90210000D03*
D15* D14*
X159766000Y-106116380D03* X159766000Y-106116380D03*
X159766000Y-104216380D03* X159766000Y-104216380D03*
D20*
X147000000Y-94200000D03*
D35* D35*
X169926000Y-103425000D03* X169926000Y-103425000D03*
X169926000Y-101600000D03* X169926000Y-101600000D03*
@ -235,12 +238,12 @@ X164050000Y-101780000D03*
D34* D34*
X143240000Y-112710000D03* X143240000Y-112710000D03*
X143240000Y-114810000D03* X143240000Y-114810000D03*
D10* D20*
X140700183Y-114698941D03*
X139626728Y-113419647D03*
X138553272Y-112140353D03*
X137479817Y-110861059D03* X137479817Y-110861059D03*
D19* X138553272Y-112140353D03*
X139626728Y-113419647D03*
X140700183Y-114698941D03*
D18*
X155514000Y-116210500D03* X155514000Y-116210500D03*
X156464000Y-116210500D03* X156464000Y-116210500D03*
X157414000Y-116210500D03* X157414000Y-116210500D03*

View File

@ -1,12 +1,12 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(6.0.10)* G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(6.0.10)*
G04 #@! TF.CreationDate,2023-02-26T11:53:10+01:00* G04 #@! TF.CreationDate,2023-03-04T08:18:26+01:00*
G04 #@! TF.ProjectId,W800_Smart_Watch,57383030-5f53-46d6-9172-745f57617463,rev?* G04 #@! TF.ProjectId,W800_Smart_Watch,57383030-5f53-46d6-9172-745f57617463,rev?*
G04 #@! TF.SameCoordinates,Original* G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Paste,Bot* G04 #@! TF.FileFunction,Paste,Bot*
G04 #@! TF.FilePolarity,Positive* G04 #@! TF.FilePolarity,Positive*
%FSLAX46Y46*% %FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-02-26 11:53:10* G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-03-04 08:18:26*
%MOMM*% %MOMM*%
%LPD*% %LPD*%
G01* G01*
@ -227,10 +227,10 @@ D33*
X143240000Y-112710000D03* X143240000Y-112710000D03*
X143240000Y-114810000D03* X143240000Y-114810000D03*
D35* D35*
X140700183Y-114698941D03*
X139626728Y-113419647D03*
X138553272Y-112140353D03*
X137479817Y-110861059D03* X137479817Y-110861059D03*
X138553272Y-112140353D03*
X139626728Y-113419647D03*
X140700183Y-114698941D03*
D18* D18*
X155514000Y-116210500D03* X155514000Y-116210500D03*
X156464000Y-116210500D03* X156464000Y-116210500D03*

View File

@ -1,12 +1,12 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(6.0.10)* G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(6.0.10)*
G04 #@! TF.CreationDate,2023-02-26T11:53:10+01:00* G04 #@! TF.CreationDate,2023-03-04T08:18:26+01:00*
G04 #@! TF.ProjectId,W800_Smart_Watch,57383030-5f53-46d6-9172-745f57617463,rev?* G04 #@! TF.ProjectId,W800_Smart_Watch,57383030-5f53-46d6-9172-745f57617463,rev?*
G04 #@! TF.SameCoordinates,Original* G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Legend,Bot* G04 #@! TF.FileFunction,Legend,Bot*
G04 #@! TF.FilePolarity,Positive* G04 #@! TF.FilePolarity,Positive*
%FSLAX46Y46*% %FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-02-26 11:53:10* G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-03-04 08:18:26*
%MOMM*% %MOMM*%
%LPD*% %LPD*%
G01* G01*
@ -29,23 +29,23 @@ G04 Aperture macros list*
20,1,$1+$1,$6,$7,$8,$9,0* 20,1,$1+$1,$6,$7,$8,$9,0*
20,1,$1+$1,$8,$9,$2,$3,0*% 20,1,$1+$1,$8,$9,$2,$3,0*%
G04 Aperture macros list end* G04 Aperture macros list end*
%ADD10C,0.300000*% %ADD10C,0.150000*%
%ADD11C,0.213592*% %ADD11C,0.213592*%
%ADD12C,0.200000*% %ADD12C,0.300000*%
%ADD13C,0.150000*% %ADD13C,0.200000*%
%ADD14C,0.120000*% %ADD14C,0.120000*%
%ADD15C,0.250000*% %ADD15C,0.250000*%
%ADD16C,1.000000*% %ADD16RoundRect,0.140000X0.140000X0.170000X-0.140000X0.170000X-0.140000X-0.170000X0.140000X-0.170000X0*%
%ADD17RoundRect,0.140000X0.140000X0.170000X-0.140000X0.170000X-0.140000X-0.170000X0.140000X-0.170000X0*% %ADD17RoundRect,0.135000X-0.185000X0.135000X-0.185000X-0.135000X0.185000X-0.135000X0.185000X0.135000X0*%
%ADD18RoundRect,0.135000X-0.185000X0.135000X-0.185000X-0.135000X0.185000X-0.135000X0.185000X0.135000X0*% %ADD18RoundRect,0.225000X0.250000X-0.225000X0.250000X0.225000X-0.250000X0.225000X-0.250000X-0.225000X0*%
%ADD19RoundRect,0.225000X0.250000X-0.225000X0.250000X0.225000X-0.250000X0.225000X-0.250000X-0.225000X0*% %ADD19RoundRect,0.140000X-0.170000X0.140000X-0.170000X-0.140000X0.170000X-0.140000X0.170000X0.140000X0*%
%ADD20RoundRect,0.140000X-0.170000X0.140000X-0.170000X-0.140000X0.170000X-0.140000X0.170000X0.140000X0*% %ADD20RoundRect,0.250000X0.475000X-0.250000X0.475000X0.250000X-0.475000X0.250000X-0.475000X-0.250000X0*%
%ADD21RoundRect,0.250000X0.475000X-0.250000X0.475000X0.250000X-0.475000X0.250000X-0.475000X-0.250000X0*% %ADD21RoundRect,0.140000X0.170000X-0.140000X0.170000X0.140000X-0.170000X0.140000X-0.170000X-0.140000X0*%
%ADD22RoundRect,0.140000X0.170000X-0.140000X0.170000X0.140000X-0.170000X0.140000X-0.170000X-0.140000X0*% %ADD22R,1.200000X1.500000*%
%ADD23R,1.200000X1.500000*% %ADD23RoundRect,0.135000X-0.135000X-0.185000X0.135000X-0.185000X0.135000X0.185000X-0.135000X0.185000X0*%
%ADD24RoundRect,0.135000X-0.135000X-0.185000X0.135000X-0.185000X0.135000X0.185000X-0.135000X0.185000X0*% %ADD24RoundRect,0.150000X-0.150000X0.512500X-0.150000X-0.512500X0.150000X-0.512500X0.150000X0.512500X0*%
%ADD25RoundRect,0.150000X-0.150000X0.512500X-0.150000X-0.512500X0.150000X-0.512500X0.150000X0.512500X0*% %ADD25RoundRect,0.150000X0.150000X-0.512500X0.150000X0.512500X-0.150000X0.512500X-0.150000X-0.512500X0*%
%ADD26RoundRect,0.150000X0.150000X-0.512500X0.150000X0.512500X-0.150000X0.512500X-0.150000X-0.512500X0*% %ADD26C,1.000000*%
%ADD27RoundRect,0.150000X-0.587500X-0.150000X0.587500X-0.150000X0.587500X0.150000X-0.587500X0.150000X0*% %ADD27RoundRect,0.150000X-0.587500X-0.150000X0.587500X-0.150000X0.587500X0.150000X-0.587500X0.150000X0*%
%ADD28RoundRect,0.200000X0.275000X-0.200000X0.275000X0.200000X-0.275000X0.200000X-0.275000X-0.200000X0*% %ADD28RoundRect,0.200000X0.275000X-0.200000X0.275000X0.200000X-0.275000X0.200000X-0.275000X-0.200000X0*%
%ADD29RoundRect,0.225000X0.225000X0.250000X-0.225000X0.250000X-0.225000X-0.250000X0.225000X-0.250000X0*% %ADD29RoundRect,0.225000X0.225000X0.250000X-0.225000X0.250000X-0.225000X-0.250000X0.225000X-0.250000X0*%
@ -63,6 +63,243 @@ G04 Aperture macros list end*
%ADD41RoundRect,0.250000X0.450000X-0.262500X0.450000X0.262500X-0.450000X0.262500X-0.450000X-0.262500X0*% %ADD41RoundRect,0.250000X0.450000X-0.262500X0.450000X0.262500X-0.450000X0.262500X-0.450000X-0.262500X0*%
G04 APERTURE END LIST* G04 APERTURE END LIST*
D10* D10*
X150638095Y-90052380D02*
X150019047Y-90052380D01*
X150352380Y-90433333D01*
X150209523Y-90433333D01*
X150114285Y-90480952D01*
X150066666Y-90528571D01*
X150019047Y-90623809D01*
X150019047Y-90861904D01*
X150066666Y-90957142D01*
X150114285Y-91004761D01*
X150209523Y-91052380D01*
X150495238Y-91052380D01*
X150590476Y-91004761D01*
X150638095Y-90957142D01*
X149733333Y-90052380D02*
X149400000Y-91052380D01*
X149066666Y-90052380D01*
X148828571Y-90052380D02*
X148209523Y-90052380D01*
X148542857Y-90433333D01*
X148400000Y-90433333D01*
X148304761Y-90480952D01*
X148257142Y-90528571D01*
X148209523Y-90623809D01*
X148209523Y-90861904D01*
X148257142Y-90957142D01*
X148304761Y-91004761D01*
X148400000Y-91052380D01*
X148685714Y-91052380D01*
X148780952Y-91004761D01*
X148828571Y-90957142D01*
X150600476Y-94604761D02*
X150457619Y-94652380D01*
X150219523Y-94652380D01*
X150124285Y-94604761D01*
X150076666Y-94557142D01*
X150029047Y-94461904D01*
X150029047Y-94366666D01*
X150076666Y-94271428D01*
X150124285Y-94223809D01*
X150219523Y-94176190D01*
X150410000Y-94128571D01*
X150505238Y-94080952D01*
X150552857Y-94033333D01*
X150600476Y-93938095D01*
X150600476Y-93842857D01*
X150552857Y-93747619D01*
X150505238Y-93700000D01*
X150410000Y-93652380D01*
X150171904Y-93652380D01*
X150029047Y-93700000D01*
X149029047Y-94557142D02*
X149076666Y-94604761D01*
X149219523Y-94652380D01*
X149314761Y-94652380D01*
X149457619Y-94604761D01*
X149552857Y-94509523D01*
X149600476Y-94414285D01*
X149648095Y-94223809D01*
X149648095Y-94080952D01*
X149600476Y-93890476D01*
X149552857Y-93795238D01*
X149457619Y-93700000D01*
X149314761Y-93652380D01*
X149219523Y-93652380D01*
X149076666Y-93700000D01*
X149029047Y-93747619D01*
X148124285Y-94652380D02*
X148600476Y-94652380D01*
X148600476Y-93652380D01*
X152014285Y-98604761D02*
X151871428Y-98652380D01*
X151633333Y-98652380D01*
X151538095Y-98604761D01*
X151490476Y-98557142D01*
X151442857Y-98461904D01*
X151442857Y-98366666D01*
X151490476Y-98271428D01*
X151538095Y-98223809D01*
X151633333Y-98176190D01*
X151823809Y-98128571D01*
X151919047Y-98080952D01*
X151966666Y-98033333D01*
X152014285Y-97938095D01*
X152014285Y-97842857D01*
X151966666Y-97747619D01*
X151919047Y-97700000D01*
X151823809Y-97652380D01*
X151585714Y-97652380D01*
X151442857Y-97700000D01*
X151014285Y-98652380D02*
X151014285Y-97652380D01*
X150776190Y-97652380D01*
X150633333Y-97700000D01*
X150538095Y-97795238D01*
X150490476Y-97890476D01*
X150442857Y-98080952D01*
X150442857Y-98223809D01*
X150490476Y-98414285D01*
X150538095Y-98509523D01*
X150633333Y-98604761D01*
X150776190Y-98652380D01*
X151014285Y-98652380D01*
X150061904Y-98366666D02*
X149585714Y-98366666D01*
X150157142Y-98652380D02*
X149823809Y-97652380D01*
X149490476Y-98652380D01*
X156301904Y-107662380D02*
X156301904Y-106662380D01*
X156063809Y-106662380D01*
X155920952Y-106710000D01*
X155825714Y-106805238D01*
X155778095Y-106900476D01*
X155730476Y-107090952D01*
X155730476Y-107233809D01*
X155778095Y-107424285D01*
X155825714Y-107519523D01*
X155920952Y-107614761D01*
X156063809Y-107662380D01*
X156301904Y-107662380D01*
X154968571Y-107138571D02*
X154825714Y-107186190D01*
X154778095Y-107233809D01*
X154730476Y-107329047D01*
X154730476Y-107471904D01*
X154778095Y-107567142D01*
X154825714Y-107614761D01*
X154920952Y-107662380D01*
X155301904Y-107662380D01*
X155301904Y-106662380D01*
X154968571Y-106662380D01*
X154873333Y-106710000D01*
X154825714Y-106757619D01*
X154778095Y-106852857D01*
X154778095Y-106948095D01*
X154825714Y-107043333D01*
X154873333Y-107090952D01*
X154968571Y-107138571D01*
X155301904Y-107138571D01*
X153778095Y-106710000D02*
X153873333Y-106662380D01*
X154016190Y-106662380D01*
X154159047Y-106710000D01*
X154254285Y-106805238D01*
X154301904Y-106900476D01*
X154349523Y-107090952D01*
X154349523Y-107233809D01*
X154301904Y-107424285D01*
X154254285Y-107519523D01*
X154159047Y-107614761D01*
X154016190Y-107662380D01*
X153920952Y-107662380D01*
X153778095Y-107614761D01*
X153730476Y-107567142D01*
X153730476Y-107233809D01*
X153920952Y-107233809D01*
X150011904Y-106710000D02*
X150107142Y-106662380D01*
X150250000Y-106662380D01*
X150392857Y-106710000D01*
X150488095Y-106805238D01*
X150535714Y-106900476D01*
X150583333Y-107090952D01*
X150583333Y-107233809D01*
X150535714Y-107424285D01*
X150488095Y-107519523D01*
X150392857Y-107614761D01*
X150250000Y-107662380D01*
X150154761Y-107662380D01*
X150011904Y-107614761D01*
X149964285Y-107567142D01*
X149964285Y-107233809D01*
X150154761Y-107233809D01*
X149535714Y-107662380D02*
X149535714Y-106662380D01*
X148964285Y-107662380D01*
X148964285Y-106662380D01*
X148488095Y-107662380D02*
X148488095Y-106662380D01*
X148250000Y-106662380D01*
X148107142Y-106710000D01*
X148011904Y-106805238D01*
X147964285Y-106900476D01*
X147916666Y-107090952D01*
X147916666Y-107233809D01*
X147964285Y-107424285D01*
X148011904Y-107519523D01*
X148107142Y-107614761D01*
X148250000Y-107662380D01*
X148488095Y-107662380D01*
X147161904Y-100100000D02*
X147257142Y-100052380D01*
X147400000Y-100052380D01*
X147542857Y-100100000D01*
X147638095Y-100195238D01*
X147685714Y-100290476D01*
X147733333Y-100480952D01*
X147733333Y-100623809D01*
X147685714Y-100814285D01*
X147638095Y-100909523D01*
X147542857Y-101004761D01*
X147400000Y-101052380D01*
X147304761Y-101052380D01*
X147161904Y-101004761D01*
X147114285Y-100957142D01*
X147114285Y-100623809D01*
X147304761Y-100623809D01*
X146685714Y-101052380D02*
X146685714Y-100052380D01*
X146114285Y-101052380D01*
X146114285Y-100052380D01*
X145638095Y-101052380D02*
X145638095Y-100052380D01*
X145400000Y-100052380D01*
X145257142Y-100100000D01*
X145161904Y-100195238D01*
X145114285Y-100290476D01*
X145066666Y-100480952D01*
X145066666Y-100623809D01*
X145114285Y-100814285D01*
X145161904Y-100909523D01*
X145257142Y-101004761D01*
X145400000Y-101052380D01*
X145638095Y-101052380D01*
D11*
X141946796Y-112010000D02*
G75*
G03*
X141946796Y-112010000I-106796J0D01*
G01*
X154986796Y-115070000D02*
G75*
G03*
X154986796Y-115070000I-106796J0D01*
G01*
D12*
X154414285Y-97207142D02* X154414285Y-97207142D02*
X154200000Y-97278571D01* X154200000Y-97278571D01*
X153842857Y-97278571D01* X153842857Y-97278571D01*
@ -178,18 +415,7 @@ X142271428Y-96278571D01*
X142485714Y-96278571D01* X142485714Y-96278571D01*
X142628571Y-96350000D01* X142628571Y-96350000D01*
X142700000Y-96421428D01* X142700000Y-96421428D01*
D11* D13*
X141946796Y-112010000D02*
G75*
G03*
X141946796Y-112010000I-106796J0D01*
G01*
X154986796Y-115070000D02*
G75*
G03*
X154986796Y-115070000I-106796J0D01*
G01*
D12*
X169384552Y-108488171D02* X169384552Y-108488171D02*
X169241695Y-108535790D01* X169241695Y-108535790D01*
X169194076Y-108583409D01* X169194076Y-108583409D01*
@ -218,7 +444,7 @@ X167955980Y-108011980D01*
X167622647Y-108726266D01* X167622647Y-108726266D01*
X167289314Y-108011980D01* X167289314Y-108011980D01*
X167289314Y-109011980D01* X167289314Y-109011980D01*
D10* D12*
X154472400Y-102293028D02* X154472400Y-102293028D02*
X154400971Y-102221600D01* X154400971Y-102221600D01*
X154258114Y-102150171D01* X154258114Y-102150171D01*
@ -444,7 +670,7 @@ X149019285Y-100097084D01*
X148938333Y-99935179D01* X148938333Y-99935179D01*
X148857380Y-99854227D01* X148857380Y-99854227D01*
X148695476Y-99773274D01* X148695476Y-99773274D01*
D12* D13*
X155737123Y-85170666D02* X155737123Y-85170666D02*
X155260933Y-85170666D01* X155260933Y-85170666D01*
X155832361Y-85456380D02* X155832361Y-85456380D02*
@ -622,14 +848,14 @@ X150260933Y-88676380D01*
X150594266Y-87676380D02* X150594266Y-87676380D02*
X150260933Y-88200190D01* X150260933Y-88200190D01*
X149927600Y-87676380D01* X149927600Y-87676380D01*
D13* D10*
X151206152Y-119705428D02* X151206152Y-119705428D02*
X150444247Y-119705428D01* X150444247Y-119705428D01*
X150825200Y-120086380D02* X150825200Y-120086380D02*
X150825200Y-119324476D01* X150825200Y-119324476D01*
X153898552Y-119705428D02* X153898552Y-119705428D02*
X153136647Y-119705428D01* X153136647Y-119705428D01*
D12* D13*
X161685219Y-109723180D02* X161685219Y-109723180D02*
X162018552Y-109246990D01* X162018552Y-109246990D01*
X162256647Y-109723180D02* X162256647Y-109723180D02*
@ -667,7 +893,7 @@ X160447123Y-108723180D02*
X159875695Y-108723180D01* X159875695Y-108723180D01*
X160161409Y-109723180D02* X160161409Y-109723180D02*
X160161409Y-108723180D01* X160161409Y-108723180D01*
D13* D10*
X163057142Y-114733333D02* X163057142Y-114733333D02*
X163104761Y-114685714D01* X163104761Y-114685714D01*
X163152380Y-114542857D01* X163152380Y-114542857D01*
@ -2045,10 +2271,25 @@ X144334285Y-115538095D01*
X144381904Y-115680952D01* X144381904Y-115680952D01*
X144953333Y-116252380D01* X144953333Y-116252380D01*
X144334285Y-116252380D01* X144334285Y-116252380D01*
X136077739Y-108599845D02* X141837739Y-112659845D02*
X135494086Y-109089588D01* X141254086Y-113149588D01*
X136030784Y-109136543D02* X141790784Y-113196543D02*
X135541041Y-108552891D01* X141301041Y-112612891D01*
X141201415Y-112168194D02*
X140558627Y-111402150D01*
X140376236Y-111555195D01*
X140297410Y-111683500D01*
X140285671Y-111817674D01*
X140310411Y-111921240D01*
X140396368Y-112097762D01*
X140488195Y-112207197D01*
X140647109Y-112322501D01*
X140744805Y-112364849D01*
X140878980Y-112376587D01*
X141019024Y-112321239D01*
X141201415Y-112168194D01*
X142417739Y-116249845D02*
X141834086Y-116739588D01*
X141125633Y-110450278D02* X141125633Y-110450278D02*
X140482845Y-109684234D01* X140482845Y-109684234D01*
X140300454Y-109837278D01* X140300454Y-109837278D01*
@ -2064,46 +2305,11 @@ X140943242Y-110603323D01*
X141125633Y-110450278D01* X141125633Y-110450278D01*
X140114717Y-110801239D02* X140114717Y-110801239D02*
X139531064Y-111290982D01* X139531064Y-111290982D01*
X142417739Y-116249845D02* X136077739Y-108599845D02*
X141834086Y-116739588D01* X135494086Y-109089588D01*
X141201415Y-112168194D02* X136030784Y-109136543D02*
X140558627Y-111402150D01* X135541041Y-108552891D01*
X140376236Y-111555195D01*
X140297410Y-111683500D01*
X140285671Y-111817674D01*
X140310411Y-111921240D01*
X140396368Y-112097762D01*
X140488195Y-112207197D01*
X140647109Y-112322501D01*
X140744805Y-112364849D01*
X140878980Y-112376587D01*
X141019024Y-112321239D01*
X141201415Y-112168194D01*
X141837739Y-112659845D02*
X141254086Y-113149588D01*
X141790784Y-113196543D02*
X141301041Y-112612891D01*
D14* D14*
X153700000Y-98200000D02*
G75*
G03*
X153700000Y-98200000I-700000J0D01*
G01*
X147700000Y-94200000D02*
G75*
G03*
X147700000Y-94200000I-700000J0D01*
G01*
X147700000Y-98800000D02*
G75*
G03*
X147700000Y-98800000I-700000J0D01*
G01*
X147700000Y-91940000D02*
G75*
G03*
X147700000Y-91940000I-700000J0D01*
G01*
X161143836Y-114956000D02* X161143836Y-114956000D02*
X160928164Y-114956000D01* X160928164Y-114956000D01*
X161143836Y-115676000D02* X161143836Y-115676000D02*
@ -2176,6 +2382,11 @@ X161943000Y-93046359D02*
X161943000Y-93353641D01* X161943000Y-93353641D01*
X161183000Y-93046359D02* X161183000Y-93046359D02*
X161183000Y-93353641D01* X161183000Y-93353641D01*
X147700000Y-91940000D02*
G75*
G03*
X147700000Y-91940000I-700000J0D01*
G01*
X166570000Y-100980000D02* X166570000Y-100980000D02*
X165920000Y-100980000D01* X165920000Y-100980000D01*
X166570000Y-104100000D02* X166570000Y-104100000D02*
@ -2200,7 +2411,7 @@ X151510000Y-112927641D02*
X151510000Y-112620359D01* X151510000Y-112620359D01*
X150750000Y-112927641D02* X150750000Y-112927641D02*
X150750000Y-112620359D01* X150750000Y-112620359D01*
D13* D10*
X142597000Y-108561000D02* X142597000Y-108561000D02*
X145947000Y-108561000D01* X145947000Y-108561000D01*
X142597000Y-111686000D02* X142597000Y-111686000D02*
@ -2281,7 +2492,7 @@ X155017602Y-96598727D02*
X155170105Y-96751230D01* X155170105Y-96751230D01*
X155526719Y-96089610D02* X155526719Y-96089610D02*
X155679222Y-96242113D01* X155679222Y-96242113D01*
D13* D10*
X150546000Y-119090000D02* X150546000Y-119090000D02*
X150046000Y-119090000D01* X150046000Y-119090000D01*
X150046000Y-116090000D02* X150046000Y-116090000D02*
@ -2308,6 +2519,11 @@ X149249641Y-110108000D02*
X148942359Y-110108000D01* X148942359Y-110108000D01*
X149249641Y-109348000D02* X149249641Y-109348000D02*
X148942359Y-109348000D01* X148942359Y-109348000D01*
X147700000Y-98800000D02*
G75*
G03*
X147700000Y-98800000I-700000J0D01*
G01*
X157764000Y-95074500D02* X157764000Y-95074500D02*
X157764000Y-94424500D01* X157764000Y-94424500D01*
X160884000Y-95074500D02* X160884000Y-95074500D02*
@ -2316,6 +2532,11 @@ X157764000Y-95074500D02*
X157764000Y-95724500D01* X157764000Y-95724500D01*
X160884000Y-95074500D02* X160884000Y-95074500D02*
X160884000Y-96749500D01* X160884000Y-96749500D01*
X153700000Y-98200000D02*
G75*
G03*
X153700000Y-98200000I-700000J0D01*
G01*
X163475641Y-103506000D02* X163475641Y-103506000D02*
X163168359Y-103506000D01* X163168359Y-103506000D01*
X163475641Y-104266000D02* X163475641Y-104266000D02*
@ -2358,6 +2579,11 @@ X159031000Y-105427632D02*
X159031000Y-104905128D01* X159031000Y-104905128D01*
X160501000Y-105427632D02* X160501000Y-105427632D02*
X160501000Y-104905128D01* X160501000Y-104905128D01*
X147700000Y-94200000D02*
G75*
G03*
X147700000Y-94200000I-700000J0D01*
G01*
X169191000Y-102739564D02* X169191000Y-102739564D02*
X169191000Y-102285436D01* X169191000Y-102285436D01*
X170661000Y-102739564D02* X170661000Y-102739564D02*
@ -2372,14 +2598,14 @@ X142390000Y-112260000D02*
X144090000Y-112260000D01* X144090000Y-112260000D01*
X144090000Y-112260000D02* X144090000Y-112260000D02*
X144090000Y-114810000D01* X144090000Y-114810000D01*
X135752805Y-110358610D02*
X140895106Y-116486965D01*
X140895106Y-116486965D02*
X142427195Y-115201390D01*
X142427195Y-115201390D02*
X137284894Y-109073035D01*
X137284894Y-109073035D02* X137284894Y-109073035D02*
X135752805Y-110358610D01* X135752805Y-110358610D01*
X142427195Y-115201390D02*
X137284894Y-109073035D01*
X140895106Y-116486965D02*
X142427195Y-115201390D01*
X135752805Y-110358610D02*
X140895106Y-116486965D01*
X158024000Y-117348000D02* X158024000Y-117348000D02*
X158024000Y-116548000D01* X158024000Y-116548000D01*
X154904000Y-117348000D02* X154904000Y-117348000D02*
@ -2390,60 +2616,57 @@ X154904000Y-117348000D02*
X154904000Y-115548000D01* X154904000Y-115548000D01*
%LPC*% %LPC*%
D16* D16*
X153000000Y-98200000D03*
X147000000Y-94200000D03*
X147000000Y-98800000D03*
X147000000Y-91940000D03*
D17*
X161516000Y-115316000D03* X161516000Y-115316000D03*
X160556000Y-115316000D03* X160556000Y-115316000D03*
D18* D17*
X159512000Y-87120000D03* X159512000Y-87120000D03*
X159512000Y-88140000D03* X159512000Y-88140000D03*
D19* D18*
X167100000Y-93775000D03* X167100000Y-93775000D03*
X167100000Y-92225000D03* X167100000Y-92225000D03*
D20* D19*
X163068000Y-89210000D03* X163068000Y-89210000D03*
X163068000Y-90170000D03* X163068000Y-90170000D03*
D21* D20*
X157734000Y-106116380D03* X157734000Y-106116380D03*
X157734000Y-104216380D03* X157734000Y-104216380D03*
D22* D21*
X162605000Y-93680000D03* X162605000Y-93680000D03*
X162605000Y-92720000D03* X162605000Y-92720000D03*
X163621000Y-93680000D03* X163621000Y-93680000D03*
X163621000Y-92720000D03* X163621000Y-92720000D03*
D23* D22*
X169530000Y-106190000D03* X169530000Y-106190000D03*
X164330000Y-106190000D03* X164330000Y-106190000D03*
D24* D23*
X160780000Y-110490000D03* X160780000Y-110490000D03*
X161800000Y-110490000D03* X161800000Y-110490000D03*
D25* D24*
X145354000Y-86360000D03* X145354000Y-86360000D03*
X146304000Y-86360000D03* X146304000Y-86360000D03*
X147254000Y-86360000D03* X147254000Y-86360000D03*
X147254000Y-88635000D03* X147254000Y-88635000D03*
X145354000Y-88635000D03* X145354000Y-88635000D03*
D24* D23*
X161542000Y-96520000D03* X161542000Y-96520000D03*
X162562000Y-96520000D03* X162562000Y-96520000D03*
D20* D19*
X159258000Y-115344000D03* X159258000Y-115344000D03*
X159258000Y-116304000D03* X159258000Y-116304000D03*
D26* D25*
X157922000Y-113405500D03* X157922000Y-113405500D03*
X156972000Y-113405500D03* X156972000Y-113405500D03*
X156022000Y-113405500D03* X156022000Y-113405500D03*
X156022000Y-111130500D03* X156022000Y-111130500D03*
X157922000Y-111130500D03* X157922000Y-111130500D03*
D22* D21*
X159258000Y-113510000D03* X159258000Y-113510000D03*
X159258000Y-112550000D03* X159258000Y-112550000D03*
D18* D17*
X161563000Y-92690000D03* X161563000Y-92690000D03*
X161563000Y-93710000D03* X161563000Y-93710000D03*
D26*
X147000000Y-91940000D03*
D27* D27*
X165632500Y-103490000D03* X165632500Y-103490000D03*
X165632500Y-101590000D03* X165632500Y-101590000D03*
@ -2474,7 +2697,7 @@ X146472000Y-111236000D03*
D31* D31*
X160782000Y-114302000D03* X160782000Y-114302000D03*
X160782000Y-113282000D03* X160782000Y-113282000D03*
D18* D17*
X143690000Y-91610000D03* X143690000Y-91610000D03*
X143690000Y-92630000D03* X143690000Y-92630000D03*
X144730000Y-90050000D03* X144730000Y-90050000D03*
@ -2485,30 +2708,30 @@ X152670000Y-111250000D03*
D30* D30*
X143156400Y-107746800D03* X143156400Y-107746800D03*
X142136400Y-107746800D03* X142136400Y-107746800D03*
D18* D17*
X154686000Y-112774000D03* X154686000Y-112774000D03*
X154686000Y-113794000D03* X154686000Y-113794000D03*
D33* D33*
X148590000Y-112334000D03* X148590000Y-112334000D03*
X148590000Y-114234000D03* X148590000Y-114234000D03*
D22* D21*
X166370000Y-112748000D03* X166370000Y-112748000D03*
X166370000Y-111788000D03* X166370000Y-111788000D03*
D17* D16*
X161262000Y-117348000D03* X161262000Y-117348000D03*
X160302000Y-117348000D03* X160302000Y-117348000D03*
D34* D34*
X164084000Y-114614000D03* X164084000Y-114614000D03*
X164084000Y-109414000D03* X164084000Y-109414000D03*
D16* D26*
X149250400Y-105664000D03* X149250400Y-105664000D03*
D31* D31*
X164637000Y-93710000D03* X164637000Y-93710000D03*
X164637000Y-92690000D03* X164637000Y-92690000D03*
D20* D19*
X162052000Y-89210000D03* X162052000Y-89210000D03*
X162052000Y-90170000D03* X162052000Y-90170000D03*
D18* D17*
X166370000Y-108710000D03* X166370000Y-108710000D03*
X166370000Y-109730000D03* X166370000Y-109730000D03*
D35* D35*
@ -2520,15 +2743,19 @@ X152746000Y-118985000D03*
D37* D37*
X150246000Y-115210000D03* X150246000Y-115210000D03*
X154046000Y-115210000D03* X154046000Y-115210000D03*
D16* D26*
X155041600Y-105664000D03* X155041600Y-105664000D03*
D30* D30*
X149606000Y-109728000D03* X149606000Y-109728000D03*
X148586000Y-109728000D03* X148586000Y-109728000D03*
D26*
X147000000Y-98800000D03*
D38* D38*
X160274000Y-96012000D03* X160274000Y-96012000D03*
X158374000Y-96012000D03* X158374000Y-96012000D03*
X159324000Y-94137000D03* X159324000Y-94137000D03*
D26*
X153000000Y-98200000D03*
D30* D30*
X163832000Y-103886000D03* X163832000Y-103886000D03*
X162812000Y-103886000D03* X162812000Y-103886000D03*
@ -2538,27 +2765,29 @@ X161800000Y-87120000D03*
D39* D39*
X155222000Y-102616000D03* X155222000Y-102616000D03*
X156182000Y-102616000D03* X156182000Y-102616000D03*
D22* D21*
X161290000Y-106018000D03* X161290000Y-106018000D03*
X161290000Y-105058000D03* X161290000Y-105058000D03*
D20* D19*
X159258000Y-110518000D03* X159258000Y-110518000D03*
X159258000Y-111478000D03* X159258000Y-111478000D03*
D40* D40*
X139860000Y-107160000D03* X139860000Y-107160000D03*
X139860000Y-109260000D03* X139860000Y-109260000D03*
D20* D19*
X150114000Y-112324000D03* X150114000Y-112324000D03*
X150114000Y-113284000D03* X150114000Y-113284000D03*
D30* D30*
X149606000Y-110744000D03* X149606000Y-110744000D03*
X148586000Y-110744000D03* X148586000Y-110744000D03*
D18* D17*
X164100000Y-89190000D03* X164100000Y-89190000D03*
X164100000Y-90210000D03* X164100000Y-90210000D03*
D21* D20*
X159766000Y-106116380D03* X159766000Y-106116380D03*
X159766000Y-104216380D03* X159766000Y-104216380D03*
D26*
X147000000Y-94200000D03*
D41* D41*
X169926000Y-103425000D03* X169926000Y-103425000D03*
X169926000Y-101600000D03* X169926000Y-101600000D03*
@ -2568,12 +2797,12 @@ X164050000Y-101780000D03*
D40* D40*
X143240000Y-112710000D03* X143240000Y-112710000D03*
X143240000Y-114810000D03* X143240000Y-114810000D03*
D16* D26*
X140700183Y-114698941D03*
X139626728Y-113419647D03*
X138553272Y-112140353D03*
X137479817Y-110861059D03* X137479817Y-110861059D03*
D25* X138553272Y-112140353D03*
X139626728Y-113419647D03*
X140700183Y-114698941D03*
D24*
X155514000Y-116210500D03* X155514000Y-116210500D03*
X156464000Y-116210500D03* X156464000Y-116210500D03*
X157414000Y-116210500D03* X157414000Y-116210500D03*

View File

@ -1,11 +1,11 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(6.0.10)* G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(6.0.10)*
G04 #@! TF.CreationDate,2023-02-26T11:53:10+01:00* G04 #@! TF.CreationDate,2023-03-04T08:18:26+01:00*
G04 #@! TF.ProjectId,W800_Smart_Watch,57383030-5f53-46d6-9172-745f57617463,rev?* G04 #@! TF.ProjectId,W800_Smart_Watch,57383030-5f53-46d6-9172-745f57617463,rev?*
G04 #@! TF.SameCoordinates,Original* G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Profile,NP* G04 #@! TF.FileFunction,Profile,NP*
%FSLAX46Y46*% %FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-02-26 11:53:10* G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-03-04 08:18:26*
%MOMM*% %MOMM*%
%LPD*% %LPD*%
G01* G01*

File diff suppressed because it is too large Load Diff

View File

@ -1,12 +1,12 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(6.0.10)* G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(6.0.10)*
G04 #@! TF.CreationDate,2023-02-26T11:53:10+01:00* G04 #@! TF.CreationDate,2023-03-04T08:18:26+01:00*
G04 #@! TF.ProjectId,W800_Smart_Watch,57383030-5f53-46d6-9172-745f57617463,rev?* G04 #@! TF.ProjectId,W800_Smart_Watch,57383030-5f53-46d6-9172-745f57617463,rev?*
G04 #@! TF.SameCoordinates,Original* G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Soldermask,Top* G04 #@! TF.FileFunction,Soldermask,Top*
G04 #@! TF.FilePolarity,Negative* G04 #@! TF.FilePolarity,Negative*
%FSLAX46Y46*% %FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-02-26 11:53:10* G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-03-04 08:18:26*
%MOMM*% %MOMM*%
%LPD*% %LPD*%
G01* G01*

View File

@ -1,12 +1,12 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(6.0.10)* G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(6.0.10)*
G04 #@! TF.CreationDate,2023-02-26T11:53:10+01:00* G04 #@! TF.CreationDate,2023-03-04T08:18:26+01:00*
G04 #@! TF.ProjectId,W800_Smart_Watch,57383030-5f53-46d6-9172-745f57617463,rev?* G04 #@! TF.ProjectId,W800_Smart_Watch,57383030-5f53-46d6-9172-745f57617463,rev?*
G04 #@! TF.SameCoordinates,Original* G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Paste,Top* G04 #@! TF.FileFunction,Paste,Top*
G04 #@! TF.FilePolarity,Positive* G04 #@! TF.FilePolarity,Positive*
%FSLAX46Y46*% %FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-02-26 11:53:10* G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-03-04 08:18:26*
%MOMM*% %MOMM*%
%LPD*% %LPD*%
G01* G01*

View File

@ -1,12 +1,12 @@
G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(6.0.10)* G04 #@! TF.GenerationSoftware,KiCad,Pcbnew,(6.0.10)*
G04 #@! TF.CreationDate,2023-02-26T11:53:10+01:00* G04 #@! TF.CreationDate,2023-03-04T08:18:26+01:00*
G04 #@! TF.ProjectId,W800_Smart_Watch,57383030-5f53-46d6-9172-745f57617463,rev?* G04 #@! TF.ProjectId,W800_Smart_Watch,57383030-5f53-46d6-9172-745f57617463,rev?*
G04 #@! TF.SameCoordinates,Original* G04 #@! TF.SameCoordinates,Original*
G04 #@! TF.FileFunction,Legend,Top* G04 #@! TF.FileFunction,Legend,Top*
G04 #@! TF.FilePolarity,Positive* G04 #@! TF.FilePolarity,Positive*
%FSLAX46Y46*% %FSLAX46Y46*%
G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-02-26 11:53:10* G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-03-04 08:18:26*
%MOMM*% %MOMM*%
%LPD*% %LPD*%
G01* G01*

View File

@ -1,12 +1,12 @@
%TF.GenerationSoftware,KiCad,Pcbnew,(6.0.10)*% %TF.GenerationSoftware,KiCad,Pcbnew,(6.0.10)*%
%TF.CreationDate,2023-02-26T11:53:20+01:00*% %TF.CreationDate,2023-03-04T08:18:30+01:00*%
%TF.ProjectId,W800_Smart_Watch,57383030-5f53-46d6-9172-745f57617463,rev?*% %TF.ProjectId,W800_Smart_Watch,57383030-5f53-46d6-9172-745f57617463,rev?*%
%TF.SameCoordinates,Original*% %TF.SameCoordinates,Original*%
%TF.FileFunction,Drillmap*% %TF.FileFunction,Drillmap*%
%TF.FilePolarity,Positive*% %TF.FilePolarity,Positive*%
%FSLAX45Y45*% %FSLAX45Y45*%
G04 Gerber Fmt 4.5, Leading zero omitted, Abs format (unit mm)* G04 Gerber Fmt 4.5, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-02-26 11:53:20* G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-03-04 08:18:30*
%MOMM*% %MOMM*%
%LPD*% %LPD*%
G01* G01*

View File

@ -71,7 +71,7 @@ endobj
10 0 obj 10 0 obj
<< <<
/Producer (KiCad PDF) /Producer (KiCad PDF)
/CreationDate (D:20230226115323) /CreationDate (D:20230304081832)
/Creator (PCBNEW) /Creator (PCBNEW)
/Title (W800_Smart_Watch-NPTH-drl_map.pdf) /Title (W800_Smart_Watch-NPTH-drl_map.pdf)
>> >>

View File

@ -1,7 +1,7 @@
M48 M48
; DRILL file {KiCad (6.0.10)} date Sun Feb 26 11:53:23 2023 ; DRILL file {KiCad (6.0.10)} date Sat Mar 4 08:18:32 2023
; FORMAT={-:-/ absolute / metric / decimal} ; FORMAT={-:-/ absolute / metric / decimal}
; #@! TF.CreationDate,2023-02-26T11:53:23+01:00 ; #@! TF.CreationDate,2023-03-04T08:18:32+01:00
; #@! TF.GenerationSoftware,Kicad,Pcbnew,(6.0.10) ; #@! TF.GenerationSoftware,Kicad,Pcbnew,(6.0.10)
; #@! TF.FileFunction,NonPlated,1,2,NPTH ; #@! TF.FileFunction,NonPlated,1,2,NPTH
FMAT,2 FMAT,2

View File

@ -1,12 +1,12 @@
%TF.GenerationSoftware,KiCad,Pcbnew,(6.0.10)*% %TF.GenerationSoftware,KiCad,Pcbnew,(6.0.10)*%
%TF.CreationDate,2023-02-26T11:53:20+01:00*% %TF.CreationDate,2023-03-04T08:18:30+01:00*%
%TF.ProjectId,W800_Smart_Watch,57383030-5f53-46d6-9172-745f57617463,rev?*% %TF.ProjectId,W800_Smart_Watch,57383030-5f53-46d6-9172-745f57617463,rev?*%
%TF.SameCoordinates,Original*% %TF.SameCoordinates,Original*%
%TF.FileFunction,Drillmap*% %TF.FileFunction,Drillmap*%
%TF.FilePolarity,Positive*% %TF.FilePolarity,Positive*%
%FSLAX45Y45*% %FSLAX45Y45*%
G04 Gerber Fmt 4.5, Leading zero omitted, Abs format (unit mm)* G04 Gerber Fmt 4.5, Leading zero omitted, Abs format (unit mm)*
G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-02-26 11:53:20* G04 Created by KiCad (PCBNEW (6.0.10)) date 2023-03-04 08:18:30*
%MOMM*% %MOMM*%
%LPD*% %LPD*%
G01* G01*
@ -243,6 +243,10 @@ X14435000Y-10130000D02*
X14465000Y-10160000D01* X14465000Y-10160000D01*
X14465000Y-10130000D02* X14465000Y-10130000D02*
X14435000Y-10160000D01* X14435000Y-10160000D01*
X14458000Y-9287000D02*
X14488000Y-9317000D01*
X14488000Y-9287000D02*
X14458000Y-9317000D01*
X14463000Y-10018000D02* X14463000Y-10018000D02*
X14493000Y-10048000D01* X14493000Y-10048000D01*
X14493000Y-10018000D02* X14493000Y-10018000D02*
@ -255,22 +259,22 @@ X14463000Y-10589500D02*
X14493000Y-10619500D01* X14493000Y-10619500D01*
X14493000Y-10589500D02* X14493000Y-10589500D02*
X14463000Y-10619500D01* X14463000Y-10619500D01*
X14469000Y-9254000D02* X14464000Y-9165000D02*
X14499000Y-9284000D01* X14494000Y-9195000D01*
X14499000Y-9254000D02* X14494000Y-9165000D02*
X14469000Y-9284000D01* X14464000Y-9195000D01*
X14483000Y-10374000D02* X14483000Y-10374000D02*
X14513000Y-10404000D01* X14513000Y-10404000D01*
X14513000Y-10374000D02* X14513000Y-10374000D02*
X14483000Y-10404000D01* X14483000Y-10404000D01*
X14488400Y-9179800D02*
X14518400Y-9209800D01*
X14518400Y-9179800D02*
X14488400Y-9209800D01*
X14513800Y-10957800D02* X14513800Y-10957800D02*
X14543800Y-10987800D01* X14543800Y-10987800D01*
X14543800Y-10957800D02* X14543800Y-10957800D02*
X14513800Y-10987800D01* X14513800Y-10987800D01*
X14517000Y-8426000D02*
X14547000Y-8456000D01*
X14547000Y-8426000D02*
X14517000Y-8456000D01*
X14526500Y-9637000D02* X14526500Y-9637000D02*
X14556500Y-9667000D01* X14556500Y-9667000D01*
X14556500Y-9637000D02* X14556500Y-9637000D02*
@ -299,6 +303,10 @@ X14555000Y-9373000D02*
X14585000Y-9403000D01* X14585000Y-9403000D01*
X14585000Y-9373000D02* X14585000Y-9373000D02*
X14555000Y-9403000D01* X14555000Y-9403000D01*
X14563000Y-9252000D02*
X14593000Y-9282000D01*
X14593000Y-9252000D02*
X14563000Y-9282000D01*
X14564000Y-10379000D02* X14564000Y-10379000D02*
X14594000Y-10409000D01* X14594000Y-10409000D01*
X14594000Y-10379000D02* X14594000Y-10379000D02*
@ -387,6 +395,10 @@ X14718000Y-10795000D02*
X14748000Y-10825000D01* X14748000Y-10825000D01*
X14748000Y-10795000D02* X14748000Y-10795000D02*
X14718000Y-10825000D01* X14718000Y-10825000D01*
X14741000Y-9584000D02*
X14771000Y-9614000D01*
X14771000Y-9584000D02*
X14741000Y-9614000D01*
X14746000Y-10389000D02* X14746000Y-10389000D02*
X14776000Y-10419000D01* X14776000Y-10419000D01*
X14776000Y-10389000D02* X14776000Y-10389000D02*
@ -395,10 +407,6 @@ X14755100Y-8455900D02*
X14785100Y-8485900D01* X14785100Y-8485900D01*
X14785100Y-8455900D02* X14785100Y-8455900D02*
X14755100Y-8485900D01* X14755100Y-8485900D01*
X14767000Y-9578000D02*
X14797000Y-9608000D01*
X14797000Y-9578000D02*
X14767000Y-9608000D01*
X14767800Y-10932400D02* X14767800Y-10932400D02*
X14797800Y-10962400D01* X14797800Y-10962400D01*
X14797800Y-10932400D02* X14797800Y-10932400D02*
@ -435,6 +443,10 @@ X14793200Y-10157700D02*
X14823200Y-10187700D01* X14823200Y-10187700D01*
X14823200Y-10157700D02* X14823200Y-10157700D02*
X14793200Y-10187700D01* X14793200Y-10187700D01*
X14816000Y-9646000D02*
X14846000Y-9676000D01*
X14846000Y-9646000D02*
X14816000Y-9676000D01*
X14825000Y-10389000D02* X14825000Y-10389000D02*
X14855000Y-10419000D01* X14855000Y-10419000D01*
X14855000Y-10389000D02* X14855000Y-10389000D02*
@ -523,10 +535,6 @@ X15064000Y-8679000D02*
X15094000Y-8709000D01* X15094000Y-8709000D01*
X15094000Y-8679000D02* X15094000Y-8679000D02*
X15064000Y-8709000D01* X15064000Y-8709000D01*
X15072600Y-9357600D02*
X15102600Y-9387600D01*
X15102600Y-9357600D02*
X15072600Y-9387600D01*
X15072600Y-10856200D02* X15072600Y-10856200D02*
X15102600Y-10886200D01* X15102600Y-10886200D01*
X15102600Y-10856200D02* X15102600Y-10856200D02*
@ -559,6 +567,10 @@ X15111000Y-10171000D02*
X15141000Y-10201000D01* X15141000Y-10201000D01*
X15141000Y-10171000D02* X15141000Y-10171000D02*
X15111000Y-10201000D01* X15111000Y-10201000D01*
X15122000Y-9360000D02*
X15152000Y-9390000D01*
X15152000Y-9360000D02*
X15122000Y-9390000D01*
X15143050Y-9052800D02* X15143050Y-9052800D02*
X15173050Y-9082800D01* X15173050Y-9082800D01*
X15173050Y-9052800D02* X15173050Y-9052800D02*
@ -855,6 +867,10 @@ X15733000Y-11465800D02*
X15763000Y-11495800D01* X15763000Y-11495800D01*
X15763000Y-11465800D02* X15763000Y-11465800D02*
X15733000Y-11495800D01* X15733000Y-11495800D01*
X15752000Y-8381000D02*
X15782000Y-8411000D01*
X15782000Y-8381000D02*
X15752000Y-8411000D01*
X15758400Y-9814800D02* X15758400Y-9814800D02*
X15788400Y-9844800D01* X15788400Y-9844800D01*
X15788400Y-9814800D02* X15788400Y-9814800D02*
@ -867,10 +883,6 @@ X15783800Y-9332200D02*
X15813800Y-9362200D01* X15813800Y-9362200D01*
X15813800Y-9332200D02* X15813800Y-9332200D02*
X15783800Y-9362200D01* X15783800Y-9362200D01*
X15800000Y-8383000D02*
X15830000Y-8413000D01*
X15830000Y-8383000D02*
X15800000Y-8413000D01*
X15809200Y-9713200D02* X15809200Y-9713200D02*
X15839200Y-9743200D01* X15839200Y-9743200D01*
X15839200Y-9713200D02* X15839200Y-9713200D02*
@ -1239,6 +1251,10 @@ X16750450Y-9100000D02*
X16780450Y-9130000D01* X16780450Y-9130000D01*
X16780450Y-9100000D02* X16780450Y-9100000D02*
X16750450Y-9130000D01* X16750450Y-9130000D01*
X16755000Y-9981000D02*
X16785000Y-10011000D01*
X16785000Y-9981000D02*
X16755000Y-10011000D01*
X16790150Y-10932400D02* X16790150Y-10932400D02*
X16820150Y-10962400D01* X16820150Y-10962400D01*
X16820150Y-10932400D02* X16820150Y-10932400D02*
@ -1725,27 +1741,11 @@ X17278333Y-12652619D01*
X17268810Y-12681190D01* X17268810Y-12681190D01*
X17154524Y-12795476D01* X17154524Y-12795476D01*
X17278333Y-12795476D01* X17278333Y-12795476D01*
X17402143Y-12595476D02* X17449762Y-12662143D02*
X17421190Y-12595476D01* X17449762Y-12795476D01*
X17440238Y-12605000D01* X17402143Y-12585952D02*
X17449762Y-12614524D01* X17354524Y-12728809D01*
X17459286Y-12633571D01* X17478333Y-12728809D01*
X17468810Y-12671667D01*
X17468810Y-12719286D01*
X17459286Y-12757381D01*
X17449762Y-12776428D01*
X17440238Y-12785952D01*
X17421190Y-12795476D01*
X17402143Y-12795476D01*
X17383095Y-12785952D01*
X17373571Y-12776428D01*
X17364048Y-12757381D01*
X17354524Y-12719286D01*
X17354524Y-12671667D01*
X17364048Y-12633571D01*
X17373571Y-12614524D01*
X17383095Y-12605000D01*
X17402143Y-12595476D01*
X17706905Y-12795476D02* X17706905Y-12795476D02*
X17706905Y-12595476D01* X17706905Y-12595476D01*
X17792619Y-12795476D02* X17792619Y-12795476D02*

View File

@ -1,7 +1,7 @@
M48 M48
; DRILL file {KiCad (6.0.10)} date Sun Feb 26 11:53:23 2023 ; DRILL file {KiCad (6.0.10)} date Sat Mar 4 08:18:32 2023
; FORMAT={-:-/ absolute / metric / decimal} ; FORMAT={-:-/ absolute / metric / decimal}
; #@! TF.CreationDate,2023-02-26T11:53:23+01:00 ; #@! TF.CreationDate,2023-03-04T08:18:32+01:00
; #@! TF.GenerationSoftware,Kicad,Pcbnew,(6.0.10) ; #@! TF.GenerationSoftware,Kicad,Pcbnew,(6.0.10)
; #@! TF.FileFunction,Plated,1,2,PTH ; #@! TF.FileFunction,Plated,1,2,PTH
FMAT,2 FMAT,2
@ -69,13 +69,14 @@ X144.145Y-98.425
X144.23Y-108.42 X144.23Y-108.42
X144.272Y-110.896 X144.272Y-110.896
X144.5Y-101.45 X144.5Y-101.45
X144.73Y-93.02
X144.78Y-100.33 X144.78Y-100.33
X144.78Y-104.775 X144.78Y-104.775
X144.78Y-106.045 X144.78Y-106.045
X144.84Y-92.69 X144.79Y-91.8
X144.98Y-103.89 X144.98Y-103.89
X145.034Y-91.948
X145.288Y-109.728 X145.288Y-109.728
X145.32Y-84.41
X145.415Y-96.52 X145.415Y-96.52
X145.415Y-97.79 X145.415Y-97.79
X145.415Y-99.06 X145.415Y-99.06
@ -83,6 +84,7 @@ X145.415Y-105.41
X145.542Y-101.473 X145.542Y-101.473
X145.669Y-118.364 X145.669Y-118.364
X145.7Y-93.88 X145.7Y-93.88
X145.78Y-92.67
X145.79Y-103.94 X145.79Y-103.94
X145.879Y-90.192 X145.879Y-90.192
X146.05Y-100.33 X146.05Y-100.33
@ -105,9 +107,9 @@ X147.193Y-117.83
X147.32Y-101.67 X147.32Y-101.67
X147.32Y-106.68 X147.32Y-106.68
X147.33Y-108.1 X147.33Y-108.1
X147.56Y-95.99
X147.61Y-104.04 X147.61Y-104.04
X147.701Y-84.709 X147.701Y-84.709
X147.82Y-95.93
X147.828Y-109.474 X147.828Y-109.474
X147.828Y-119.38 X147.828Y-119.38
X147.955Y-99.695 X147.955Y-99.695
@ -117,6 +119,7 @@ X148.0Y-118.618
X148.005Y-84.101 X148.005Y-84.101
X148.082Y-90.932 X148.082Y-90.932
X148.082Y-101.727 X148.082Y-101.727
X148.31Y-96.61
X148.4Y-104.04 X148.4Y-104.04
X148.463Y-89.916 X148.463Y-89.916
X148.54Y-93.4 X148.54Y-93.4
@ -139,7 +142,6 @@ X150.368Y-118.11
X150.41Y-101.59 X150.41Y-101.59
X150.724Y-106.782 X150.724Y-106.782
X150.79Y-86.94 X150.79Y-86.94
X150.876Y-93.726
X150.876Y-108.712 X150.876Y-108.712
X150.876Y-109.474 X150.876Y-109.474
X150.879Y-110.179 X150.879Y-110.179
@ -148,6 +150,7 @@ X150.927Y-106.07
X150.99Y-86.03 X150.99Y-86.03
X151.003Y-113.919 X151.003Y-113.919
X151.26Y-101.86 X151.26Y-101.86
X151.37Y-93.75
X151.581Y-90.678 X151.581Y-90.678
X151.638Y-110.998 X151.638Y-110.998
X151.76Y-87.729 X151.76Y-87.729
@ -222,10 +225,10 @@ X157.131Y-109.633
X157.2Y-95.7 X157.2Y-95.7
X157.275Y-107.687 X157.275Y-107.687
X157.48Y-114.808 X157.48Y-114.808
X157.67Y-83.96
X157.734Y-98.298 X157.734Y-98.298
X157.861Y-112.268 X157.861Y-112.268
X157.988Y-93.472 X157.988Y-93.472
X158.15Y-83.98
X158.242Y-97.282 X158.242Y-97.282
X158.27Y-109.72 X158.27Y-109.72
X158.339Y-89.505 X158.339Y-89.505
@ -318,6 +321,7 @@ X167.4Y-103.47
X167.589Y-105.258 X167.589Y-105.258
X167.589Y-106.883 X167.589Y-106.883
X167.654Y-91.15 X167.654Y-91.15
X167.7Y-99.96
X168.052Y-109.474 X168.052Y-109.474
X168.092Y-94.408 X168.092Y-94.408
X168.2Y-92.2 X168.2Y-92.2

File diff suppressed because it is too large Load Diff

View File

@ -1,6 +1,6 @@
{ {
"board": { "board": {
"active_layer": 0, "active_layer": 36,
"active_layer_preset": "", "active_layer_preset": "",
"auto_track_width": true, "auto_track_width": true,
"hidden_nets": [], "hidden_nets": [],
@ -62,7 +62,7 @@
35, 35,
36 36
], ],
"visible_layers": "000d3fc_ffffffff", "visible_layers": "000d37c_ffffffff",
"zone_display_mode": 0 "zone_display_mode": 0
}, },
"meta": { "meta": {

View File

@ -45,7 +45,7 @@
"silk_text_upright": false, "silk_text_upright": false,
"zones": { "zones": {
"45_degree_only": false, "45_degree_only": false,
"min_clearance": 0.3 "min_clearance": 0.0
} }
}, },
"diff_pair_dimensions": [ "diff_pair_dimensions": [

View File

@ -2365,7 +2365,6 @@
) )
) )
(junction (at 165.1 29.21) (diameter 0) (color 0 0 0 0) (junction (at 165.1 29.21) (diameter 0) (color 0 0 0 0)
(uuid 0052d37e-e6de-4b27-bd9a-838024e8b8c2) (uuid 0052d37e-e6de-4b27-bd9a-838024e8b8c2)
) )
@ -4621,7 +4620,7 @@
(property "Reference" "D1" (id 0) (at 20.32 137.16 90) (property "Reference" "D1" (id 0) (at 20.32 137.16 90)
(effects (font (size 1.27 1.27)) (justify right)) (effects (font (size 1.27 1.27)) (justify right))
) )
(property "Value" "GBLC05" (id 1) (at 17.78 140.97 90) (property "Value" "GBLC05" (id 1) (at 16.51 139.7 90)
(effects (font (size 1.27 1.27)) (justify right)) (effects (font (size 1.27 1.27)) (justify right))
) )
(property "Footprint" "ICs:D_SOD-323" (id 2) (at 25.4 138.43 0) (property "Footprint" "ICs:D_SOD-323" (id 2) (at 25.4 138.43 0)

View File

@ -1,6 +0,0 @@
{
"files.associations": {
"wm_include.h": "c",
"freertos.h": "c"
}
}

View File

@ -33,6 +33,8 @@ COMPONENTS_$(TARGET) = \
$(TOP_DIR)/app/libuser$(LIB_EXT) \ $(TOP_DIR)/app/libuser$(LIB_EXT) \
$(TOP_DIR)/app/app_drivers/libappdrivers$(LIB_EXT) \ $(TOP_DIR)/app/app_drivers/libappdrivers$(LIB_EXT) \
$(TOP_DIR)/app/persistency/libpersistency$(LIB_EXT) \ $(TOP_DIR)/app/persistency/libpersistency$(LIB_EXT) \
$(TOP_DIR)/app/translation/libtranslation$(LIB_EXT) \
$(TOP_DIR)/app/translation/libble$(LIB_EXT) \
$(TOP_DIR)/lvgl/liblvgl$(LIB_EXT) $(TOP_DIR)/lvgl/liblvgl$(LIB_EXT)
ifeq ($(USE_LIB), 0) ifeq ($(USE_LIB), 0)

View File

@ -1,5 +1,5 @@
#ifndef APPCONFIG_H #ifndef APP_CONFIG_H
#define APPCONFIG_H #define APP_CONFIG_H
#include "wm_gpio.h" #include "wm_gpio.h"
@ -8,6 +8,18 @@
* *
*/ */
/**
* @brief Defines for which platform to compile the firmware for :
*
* SMART_WATCH_BREADBOARD : the smart watch dev hardware which is on a breadboard
* SMART_WATCH_PCB : the smart watch using the PCB
*
*/
#define SMART_WATCH_BREADBOARD (0)
#define SMART_WATCH_PCB (1)
#define HARDWARE_PLATFORM SMART_WATCH_PCB
/** /**
* @brief Define which kind of logs to display : * @brief Define which kind of logs to display :
* *
@ -31,6 +43,7 @@
* @brief i2c * @brief i2c
* *
*/ */
#define I2C_CLOCK_SPEED (300000) // 300 kHz seems to be the maximum achievable clock speed before the touch IC behaves funky
#define I2C_SCL WM_IO_PA_01 #define I2C_SCL WM_IO_PA_01
#define I2C_SDA WM_IO_PB_19 #define I2C_SDA WM_IO_PB_19
@ -66,6 +79,13 @@
*/ */
#define BATTERY_VOLTAGE_DIVIDER_ENABLE WM_IO_PB_05 #define BATTERY_VOLTAGE_DIVIDER_ENABLE WM_IO_PB_05
/**
* @brief battery controller IC charged and charging status pins
*
*/
#define BATTERY_CONTROLLER_CHARGING_STATUS WM_IO_PB_03
#define BATTERY_CONTROLLER_CHARGED_STATUS WM_IO_PB_04
/** /**
* @brief battery voltage adc input pin : WM_IO_PA_04 = channel 1 * @brief battery voltage adc input pin : WM_IO_PA_04 = channel 1
* *
@ -79,4 +99,6 @@
#define VIBRATION_MOTOR_ENABLE WM_IO_PB_00 #define VIBRATION_MOTOR_ENABLE WM_IO_PB_00
#define VIBRATION_MOTOR_PWM_CHANNEL (0) #define VIBRATION_MOTOR_PWM_CHANNEL (0)
#endif //APPCONFIG_H #define BLE_DEVICE_NAME "MDBT42Q_W800SW"
#endif //APP_CONFIG_H

View File

@ -78,7 +78,11 @@ const uint8_t gc9a01_init_seq[] = {
0x02, 0, 0x8E, 0xFF, 0x02, 0, 0x8E, 0xFF,
0x02, 0, 0x8F, 0xFF, 0x02, 0, 0x8F, 0xFF,
0x03, 0, 0xB6, 0x00, 0x00, 0x03, 0, 0xB6, 0x00, 0x00,
#if HARDWARE_PLATFORM == SMART_WATCH_BREADBOARD
0x02, 0, 0x36, 0x88, 0x02, 0, 0x36, 0x88,
#elif HARDWARE_PLATFORM == SMART_WATCH_PCB
0x02, 0, 0x36, 0x48,
#endif
0x02, 0, 0x3A, 0x55, 0x02, 0, 0x3A, 0x55,
0x05, 0, 0x90, 0x08, 0x08, 0x08, 0x08, 0x05, 0, 0x90, 0x08, 0x08, 0x08, 0x08,
0x02, 0, 0xBD, 0x06, 0x02, 0, 0xBD, 0x06,
@ -378,7 +382,6 @@ void lcd_set_backlight(LCDConfig_t * const LCDConfig, uint8_t brightness)
tls_gpio_cfg(LCDConfig->LCDPWMBacklightPin, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_FLOATING); tls_gpio_cfg(LCDConfig->LCDPWMBacklightPin, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_FLOATING);
tls_gpio_write(LCDConfig->LCDPWMBacklightPin, 0); tls_gpio_write(LCDConfig->LCDPWMBacklightPin, 0);
} }
} }
void lcd_hardware_reset(LCDConfig_t * const LCDConfig) void lcd_hardware_reset(LCDConfig_t * const LCDConfig)
@ -416,7 +419,7 @@ void lcd_sleep(LCDConfig_t *const LCDConfig, bool state)
lcd_set_data_command(LCDConfig, LCD_DATA); lcd_set_data_command(LCDConfig, LCD_DATA);
} }
void lcd_orientation(LCDConfig_t *const LCDConfig, LCDOrientation_t orientation) void lcd_orientation(LCDConfig_t *const LCDConfig, LCDOrientation_e orientation)
{ {
if(!LCDConfig) return; if(!LCDConfig) return;
@ -434,6 +437,7 @@ void lcd_orientation(LCDConfig_t *const LCDConfig, LCDOrientation_t orientation)
switch(orientation) switch(orientation)
{ {
#if HARDWARE_PLATFORM == SMART_WATCH_BREADBOARD
case LCD_ORIENTATION_90: case LCD_ORIENTATION_90:
mmc_sdio_driver_write_one(0xE8); mmc_sdio_driver_write_one(0xE8);
break; break;
@ -445,6 +449,19 @@ void lcd_orientation(LCDConfig_t *const LCDConfig, LCDOrientation_t orientation)
break; break;
default: //Is default orientation eg : 0 default: //Is default orientation eg : 0
mmc_sdio_driver_write_one(0x88); mmc_sdio_driver_write_one(0x88);
#elif HARDWARE_PLATFORM == SMART_WATCH_PCB
case LCD_ORIENTATION_90:
mmc_sdio_driver_write_one(0x28);
break;
case LCD_ORIENTATION_180:
mmc_sdio_driver_write_one(0x88);
break;
case LCD_ORIENTATION_270:
mmc_sdio_driver_write_one(0xE8);
break;
default: //Is default orientation eg : 0
mmc_sdio_driver_write_one(0x48);
#endif
} }
lcd_set_cs(LCDConfig, LCD_RELEASED); lcd_set_cs(LCDConfig, LCD_RELEASED);
@ -505,5 +522,8 @@ static void lcd_set_cs(LCDConfig_t * const LCDConfig, LCDSelect_e selected)
static void lcd_set_data_command(LCDConfig_t * const LCDConfig, LCDDataCommand_e dataCommand) static void lcd_set_data_command(LCDConfig_t * const LCDConfig, LCDDataCommand_e dataCommand)
{ {
// We wait for the mmc sdio driver to be ready before changing the LCD access mode
mmc_sdio_driver_blocking_wait_bus_free();
tls_gpio_write(LCDConfig->LCDDataCommandPin, dataCommand); tls_gpio_write(LCDConfig->LCDDataCommandPin, dataCommand);
} }

View File

@ -46,7 +46,7 @@ typedef enum LCDOrientation
LCD_ORIENTATION_90, LCD_ORIENTATION_90,
LCD_ORIENTATION_180, LCD_ORIENTATION_180,
LCD_ORIENTATION_270, LCD_ORIENTATION_270,
} LCDOrientation_t; } LCDOrientation_e;
/** /**
* @brief * @brief
@ -62,7 +62,7 @@ typedef struct LCDConfig
enum tls_io_name LCDResetPin; enum tls_io_name LCDResetPin;
DrawFinishedCb_t drawFinishedCb; DrawFinishedCb_t drawFinishedCb;
void *cbArg; void *cbArg;
LCDOrientation_t LCDOrientation; LCDOrientation_e LCDOrientation;
} LCDConfig_t; } LCDConfig_t;
/** /**
@ -139,8 +139,12 @@ void lcd_sleep(LCDConfig_t * const LCDConfig, bool state);
* @brief Sets the LCD orientation. * @brief Sets the LCD orientation.
* *
* @param LCDConfig a pointer to a user allocated LCDConfig_t structure * @param LCDConfig a pointer to a user allocated LCDConfig_t structure
* @param orientation the value of the orientation to set * @param orientation the value of the orientation to set :
* - LCD_ORIENTATION_DEFAULT or LCD_ORIENTATION_0
* - LCD_ORIENTATION_90
* - LCD_ORIENTATION_180
* - LCD_ORIENTATION_270
*/ */
void lcd_orientation(LCDConfig_t * const LCDConfig, LCDOrientation_t orientation); void lcd_orientation(LCDConfig_t * const LCDConfig, LCDOrientation_e orientation);
#endif //LCD_H #endif //LCD_H

View File

@ -99,7 +99,7 @@ void mmc_sdio_driver_write_dma_async(uint32_t *data, uint32_t dataLengthInBytes)
void mmc_sdio_driver_write_one(uint8_t data) void mmc_sdio_driver_write_one(uint8_t data)
{ {
/* Wait for MMC device to be ready to send the data */ /* Wait for MMC device to be ready to send the data */
while (SDIO_HOST->MMC_IO & 0x01); mmc_sdio_driver_blocking_wait_bus_free();
SDIO_HOST->BUF_CTL = 0x4820; SDIO_HOST->BUF_CTL = 0x4820;
SDIO_HOST->DATA_BUF[0] = (uint32_t)data; SDIO_HOST->DATA_BUF[0] = (uint32_t)data;
@ -107,19 +107,25 @@ void mmc_sdio_driver_write_one(uint8_t data)
/* Start the transfer */ /* Start the transfer */
SDIO_HOST->MMC_IO = 0x01; SDIO_HOST->MMC_IO = 0x01;
/* Wait for MMC device to be done sending the data */ /* Wait for MMC device to be done sending the data */
while (SDIO_HOST->MMC_IO & 0x01); mmc_sdio_driver_blocking_wait_bus_free();
} }
void mmc_sdio_driver_write(const uint8_t *data, uint16_t dataLengthInBytes) void mmc_sdio_driver_write(const uint8_t *data, uint16_t dataLengthInBytes)
{ {
/* Wait for MMC device to be ready to send the data */ /* Wait for MMC device to be ready to send the data */
while (SDIO_HOST->MMC_IO & 0x01); mmc_sdio_driver_blocking_wait_bus_free();
SDIO_HOST->BUF_CTL = 0x4820; SDIO_HOST->BUF_CTL = 0x4820;
memcpy((void *)SDIO_HOST->DATA_BUF, (void *)data, dataLengthInBytes); memcpy((void *)SDIO_HOST->DATA_BUF, (void *)data, dataLengthInBytes);
SDIO_HOST->MMC_BYTECNTL = dataLengthInBytes; SDIO_HOST->MMC_BYTECNTL = dataLengthInBytes;
/* Start the transfer */ /* Start the transfer */
SDIO_HOST->MMC_IO = 0x01; SDIO_HOST->MMC_IO = 0x01;
/* Wait for MMC device to be done sending the data */ /* Wait for MMC device to be done sending the data */
mmc_sdio_driver_blocking_wait_bus_free();
}
void mmc_sdio_driver_blocking_wait_bus_free(void)
{
while (SDIO_HOST->MMC_IO & 0x01); while (SDIO_HOST->MMC_IO & 0x01);
} }

View File

@ -23,7 +23,7 @@ void mmc_sdio_driver_periph_init(DMATransferDoneCb_t DMATransferDoneCb, void *ar
* @param dataLengthInBytes the size in bytes of the data to transfer. * @param dataLengthInBytes the size in bytes of the data to transfer.
* Maximum length is 65535 bytes. * Maximum length is 65535 bytes.
*/ */
void mmc_sdio_driver_write_dma_async(uint32_t *data, u32 dataLengthInBytes); void mmc_sdio_driver_write_dma_async(uint32_t *data, uint32_t dataLengthInBytes);
/** /**
* @brief Sends one byte of data to the slave * @brief Sends one byte of data to the slave
@ -43,4 +43,10 @@ void mmc_sdio_driver_write_one(uint8_t data);
*/ */
void mmc_sdio_driver_write(const uint8_t *data, uint16_t dataLengthInBytes); void mmc_sdio_driver_write(const uint8_t *data, uint16_t dataLengthInBytes);
/**
* @brief Performs a busy wait until the data bus is free for us to use.
*
*/
void mmc_sdio_driver_blocking_wait_bus_free(void);
#endif //MMC_SDIO_H #endif //MMC_SDIO_H

View File

@ -6,19 +6,107 @@
#include "wm_timer.h" #include "wm_timer.h"
#include "wm_pwm.h" #include "wm_pwm.h"
#define INTERRUPT_POLICY (0)
#define POLL_POLICY (1)
#define BATTERY_CONTROLLER_STATUS_DETECTION_POLICY INTERRUPT_POLICY
/* Battery voltage and ADC */
static int8_t _adc_offset = 0; static int8_t _adc_offset = 0;
/* Vibration motor timer */
static uint8_t _vibration_motor_timer_id = WM_TIMER_ID_INVALID; static uint8_t _vibration_motor_timer_id = WM_TIMER_ID_INVALID;
/* Battery charge controller status */
static battery_controller_status_e _battery_fsm = BATTERY_CONTROLLER_STATUS_DISCHARGING;
static BatteryControllerStatusChangeCb_t _BatteryControllerStatusChangeCb = NULL;
static void vibration_motor_timer_irq_cb(void *p) static void vibration_motor_timer_irq_cb(void *p)
{ {
(void)p; (void)p;
tls_pwm_stop(VIBRATION_MOTOR_PWM_CHANNEL); tls_pwm_stop(VIBRATION_MOTOR_PWM_CHANNEL);
tls_gpio_cfg(VIBRATION_MOTOR_ENABLE, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_FLOATING); tls_gpio_cfg(VIBRATION_MOTOR_ENABLE, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_FLOATING);
tls_gpio_write(VIBRATION_MOTOR_ENABLE, 0); tls_gpio_write(VIBRATION_MOTOR_ENABLE, 0);
APP_LOG_DEBUG("Vibration stopped");
} }
#if BATTERY_CONTROLLER_STATUS_DETECTION_POLICY == POLL_POLICY
static uint8_t _battery_status_timer_id = WM_TIMER_ID_INVALID;
static void battery_status_timer_irq_cb(void *p)
{
bool charging = tls_gpio_read(BATTERY_CONTROLLER_CHARGING_STATUS) == 0;
bool charged = tls_gpio_read(BATTERY_CONTROLLER_CHARGED_STATUS) == 0;
battery_controller_status_e old_battery_status = _battery_fsm;
if(charging && !charged)
_battery_fsm = BATTERY_CONTROLLER_STATUS_CHARGING;
else if(!charging && charged)
_battery_fsm = BATTERY_CONTROLLER_STATUS_CHARGED;
else if (!charging && !charged)
_battery_fsm = BATTERY_CONTROLLER_STATUS_DISCHARGING;
else
_battery_fsm = BATTERY_CONTROLLER_STATUS_ERROR;
if(old_battery_status != _battery_fsm)
{
// Let's call a user registered callback here
APP_LOG_INFO("Battery status changed from %s to %s",
battery_controller_status_2_str(old_battery_status),
battery_controller_status_2_str(_battery_fsm));
if(_BatteryControllerStatusChangeCb) _BatteryControllerStatusChangeCb(old_battery_status, _battery_fsm);
}
}
#elif BATTERY_CONTROLLER_STATUS_DETECTION_POLICY == INTERRUPT_POLICY
static void battery_controller_irq_cb(void *p)
{
enum tls_io_name gpio_pin = (enum tls_io_name)p;
if(BATTERY_CONTROLLER_CHARGING_STATUS == gpio_pin)
{
tls_clr_gpio_irq_status(BATTERY_CONTROLLER_CHARGING_STATUS);
}
if(BATTERY_CONTROLLER_CHARGED_STATUS == gpio_pin)
{
tls_clr_gpio_irq_status(BATTERY_CONTROLLER_CHARGED_STATUS);
}
bool charging = tls_gpio_read(BATTERY_CONTROLLER_CHARGING_STATUS) == 0;
bool charged = tls_gpio_read(BATTERY_CONTROLLER_CHARGED_STATUS) == 0;
battery_controller_status_e old_battery_status = _battery_fsm;
switch(old_battery_status)
{
case BATTERY_CONTROLLER_STATUS_CHARGING:
if(charged) _battery_fsm = BATTERY_CONTROLLER_STATUS_CHARGED;
else if(!charged && !charging) _battery_fsm = BATTERY_CONTROLLER_STATUS_DISCHARGING;
break;
case BATTERY_CONTROLLER_STATUS_CHARGED:
if(!charged && !charging) _battery_fsm = BATTERY_CONTROLLER_STATUS_DISCHARGING;
break;
case BATTERY_CONTROLLER_STATUS_DISCHARGING:
if(charging) _battery_fsm = BATTERY_CONTROLLER_STATUS_CHARGING;
break;
default:
_battery_fsm = BATTERY_CONTROLLER_STATUS_DISCHARGING;
break;
}
if(old_battery_status != _battery_fsm)
{
// Let's call a user registered callback here
APP_LOG_INFO("Battery status changed from %s to : %s, IRQ : %u",
battery_controller_status_2_str(old_battery_status),
battery_controller_status_2_str(_battery_fsm),
gpio_pin);
if(_BatteryControllerStatusChangeCb) _BatteryControllerStatusChangeCb(old_battery_status, _battery_fsm);
}
}
#endif
static void watch_peripherals_io_init(void) static void watch_peripherals_io_init(void)
{ {
/* We initialize the ADC input as well as the gpio used to enabled the voltage divider bridge */ /* We initialize the ADC input as well as the gpio used to enabled the voltage divider bridge */
@ -29,6 +117,36 @@ static void watch_peripherals_io_init(void)
/* We initialize the output pin for the vibration motor enable pin */ /* We initialize the output pin for the vibration motor enable pin */
tls_gpio_cfg(VIBRATION_MOTOR_ENABLE, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_FLOATING); tls_gpio_cfg(VIBRATION_MOTOR_ENABLE, WM_GPIO_DIR_OUTPUT, WM_GPIO_ATTR_FLOATING);
tls_gpio_write(VIBRATION_MOTOR_ENABLE, 0); tls_gpio_write(VIBRATION_MOTOR_ENABLE, 0);
/* We initialize the pins used to read the battery controller IC charging and charged statuses */
tls_gpio_cfg(BATTERY_CONTROLLER_CHARGED_STATUS, WM_GPIO_DIR_INPUT, WM_GPIO_ATTR_FLOATING);
tls_gpio_cfg(BATTERY_CONTROLLER_CHARGING_STATUS, WM_GPIO_DIR_INPUT, WM_GPIO_ATTR_FLOATING);
#if BATTERY_CONTROLLER_STATUS_DETECTION_POLICY == INTERRUPT_POLICY
tls_gpio_isr_register(BATTERY_CONTROLLER_CHARGED_STATUS, &(battery_controller_irq_cb), (int*) BATTERY_CONTROLLER_CHARGED_STATUS);
tls_gpio_irq_enable(BATTERY_CONTROLLER_CHARGED_STATUS, WM_GPIO_IRQ_TRIG_DOUBLE_EDGE); // Enabled when level is changing edge
tls_gpio_isr_register(BATTERY_CONTROLLER_CHARGING_STATUS, &(battery_controller_irq_cb), (int*) BATTERY_CONTROLLER_CHARGING_STATUS);
tls_gpio_irq_enable(BATTERY_CONTROLLER_CHARGING_STATUS, WM_GPIO_IRQ_TRIG_DOUBLE_EDGE); // Enabled when level is changing edge
#endif
}
#ifndef CASE_RETURN_STR
#define CASE_RETURN_STR(const) case const: return #const;
#endif
const char *battery_controller_status_2_str(battery_controller_status_e status)
{
switch(status)
{
CASE_RETURN_STR(BATTERY_CONTROLLER_STATUS_CHARGING)
CASE_RETURN_STR(BATTERY_CONTROLLER_STATUS_DISCHARGING)
CASE_RETURN_STR(BATTERY_CONTROLLER_STATUS_CHARGED)
CASE_RETURN_STR(BATTERY_CONTROLLER_STATUS_ERROR)
default:
return "Unknown Battery Status";
}
} }
void watch_peripherals_init(int8_t adcOffset) void watch_peripherals_init(int8_t adcOffset)
@ -39,7 +157,7 @@ void watch_peripherals_init(int8_t adcOffset)
/* Prevent multiple init call !*/ /* Prevent multiple init call !*/
if(WM_TIMER_ID_INVALID == _vibration_motor_timer_id) if(WM_TIMER_ID_INVALID == _vibration_motor_timer_id)
{ {
/* Let's initialize the timer w'll use to stop the vibration motor */ /* Let's initialize the timer we'll use to stop the vibration motor */
struct tls_timer_cfg vibration_motor_timer_cfg = struct tls_timer_cfg vibration_motor_timer_cfg =
{ {
.arg = NULL, .arg = NULL,
@ -51,11 +169,35 @@ void watch_peripherals_init(int8_t adcOffset)
_vibration_motor_timer_id = tls_timer_create(&vibration_motor_timer_cfg); _vibration_motor_timer_id = tls_timer_create(&vibration_motor_timer_cfg);
if(WM_TIMER_ID_INVALID == _vibration_motor_timer_id) if(WM_TIMER_ID_INVALID == _vibration_motor_timer_id)
APP_LOG_ERROR("Failed to create timer"); APP_LOG_ERROR("Failed to create vibration motor timer");
} }
#if BATTERY_CONTROLLER_STATUS_DETECTION_POLICY == POLL_POLICY
if(WM_TIMER_ID_INVALID == _battery_status_timer_id)
{
struct tls_timer_cfg battery_status_timer_cfg =
{
.arg = NULL,
.callback = &(battery_status_timer_irq_cb),
.unit = TLS_TIMER_UNIT_MS,
.is_repeat = true,
.timeout = 200
};
_battery_status_timer_id = tls_timer_create(&battery_status_timer_cfg);
if(WM_TIMER_ID_INVALID == _battery_status_timer_id)
APP_LOG_ERROR("Failed to create battery status timer");
else
tls_timer_start(_battery_status_timer_id);
}
#endif
} }
uint16_t watch_peripherals_get_battery_voltage(Battery_Unit_e unit) void watch_peripherals_register_battery_controller_status_change_cb(BatteryControllerStatusChangeCb_t BatteryControllerStatusChangeCb)
{
_BatteryControllerStatusChangeCb = BatteryControllerStatusChangeCb;
}
uint16_t watch_peripherals_get_battery_voltage(battery_unit_e unit)
{ {
tls_gpio_write(BATTERY_VOLTAGE_DIVIDER_ENABLE, 1); tls_gpio_write(BATTERY_VOLTAGE_DIVIDER_ENABLE, 1);
int batteryVoltage = adc_get_inputVolt(BATTERY_VOLTAGE_ADC_CHANNEL, 1, 1) * 2 + _adc_offset; int batteryVoltage = adc_get_inputVolt(BATTERY_VOLTAGE_ADC_CHANNEL, 1, 1) * 2 + _adc_offset;
@ -63,10 +205,10 @@ uint16_t watch_peripherals_get_battery_voltage(Battery_Unit_e unit)
switch (unit) switch (unit)
{ {
case Battery_Unit_mV: case battery_unit_mv:
return batteryVoltage < 0 ? 0 : batteryVoltage; return batteryVoltage < 0 ? 0 : batteryVoltage;
break; break;
case Battery_Unit_percent: case battery_unit_percent:
return battery_voltage_to_percentage(batteryVoltage < 0 ? 0 : batteryVoltage); return battery_voltage_to_percentage(batteryVoltage < 0 ? 0 : batteryVoltage);
break; break;
default: default:
@ -94,9 +236,15 @@ uint8_t battery_voltage_to_percentage(uint16_t voltage_in_mV)
return (i+1) * 5; return (i+1) * 5;
} }
battery_controller_status_e watch_peripherals_get_battery_controller_status(void)
{
return _battery_fsm;
}
void watch_peripherals_vibrate(uint8_t strength, uint32_t durationMs) void watch_peripherals_vibrate(uint8_t strength, uint32_t durationMs)
{ {
APP_LOG_DEBUG("Vibration started"); /* No need to do anything if the duration is 0 or if the strength is 0 */
if(!strength || !durationMs) return;
/* We start the timer which will stop the vibration after durationMs time */ /* We start the timer which will stop the vibration after durationMs time */
tls_timer_change(_vibration_motor_timer_id, durationMs); tls_timer_change(_vibration_motor_timer_id, durationMs);
wm_pwm0_config(VIBRATION_MOTOR_ENABLE); wm_pwm0_config(VIBRATION_MOTOR_ENABLE);
@ -104,3 +252,15 @@ void watch_peripherals_vibrate(uint8_t strength, uint32_t durationMs)
tls_pwm_duty_set(VIBRATION_MOTOR_PWM_CHANNEL, strength); tls_pwm_duty_set(VIBRATION_MOTOR_PWM_CHANNEL, strength);
tls_timer_start(_vibration_motor_timer_id); tls_timer_start(_vibration_motor_timer_id);
} }
void watch_peripherals_set_brightness(uint8_t brightness)
{
extern LCDConfig_t LCDConfig;
lcd_set_backlight(&LCDConfig, brightness);
}
void watch_peripherals_set_orientation(LCDOrientation_e orientation)
{
extern LCDConfig_t LCDConfig;
lcd_orientation(&LCDConfig, orientation);
}

View File

@ -4,13 +4,32 @@
*/ */
#ifndef WATCH_PERIPHERALS_H #ifndef WATCH_PERIPHERALS_H
#define WATCH_PERIPHERALS_H #define WATCH_PERIPHERALS_H
#include "lcd.h"
#include "wm_type_def.h" #include "wm_type_def.h"
typedef enum Battery_Unit typedef enum battery_unit
{ {
Battery_Unit_mV = 0, battery_unit_mv = 0,
Battery_Unit_percent battery_unit_percent
} Battery_Unit_e; } battery_unit_e;
typedef enum battery_controller_status
{
BATTERY_CONTROLLER_STATUS_DISCHARGING = 0,
BATTERY_CONTROLLER_STATUS_CHARGING,
BATTERY_CONTROLLER_STATUS_CHARGED,
BATTERY_CONTROLLER_STATUS_ERROR
} battery_controller_status_e;
typedef void (*BatteryControllerStatusChangeCb_t)(battery_controller_status_e old, battery_controller_status_e new);
/**
* @brief Helper function to easily print the battery status enumeration name
*
* @param status the enumeration value for which to get the name
* @return const char* a string representing the enumeration value
*/
const char *battery_controller_status_2_str(battery_controller_status_e status);
/** /**
* @brief Inits the watch peripherals driver. * @brief Inits the watch peripherals driver.
@ -20,6 +39,14 @@ typedef enum Battery_Unit
*/ */
void watch_peripherals_init(int8_t adcOffset); void watch_peripherals_init(int8_t adcOffset);
/**
* @brief Registers the user provided callback function to notify the battery controller status change event
* @note This function should be as short as possible, do not call LVGL functions in it.
*
* @param BatteryStatusChangeCb a pointer to the function having the right definition.
*/
void watch_peripherals_register_battery_controller_status_change_cb(BatteryControllerStatusChangeCb_t BatteryStatusChangeCb);
/** /**
* @brief Reads and returns the current battery voltage in mV or it's corresponding capacity in percentage. * @brief Reads and returns the current battery voltage in mV or it's corresponding capacity in percentage.
* This function takes into account the adcOffset parameter provided in the @ref watch_peripherals_init * This function takes into account the adcOffset parameter provided in the @ref watch_peripherals_init
@ -29,7 +56,7 @@ void watch_peripherals_init(int8_t adcOffset);
* @param unit the unit of the data to be returned : mV or corresponding capacity in percentage * @param unit the unit of the data to be returned : mV or corresponding capacity in percentage
* @return uint16_t the voltage in mV or the battery left capacity in % * @return uint16_t the voltage in mV or the battery left capacity in %
*/ */
uint16_t watch_peripherals_get_battery_voltage(Battery_Unit_e unit); uint16_t watch_peripherals_get_battery_voltage(battery_unit_e unit);
/** /**
* @brief Converts the given battery voltage to the corresponding battery capacity for a single cell LiPo only (4.2V to 3.2V) * @brief Converts the given battery voltage to the corresponding battery capacity for a single cell LiPo only (4.2V to 3.2V)
@ -39,6 +66,14 @@ uint16_t watch_peripherals_get_battery_voltage(Battery_Unit_e unit);
*/ */
uint8_t battery_voltage_to_percentage(uint16_t voltage_in_mV); uint8_t battery_voltage_to_percentage(uint16_t voltage_in_mV);
/**
* @brief Returns the current battery controller IC status.
* It can be one of the following :
*
* @return battery_controller_status_e BATTERY_CHARGING, BATTERY_CHARGED, BATTERY_DISCHARGING and BATTERY_ERROR.
*/
battery_controller_status_e watch_peripherals_get_battery_controller_status(void);
/** /**
* @brief Triggers the vibration motor to vibrate at the provided strength for the set duration in ms. * @brief Triggers the vibration motor to vibrate at the provided strength for the set duration in ms.
* *
@ -47,4 +82,22 @@ uint8_t battery_voltage_to_percentage(uint16_t voltage_in_mV);
*/ */
void watch_peripherals_vibrate(uint8_t strength, uint32_t durationMs); void watch_peripherals_vibrate(uint8_t strength, uint32_t durationMs);
/**
* @brief Sets the brightness of the LCD display
*
* @param brightness from 0 (backlight off) to 255 backlight fully on
*/
void watch_peripherals_set_brightness(uint8_t brightness);
/**
* @brief Sets the orientation of the LCD display
*
* @param orientation the value of the orientation to set :
* - LCD_ORIENTATION_DEFAULT or LCD_ORIENTATION_0
* - LCD_ORIENTATION_90
* - LCD_ORIENTATION_180
* - LCD_ORIENTATION_270
*/
void watch_peripherals_set_orientation(LCDOrientation_e orientation);
#endif //WATCH_PERIPHERALS_H #endif //WATCH_PERIPHERALS_H

View File

@ -1,5 +1,5 @@
#ifndef APPLOG_H #ifndef APP_LOG_H
#define APPLOG_G #define APP_LOG_G
#include "app_common.h" #include "app_common.h"
#include "app_config.h" #include "app_config.h"
@ -34,4 +34,4 @@
#define APP_LOG_DEBUG(message, ...) do{}while(0) #define APP_LOG_DEBUG(message, ...) do{}while(0)
#endif #endif
#endif //APPLOG_H #endif //APP_LOG_H

View File

@ -0,0 +1,15 @@
TOP_DIR = ../..
sinclude $(TOP_DIR)/tools/w800/conf.mk
ifndef PDIR
GEN_LIBS = libble$(LIB_EXT)
endif
#DEFINES +=
sinclude $(TOP_DIR)/tools/w800/rules.mk
INCLUDES := $(INCLUDES) -I $(PDIR)include
PDIR := ../$(PDIR)
sinclude $(PDIR)Makefile

View File

@ -0,0 +1,91 @@
#include "ble_modem.h"
#include "app_common.h"
#include "host/ble_hs.h"
#include "FreeRTOS.h"
#include "wm_bt_def.h"
#include "wm_bt_app.h"
#include "wm_bt_util.h"
#include "ble_service.h"
//Is needed for the BT off workaround
#include "wm_wifi.h"
bool ble_modem_on(bool startService)
{
int status = BLE_HS_ENOERR;
bool serviceStartSuccess = true;
uint8_t uart_no = 0xFF;
tls_appl_trace_level = TLS_BT_LOG_VERBOSE; //Should be set with a config define
if(bt_adapter_state == WM_BT_STATE_ON) {
TLS_BT_APPL_TRACE_VERBOSE("ble modem already on"NEW_LINE);
return true;
}
TLS_BT_APPL_TRACE_DEBUG("ble modem running, uart_no=%d, log_level=%d"NEW_LINE, uart_no,
tls_appl_trace_level);
status = tls_bt_init(uart_no);
if((status != BLE_HS_ENOERR) && (status != BLE_HS_EALREADY)) {
TLS_BT_APPL_TRACE_ERROR("%s, tls_bt_init ret:%s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
}
// Start the ble service if it was asked and if it is not yet started
if(startService && !ble_service_is_started())
serviceStartSuccess = ble_service_start();
return ((status == BLE_HS_ENOERR || status == BLE_HS_EALREADY) && serviceStartSuccess) ? true : false;
}
bool ble_modem_off(void)
{
int status = BLE_HS_ENOERR;
bool serviceStopSuccess = true;
TLS_BT_APPL_TRACE_DEBUG("ble modem off"NEW_LINE);
if(bt_adapter_state == WM_BT_STATE_OFF)
{
TLS_BT_APPL_TRACE_VERBOSE("ble modem already off"NEW_LINE);
return TLS_BT_STATUS_SUCCESS;
}
if(ble_service_is_started())
{
serviceStopSuccess = ble_service_stop();
}
// Let's make a busy wait on the status of the ble service:
uint8_t timeout = 0;
while(ble_service_is_started())
{
tls_os_time_delay(pdMS_TO_TICKS(5));
// Service is stuck ? waiting up to 300 ms for it to stop
if(++timeout > 60)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_service_stop timeout "NEW_LINE, __FUNCTION__);
return serviceStopSuccess;
}
};
status = tls_bt_deinit();
if((status != BLE_HS_ENOERR) && (status != BLE_HS_EALREADY)) {
TLS_BT_APPL_TRACE_ERROR("%s, tls_bt_deinit ret:%s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
}
if(status != BLE_HS_EALREADY)
{
//Starting a wifi scan really stops the BT modem ?? Why ? I don't know
tls_wifi_scan();
}
return ((status == BLE_HS_ENOERR || status == BLE_HS_EALREADY) && serviceStopSuccess) ? true : false;
}
bool is_ble_modem_on(void)
{
if(bt_adapter_state == WM_BT_STATE_OFF || bt_system_action != WM_BT_SYSTEM_ACTION_IDLE)
return false;
return true;
}

View File

@ -0,0 +1,32 @@
#ifndef BLE_MODEM_H
#define BLE_MODEM_H
#include "wm_type_def.h"
/**
* @brief Turns the BLE modem on
*
* @param startService to start the ble service when turning the modem on
* @return true on success
* @return false on failure
*/
bool ble_modem_on(bool startService);
/**
* @brief Turns the BLE modem off
* @note If the ble service was started, then it will automatically be turned off with the modem
*
* @return true on success
* @return false on failure
*/
bool ble_modem_off(void);
/**
* @brief Find out if the modem is turned on or not
*
* @return true if turned on
* @return false if turned off
*/
bool is_ble_modem_on(void);
#endif //BLE_MODEM_H

View File

@ -0,0 +1,788 @@
#include "ble_service.h"
#include "app_common.h"
#include "ble_modem.h"
#include "host/ble_hs.h"
#include "services/gap/ble_svc_gap.h"
#include "wm_bt_util.h"
#include "bluetooth_sig_values.h"
#define USABLE_DEFAULT_MTU (20) //23 - 3 of header bytes
/* ble service internal workings attributes */
static volatile ble_service_state_e _ble_service_state = BLE_SERVICE_MODE_STOPPED;
static nus_data_rx_fn_t _ble_service_nus_data_rx_cb = NULL;
static ble_service_state_change_fn_t _ble_service_state_change_cb = NULL;
/* Connection handle to the connected device : only one simultaneous connection */
static uint16_t ble_device_conn_handle = BLE_HS_CONN_HANDLE_NONE;
static uint16_t usable_mtu = USABLE_DEFAULT_MTU;
/**
* @brief Structure used to store the various data to carry out a chunked notification or indication data transfer
*
*/
typedef struct
{
uint16_t length; // The length of the data being sent
uint16_t offset; // The offset used to be ableto send the next chunk of data in the array
uint16_t sent_chunk_size; // The size of the chunk sent
const uint8_t *data; // The address of the data to send
bool transfer_in_progress; // Is a transfer already in progress ?
} data_being_sent_t;
// Only one transfer of a type () can occur at any given time
static data_being_sent_t notification_data = {.data = NULL, .length = 0, .offset = 0, .transfer_in_progress = false};
static data_being_sent_t indication_data = {.data = NULL, .length = 0, .offset = 0, .transfer_in_progress = false};
static struct ble_gap_event_listener ble_gap_event_listener;
static int battery_level_char_access_cb(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg);
static uint16_t battery_level_char_handle = 0;
static uint8_t battery_level_value = 42;
static int gatt_nus_char_access_cb(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg);
static const ble_uuid128_t gatt_nus_service_uuid = BLE_UUID128_INIT(0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x01, 0x00, 0x40, 0x6E);
static uint16_t gatt_nus_char_rx_handle = 0;
static const ble_uuid128_t gatt_nus_char_rx_uuid = BLE_UUID128_INIT(0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x02, 0x00, 0x40, 0x6E);
static uint16_t gatt_nus_char_tx_handle = 0;
static const ble_uuid128_t gatt_nus_char_tx_uuid = BLE_UUID128_INIT(0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x03, 0x00, 0x40, 0x6E);
static struct ble_gatt_svc_def gatt_svc[] =
{
{
.type = BLE_GATT_SVC_TYPE_PRIMARY,
.uuid = BLE_UUID16_DECLARE(BLE_DEVICE_ADV_SERVICE),
.characteristics = (struct ble_gatt_chr_def[])
{
{
.uuid = BLE_UUID16_DECLARE(0x2A19),
.val_handle = &battery_level_char_handle,
.access_cb = &(battery_level_char_access_cb),
.flags = BLE_GATT_CHR_F_READ | BLE_GATT_CHR_F_NOTIFY
},
{
.uuid = NULL
}
}
},
{
.type = BLE_GATT_SVC_TYPE_PRIMARY,
.uuid = &gatt_nus_service_uuid.u,
.characteristics = (struct ble_gatt_chr_def[])
{
{
.uuid = &gatt_nus_char_rx_uuid.u,
.val_handle = &gatt_nus_char_rx_handle,
.access_cb = &(gatt_nus_char_access_cb),
.flags = BLE_GATT_CHR_F_WRITE | BLE_GATT_CHR_F_WRITE_NO_RSP
}
,
{
.uuid = &gatt_nus_char_tx_uuid.u,
.val_handle = &gatt_nus_char_tx_handle,
.access_cb = &(gatt_nus_char_access_cb),
.flags = BLE_GATT_CHR_F_NOTIFY
}
,
{
.uuid = NULL
}
}
},
{
.type = BLE_GATT_SVC_TYPE_END
}
};
static bool ble_service_define_gatt(const struct ble_gatt_svc_def *gatt_svc);
static bool ble_service_advertise(bool enable);
static int ble_gap_event_cb(struct ble_gap_event *event, void *arg);
static int ble_advertise_gap_event_cb(struct ble_gap_event *event, void *arg);
static void print_conn_desc(const struct ble_gap_conn_desc *desc);
// Raw because it doesn't handle payload fragmentation if mtu size is smaller than the payload size
static bool ble_service_send_raw_custom_notification(uint16_t characteristic_handle, const uint8_t *data, uint16_t length);
static bool ble_service_send_custom_notification(uint16_t characteristic_handle, data_being_sent_t * const data);
static void reset_data_being_sent(data_being_sent_t * const data);
// Needed to get the reponse after a mtu exchange request
static int ble_gatt_mtu_cb(uint16_t conn_handle, const struct ble_gatt_error *error, uint16_t mtu, void *arg);
const char *ble_service_state_2_str(ble_service_state_e state)
{
switch(state) {
CASE_RETURN_STR(BLE_SERVICE_MODE_STOPPED)
CASE_RETURN_STR(BLE_SERVICE_MODE_IDLE)
CASE_RETURN_STR(BLE_SERVICE_MODE_ADVERTISING)
CASE_RETURN_STR(BLE_SERVICE_MODE_CONNECTED)
CASE_RETURN_STR(BLE_SERVICE_MODE_INDICATING)
CASE_RETURN_STR(BLE_SERVICE_MODE_EXITING)
default:
return "unkown ble service state";
}
}
/**
* PUBLIC FUNCTION DEFINITION
*/
bool ble_service_start(void)
{
int status = BLE_HS_ENOERR;
// 1 We first check if the BLE service is stopped
if(_ble_service_state != BLE_SERVICE_MODE_STOPPED)
{
TLS_BT_APPL_TRACE_WARNING("%s, ble service already running (%s)"NEW_LINE, __FUNCTION__, ble_service_state_2_str(_ble_service_state));
return true;
}
// 2 We check if the BLE MODEM is turned on
if(!is_ble_modem_on())
{
TLS_BT_APPL_TRACE_ERROR("%s, ble modem is not turned on"NEW_LINE, __FUNCTION__);
return false;
}
// 3 We set our device name and appearance
if((status = ble_svc_gap_device_name_set(BLE_DEVICE_NAME)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_WARNING("%s, ble_svc_gap_device_name_set "NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
}
if((status = ble_svc_gap_device_appearance_set(BLE_DEVICE_APPEARANCE)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_WARNING("%s, ble_svc_gap_device_appearance_set "NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
}
// 4 We register our gatt (service structure)
if(!ble_service_define_gatt(gatt_svc))
{
TLS_BT_APPL_TRACE_ERROR("%s, failed to define gatt"NEW_LINE, __FUNCTION__);
return false;
}
// 5 We register a gap event handler callback
if((status = ble_gap_event_listener_register(&ble_gap_event_listener, &(ble_gap_event_cb), NULL)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_gap_event_listener_register %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
return false;
}
// 6 We are now ready to make all registered services available to peers
if((status = ble_gatts_start()) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_gatts_start failed : %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
return false;
}
// 7 Finally we can start advertising
if(!ble_service_advertise(true))
{
return false;
}
_ble_service_state = BLE_SERVICE_MODE_ADVERTISING;
return true;
}
bool ble_service_stop(void)
{
int status = BLE_HS_ENOERR;
// 1 We first check if the BLE service is not stopped
if(_ble_service_state == BLE_SERVICE_MODE_STOPPED)
{
TLS_BT_APPL_TRACE_WARNING("%s, ble service already stopped"NEW_LINE, __FUNCTION__);
return true;
}
// 2 We check if the BLE MODEM is turned on
if(!is_ble_modem_on())
{
TLS_BT_APPL_TRACE_ERROR("%s, ble modem is not turned on"NEW_LINE, __FUNCTION__);
return false;
}
switch(_ble_service_state)
{
case BLE_SERVICE_MODE_CONNECTED:
case BLE_SERVICE_MODE_INDICATING:
status = ble_gap_terminate(ble_device_conn_handle, BLE_ERR_REM_USER_CONN_TERM);
if(status == BLE_HS_ENOERR)
{
_ble_service_state = BLE_SERVICE_MODE_EXITING;
}
else //BLE_HS_EDISABLED || BLE_HS_ENOTCONN or any other error
{
TLS_BT_APPL_TRACE_WARNING("%s, ble_gap_terminate %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
_ble_service_state = BLE_SERVICE_MODE_STOPPED;
//Unregister gap event listener
if((status = ble_gap_event_listener_unregister(&ble_gap_event_listener)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_WARNING("%s, ble_gap_event_listener_unregister %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
}
}
break;
case BLE_SERVICE_MODE_ADVERTISING:
if(!ble_service_advertise(false))
{
TLS_BT_APPL_TRACE_WARNING("%s, ble_service_advertise failed to stop"NEW_LINE, __FUNCTION__);
}
else
{
_ble_service_state = BLE_SERVICE_MODE_STOPPED;
//Unregister gap event listener
if((status = ble_gap_event_listener_unregister(&ble_gap_event_listener)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_WARNING("%s, ble_gap_event_listener_unregister %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
}
}
break;
default: //Just to keep compiler happy since BLE_SERVICE_MODE_STOPPED is rulled out earlier
break;
}
if(_ble_service_state == BLE_SERVICE_MODE_STOPPED)
{
// We finally clean the gatt registered services
if((status = ble_gatts_reset()) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_gatts_reset %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
return false;
}
}
return true;
}
bool ble_service_is_started(void)
{
return _ble_service_state != BLE_SERVICE_MODE_STOPPED;
}
bool ble_service_is_device_connected(void)
{
return _ble_service_state == BLE_SERVICE_MODE_CONNECTED;
}
void ble_service_register_state_change_cb(ble_service_state_change_fn_t ble_service_state_change_cb)
{
_ble_service_state_change_cb = ble_service_state_change_cb;
}
ble_service_state_e ble_service_get_state(void)
{
return _ble_service_state;
}
bool ble_service_update_connection_parameters(
uint16_t itvl_min,
uint16_t itvl_max,
uint16_t latency,
uint16_t supervision_timeout,
uint16_t min_ce_len,
uint16_t max_ce_len)
{
if(BLE_HS_CONN_HANDLE_NONE == ble_device_conn_handle)
{
TLS_BT_APPL_TRACE_ERROR("%s, no active connection" NEW_LINE, __FUNCTION__);
return false;
}
int status = BLE_HS_ENOERR;
struct ble_gap_upd_params gap_params_to_apply = {0};
gap_params_to_apply.itvl_min = itvl_min;
gap_params_to_apply.itvl_max = itvl_max;
gap_params_to_apply.latency = latency;
gap_params_to_apply.supervision_timeout = supervision_timeout;
gap_params_to_apply.min_ce_len = min_ce_len;
gap_params_to_apply.max_ce_len = max_ce_len;
if ((status = ble_gap_update_params(ble_device_conn_handle, &gap_params_to_apply)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_gap_update_params failed %s" NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
return false;
}
return true;
}
bool ble_service_request_mtu_exchange(void)
{
if(BLE_HS_CONN_HANDLE_NONE == ble_device_conn_handle)
{
TLS_BT_APPL_TRACE_ERROR("%s, no active connection" NEW_LINE, __FUNCTION__);
return false;
}
int status = BLE_HS_ENOERR;
if((status = ble_gattc_exchange_mtu(ble_device_conn_handle, &(ble_gatt_mtu_cb), NULL)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_gattc_exchange_mtu %s" NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
return false;
}
return true;
}
bool ble_service_send_nus_data(const uint8_t *data, uint16_t length)
{
// The NUS is TX is using notifications
if(notification_data.transfer_in_progress)
{
TLS_BT_APPL_TRACE_WARNING("%s, a transfer is already in progress"NEW_LINE, __FUNCTION__);
return false;
}
notification_data.transfer_in_progress = true;
notification_data.data = data;
notification_data.length = length;
return ble_service_send_custom_notification(gatt_nus_char_tx_handle, &notification_data);
}
void ble_service_register_nus_data_rx_cb(nus_data_rx_fn_t nus_data_rx_cb)
{
_ble_service_nus_data_rx_cb = nus_data_rx_cb;
}
/**
* PRIVATE FUNCTION DEFINITION
* Used for the internal workings of the service
*/
static bool ble_service_send_raw_custom_notification(uint16_t characteristic_handle, const uint8_t *data, uint16_t length)
{
if(BLE_HS_CONN_HANDLE_NONE == ble_device_conn_handle)
{
TLS_BT_APPL_TRACE_ERROR("%s, no active connection" NEW_LINE, __FUNCTION__);
return false;
}
if(!data || !length)
{
TLS_BT_APPL_TRACE_ERROR("%s, no data" NEW_LINE, __FUNCTION__);
return false;
}
int status = BLE_HS_ENOERR;
struct os_mbuf *om_buf = ble_hs_mbuf_from_flat(data, length);
if(!om_buf)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_hs_mbuf_from_flat" NEW_LINE, __FUNCTION__);
return false;
}
if((status = ble_gattc_notify_custom(ble_device_conn_handle, characteristic_handle, om_buf)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_hs_mbuf_from_flat %s" NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
return false;
}
return true;
}
static bool ble_service_send_custom_notification(uint16_t characteristic_handle, data_being_sent_t * const notif_data)
{
if(!notif_data)
{
TLS_BT_APPL_TRACE_WARNING("%s, notif_data is NULL"NEW_LINE, __FUNCTION__);
return false;
}
// We compute the maximum size of the data we can send:
uint16_t remaining_data_to_send = notif_data->length - notif_data->offset;
notif_data->sent_chunk_size = remaining_data_to_send <= usable_mtu ? remaining_data_to_send : usable_mtu;
if(!ble_service_send_raw_custom_notification(characteristic_handle, &notif_data->data[notif_data->offset], notif_data->sent_chunk_size))
{
//Transfer failed :
reset_data_being_sent(notif_data);
return false;
}
return true;
}
int ble_gatt_mtu_cb(uint16_t conn_handle, const struct ble_gatt_error *error, uint16_t mtu, void *arg)
{
TLS_BT_APPL_TRACE_DEBUG("ble_gatt_mtu_cb"NEW_LINE);
switch(error->status)
{
case 0:
TLS_BT_APPL_TRACE_DEBUG("mtu exchange complete: conn_handle=%d mtu=%d"NEW_LINE,
conn_handle, mtu);
usable_mtu = mtu - 3;
break;
default:
TLS_BT_APPL_TRACE_ERROR("Update MTU failed...error->status=%d"NEW_LINE, error->status);
break;
}
return BLE_HS_ENOERR;
}
static bool ble_service_define_gatt(const struct ble_gatt_svc_def *gatt_svc)
{
int status = BLE_HS_ENOERR;
if((status = ble_gatts_count_cfg(gatt_svc)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_gatts_count_cfg failed : %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
return false;
}
if((status = ble_gatts_add_svcs(gatt_svc)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_gatts_add_svcs failed : %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
return false;
}
return status == BLE_HS_ENOERR ? true : false;
}
static bool ble_service_advertise(bool enable)
{
int status = BLE_HS_ENOERR;
if(enable)
{
struct ble_hs_adv_fields advertisement_fields = {0};
uint8_t own_addr_type = BLE_OWN_ADDR_RANDOM;
advertisement_fields.flags = BLE_HS_ADV_F_DISC_GEN | BLE_HS_ADV_F_BREDR_UNSUP;
advertisement_fields.appearance = ble_svc_gap_device_appearance();
advertisement_fields.appearance_is_present = 1;
// Set the name of a watch supported by GB
#ifdef GADGETBRIDGE_SUPPORT
static const char dev_name[12] = "Bangle.js 2";
advertisement_fields.name = (uint8_t *)dev_name;//ble_svc_gap_device_name();
advertisement_fields.name_len = 11;//strlen(ble_svc_gap_device_name());
#else
advertisement_fields.name = (uint8_t *)ble_svc_gap_device_name();
advertisement_fields.name_len = strlen(ble_svc_gap_device_name());
#endif
advertisement_fields.name_is_complete = 1;
advertisement_fields.uuids16 = (ble_uuid16_t[])
{
BLE_UUID16_INIT(BLE_DEVICE_ADV_SERVICE)
};
advertisement_fields.num_uuids16 = 1;
advertisement_fields.uuids16_is_complete = 1;
// Lets apply the advertisement data
if((status = ble_gap_adv_set_fields(&advertisement_fields)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_gap_adv_set_fields failed : %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
return false;
}
// We the device address
uint8_t device_addr[6] = {0};
extern int tls_get_bt_mac_addr(u8 *mac);
tls_get_bt_mac_addr(device_addr);
// Make sure the the device address is compliant with the random address specification :
device_addr[5] |= 0xC0;
if((status = ble_hs_id_set_rnd(device_addr)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_hs_id_set_rnd failed : %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
return false;
}
else
{
TLS_BT_APPL_TRACE_VERBOSE("addr type : %s"NEW_LINE"device addr : %02X:%02X:%02X:%02X:%02X:%02X"NEW_LINE,
tls_bt_addr_type_2_str(own_addr_type),
device_addr[5],
device_addr[4],
device_addr[3],
device_addr[2],
device_addr[1],
device_addr[0]);
}
// We are now ready to configure the advertisement parameters
struct ble_gap_adv_params advertisement_params = {0};
advertisement_params.conn_mode = BLE_GAP_CONN_MODE_UND;
advertisement_params.disc_mode = BLE_GAP_DISC_MODE_GEN;
advertisement_params.itvl_min = 160;
advertisement_params.itvl_max = 160; //160 / 0.625 = 100 ms
advertisement_params.filter_policy = 0;
advertisement_params.channel_map = 0; // Use sane default
advertisement_params.high_duty_cycle = 0;
if((status = ble_gap_adv_start(BLE_OWN_ADDR_RANDOM, NULL, BLE_HS_FOREVER, &advertisement_params, &(ble_advertise_gap_event_cb), NULL)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_gap_adv_start failed : %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
return false;
}
}
else
{
if((status = ble_gap_adv_stop()) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_gap_adv_stop failed : %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
return false;
}
}
return true;
}
// This is the brain of the ble service, here we handle all the possible GAP events
static int ble_gap_event_cb(struct ble_gap_event *event, void *arg)
{
int status = BLE_HS_ENOERR;
struct ble_gap_conn_desc desc;
bool error = false;
TLS_BT_APPL_TRACE_EVENT("ble_gap_event_cb : %s"NEW_LINE, tls_bt_gap_evt_2_str(event->type));
switch(event->type)
{
case BLE_GAP_EVENT_CONNECT:
if(event->connect.status == BLE_HS_ENOERR)
{
if((status = ble_gap_conn_find(event->connect.conn_handle, &desc)) == BLE_HS_ENOERR)
{
print_conn_desc(&desc);
if(desc.role == BLE_GAP_ROLE_SLAVE)
{
_ble_service_state = BLE_SERVICE_MODE_CONNECTED;
usable_mtu = USABLE_DEFAULT_MTU;
ble_device_conn_handle = event->connect.conn_handle;
//We call the state change callback if registered
if(_ble_service_state_change_cb)_ble_service_state_change_cb(_ble_service_state);
}
else
{
error = true;
if((status = ble_gap_terminate(event->connect.conn_handle, BLE_ERR_REM_USER_CONN_TERM)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_WARNING("%s, ble_gap_terminate %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
}
}
}
}
else
{
error = true;
}
//Resume advertising :
if(error)
{
TLS_BT_APPL_TRACE_VERBOSE("Remote device failed to connect, advertise again"NEW_LINE);
if(!ble_service_advertise(true))
{
_ble_service_state = BLE_SERVICE_MODE_IDLE;
return BLE_HS_EUNKNOWN;
}
_ble_service_state = BLE_SERVICE_MODE_ADVERTISING;
}
break;
case BLE_GAP_EVENT_DISCONNECT:
if(event->disconnect.conn.role != BLE_GAP_ROLE_SLAVE) return 0;
TLS_BT_APPL_TRACE_DEBUG("Server disconnect reason=%d[0x%02x],state=%s"NEW_LINE, event->disconnect.reason,event->disconnect.reason-0x200,
ble_service_state_2_str(_ble_service_state));
// Don't forget to invalidate the connection handle :
ble_device_conn_handle = BLE_HS_CONN_HANDLE_NONE;
if(_ble_service_state == BLE_SERVICE_MODE_EXITING)
{
_ble_service_state = BLE_SERVICE_MODE_STOPPED;
if((status = ble_gap_event_listener_unregister(&ble_gap_event_listener)) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_WARNING("%s, ble_gap_event_listener_unregister %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
}
// We finally clean the gatt registered services
if((status = ble_gatts_reset()) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_ERROR("%s, ble_gatts_reset %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
}
}
else
{
// Let's advertise again
TLS_BT_APPL_TRACE_VERBOSE("Service disconnect event, advertise again"NEW_LINE);
if(!ble_service_advertise(true))
{
_ble_service_state = BLE_SERVICE_MODE_IDLE;
return BLE_HS_EUNKNOWN;
}
_ble_service_state = BLE_SERVICE_MODE_ADVERTISING;
}
//We call the state change callback if registered
if(_ble_service_state_change_cb)_ble_service_state_change_cb(_ble_service_state);
break;
case BLE_GAP_EVENT_CONN_UPDATE:
TLS_BT_APPL_TRACE_DEBUG("Conn update status : %d"NEW_LINE, event->conn_update.status);
if((status = ble_gap_conn_find(event->connect.conn_handle, &desc)) == BLE_HS_ENOERR)
{
print_conn_desc(&desc);
}
else
{
TLS_BT_APPL_TRACE_WARNING("%s, ble_gap_conn_find %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
}
break;
case BLE_GAP_EVENT_SUBSCRIBE:
TLS_BT_APPL_TRACE_VERBOSE("Attr handle : %u"NEW_LINE
"cur_indicate : %u"NEW_LINE
"prev_indicate : %u"NEW_LINE
"cur_notify : %u"NEW_LINE
"prev_notify : %u"NEW_LINE,
event->subscribe.attr_handle,
event->subscribe.cur_indicate,
event->subscribe.prev_indicate,
event->subscribe.cur_notify,
event->subscribe.prev_notify
);
break;
case BLE_GAP_EVENT_MTU:
TLS_BT_APPL_TRACE_VERBOSE("MTU update : %u"NEW_LINE, event->mtu.value);
usable_mtu = event->mtu.value - 3;
break;
case BLE_GAP_EVENT_NOTIFY_TX:
if(event->notify_tx.indication == 0) // Notification
{
TLS_BT_APPL_TRACE_VERBOSE("Type : notification"NEW_LINE);
if(event->notify_tx.status != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_WARNING("%s, notify_tx notification error %d, transfer in progress : %u"NEW_LINE, __FUNCTION__, event->notify_tx.status, notification_data.transfer_in_progress);
reset_data_being_sent(&notification_data);
return BLE_HS_EUNKNOWN;
}
TLS_BT_APPL_TRACE_DEBUG("transfer : %u"NEW_LINE"length : %u"NEW_LINE"offset : %u"NEW_LINE,
notification_data.transfer_in_progress,
notification_data.length,
notification_data.offset);
// We update the offset :
notification_data.offset += notification_data.sent_chunk_size;
if(notification_data.offset < notification_data.length) // Still data to send ?
{
if(!ble_service_send_custom_notification(event->notify_tx.attr_handle, &notification_data))
{
TLS_BT_APPL_TRACE_ERROR("Failed to send next notification chunk, aborting"NEW_LINE);
reset_data_being_sent(&notification_data);
return BLE_HS_EUNKNOWN;
}
}
else
{
TLS_BT_APPL_TRACE_VERBOSE("last data chunk sent, end of the transfer"NEW_LINE);
// All data have been sent, end of the transfer
reset_data_being_sent(&notification_data);
}
}
else // Indication
{
TLS_BT_APPL_TRACE_WARNING("Indication not yet handled"NEW_LINE);
}
break;
default:
TLS_BT_APPL_TRACE_WARNING("unhandled event !"NEW_LINE);
}
return BLE_HS_ENOERR;
}
static int ble_advertise_gap_event_cb(struct ble_gap_event *event, void *arg)
{
return BLE_HS_ENOERR;
}
static int battery_level_char_access_cb(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg)
{
int status = BLE_HS_ENOERR;
TLS_BT_APPL_TRACE_EVENT("battery_level_char_access_cb op : %s"NEW_LINE, tls_bt_access_opt_2_str(ctxt->op));
switch(ctxt->op)
{
case BLE_GATT_ACCESS_OP_READ_CHR:
if(attr_handle == battery_level_char_handle)
{
TLS_BT_APPL_TRACE_VERBOSE("battery level reading"NEW_LINE);
if((status = os_mbuf_append(ctxt->om, &battery_level_value, sizeof(battery_level_value))) != BLE_HS_ENOERR)
{
TLS_BT_APPL_TRACE_ERROR("%s, battery level os_mbuf : %s"NEW_LINE, __FUNCTION__, tls_bt_rc_2_str(status));
}
}
break;
default:
TLS_BT_APPL_TRACE_WARNING("unhandled operation !"NEW_LINE);
}
return BLE_HS_ENOERR;
}
static int gatt_nus_char_access_cb(uint16_t conn_handle, uint16_t attr_handle, struct ble_gatt_access_ctxt *ctxt, void *arg)
{
//TLS_BT_APPL_TRACE_EVENT("gatt_nus_char_access_cb op : %s"NEW_LINE, tls_bt_access_opt_2_str(ctxt->op));
switch(ctxt->op)
{
case BLE_GATT_ACCESS_OP_WRITE_CHR:
{
struct os_mbuf *om_buf = ctxt->om;
while(om_buf)
{
// Call the nus rx cb function if one is registered
if(_ble_service_nus_data_rx_cb)
_ble_service_nus_data_rx_cb(om_buf->om_data, om_buf->om_len);
om_buf = SLIST_NEXT(om_buf, om_next);
}
}
break;
default:
TLS_BT_APPL_TRACE_WARNING("unhandled operation !"NEW_LINE);
}
return BLE_HS_ENOERR;
}
static void print_conn_desc(const struct ble_gap_conn_desc *desc)
{
TLS_BT_APPL_TRACE_VERBOSE("conn_handle : %u"NEW_LINE"conn_itvl : %u"NEW_LINE"conn_latency : %u"NEW_LINE"master_clock_accuracy : %u"NEW_LINE"role : %s"NEW_LINE"supervision_timeout : %u"NEW_LINE
"encrypted : %u"NEW_LINE"authenticated : %u"NEW_LINE"bonded : %u"NEW_LINE,
desc->conn_handle,
desc->conn_itvl,
desc->conn_latency,
desc->master_clock_accuracy,
desc->role == BLE_GAP_ROLE_MASTER ? "MASTER" : "SLAVE",
desc->supervision_timeout,
desc->sec_state.encrypted,
desc->sec_state.authenticated,
desc->sec_state.bonded);
}
static void reset_data_being_sent(data_being_sent_t * const data)
{
if(data)
{
memset(data, 0, sizeof(data_being_sent_t));
}
}

View File

@ -0,0 +1,126 @@
#ifndef BLE_SERVICE_H
#define BLE_SERVICE_H
#include "wm_type_def.h"
#ifndef CASE_RETURN_STR
#define CASE_RETURN_STR(const) case const: return #const;
#endif
typedef void (*nus_data_rx_fn_t)(const uint8_t *data, uint16_t length);
typedef enum
{
BLE_SERVICE_MODE_STOPPED = 0x00,
BLE_SERVICE_MODE_IDLE,
BLE_SERVICE_MODE_ADVERTISING,
BLE_SERVICE_MODE_CONNECTED,
BLE_SERVICE_MODE_INDICATING,
BLE_SERVICE_MODE_EXITING
} ble_service_state_e;
typedef void (*ble_service_state_change_fn_t)(ble_service_state_e service_state);
/**
* @brief Resturns the corresponding enum name as a string
*
* @param state the enum value
* @return const char* the enum name as a string
*/
const char *ble_service_state_2_str(ble_service_state_e state);
/**
* @brief Configures and starts the BLE service
*
* @return true on success
* @return false on failure
*/
bool ble_service_start(void);
/**
* @brief Deinits and stops the BLE service
*
* @return true on success
* @return false on failure
*/
bool ble_service_stop(void);
/**
* @brief Check whether the ble service is running or not
*
* @return true if it is running
* @return false if it is stopped
*/
bool ble_service_is_started(void);
/**
* @brief Check whether a device is connected to the ble service or not
*
* @return true if a device is connected
* @return false if no device is connected
*/
bool ble_service_is_device_connected(void);
/**
* @brief Registers a callback function called every time the state of the BLE service changes.
* For example, you can register a callback to know if a device connected to the service, or disconnected
*
* @param ble_service_state_change_cb the function to register as the callback. The ble_service_state parameter is set to the new state.
*/
void ble_service_register_state_change_cb(ble_service_state_change_fn_t ble_service_state_change_cb);
/**
* @brief Returns the current state of the ble service
*
* @return ble_service_state_e
*/
ble_service_state_e ble_service_get_state(void);
/**
* @brief Asks to update the current connection parameters
* /!\ A connection should be already active before calling this function.
*
* @param itvl_min Minimum value for connection interval in 1.25ms units
* @param itvl_max Maximum value for connection interval in 1.25ms units
* @param latency Connection latency
* @param supervision_timeout Supervision timeout in 10ms units
* @param min_ce_len Minimum length of connection event in 0.625ms units
* @param max_ce_len Maximum length of connection event in 0.625ms units
* @return true
* @return false
*/
bool ble_service_update_connection_parameters(
uint16_t itvl_min,
uint16_t itvl_max,
uint16_t latency,
uint16_t supervision_timeout,
uint16_t min_ce_len,
uint16_t max_ce_len);
/**
* @brief Requests a MTU (Maximum Transmission Unit) update in order to hopefully, get something bigger than 20 bytes ...
*
* @return true on success
* @return false on failure
*/
bool ble_service_request_mtu_exchange(void);
/**
* @brief Sends the provided payload of size length using the NUS (Nordic UART Service) TX characteristic
*
* @param data the data to send through the NUS
* @param length the lenght in byte of the data to send
* @return true on success
* @return false on failure
*/
bool ble_service_send_nus_data(const uint8_t *data, uint16_t length);
/**
* @brief Registers a function which will be called every time data is received by the nus rx
* @note To unregister a callback, simply pass NULL to the function
*
* @param nus_data_rx_cb a pointer to the function to call of type nus_data_rx_fn_t
*/
void ble_service_register_nus_data_rx_cb(nus_data_rx_fn_t nus_data_rx_cb);
#endif //BLE_APP_H

View File

@ -0,0 +1,8 @@
#ifndef BLUETOOTH_SIG_VALUES_H
#define BLUETOOTH_SIG_VALUES_H
#define BLE_DEVICE_APPEARANCE (0x00C2) //Smart Watch
#define BLE_DEVICE_ADV_SERVICE (0x180F) //Battery Service
#endif //BLUETOOTH_SIG_VALUES_H

View File

@ -0,0 +1,8 @@
#ifndef FIRMWARE_VERSION_H
#define FIRMWARE_VERSION_H
#define FIRMWARE_VERSION "0.0.1" //Firmware creation
#define FIRMWARE_TIME_DATE (__TIME__" "__DATE__)
#endif //FIRMWARE_VERSION_H

File diff suppressed because one or more lines are too long

View File

@ -1,16 +1,58 @@
#include "lvgl.h" #include "lvgl.h"
/***
* It is needed to have a reference on two header_titles because when
* switching from one screen using a header to an other screen which is also using one
* the header of the new screen will be created BEFORE the header of the previous screen
* is deleted ...
*/
/* A reference to the current and previous header title */
static lv_obj_t *header_title[2] = {NULL, NULL};
/* Pointer to the header_title to use */
lv_obj_t **header_title_p = &header_title[0];
static void cleanup_event_cb(lv_event_t * e)
{
lv_obj_t **header_title_deleted_p = e->user_data;
*header_title_deleted_p = NULL;
LV_LOG_USER("header_title cleanup");
}
void common_screen_header_component(lv_obj_t *parent, const char * title, lv_coord_t height) void common_screen_header_component(lv_obj_t *parent, const char * title, lv_coord_t height)
{ {
if(header_title[0] == NULL)
header_title_p = &header_title[0];
else if(header_title[1] == NULL)
header_title_p = &header_title[1];
else
{
LV_LOG_ERROR("no free header_title");
return;
}
lv_obj_t *header = lv_obj_create(parent); lv_obj_t *header = lv_obj_create(parent);
lv_obj_set_style_bg_color(header, lv_color_make(129, 141,181), LV_PART_MAIN); lv_obj_set_style_bg_color(header, lv_color_make(129, 141,181), LV_PART_MAIN);
lv_obj_set_size(header, lv_disp_get_hor_res(NULL), height); lv_obj_set_size(header, lv_disp_get_hor_res(NULL), height);
lv_obj_set_style_radius(header, 0, LV_PART_MAIN); lv_obj_set_style_radius(header, 0, LV_PART_MAIN);
lv_obj_set_style_border_width(header, 0, LV_PART_MAIN); lv_obj_set_style_border_width(header, 0, LV_PART_MAIN);
lv_obj_clear_flag(header, LV_OBJ_FLAG_SCROLLABLE);
lv_obj_t *header_title = lv_label_create(header); *header_title_p = lv_label_create(header);
lv_label_set_text_static(header_title, title); lv_label_set_text_static(*header_title_p, title);
lv_obj_set_style_text_color(header_title, lv_color_white(), LV_PART_MAIN); lv_obj_set_style_text_align(*header_title_p, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN);
lv_obj_set_style_text_font(header_title, &lv_font_montserrat_30, LV_PART_MAIN); lv_obj_set_style_text_color(*header_title_p, lv_color_white(), LV_PART_MAIN);
lv_obj_set_align(header_title, LV_ALIGN_CENTER); lv_obj_set_style_text_font(*header_title_p, &lv_font_montserrat_30, LV_PART_MAIN);
lv_obj_set_width(*header_title_p, 150);
lv_obj_set_align(*header_title_p, LV_ALIGN_CENTER);
lv_label_set_long_mode(*header_title_p, LV_LABEL_LONG_SCROLL_CIRCULAR);
/* Once the current header_title is destroyed, mark it as NULL to prevent any crashes when trying to change it's title */
lv_obj_add_event_cb(*header_title_p, &(cleanup_event_cb), LV_EVENT_DELETE, header_title_p);
}
void common_screen_header_update_title(const char * title)
{
if(!*header_title_p)return;
lv_label_set_text_static(*header_title_p, title);
} }

View File

@ -3,6 +3,20 @@
#include "lvgl.h" #include "lvgl.h"
/**
* @brief Adds a screen header with the defined title to the screen passed as parent with the provided height.
*
* @param parent the screen to which the header will be added
* @param title a string used as the header's title
* @param height the height in pixel of the header
*/
void common_screen_header_component(lv_obj_t *parent, const char * title, lv_coord_t height); void common_screen_header_component(lv_obj_t *parent, const char * title, lv_coord_t height);
/**
* @brief Updates the current title of displayed screen header
*
* @param title a string used as the new header's title
*/
void common_screen_header_update_title(const char * title);
#endif //COMMON_SCREEN_COMPONENTS_H #endif //COMMON_SCREEN_COMPONENTS_H

View File

@ -3,6 +3,7 @@
#include "lvgl.h" #include "lvgl.h"
#include "compass_screen.h" #include "compass_screen.h"
#include "menu_screen.h" #include "menu_screen.h"
#include "app_config.h"
static const char *cardinals[] = static const char *cardinals[] =
{ {
@ -71,9 +72,13 @@ static void rotate_cardinal(CompassCardinal_t *cardinal, uint16_t azimuth)
{ {
lv_coord_t rotated_x, rotated_y; lv_coord_t rotated_x, rotated_y;
float azimuth_in_rads = (float)azimuth*M_PI/180.0; float azimuth_in_rads = (float)azimuth*M_PI/180.0;
#if HARDWARE_PLATFORM == SMART_WATCH_BREADBOARD
rotated_x = (float)(cardinal->position.x-120+cardinal->offset.x)*cos(azimuth_in_rads) - (float)(cardinal->position.y-120+cardinal->offset.y)*sin(azimuth_in_rads) + 120-cardinal->offset.x; rotated_x = (float)(cardinal->position.x-120+cardinal->offset.x)*cos(azimuth_in_rads) - (float)(cardinal->position.y-120+cardinal->offset.y)*sin(azimuth_in_rads) + 120-cardinal->offset.x;
rotated_y = (float)(cardinal->position.y-120+cardinal->offset.y)*cos(azimuth_in_rads) + (float)(cardinal->position.x-120+cardinal->offset.x)*sin(azimuth_in_rads) + 120-cardinal->offset.y; rotated_y = (float)(cardinal->position.y-120+cardinal->offset.y)*cos(azimuth_in_rads) + (float)(cardinal->position.x-120+cardinal->offset.x)*sin(azimuth_in_rads) + 120-cardinal->offset.y;
#elif HARDWARE_PLATFORM == SMART_WATCH_PCB
rotated_x = (float)(cardinal->position.x-120+cardinal->offset.x)*cos(azimuth_in_rads) + (float)(cardinal->position.y-120+cardinal->offset.y)*sin(azimuth_in_rads) + 120-cardinal->offset.x;
rotated_y = (float)(cardinal->position.y-120+cardinal->offset.y)*cos(azimuth_in_rads) - (float)(cardinal->position.x-120+cardinal->offset.x)*sin(azimuth_in_rads) + 120-cardinal->offset.y;
#endif
lv_obj_set_pos(cardinal->label, rotated_x, rotated_y); lv_obj_set_pos(cardinal->label, rotated_x, rotated_y);
} }
@ -102,7 +107,11 @@ void compass_screen_set_azimuth(CompassScreen_t * const compassScreen, uint16_t
//We make sure the azimuth is in the right range ie 0 to 359 //We make sure the azimuth is in the right range ie 0 to 359
azimuth %= 360; azimuth %= 360;
#if HARDWARE_PLATFORM == SMART_WATCH_BREADBOARD
uint16_t azimuthAdjusted = 359 - azimuth; uint16_t azimuthAdjusted = 359 - azimuth;
#elif HARDWARE_PLATFORM == SMART_WATCH_PCB
uint16_t azimuthAdjusted = azimuth;
#endif
uint8_t index; uint8_t index;
@ -129,7 +138,11 @@ void compass_screen_set_azimuth(CompassScreen_t * const compassScreen, uint16_t
//Rotate each cardinal with the current azimuth //Rotate each cardinal with the current azimuth
rotate_cardinal(&compassScreen->northCardinal, azimuth); rotate_cardinal(&compassScreen->northCardinal, azimuth);
#if HARDWARE_PLATFORM == SMART_WATCH_BREADBOARD
lv_img_set_angle(compassScreen->northMarker, azimuth*10); lv_img_set_angle(compassScreen->northMarker, azimuth*10);
#elif HARDWARE_PLATFORM == SMART_WATCH_PCB
lv_img_set_angle(compassScreen->northMarker, -azimuth*10);
#endif
//lv_meter_set_scale_range(compassScreen->compassGraduation.meter, compassScreen->compassGraduation.scale, 0, 330, 330, azimuth-90); //lv_meter_set_scale_range(compassScreen->compassGraduation.meter, compassScreen->compassGraduation.scale, 0, 330, 330, azimuth-90);
rotate_cardinal(&compassScreen->eastCardinal, azimuth); rotate_cardinal(&compassScreen->eastCardinal, azimuth);

View File

@ -17,18 +17,18 @@
#include "watch_peripherals.h" #include "watch_peripherals.h"
#include "watch_settings.h" #include "watch_settings.h"
#include "ble_modem.h"
#include "ble_service.h"
static void date_time_cb(struct tm * const dateTime) static void date_time_cb(struct tm * const dateTime)
{ {
if(!dateTime)return; if(!dateTime)return;
tls_get_rtc(dateTime); tls_get_rtc(dateTime);
//APP_LOG_DEBUG("RTC time : %d:%d:%d", dateTime->tm_hour, dateTime->tm_min, dateTime->tm_sec);
} }
static uint8_t battery_percentage = 100; static void _perform_deferred_display_wake_up_set_sleeping(void);
static uint8_t battery_indicator_cb(void) static void _perform_deferred_display_wake_up_set_timestamp(void);
{ static void _perform_deferred_display_wake_up(uint8_t deferred_time_in_ms);
return battery_percentage;
}
WatchFace_t watchFace; WatchFace_t watchFace;
MenuScreen_t menuScreen; MenuScreen_t menuScreen;
@ -39,69 +39,238 @@ struct bma4_dev bma;
struct bma4_accel_config accel_conf; struct bma4_accel_config accel_conf;
struct bma456w_wrist_wear_wakeup_params setting; struct bma456w_wrist_wear_wakeup_params setting;
struct bma4_int_pin_config pin_config; struct bma4_int_pin_config pin_config;
static struct
{
uint16_t int_status; uint16_t int_status;
bool battery_controller_status;
} _interrupts_statuses = {.int_status = 0, .battery_controller_status = false};
static void setBrightness(uint8_t brightness) static struct
{ {
extern LCDConfig_t LCDConfig; uint16_t battery_voltage;
lcd_set_backlight(&LCDConfig, brightness); uint8_t battery_percentage;
} _battery_stats = {.battery_voltage = 0, .battery_percentage = 100};
/* This call back is automatically called by the watch face when it wants to refresh the battery */
static void battery_indicator_cb(uint8_t *levelInPercent, BatteryState_e *batteryState)
{
*levelInPercent = _battery_stats.battery_percentage;
*batteryState = watch_peripherals_get_battery_controller_status();
} }
static void setBrightnessCb(uint8_t brightness) static void battery_controller_status_on_change_cb(battery_controller_status_e old, battery_controller_status_e new)
{ {
_interrupts_statuses.battery_controller_status = true;
persistency_get_settings()->display.brightness = brightness;
setBrightness(brightness);
} }
static void setTimeCb(uint8_t hour, uint8_t minute, uint8_t second, uint8_t day, uint8_t month, uint8_t year) static void setGetBrightnessCb(uint8_t *brightness, SettingMode_e mode)
{
if(SETTING_MODE_GET == mode)
{
*brightness = persistency_get_settings()->display.display_brightness;
}
else
{
// Updates the settings in the watch settings structure
watch_settings_display_set_brightness(*brightness);
// Physically apply the setting to the hardware
watch_peripherals_set_brightness(*brightness);
}
}
static void setTimeCb(uint8_t *hour, uint8_t *minute, uint8_t *second, uint8_t *day, uint8_t *month, uint8_t *year, SettingMode_e mode)
{ {
struct tm timeToSet; struct tm timeToSet;
//First we get the current time from the RTC //First we get the current time from the RTC
tls_get_rtc(&timeToSet); tls_get_rtc(&timeToSet);
if(hour != 0xFF) if(SETTING_MODE_GET == mode)
timeToSet.tm_hour = hour; {
*hour = timeToSet.tm_hour;
*minute = timeToSet.tm_min;
*second = timeToSet.tm_sec;
*day = timeToSet.tm_mday;
*month = timeToSet.tm_mon;
*year = timeToSet.tm_year;
}
else
{
if(*hour != 0xFF)
timeToSet.tm_hour = *hour;
if(minute != 0xFF) if(*minute != 0xFF)
timeToSet.tm_min = minute; timeToSet.tm_min = *minute;
if(second != 0xFF) if(*second != 0xFF)
timeToSet.tm_sec = second; timeToSet.tm_sec = *second;
if(day != 0xFF) if(*day != 0xFF)
timeToSet.tm_mday = day; timeToSet.tm_mday = *day;
if(month != 0xFF) if(*month != 0xFF)
timeToSet.tm_mon = month; timeToSet.tm_mon = *month;
if(year != 0xFF) if(*year != 0xFF)
timeToSet.tm_year = year + 100; timeToSet.tm_year = *year;
tls_set_rtc(&timeToSet); tls_set_rtc(&timeToSet);
} }
static void setTimeoutCb(uint8_t timeout)
{
persistency_get_settings()->display.sleep_timeout = timeout;
} }
static void setOrientationCb(uint8_t orientation) static void setDisplayVibrationDuration(uint8_t *duration, SettingMode_e mode)
{ {
extern LCDConfig_t LCDConfig; if(SETTING_MODE_GET == mode)
lcd_orientation(&LCDConfig, orientation); {
persistency_get_settings()->display.orientation = orientation; *duration = persistency_get_settings()->display.display_vibrate_on_touch_duration;
// Forces to redraw the full screen to avoid strange artifact }
else
{
watch_settings_display_set_vibrate_on_touch_duration(*duration);
}
}
static void setDisplayVibrationStrength(uint8_t *strength, SettingMode_e mode)
{
if(SETTING_MODE_GET == mode)
{
*strength = persistency_get_settings()->display.display_vibrate_on_touch_strength;
}
else
{
watch_settings_display_set_vibrate_on_touch_strength(*strength);
}
}
static void setTimeoutCb(uint8_t *timeout, SettingMode_e mode)
{
if(SETTING_MODE_GET == mode)
{
*timeout = persistency_get_settings()->display.display_delay_before_sleep;
}
else
{
watch_settings_display_set_delay_before_sleep(*timeout);
}
}
static void setOrientationCb(uint8_t *orientation, SettingMode_e mode)
{
if(SETTING_MODE_GET == mode)
{
*orientation = persistency_get_settings()->display.display_orientation;
}
else
{
watch_settings_display_set_orientation(*orientation);
watch_peripherals_set_orientation(*orientation);
// Forces to redraw the full screen to avoid strange artifacts
lv_obj_invalidate(lv_scr_act()); lv_obj_invalidate(lv_scr_act());
} }
}
static void setBLEEnabledCb(bool *enabled, SettingMode_e mode)
{
if(SETTING_MODE_GET == mode)
{
*enabled = persistency_get_settings()->connectivity.connectivity_ble_enabled;
}
else
{
watch_settings_connectivity_set_ble_enabled(*enabled);
//Let's turn the BLE on or OFF here
if(*enabled)
{
if(!ble_modem_on(true))
APP_LOG_ERROR("Failed to start BLE modem with service");
else
watch_face_set_bluetooth_indicator(&watchFace, BLUETOOTH_STATE_ON);
}
else
{
if(!ble_modem_off())
APP_LOG_ERROR("Failed to stop BLE modem with service");
else
watch_face_set_bluetooth_indicator(&watchFace, BLUETOOTH_STATE_OFF);
}
}
}
/* This may never get implemented due to power consumption */
static void setWiFiEnabledCb(bool *enabled, SettingMode_e mode)
{
if(SETTING_MODE_GET == mode)
{
*enabled = persistency_get_settings()->connectivity.connectivity_wifi_enabled;
}
else
{
watch_settings_connectivity_set_wifi_enabled(*enabled);
}
}
static void setLanguageCb(uint8_t *language, SettingMode_e mode)
{
if(SETTING_MODE_GET == mode)
{
*language = persistency_get_settings()->languageAndUI.language;
}
else
{
watch_settings_language_and_UI_set_language(*language);
}
}
static void getBLEDeviceNameCb(const char **dev_name)
{
*dev_name = BLE_DEVICE_NAME;
}
static void getBatteryVoltageCb(uint16_t *battery_voltage)
{
*battery_voltage = _battery_stats.battery_voltage;
}
static void saveSettingsToFlashCb(void)
{
/*if(!persistency_save_settings_to_flash())
{
APP_LOG_ERROR("Failed to save watch settings to flash");
}*/
}
static void performFactoryResetCb()
{
// Reload factory settings
persistency_factory_reset();
if(!persistency_save_settings_to_flash())
{
APP_LOG_ERROR("Failed to save factory reset settings to flash");
return;
}
// We do a hardware reset of the watch
tls_sys_reset();
}
SettingsScreenAPIInterface_t settingsScreenAPIInterface = SettingsScreenAPIInterface_t settingsScreenAPIInterface =
{ {
.setBrightnessSettingsCb = setBrightnessCb, .setTimeSettingsCb = &(setTimeCb),
.setTimeSettingsCb = setTimeCb, .setBrightnessSettingsCb = &(setGetBrightnessCb),
.setTimeoutSettingsCb = setTimeoutCb, .setTimeoutSettingsCb = &(setTimeoutCb),
.setOrientationSettingsCb = setOrientationCb, .setDisplayVibrationDurationSettingsCb = &(setDisplayVibrationDuration),
.setDisplayVibrationStrengthSettingsCb = &(setDisplayVibrationStrength),
.setOrientationSettingsCb = &(setOrientationCb),
.setBLEEnabledSettingsCb = &(setBLEEnabledCb),
.setWiFiEnabledSettingsCb = &(setWiFiEnabledCb),
.setLanguageSettingsCb = &(setLanguageCb),
.getBLEDeviceNameCb = &(getBLEDeviceNameCb),
.getBatteryVoltageCb = &(getBatteryVoltageCb),
.saveSettingsCb = &(saveSettingsToFlashCb),
.factoryResetCb = &(performFactoryResetCb),
}; };
static uint16_t angle_with_offset(uint16_t angle, uint16_t offset) static uint16_t angle_with_offset(uint16_t angle, uint16_t offset)
@ -133,6 +302,32 @@ static void delay_us(uint32_t period, void *intf_ptr)
tls_os_time_delay(pdMS_TO_TICKS(period / 1000)); tls_os_time_delay(pdMS_TO_TICKS(period / 1000));
} }
static void ble_service_nus_data_rx_cb(const uint8_t *data, uint16_t length)
{
for (uint16_t i = 0; i < length; i++)
{
if (data[i] < 32)
printf("[%u]", data[i]);
else
printf("%c", data[i]);
}
}
static void ble_service_state_change_cb(ble_service_state_e ble_service_state)
{
switch(ble_service_state)
{
case BLE_SERVICE_MODE_CONNECTED:
watch_face_set_bluetooth_indicator(&watchFace, BLUETOOTH_STATE_CONNECTED);
break;
case BLE_SERVICE_MODE_ADVERTISING:
watch_face_set_bluetooth_indicator(&watchFace, BLUETOOTH_STATE_ON);
break;
default:
break;
}
}
static void scan_result_cb(void) static void scan_result_cb(void)
{ {
size_t buffer_size = sizeof(struct tls_scan_bss_format2_t) + sizeof(struct tls_bss_info_format2_t) * 10; size_t buffer_size = sizeof(struct tls_scan_bss_format2_t) + sizeof(struct tls_bss_info_format2_t) * 10;
@ -170,9 +365,41 @@ static void scan_result_cb(void)
tls_mem_free(buffer); tls_mem_free(buffer);
} }
extern LCDConfig_t LCDConfig;
void gfx_task(void *param) void gfx_task(void *param)
{ {
APP_LOG_TRACE("starting"); APP_LOG_TRACE("GFX task starting");
/* Init and load watch settings using the persistency layer */
persistency_init();
if(!persistency_load_settings_from_flash())
{
APP_LOG_ERROR("Failed to retrieve watch settings from flash");
}
//persistency_debug();
/* Let's init the watch peripherals driver (vibration motor + battery voltage sense) */
watch_peripherals_init(27);
watch_peripherals_register_battery_controller_status_change_cb(&(battery_controller_status_on_change_cb));
/* Make the first battery voltage reading here */
_battery_stats.battery_voltage = watch_peripherals_get_battery_voltage(battery_unit_mv);
_battery_stats.battery_percentage = battery_voltage_to_percentage(_battery_stats.battery_voltage);
/* Check whether the RTC is running or not, if not, then the board was reset
So we start the RTC */
if(!tls_is_rtc_running())
{
struct tm curr_time = {
.tm_mday = 1,
.tm_mon = 1,
.tm_year = 22, // Starting from 2000
};
tls_set_rtc(&curr_time);
}
/* Initialize the lvgl library and peripherals (display and input device)*/ /* Initialize the lvgl library and peripherals (display and input device)*/
lv_init(); lv_init();
@ -194,9 +421,7 @@ void gfx_task(void *param)
lv_scr_load(watchFace.display); lv_scr_load(watchFace.display);
/* Let's init the I2C interface */ /* Let's init the I2C interface */
i2c_init(I2C_SDA, I2C_SCL, 100000); i2c_init(I2C_SDA, I2C_SCL, I2C_CLOCK_SPEED);
uint8_t aliveCounter = 0;
/* Init the magnetometer */ /* Init the magnetometer */
if(!QMC5883L_init()) if(!QMC5883L_init())
@ -269,7 +494,7 @@ void gfx_task(void *param)
else else
APP_LOG_INFO("BMA456 accel en failed"); APP_LOG_INFO("BMA456 accel en failed");
bma456w_feature_enable(BMA456W_WRIST_WEAR_WAKEUP, 1, &bma); bma456w_feature_enable(BMA456W_WRIST_WEAR_WAKEUP, BMA4_ENABLE, &bma);
bma456w_get_wrist_wear_wakeup_param_config(&setting, &bma); bma456w_get_wrist_wear_wakeup_param_config(&setting, &bma);
@ -296,23 +521,26 @@ void gfx_task(void *param)
else else
APP_LOG_INFO("BMA456 set pin conf failed"); APP_LOG_INFO("BMA456 set pin conf failed");
/* Let's init the watch peripherals driver (vibration motor + battery voltage sense) */ /* Configure BMA's step counter */
watch_peripherals_init(27); if(bma456w_feature_enable(BMA456W_STEP_CNTR, BMA4_ENABLE, &bma) == BMA4_OK)
/* Make the first battery voltage reading here */ APP_LOG_INFO("BMA456 step cnter feature enable ok");
uint16_t battery_voltage = watch_peripherals_get_battery_voltage(Battery_Unit_mV); else
battery_percentage = battery_voltage_to_percentage(battery_voltage); APP_LOG_INFO("BMA456 step cnter feature enable failed");
watch_face_set_battery_indicator(&watchFace, battery_percentage);
/* Configure and register BLE stack and services callbacks */
ble_service_register_nus_data_rx_cb(&(ble_service_nus_data_rx_cb));
ble_service_register_state_change_cb(&(ble_service_state_change_cb));
/* Once we are done with the initializing steps we /* Once we are done with the initializing steps we
don't forget to turn the backlight on ! */ don't forget to turn the backlight on ! */
setBrightness(persistency_get_settings()->display.brightness); watch_peripherals_set_brightness(persistency_get_settings()->display.display_brightness);
/* Enable WiFi hotspot scanning for antenna performance test purposes */ /* Enable WiFi hotspot scanning for antenna performance test purposes */
tls_wifi_scan_result_cb_register(&(scan_result_cb)); //tls_wifi_scan_result_cb_register(&(scan_result_cb));
extern LCDConfig_t LCDConfig;
float temperature = 0; float temperature = 0;
float pressure = 0; float pressure = 0;
uint32_t update_tick = 0;
for(;;) for(;;)
{ {
@ -336,38 +564,44 @@ void gfx_task(void *param)
} }
uint8_t rslt = bma456w_read_int_status(&int_status, &bma); uint8_t rslt = bma456w_read_int_status(&_interrupts_statuses.int_status, &bma);
if(rslt != BMA4_OK) if(rslt != BMA4_OK)
APP_LOG_DEBUG("Failed to read int status"); APP_LOG_DEBUG("Failed to read int status");
if((BMA4_OK == rslt) && (int_status & BMA456W_WRIST_WEAR_WAKEUP_INT)) if((BMA4_OK == rslt) && (_interrupts_statuses.int_status & BMA456W_WRIST_WEAR_WAKEUP_INT))
{ {
APP_LOG_DEBUG("Wrist tilt"); APP_LOG_DEBUG("Wrist tilt");
} }
if(++aliveCounter % 200 == 0) if(lv_tick_elaps(update_tick) > 5000)
{ {
uint32_t steps = 0;
if(bma456w_step_counter_output(&steps, &bma) != BMA4_OK)
APP_LOG_DEBUG("Failed to read step counts");
watch_face_set_step_count_indicator(&watchFace, steps);
pressure = BMP280_get_pressure(&temperature); pressure = BMP280_get_pressure(&temperature);
BMP280_trigger_measurement(); BMP280_trigger_measurement();
battery_voltage = watch_peripherals_get_battery_voltage(Battery_Unit_mV); _battery_stats.battery_voltage = watch_peripherals_get_battery_voltage(battery_unit_mv);
battery_percentage = battery_voltage_to_percentage(battery_voltage); _battery_stats.battery_percentage = battery_voltage_to_percentage(_battery_stats.battery_voltage);
APP_LOG_DEBUG("GFX thread, temp : %0.2f °C, press : %0.2f hPa, bat : %u mV <-> %u %%", APP_LOG_DEBUG("GFX thread, temp : %0.2f °C, press : %0.2f hPa, battery(%s) : %u mV <-> %u %%",
temperature, temperature,
pressure/100, pressure/100,
battery_voltage, battery_controller_status_2_str(watch_peripherals_get_battery_controller_status()),
battery_percentage); _battery_stats.battery_voltage,
_battery_stats.battery_percentage);
//APP_LOG_DEBUG("Scanning WiFi : %d", tls_wifi_scan()); //APP_LOG_DEBUG("Scanning WiFi : %d", tls_wifi_scan());
update_tick = lv_tick_get();
aliveCounter = 0;
} }
/* Handle inactivity periods : */ /* Handle inactivity periods : */
if( persistency_get_settings()->display.sleep_timeout != 0 && if( persistency_get_settings()->display.display_delay_before_sleep != 0 &&
lv_disp_get_inactive_time(NULL) > (persistency_get_settings()->display.sleep_timeout * 1000)) lv_disp_get_inactive_time(NULL) > (persistency_get_settings()->display.display_delay_before_sleep * 5 * 1000))
{ {
// First, we disable the display backlight and we set all the peripherals in their low power mode // First, we disable the display backlight and we set all the peripherals in their low power mode
setBrightness(0); watch_peripherals_set_brightness(0);
//lcd_on(&LCDConfig, false); //lcd_on(&LCDConfig, false);
lcd_sleep(&LCDConfig, true); lcd_sleep(&LCDConfig, true);
QMC5883L_set_power_mode(Standby); QMC5883L_set_power_mode(Standby);
@ -384,9 +618,14 @@ void gfx_task(void *param)
QMC5883L_set_power_mode(Continuous); QMC5883L_set_power_mode(Continuous);
//lcd_on(&LCDConfig, true); //lcd_on(&LCDConfig, true);
lcd_sleep(&LCDConfig, false); lcd_sleep(&LCDConfig, false);
setBrightness(persistency_get_settings()->display.brightness); //watch_peripherals_set_brightness(persistency_get_settings()->display.display_brightness);
//lcd_on(&LCDConfig, false);
_perform_deferred_display_wake_up_set_timestamp();
} }
/* Will wake the display up after some ms to avoid seeing the second hand jumping */
_perform_deferred_display_wake_up(30);
/* Throttle CPU freq down when inactive to save power or to increase responsiveness */ /* Throttle CPU freq down when inactive to save power or to increase responsiveness */
tls_sys_clk clk; tls_sys_clk clk;
tls_sys_clk_get(&clk); tls_sys_clk_get(&clk);
@ -406,5 +645,37 @@ void gfx_task(void *param)
APP_LOG_DEBUG("CPU 160Mhz"); APP_LOG_DEBUG("CPU 160Mhz");
} }
} }
/* Handle any interrupts status */
if(_interrupts_statuses.battery_controller_status)
{
_interrupts_statuses.battery_controller_status = false;
//Let's refresh the battery percentage as well:
_battery_stats.battery_voltage = watch_peripherals_get_battery_voltage(battery_unit_mv);
_battery_stats.battery_percentage = battery_voltage_to_percentage(_battery_stats.battery_voltage);
watch_face_set_battery_indicator(&watchFace, _battery_stats.battery_percentage, watch_peripherals_get_battery_controller_status());
}
}
}
/* This handling logic should be moved somewhere ! I just don't know where yet ... */
static uint32_t _ticks = 0;
static bool _was_sleeping = false;
static void _perform_deferred_display_wake_up_set_timestamp(void)
{
_ticks = lv_tick_get();
_was_sleeping = true;
}
static void _perform_deferred_display_wake_up(uint8_t deferred_time_in_ms)
{
if(_was_sleeping && lv_tick_elaps(_ticks) > deferred_time_in_ms)
{
_was_sleeping = false;
lcd_on(&LCDConfig, true);
watch_peripherals_set_brightness(persistency_get_settings()->display.display_brightness);
} }
} }

View File

@ -4,6 +4,7 @@
#include "settings_screen.h" #include "settings_screen.h"
#include "watch_face.h" #include "watch_face.h"
#include "compass_screen.h" #include "compass_screen.h"
#include "translation.h"
#define array_size(array) (sizeof(array)/sizeof(array[0])) #define array_size(array) (sizeof(array)/sizeof(array[0]))
@ -60,10 +61,11 @@ void menu_screen_init(MenuScreen_t * const menuScreen)
static void menu_screen_add_item(lv_obj_t *scroll_item_container, uint8_t position, const lv_img_dsc_t *itemImg,const char *itemTitle, lv_event_cb_t itemClickEventCb) static void menu_screen_add_item(lv_obj_t *scroll_item_container, uint8_t position, const lv_img_dsc_t *itemImg,const char *itemTitle, lv_event_cb_t itemClickEventCb)
{ {
//We add the image button with the icon of the item //We add the image button with the icon of the item
lv_obj_t *item_btn = lv_imgbtn_create(scroll_item_container); lv_obj_t *item_btn = lv_img_create(scroll_item_container);
lv_obj_set_size(item_btn, itemImg->header.w, itemImg->header.h); lv_obj_set_size(item_btn, itemImg->header.w, itemImg->header.h);
lv_obj_add_flag(item_btn, LV_OBJ_FLAG_ADV_HITTEST | LV_OBJ_FLAG_CLICKABLE);
lv_obj_set_pos(item_btn, 42, 52 * position); lv_obj_set_pos(item_btn, 42, 52 * position);
lv_imgbtn_set_src(item_btn, LV_IMGBTN_STATE_RELEASED, NULL, itemImg, NULL); lv_img_set_src(item_btn, itemImg);
lv_obj_add_event_cb(item_btn, itemClickEventCb, LV_EVENT_CLICKED, (void *)(uint32_t)position); lv_obj_add_event_cb(item_btn, itemClickEventCb, LV_EVENT_CLICKED, (void *)(uint32_t)position);
//We add the click-able label with the title of the item //We add the click-able label with the title of the item
@ -105,12 +107,12 @@ void menu_screen_create(MenuScreen_t * const menuScreen)
menuScreen->display = lv_obj_create(NULL); menuScreen->display = lv_obj_create(NULL);
//We add the screen header //We add the screen header
common_screen_header_component(menuScreen->display, "Menu", 65); common_screen_header_component(menuScreen->display, "Menu", 50);
lv_obj_t *scroll_item_container = lv_obj_create(menuScreen->display); lv_obj_t *scroll_item_container = lv_obj_create(menuScreen->display);
lv_obj_set_style_bg_color(scroll_item_container, lv_color_make(0xFF,0xFF,0xFF), LV_PART_MAIN); lv_obj_set_style_bg_color(scroll_item_container, lv_color_make(0xFF,0xFF,0xFF), LV_PART_MAIN);
lv_obj_set_size(scroll_item_container, lv_pct(100), 240-65); lv_obj_set_size(scroll_item_container, lv_pct(100), 240-50);
lv_obj_set_pos(scroll_item_container, 0, 65); lv_obj_set_pos(scroll_item_container, 0, 50);
lv_obj_set_style_pad_all(scroll_item_container, 0, LV_PART_MAIN); lv_obj_set_style_pad_all(scroll_item_container, 0, LV_PART_MAIN);
lv_obj_set_style_pad_top(scroll_item_container, 10, LV_PART_MAIN); lv_obj_set_style_pad_top(scroll_item_container, 10, LV_PART_MAIN);
lv_obj_set_style_pad_bottom(scroll_item_container, 20, LV_PART_MAIN); lv_obj_set_style_pad_bottom(scroll_item_container, 20, LV_PART_MAIN);
@ -118,14 +120,14 @@ void menu_screen_create(MenuScreen_t * const menuScreen)
lv_obj_set_style_border_width(scroll_item_container, 0, LV_PART_MAIN); lv_obj_set_style_border_width(scroll_item_container, 0, LV_PART_MAIN);
lv_obj_set_style_pad_right(scroll_item_container, 15, LV_PART_SCROLLBAR); lv_obj_set_style_pad_right(scroll_item_container, 15, LV_PART_SCROLLBAR);
menu_screen_add_item(scroll_item_container, 0, &watch_menu_clock_icon, "Watch", &(menu_item_cb)); menu_screen_add_item(scroll_item_container, 0, &watch_menu_clock_icon, translation_get_word(TRANSLATION_WATCH), &(menu_item_cb));
menu_screen_add_item(scroll_item_container, 1, &watch_menu_compass_icon, "Compass", &(menu_item_cb)); menu_screen_add_item(scroll_item_container, 1, &watch_menu_compass_icon, translation_get_word(TRANSLATION_COMPASS), &(menu_item_cb));
menu_screen_add_item(scroll_item_container, 2, &watch_menu_alarm_icon, "Alarm", &(menu_item_cb)); menu_screen_add_item(scroll_item_container, 2, &watch_menu_alarm_icon, translation_get_word(TRANSLATION_ALARM), &(menu_item_cb));
menu_screen_add_item(scroll_item_container, 3, &watch_menu_messages_icon, "Text messages", &(menu_item_cb)); menu_screen_add_item(scroll_item_container, 3, &watch_menu_messages_icon, "Text messages", &(menu_item_cb));
menu_screen_add_item(scroll_item_container, 4, &watch_menu_mail_icon, "Mails", &(menu_item_cb)); menu_screen_add_item(scroll_item_container, 4, &watch_menu_mail_icon, "Mails", &(menu_item_cb));
menu_screen_add_item(scroll_item_container, 5, &watch_menu_dialer_icon, "Phone", &(menu_item_cb)); menu_screen_add_item(scroll_item_container, 5, &watch_menu_dialer_icon, "Phone", &(menu_item_cb));
menu_screen_add_item(scroll_item_container, 6, &watch_menu_contacts_icon, "Contacts", &(menu_item_cb)); menu_screen_add_item(scroll_item_container, 6, &watch_menu_contacts_icon, "Contacts", &(menu_item_cb));
menu_screen_add_item(scroll_item_container, 7, &watch_menu_settings_icon, "Settings", &(menu_item_cb)); menu_screen_add_item(scroll_item_container, 7, &watch_menu_settings_icon, translation_get_word(TRANSLATION_SETTINGS), &(menu_item_cb));
//We register the event callback to handle the cleanup //We register the event callback to handle the cleanup
lv_obj_add_event_cb(menuScreen->display, &(cleanup_event_cb), LV_EVENT_DELETE, menuScreen); lv_obj_add_event_cb(menuScreen->display, &(cleanup_event_cb), LV_EVENT_DELETE, menuScreen);

File diff suppressed because it is too large Load Diff

View File

@ -3,24 +3,73 @@
#include "lvgl.h" #include "lvgl.h"
typedef enum SettingMode
{
SETTING_MODE_GET = 0,
SETTING_MODE_SET
} SettingMode_e;
typedef struct SettingsScreenAPIInterface typedef struct SettingsScreenAPIInterface
{ {
void (*setBrightnessSettingsCb)(uint8_t brightness); void (*setTimeSettingsCb)(uint8_t *hour, uint8_t *minute, uint8_t *second, uint8_t *day, uint8_t *month, uint8_t *year, SettingMode_e mode);
void (*setTimeSettingsCb)(uint8_t hour, uint8_t minute, uint8_t second, uint8_t day, uint8_t month, uint8_t year); void (*setBrightnessSettingsCb)(uint8_t *brightness, SettingMode_e mode);
void (*setTimeoutSettingsCb)(uint8_t timeout); void (*setTimeoutSettingsCb)(uint8_t *timeout, SettingMode_e mode);
void (*setOrientationSettingsCb)(uint8_t orientation); void (*setOrientationSettingsCb)(uint8_t *orientation, SettingMode_e mode);
void (*setWristTiltSettingsCb)(bool *enabled, SettingMode_e mode);
void (*setDisplayVibrationDurationSettingsCb)(uint8_t *duration, SettingMode_e mode);
void (*setDisplayVibrationStrengthSettingsCb)(uint8_t *strength, SettingMode_e mode);
void (*setBLEEnabledSettingsCb)(bool *enabled, SettingMode_e mode);
void (*setWiFiEnabledSettingsCb)(bool *enabled, SettingMode_e mode);
void (*setLanguageSettingsCb)(uint8_t *language, SettingMode_e mode);
void (*getBLEDeviceNameCb)(const char **dev_name);
void (*getBatteryVoltageCb)(uint16_t *battery_voltage);
void (*saveSettingsCb)(void);
void (*factoryResetCb)(void);
} SettingsScreenAPIInterface_t; } SettingsScreenAPIInterface_t;
typedef struct SettingsScreen typedef struct SettingsScreen
{ {
SettingsScreenAPIInterface_t settingsScreenAPIInterface; SettingsScreenAPIInterface_t settingsScreenAPIInterface;
/* Menu list items */
lv_obj_t *time_and_date_item;
lv_obj_t *display_item;
lv_obj_t *notifications_item;
lv_obj_t *connectivity_item;
lv_obj_t *language_item;
lv_obj_t *about_item;
lv_obj_t *side_screen;
/* Menu widgets */
lv_obj_t *hour_roller; lv_obj_t *hour_roller;
lv_obj_t *minute_roller; lv_obj_t *minute_roller;
lv_obj_t *second_roller; lv_obj_t *second_roller;
lv_obj_t *checkbox_time_12H;
lv_obj_t *checkbox_time_24H;
lv_obj_t *day_roller; lv_obj_t *day_roller;
lv_obj_t *month_roller; lv_obj_t *month_roller;
lv_obj_t *year_roller; lv_obj_t *year_roller;
lv_obj_t *wrist_tilt_switch;
lv_obj_t *ble_switch;
lv_obj_t *wifi_switch;
struct
{
lv_obj_t *current_time_label;
char current_time_text[20];
} currentTime;
struct
{
lv_obj_t *batteryVoltageLabel;
char batteryVoltageText[8];
} batteryVoltage;
/* Main screen */
lv_obj_t *display; lv_obj_t *display;
/* Other */
lv_timer_t *about_refresh_timer;
} SettingsScreen_t; } SettingsScreen_t;
void settings_screen_init(SettingsScreen_t * const settingsScreen); void settings_screen_init(SettingsScreen_t * const settingsScreen);
@ -31,6 +80,4 @@ void settings_screen_create(SettingsScreen_t * const settingsScreen);
void settings_screen_destroy(SettingsScreen_t * const settingsScreen); void settings_screen_destroy(SettingsScreen_t * const settingsScreen);
void settings_screen(void);
#endif //SETTINGS_SCREEN_H #endif //SETTINGS_SCREEN_H

View File

@ -4,6 +4,27 @@
#include <stdio.h> #include <stdio.h>
#include "app_log.h" #include "app_log.h"
LV_IMG_DECLARE(battery_low_icon)
LV_IMG_DECLARE(battery_charging_icon)
LV_IMG_DECLARE(battery_charged_icon)
static void _set_bluetooth_indicator(WatchFace_t * const watchFace)
{
switch(watchFace->bluetoothIndicator.bluetoothState)
{
case BLUETOOTH_STATE_ON:
lv_obj_set_style_img_recolor_opa(watchFace->bluetoothIndicator.bluetoothIcon, 185, LV_PART_MAIN);
lv_obj_clear_flag(watchFace->bluetoothIndicator.bluetoothIcon, LV_OBJ_FLAG_HIDDEN);
break;
case BLUETOOTH_STATE_CONNECTED:
lv_obj_set_style_img_recolor_opa(watchFace->bluetoothIndicator.bluetoothIcon, 0, LV_PART_MAIN);
lv_obj_clear_flag(watchFace->bluetoothIndicator.bluetoothIcon, LV_OBJ_FLAG_HIDDEN);
break;
default:
lv_obj_add_flag(watchFace->bluetoothIndicator.bluetoothIcon, LV_OBJ_FLAG_HIDDEN);
}
}
static void gesture_event_cb(lv_event_t * e) static void gesture_event_cb(lv_event_t * e)
{ {
WatchFace_t *watchFace = e->user_data; WatchFace_t *watchFace = e->user_data;
@ -17,6 +38,7 @@ static void gesture_event_cb(lv_event_t * e)
case LV_DIR_RIGHT: case LV_DIR_RIGHT:
LV_LOG_USER("GESTURE : RIGHT"); LV_LOG_USER("GESTURE : RIGHT");
// We delete the timer // We delete the timer
lv_timer_del(watchFace->batteryIndicator.lowBatteryAnimationTimer);
lv_timer_del(watchFace->handAnimationTimer); lv_timer_del(watchFace->handAnimationTimer);
// We create the menu screen and switch to it // We create the menu screen and switch to it
extern MenuScreen_t menuScreen; extern MenuScreen_t menuScreen;
@ -60,11 +82,17 @@ static void update_watch_hands_angles(WatchFace_t * const watchFace, uint8_t inc
//Don't forget to update the day date window //Don't forget to update the day date window
sprintf(watchFace->dateWindow.dateWindowText, "%s%d", watchFace->dateTime.tm_mday < 10 ? " " : "", watchFace->dateTime.tm_mday); sprintf(watchFace->dateWindow.dateWindowText, "%s%d", watchFace->dateTime.tm_mday < 10 ? " " : "", watchFace->dateTime.tm_mday);
lv_obj_invalidate(watchFace->dateWindow.dateWindowWidget); lv_label_set_text_static(watchFace->dateWindow.dateWindowWidget, watchFace->dateWindow.dateWindowText);
APP_LOG_DEBUG("Syncing time"); APP_LOG_DEBUG("Syncing time");
if(watchFace->batteryIndicatorCb) if(watchFace->batteryIndicatorCb)
watch_face_set_battery_indicator(watchFace, watchFace->batteryIndicatorCb()); {
uint8_t levelInPercent = 0;
BatteryState_e batteryState = BATTERY_STATE_DISCHARGING;
watchFace->batteryIndicatorCb(&levelInPercent, &batteryState);
watch_face_set_battery_indicator(watchFace, levelInPercent, batteryState);
}
} }
else else
{ {
@ -93,6 +121,57 @@ static void hand_timer_anim_cb(lv_timer_t *timer)
update_watch_hands_angles(watchFace, 12); update_watch_hands_angles(watchFace, 12);
} }
static void battery_timer_anim_cb(lv_timer_t *timer)
{
WatchFace_t *watchFace = timer->user_data;
if(lv_obj_has_flag(watchFace->batteryIndicator.batteryIcon, LV_OBJ_FLAG_HIDDEN))
{
lv_obj_clear_flag(watchFace->batteryIndicator.batteryIcon, LV_OBJ_FLAG_HIDDEN);
}
else
{
lv_obj_add_flag(watchFace->batteryIndicator.batteryIcon, LV_OBJ_FLAG_HIDDEN);
}
}
static void set_battery_state_icon(WatchFace_t * const watchFace)
{
switch(watchFace->batteryIndicator.batteryState)
{
case BATTERY_STATE_CHARGING:
lv_timer_pause(watchFace->batteryIndicator.lowBatteryAnimationTimer);
lv_obj_clear_flag(watchFace->batteryIndicator.batteryIcon, LV_OBJ_FLAG_HIDDEN);
lv_img_set_src(watchFace->batteryIndicator.batteryIcon, &battery_charging_icon);
break;
case BATTERY_STATE_CHARGED:
lv_timer_pause(watchFace->batteryIndicator.lowBatteryAnimationTimer);
lv_obj_clear_flag(watchFace->batteryIndicator.batteryIcon, LV_OBJ_FLAG_HIDDEN);
lv_img_set_src(watchFace->batteryIndicator.batteryIcon, &battery_charged_icon);
break;
default:
lv_obj_add_flag(watchFace->batteryIndicator.batteryIcon, LV_OBJ_FLAG_HIDDEN);
lv_img_set_src(watchFace->batteryIndicator.batteryIcon, &battery_low_icon);
break;
}
}
static void hide_hour_and_minutes_hand_cb(lv_event_t *e)
{
WatchFace_t *watchFace = e->user_data;
if(lv_obj_has_flag(watchFace->hourHand.handImg, LV_OBJ_FLAG_HIDDEN))
{
lv_obj_clear_flag(watchFace->hourHand.handImg, LV_OBJ_FLAG_HIDDEN);
lv_obj_clear_flag(watchFace->minuteHand.handImg, LV_OBJ_FLAG_HIDDEN);
}
else
{
lv_obj_add_flag(watchFace->hourHand.handImg, LV_OBJ_FLAG_HIDDEN);
lv_obj_add_flag(watchFace->minuteHand.handImg, LV_OBJ_FLAG_HIDDEN);
}
}
void watch_face_init(WatchFace_t * const watchFace) void watch_face_init(WatchFace_t * const watchFace)
{ {
if(!watchFace) if(!watchFace)
@ -101,6 +180,7 @@ void watch_face_init(WatchFace_t * const watchFace)
return; return;
} }
memset(watchFace, 0, sizeof(WatchFace_t)); memset(watchFace, 0, sizeof(WatchFace_t));
strcpy(watchFace->stepCounter.text, "0");
} }
void watch_face_register_date_time_cb(WatchFace_t * const watchFace, DateTimeCb_t dateTimeCb) void watch_face_register_date_time_cb(WatchFace_t * const watchFace, DateTimeCb_t dateTimeCb)
@ -139,7 +219,8 @@ void watch_face_create(WatchFace_t * const watchFace)
LV_IMG_DECLARE(watch_casio_minute_hand_asset) LV_IMG_DECLARE(watch_casio_minute_hand_asset)
LV_IMG_DECLARE(watch_casio_second_hand_asset) LV_IMG_DECLARE(watch_casio_second_hand_asset)
LV_IMG_DECLARE(watch_casio_medium_hand_asset) LV_IMG_DECLARE(watch_casio_medium_hand_asset)
LV_IMG_DECLARE(watch_casio_small_hand_asset) //LV_IMG_DECLARE(watch_casio_small_hand_asset)
LV_IMG_DECLARE(bluetooth_icon)
//We create our parent screen : //We create our parent screen :
if(watchFace->display) if(watchFace->display)
@ -148,34 +229,35 @@ void watch_face_create(WatchFace_t * const watchFace)
lv_obj_del(watchFace->display); lv_obj_del(watchFace->display);
watchFace->display = NULL; watchFace->display = NULL;
} }
watchFace->display = lv_obj_create(NULL); //Our display is the watch face image :
watchFace->display = lv_img_create(NULL);
lv_img_set_src(watchFace->display, &watch_casio_face_asset);
lv_obj_set_style_bg_color(watchFace->display, lv_color_black(), LV_PART_MAIN); lv_obj_set_style_bg_color(watchFace->display, lv_color_black(), LV_PART_MAIN);
//We load our assets : lv_obj_add_event_cb(watchFace->display, &(hide_hour_and_minutes_hand_cb), LV_EVENT_LONG_PRESSED, watchFace);
lv_obj_t *watchFaceImg = lv_img_create(watchFace->display);
lv_img_set_src(watchFaceImg, &watch_casio_face_asset);
lv_obj_t *smallHandImg = lv_img_create(watchFace->display); //We load our other assets :
/*lv_obj_t *smallHandImg = lv_img_create(watchFace->display);
lv_img_set_src(smallHandImg, &watch_casio_small_hand_asset); lv_img_set_src(smallHandImg, &watch_casio_small_hand_asset);
lv_obj_set_pos(smallHandImg, 69, 98); lv_obj_set_pos(smallHandImg, 69, 98);
lv_img_set_pivot(smallHandImg, 4, 20); lv_img_set_pivot(smallHandImg, 4, 20);*/
//Battery arc is created here //Battery arc is created here
if(watchFace->batteryIndicator.battery_arc) if(watchFace->batteryIndicator.batteryArc)
{ {
LV_LOG_ERROR("battery_arc should be NULL here !"); LV_LOG_ERROR("batteryArc should be NULL here !");
lv_obj_del(watchFace->batteryIndicator.battery_arc); lv_obj_del(watchFace->batteryIndicator.batteryArc);
watchFace->batteryIndicator.battery_arc = NULL; watchFace->batteryIndicator.batteryArc = NULL;
} }
watchFace->batteryIndicator.battery_arc = lv_arc_create(watchFace->display); watchFace->batteryIndicator.batteryArc = lv_arc_create(watchFace->display);
lv_obj_remove_style(watchFace->batteryIndicator.battery_arc, NULL, LV_PART_KNOB); lv_obj_remove_style(watchFace->batteryIndicator.batteryArc, NULL, LV_PART_KNOB);
lv_obj_clear_flag(watchFace->batteryIndicator.battery_arc, LV_OBJ_FLAG_CLICKABLE); lv_obj_clear_flag(watchFace->batteryIndicator.batteryArc, LV_OBJ_FLAG_CLICKABLE);
lv_obj_set_size(watchFace->batteryIndicator.battery_arc, 60, 60); lv_obj_set_size(watchFace->batteryIndicator.batteryArc, 60, 60);
lv_obj_align(watchFace->batteryIndicator.battery_arc, LV_ALIGN_CENTER, -1, 45); lv_obj_align(watchFace->batteryIndicator.batteryArc, LV_ALIGN_CENTER, -1, 45);
lv_obj_set_style_arc_width(watchFace->batteryIndicator.battery_arc, 5, LV_PART_INDICATOR); lv_obj_set_style_arc_width(watchFace->batteryIndicator.batteryArc, 5, LV_PART_INDICATOR);
lv_obj_set_style_arc_width(watchFace->batteryIndicator.battery_arc, 0, LV_PART_MAIN); lv_obj_set_style_arc_width(watchFace->batteryIndicator.batteryArc, 0, LV_PART_MAIN);
lv_obj_set_style_arc_color(watchFace->batteryIndicator.battery_arc, lv_color_make(228, 233, 236), LV_PART_INDICATOR); lv_obj_set_style_arc_color(watchFace->batteryIndicator.batteryArc, lv_color_make(228, 233, 236), LV_PART_INDICATOR);
lv_arc_set_value(watchFace->batteryIndicator.battery_arc, 100); lv_arc_set_value(watchFace->batteryIndicator.batteryArc, 100);
if(watchFace->batteryIndicator.label) if(watchFace->batteryIndicator.label)
{ {
@ -188,9 +270,57 @@ void watch_face_create(WatchFace_t * const watchFace)
strcpy(watchFace->batteryIndicator.text, "100 %"); strcpy(watchFace->batteryIndicator.text, "100 %");
lv_label_set_text_static(watchFace->batteryIndicator.label, watchFace->batteryIndicator.text); lv_label_set_text_static(watchFace->batteryIndicator.label, watchFace->batteryIndicator.text);
lv_obj_set_style_text_color(watchFace->batteryIndicator.label, lv_color_white(), LV_PART_MAIN); lv_obj_set_style_text_color(watchFace->batteryIndicator.label, lv_color_white(), LV_PART_MAIN);
lv_obj_align_to(watchFace->batteryIndicator.label, watchFace->batteryIndicator.battery_arc, LV_ALIGN_CENTER, 0, 0); lv_obj_align_to(watchFace->batteryIndicator.label, watchFace->batteryIndicator.batteryArc, LV_ALIGN_CENTER, 0, -5);
// Battery icon is created here
if(watchFace->batteryIndicator.batteryIcon)
{
LV_LOG_ERROR("batteryIcon should be NULL here !");
lv_obj_del(watchFace->batteryIndicator.batteryIcon);
watchFace->batteryIndicator.batteryIcon = NULL;
}
watchFace->batteryIndicator.batteryIcon = lv_img_create(watchFace->display);
set_battery_state_icon(watchFace);
lv_img_set_zoom(watchFace->batteryIndicator.batteryIcon, 141);
lv_obj_align_to(watchFace->batteryIndicator.batteryIcon, watchFace->batteryIndicator.label, LV_ALIGN_OUT_BOTTOM_MID, 0, -9);
if(watchFace->batteryIndicator.lowBatteryAnimationTimer)
{
LV_LOG_ERROR("battery animation timer should be NULL here !");
lv_timer_del(watchFace->batteryIndicator.lowBatteryAnimationTimer);
watchFace->batteryIndicator.lowBatteryAnimationTimer = NULL;
}
watchFace->batteryIndicator.lowBatteryAnimationTimer = lv_timer_create(&(battery_timer_anim_cb), 500, watchFace);
lv_timer_pause(watchFace->batteryIndicator.lowBatteryAnimationTimer);
// Bluetooth status icon is created here
if(watchFace->bluetoothIndicator.bluetoothIcon)
{
LV_LOG_ERROR("bluetoothIcon be NULL here !");
lv_obj_del(watchFace->bluetoothIndicator.bluetoothIcon);
watchFace->bluetoothIndicator.bluetoothIcon = NULL;
}
watchFace->bluetoothIndicator.bluetoothIcon = lv_img_create(watchFace->display);
lv_img_set_src(watchFace->bluetoothIndicator.bluetoothIcon, &bluetooth_icon);
lv_img_set_zoom(watchFace->bluetoothIndicator.bluetoothIcon, 128);
lv_obj_add_flag(watchFace->bluetoothIndicator.bluetoothIcon, LV_OBJ_FLAG_HIDDEN);
lv_obj_set_style_img_recolor(watchFace->bluetoothIndicator.bluetoothIcon, lv_palette_main(LV_PALETTE_GREY), LV_PART_MAIN);
lv_obj_align_to(watchFace->bluetoothIndicator.bluetoothIcon, watchFace->batteryIndicator.batteryArc, LV_ALIGN_OUT_LEFT_BOTTOM, -9, 0);
_set_bluetooth_indicator(watchFace);
// StepCounter label is created here
if(watchFace->stepCounter.label)
{
LV_LOG_ERROR("stepCounter should be NULL here !");
lv_obj_del(watchFace->stepCounter.label);
watchFace->stepCounter.label = NULL;
}
watchFace->stepCounter.label = lv_label_create(watchFace->display);
lv_label_set_text_static(watchFace->stepCounter.label, watchFace->stepCounter.text);
lv_obj_set_style_text_color(watchFace->stepCounter.label, lv_color_white(), LV_PART_MAIN);
lv_obj_set_pos(watchFace->stepCounter.label, 63, 111);
if(watchFace->mediumHand24h.handImg) if(watchFace->mediumHand24h.handImg)
{ {
@ -259,6 +389,9 @@ void watch_face_create(WatchFace_t * const watchFace)
//We set the appropriate angles to each of the hands //We set the appropriate angles to each of the hands
update_watch_hands_angles(watchFace, 0); update_watch_hands_angles(watchFace, 0);
//Don't forget to make the background image clickable to be able to use gestures on it.
lv_obj_add_flag(watchFace->display, LV_OBJ_FLAG_CLICKABLE);
//We register the event callback to handle gestures //We register the event callback to handle gestures
lv_obj_add_event_cb(watchFace->display, &(gesture_event_cb), LV_EVENT_GESTURE, watchFace); lv_obj_add_event_cb(watchFace->display, &(gesture_event_cb), LV_EVENT_GESTURE, watchFace);
//We register the event callback to handle the cleanup //We register the event callback to handle the cleanup
@ -275,20 +408,7 @@ void watch_face_create(WatchFace_t * const watchFace)
watchFace->handAnimationTimer = lv_timer_create(&(hand_timer_anim_cb), 199, watchFace); watchFace->handAnimationTimer = lv_timer_create(&(hand_timer_anim_cb), 199, watchFace);
} }
void watch_face_force_sync(WatchFace_t *const watchFace) void watch_face_set_battery_indicator(WatchFace_t * const watchFace, uint8_t levelInPercent, BatteryState_e batteryState)
{
if(!watchFace)
{
LV_LOG_ERROR("NULL pointer given !");
return;
}
if(!watchFace->display) return;
update_watch_hands_angles(watchFace, 0);
}
void watch_face_set_battery_indicator(WatchFace_t * const watchFace, uint8_t percentage)
{ {
if(!watchFace) if(!watchFace)
{ {
@ -300,18 +420,73 @@ void watch_face_set_battery_indicator(WatchFace_t * const watchFace, uint8_t per
lv_color_t arc_color = lv_color_make(228, 233, 236); lv_color_t arc_color = lv_color_make(228, 233, 236);
if(percentage <= 10) if(levelInPercent <= 10)
arc_color = lv_color_make(228, 33, 81); arc_color = lv_color_make(228, 33, 81);
else if(percentage <= 30) else if(levelInPercent <= 30)
arc_color = lv_color_make(247, 148, 29); arc_color = lv_color_make(247, 148, 29);
else if(percentage <= 50) else if(levelInPercent <= 50)
arc_color = lv_color_make(226, 175, 58); arc_color = lv_color_make(226, 175, 58);
lv_arc_set_value(watchFace->batteryIndicator.battery_arc, percentage); lv_arc_set_value(watchFace->batteryIndicator.batteryArc, levelInPercent);
lv_obj_set_style_arc_color(watchFace->batteryIndicator.battery_arc, arc_color, LV_PART_INDICATOR); lv_obj_set_style_arc_color(watchFace->batteryIndicator.batteryArc, arc_color, LV_PART_INDICATOR);
sprintf(watchFace->batteryIndicator.text, "%u %%", percentage); sprintf(watchFace->batteryIndicator.text, "%u %%", levelInPercent);
lv_label_set_text_static(watchFace->batteryIndicator.label, watchFace->batteryIndicator.text); lv_label_set_text_static(watchFace->batteryIndicator.label, watchFace->batteryIndicator.text);
lv_obj_align_to(watchFace->batteryIndicator.label, watchFace->batteryIndicator.battery_arc, LV_ALIGN_CENTER, 0, 0); lv_obj_align_to(watchFace->batteryIndicator.label, watchFace->batteryIndicator.batteryArc, LV_ALIGN_CENTER, 0, -5);
//We save the new battery state only if it's different, this allows to have a trigger when it changes :
if(watchFace->batteryIndicator.batteryState != batteryState)
{
watchFace->batteryIndicator.batteryState = batteryState;
set_battery_state_icon(watchFace);
}
//Finally we check if it's time to show the battery low indicator by enabling it's timer
if(levelInPercent <= 10 && watchFace->batteryIndicator.batteryState == BATTERY_STATE_DISCHARGING)
{
lv_timer_resume(watchFace->batteryIndicator.lowBatteryAnimationTimer);
}
else if(watchFace->batteryIndicator.batteryState == BATTERY_STATE_DISCHARGING)
{
lv_timer_pause(watchFace->batteryIndicator.lowBatteryAnimationTimer);
lv_obj_add_flag(watchFace->batteryIndicator.batteryIcon, LV_OBJ_FLAG_HIDDEN);
}
}
void watch_face_set_bluetooth_indicator(WatchFace_t * const watchFace, BluetoothState_e bluetoothState)
{
if(!watchFace)
{
LV_LOG_ERROR("NULL pointer given !");
return;
}
if(watchFace->bluetoothIndicator.bluetoothState == bluetoothState) return;
watchFace->bluetoothIndicator.bluetoothState = bluetoothState;
if(!watchFace->display) return;
_set_bluetooth_indicator(watchFace);
}
void watch_face_set_step_count_indicator(WatchFace_t * const watchFace, uint32_t step_count)
{
if(!watchFace)
{
LV_LOG_ERROR("NULL pointer given !");
return;
}
if(step_count < 1000)
sprintf(watchFace->stepCounter.text, "%u", step_count);
else if(step_count < 9996)
sprintf(watchFace->stepCounter.text, "%.2fk", step_count/1000.0);
else
sprintf(watchFace->stepCounter.text, "%.1fk", step_count/1000.0);
if(!watchFace->display) return;
lv_label_set_text_static(watchFace->stepCounter.label, watchFace->stepCounter.text);
} }
void watch_face_destroy(WatchFace_t * const watchFace) void watch_face_destroy(WatchFace_t * const watchFace)
@ -329,7 +504,34 @@ void watch_face_destroy(WatchFace_t * const watchFace)
watchFace->minuteHand.handImg = NULL; watchFace->minuteHand.handImg = NULL;
watchFace->secondHand.handImg = NULL; watchFace->secondHand.handImg = NULL;
watchFace->mediumHand24h.handImg = NULL; watchFace->mediumHand24h.handImg = NULL;
watchFace->batteryIndicator.battery_arc = NULL; watchFace->batteryIndicator.batteryArc = NULL;
watchFace->batteryIndicator.label = NULL; watchFace->batteryIndicator.label = NULL;
watchFace->batteryIndicator.batteryIcon = NULL;
watchFace->batteryIndicator.lowBatteryAnimationTimer = NULL;
watchFace->stepCounter.label = NULL;
watchFace->bluetoothIndicator.bluetoothIcon = NULL;
} }
void watch_face_force_sync(WatchFace_t *const watchFace)
{
if(!watchFace)
{
LV_LOG_ERROR("NULL pointer given !");
return;
}
if(!watchFace->display) return;
update_watch_hands_angles(watchFace, 0);
}
bool watch_face_is_in_use(WatchFace_t * const watchFace)
{
if(!watchFace)
{
LV_LOG_ERROR("NULL pointer given !");
return false;
}
return watchFace->display != NULL;
}

View File

@ -4,8 +4,23 @@
#include "lvgl.h" #include "lvgl.h"
#include <time.h> #include <time.h>
typedef enum BatteryState
{
BATTERY_STATE_DISCHARGING = 0,
BATTERY_STATE_CHARGING,
BATTERY_STATE_CHARGED,
} BatteryState_e;
typedef enum BluetoothState
{
BLUETOOTH_STATE_OFF = 0,
BLUETOOTH_STATE_ON,
BLUETOOTH_STATE_CONNECTED
} BluetoothState_e;
typedef void (*DateTimeCb_t)(struct tm * const dateTime); typedef void (*DateTimeCb_t)(struct tm * const dateTime);
typedef uint8_t (*BatteryIndicatorCb_t)(void);
typedef void (*BatteryIndicatorCb_t)(uint8_t *levelInPercent, BatteryState_e *batteryState);
typedef struct DateWindow typedef struct DateWindow
{ {
@ -22,10 +37,25 @@ typedef struct WatchHand
typedef struct BatteryIndicator typedef struct BatteryIndicator
{ {
lv_obj_t *label; lv_obj_t *label;
lv_obj_t *battery_arc; lv_obj_t *batteryArc;
lv_obj_t *batteryIcon;
lv_timer_t *lowBatteryAnimationTimer;
char text[7]; char text[7];
BatteryState_e batteryState:2;
} BatteryIndicator_t; } BatteryIndicator_t;
typedef struct BluetoothIndicator
{
lv_obj_t *bluetoothIcon;
BluetoothState_e bluetoothState;
} BluetoothIndicator_t;
typedef struct StepCounter
{
lv_obj_t *label;
char text[7];
} StepCounter_t;
/* Watch face context object */ /* Watch face context object */
typedef struct WatchFace typedef struct WatchFace
{ {
@ -39,7 +69,8 @@ typedef struct WatchFace
lv_obj_t *display; lv_obj_t *display;
DateWindow_t dateWindow; DateWindow_t dateWindow;
BatteryIndicator_t batteryIndicator; BatteryIndicator_t batteryIndicator;
StepCounter_t stepCounter;
BluetoothIndicator_t bluetoothIndicator;
struct tm dateTime; struct tm dateTime;
} WatchFace_t; } WatchFace_t;
@ -76,7 +107,31 @@ void watch_face_create(WatchFace_t * const watchFace);
* @param watchFace a pointer to the watch face context structure. * @param watchFace a pointer to the watch face context structure.
* @param percentage the value to set the indicator to in percent. * @param percentage the value to set the indicator to in percent.
*/ */
void watch_face_set_battery_indicator(WatchFace_t * const watchFace, uint8_t percentage);
/**
* @brief Sets the battery level in percent as well as it's current state to draw on the watch face.
*
* @param watchFace a pointer to the watch face context structure.
* @param levelInPercent the level to set the indicator to in percent.
* @param batteryState the current state of the battery : BATTERY_STATE_DISCHARGING, BATTERY_STATE_CHARGING or BATTERY_STATE_CHARGED
*/
void watch_face_set_battery_indicator(WatchFace_t * const watchFace, uint8_t levelInPercent, BatteryState_e batteryState);
/**
* @brief Sets the current bluetooth state to display on the watch face
*
* @param watchFace a pointer to the watch face context structure.
* @param bluetoothState the state of the bluetooth modem to show, can be : BLUETOOTH_STATE_OFF, BLUETOOTH_STATE_ON or BLUETOOTH_STATE_CONNECTED
*/
void watch_face_set_bluetooth_indicator(WatchFace_t * const watchFace, BluetoothState_e bluetoothState);
/**
* @brief Shows the current step count passed as parameter on the watch face.
*
* @param watchFace a pointer to the watch face context structure.
* @param step_count the step count to show on the watch face.
*/
void watch_face_set_step_count_indicator(WatchFace_t * const watchFace, uint32_t step_count);
/** /**
* @brief Forces the watch face to sync up with the RTC by calling the provided date_time_cb * @brief Forces the watch face to sync up with the RTC by calling the provided date_time_cb
@ -85,6 +140,15 @@ void watch_face_set_battery_indicator(WatchFace_t * const watchFace, uint8_t per
*/ */
void watch_face_force_sync(WatchFace_t * const watchFace); void watch_face_force_sync(WatchFace_t * const watchFace);
/**
* @brief Returns true if the watch face screen is currently being used and displayed.
*
* @param watchFace a pointer to the watch face context structure.
* @return true if the watch face screen is being used
* @return false if the watch face screen is not being used/displayed currently
*/
bool watch_face_is_in_use(WatchFace_t * const watchFace);
/** /**
* @brief Frees all resources used by the WatchFace object * @brief Frees all resources used by the WatchFace object
* *

View File

@ -38,9 +38,13 @@ void user_task_main(void *param)
if(buf) if(buf)
{ {
UBaseType_t writtenSize = vTaskList((char *)buf, 800); UBaseType_t writtenSize = vTaskList((char *)buf, 800);
APP_LOG_INFO("Available RAM (bytes)/Total RAM (bytes) : %u/%u"NEW_LINE"Reset reason : %d"NEW_LINE"Clk : apb(%u), cpu(%u), wlan(%u)"NEW_LINE"Tasks (%lu) :"NEW_LINE, APP_LOG_INFO("Available RAM (bytes)/Total RAM (bytes) : %u/%u"NEW_LINE
tls_mem_get_avail_heapsize(), "FreeRTOS free heap/total heap : %u/%u byte(s)"NEW_LINE
total_mem_size, "Reset reason : %d"NEW_LINE
"Clk : apb(%u), cpu(%u), wlan(%u)"NEW_LINE
"Tasks (%lu) :"NEW_LINE,
tls_mem_get_avail_heapsize(), total_mem_size,
xPortGetFreeHeapSize(), configTOTAL_HEAP_SIZE,
tls_sys_get_reboot_reason(), tls_sys_get_reboot_reason(),
clk.apbclk, clk.cpuclk, clk.wlanclk, clk.apbclk, clk.cpuclk, clk.wlanclk,
writtenSize); writtenSize);

View File

@ -1,13 +1,210 @@
#include "watch_settings.h" #include "watch_settings.h"
#include "wm_internal_flash.h"
#include "app_log.h"
#include "translation.h"
/* WatchSetting object with default values */ /**
static WatchSettings_t watchSettings = * @brief WatchSetting object with default values.
*
* @note Used to restore factory settings for example or as default values when first start.
*/
static const WatchSettings_t defaultWatchSettings =
{ {
.timeAndDate = {.hour_format = 0, .date_format = 0, .automatic_time_and_date = 0},
.display = {.brightness = 255, .sleep_timeout = 0,}, .first_time_init = false,
.timeAndDate = {
.time_and_date_hour_format = 0,
.time_and_date_date_format = 0,
.time_and_date_automatic = 0,
},
.display = {
.display_brightness = 200,
.display_delay_before_sleep = 0,
.display_orientation = LCD_ORIENTATION_DEFAULT,
.display_vibrate_on_touch_duration = 0,
.display_vibrate_on_touch_strength = 6,
.display_wrist_wakeup = true,
},
.notification = {
.notification_vibration_duration = 3,
.notification_vibration_strength = 6,
.vibrate_on_email = true,
.vibrate_on_sms = true,
},
.connectivity = {
.connectivity_ble_enabled = false,
.connectivity_wifi_enabled = false,
},
.languageAndUI = {
.language = TRANSLATION_ENGLISH,
},
}; };
/**
* @brief Actual watchSettings object which can change and lives in RAM memory.
*
*/
static WatchSettings_t watchSettings;
/**
* @brief Internal variable used to know if something has to be saved or not because some settings changed.
*
* @note This is designed to prevent excessive wear and tear on the flash.
*
*/
static bool _params_changed = false;
void watch_settings_time_and_date_set_hour_format(bool hour_24H_format)
{
watchSettings.timeAndDate.time_and_date_hour_format = hour_24H_format;
_params_changed = true;
}
void watch_settings_time_and_date_set_date_format(uint8_t date_format)
{
watchSettings.timeAndDate.time_and_date_date_format = date_format;
_params_changed = true;
}
void watch_settings_time_and_date_set_automatic(bool automatic)
{
watchSettings.timeAndDate.time_and_date_automatic = automatic;
_params_changed = true;
}
void watch_settings_display_set_brightness(uint8_t brightness)
{
watchSettings.display.display_brightness = brightness;
_params_changed = true;
}
void watch_settings_display_set_delay_before_sleep(uint8_t delay)
{
watchSettings.display.display_delay_before_sleep = delay;
_params_changed = true;
}
void watch_settings_display_set_orientation(LCDOrientation_e orientation)
{
watchSettings.display.display_orientation = orientation;
_params_changed = true;
}
void watch_settings_display_set_wrist_wakeup(bool wakeup)
{
watchSettings.display.display_wrist_wakeup = wakeup;
_params_changed = true;
}
void watch_settings_display_set_vibrate_on_touch_strength(uint8_t level)
{
watchSettings.display.display_vibrate_on_touch_strength = level;
_params_changed = true;
}
void watch_settings_display_set_vibrate_on_touch_duration(uint8_t duration)
{
watchSettings.display.display_vibrate_on_touch_duration = duration;
_params_changed = true;
}
void watch_settings_notification_set_vibration_strength(uint8_t level)
{
watchSettings.notification.notification_vibration_strength = level;
_params_changed = true;
}
void watch_settings_notification_set_vibration_duration(uint8_t duration)
{
watchSettings.notification.notification_vibration_duration = duration;
_params_changed = true;
}
void watch_settings_connectivity_set_ble_enabled(bool enabled)
{
watchSettings.connectivity.connectivity_ble_enabled = enabled;
_params_changed = true;
}
void watch_settings_connectivity_set_wifi_enabled(bool enabled)
{
watchSettings.connectivity.connectivity_wifi_enabled = enabled;
_params_changed = true;
}
void watch_settings_language_and_UI_set_language(TranslationLanguage_e language)
{
watchSettings.languageAndUI.language = language;
_params_changed = true;
}
void persistency_init(void)
{
memcpy(&watchSettings, &defaultWatchSettings, sizeof(WatchSettings_t));
}
WatchSettings_t *persistency_get_settings(void) WatchSettings_t *persistency_get_settings(void)
{ {
return &watchSettings; return &watchSettings;
} }
bool persistency_save_settings_to_flash(void)
{
if(!_params_changed)
{
APP_LOG_INFO("Nothing to save, no params changed");
return true;
}
uint8_t status = TLS_FLS_STATUS_OK;
if(TLS_FLS_STATUS_OK != (status = tls_fls_write(WATCH_SETTINGS_FLASH_STORAGE_ADDRESS, (uint8_t *) &watchSettings, sizeof watchSettings)))
{
APP_LOG_ERROR("Failed to write settings to flash : %u", status);
return false;
}
// Don't forget to reset the state variable here
_params_changed = false;
return true;
}
bool persistency_load_settings_from_flash(void)
{
uint8_t status = TLS_FLS_STATUS_OK;
if(TLS_FLS_STATUS_OK != (status = tls_fls_read(WATCH_SETTINGS_FLASH_STORAGE_ADDRESS, (uint8_t *) &watchSettings, sizeof watchSettings)))
{
APP_LOG_ERROR("Failed to read settings to flash : %u", status);
return false;
}
// If it is the first time that we read the settings from flash,
// we load the factory ones instead and we save'em.
if(watchSettings.first_time_init)
{
persistency_factory_reset();
return persistency_save_settings_to_flash();
}
return true;
}
void persistency_factory_reset(void)
{
memcpy(&watchSettings, &defaultWatchSettings, sizeof(WatchSettings_t));
_params_changed = true;
}
void persistency_debug(void)
{
uint32_t *p = (uint32_t *)&watchSettings;
APP_LOG_DEBUG("%u %u %u %u %u %u",
p[0],
p[1],
p[2],
p[3],
p[4],
p[5]);
}

View File

@ -2,48 +2,228 @@
#define WATCH_SETTINGS_H #define WATCH_SETTINGS_H
#include "wm_type_def.h" #include "wm_type_def.h"
#include "lcd.h"
#include "translation.h"
/* Time and Date Settings */ /**
* @brief The address in flash storage where the settings are saved
*
*/
#define WATCH_SETTINGS_FLASH_STORAGE_ADDRESS (0x1E0000)
/**
* @brief Time and Date Settings
*
*/
typedef struct TimeAndDate typedef struct TimeAndDate
{ {
uint32_t hour_format:1; uint32_t time_and_date_hour_format:1,
uint32_t date_format:2; time_and_date_date_format:2,
uint32_t automatic_time_and_date:1; time_and_date_automatic:1;
} TimeAndDate_t; } TimeAndDate_t;
/* Display Settings */ /**
* @brief Display Settings
*
*/
typedef struct Display typedef struct Display
{ {
uint8_t brightness; uint32_t display_brightness:8,
uint8_t sleep_timeout; display_delay_before_sleep:4,
uint8_t orientation:2; display_orientation:2,
display_wrist_wakeup:1,
display_vibrate_on_touch_strength:3,
display_vibrate_on_touch_duration:3;
} Display_t; } Display_t;
/* Connectivity Settings */ /**
* @brief Notification Settings
*
*/
typedef struct Notification
{
uint32_t vibrate_on_sms:1,
vibrate_on_email:1,
notification_vibration_strength:3,
notification_vibration_duration:3;
} Notification_t;
/**
* @brief Connectivity Settings
*
*/
typedef struct Connectivity typedef struct Connectivity
{ {
uint32_t connectivity_ble_enabled:1,
connectivity_wifi_enabled:1;
} Connectivity_t; } Connectivity_t;
/* Language and UI Settings */ /**
* @brief Language and UI Settings
*
* @note Languages : English, French and German will be available
*
*/
typedef struct LanguageAndUI typedef struct LanguageAndUI
{ {
uint32_t language:3;
} LanguageAndUI_t; } LanguageAndUI_t;
/* Main setting structure */ /**
* @brief Main setting structure
*
*/
typedef struct WatchSettings typedef struct WatchSettings
{ {
uint32_t first_time_init:1;
TimeAndDate_t timeAndDate; TimeAndDate_t timeAndDate;
Display_t display; Display_t display;
Notification_t notification;
Connectivity_t connectivity; Connectivity_t connectivity;
LanguageAndUI_t languageAndUI; LanguageAndUI_t languageAndUI;
} WatchSettings_t; } WatchSettings_t;
/**
* @brief
*
* @param hour_24H_format
*/
void watch_settings_time_and_date_set_hour_format(bool hour_24H_format);
/**
* @brief
*
* @param date_format
*/
void watch_settings_time_and_date_set_date_format(uint8_t date_format);
/**
* @brief
*
* @param automatic
*/
void watch_settings_time_and_date_set_automatic(bool automatic);
/**
* @brief
*
* @param brightness
*/
void watch_settings_display_set_brightness(uint8_t brightness);
/**
* @brief
*
* @param delay
*/
void watch_settings_display_set_delay_before_sleep(uint8_t delay);
/**
* @brief
*
* @param orientation
*/
void watch_settings_display_set_orientation(LCDOrientation_e orientation);
/**
* @brief
*
* @param wakeup
*/
void watch_settings_display_set_wrist_wakeup(bool wakeup);
/**
* @brief
*
* @param level
*/
void watch_settings_display_set_vibrate_on_touch_strength(uint8_t level);
/**
* @brief
*
* @param duration
*/
void watch_settings_display_set_vibrate_on_touch_duration(uint8_t duration);
/**
* @brief
*
* @param level
*/
void watch_settings_notification_set_vibration_strength(uint8_t level);
/**
* @brief
*
* @param duration
*/
void watch_settings_notification_set_vibration_duration(uint8_t duration);
/**
* @brief
*
* @param enabled
*/
void watch_settings_connectivity_set_ble_enabled(bool enabled);
/**
* @brief
*
* @param enabled
*/
void watch_settings_connectivity_set_wifi_enabled(bool enabled);
/**
* @brief
*
* @param language
*/
void watch_settings_language_and_UI_set_language(TranslationLanguage_e language);
/**
* @brief Initializes the persistency layer. Must be called first before any other persistency API functions.
*
*/
void persistency_init(void);
/**
* @brief Returns the watchSettings structure living in RAM
*
* @return WatchSettings_t* a pointer to the WatchSettings structure
*/
WatchSettings_t *persistency_get_settings(void); WatchSettings_t *persistency_get_settings(void);
bool persistency_save_settings(void); /**
* @brief Writes the current watchSettings settings to flash
*
* @return true on success
* @return false on failure
*/
bool persistency_save_settings_to_flash(void);
bool persistency_load_settings(void); /**
* @brief Reads the stored settings in the flash to put them in the watchSettings object
* which lives in RAM.
* @note If it is the first time that the settings are read from flash, this will also write default settings to it.
*
* @return true on success
* @return false on failure
*/
bool persistency_load_settings_from_flash(void);
/**
* @brief Reloads every settings of the watchSettings data structure with their default value.
* @note The call to this function DOES NOT save the new settings to flash.
* Call @ref persistency_save_settings_to_flash for that.
*
* @return true on success
* @return false on failure
*/
void persistency_factory_reset(void);
void persistency_debug(void);
#endif //WATCH_SETTINGS_H #endif //WATCH_SETTINGS_H

View File

@ -0,0 +1,15 @@
TOP_DIR = ../..
sinclude $(TOP_DIR)/tools/w800/conf.mk
ifndef PDIR
GEN_LIBS = libtranslation$(LIB_EXT)
endif
#DEFINES +=
sinclude $(TOP_DIR)/tools/w800/rules.mk
INCLUDES := $(INCLUDES) -I $(PDIR)include
PDIR := ../$(PDIR)
sinclude $(PDIR)Makefile

View File

@ -0,0 +1,39 @@
#include "wm_type_def.h"
#include "translation.h"
#include "watch_settings.h"
static const char * const translation_dictionary[][TRANSLATED_LANGUAGES_COUNT] =
{
[TRANSLATION_WATCH] = {
[TRANSLATION_FRENCH] = "Montre",
[TRANSLATION_GERMAN] = "Uhr",
[TRANSLATION_ENGLISH]= "Watch"
},
[TRANSLATION_ALARM] = {
[TRANSLATION_FRENCH] = "Reveil",
[TRANSLATION_GERMAN] = "Wecker",
[TRANSLATION_ENGLISH]= "Alarm"
},
[TRANSLATION_COMPASS] = {
[TRANSLATION_FRENCH] = "Boussole",
[TRANSLATION_GERMAN] = "Kompass",
[TRANSLATION_ENGLISH]= "Compass"
},
[TRANSLATION_ALTIMETER] = {
[TRANSLATION_FRENCH] = "Altimetre",
[TRANSLATION_GERMAN] = "Hohenmesser",
[TRANSLATION_ENGLISH]= "Altimeter"
},
[TRANSLATION_SETTINGS] = {
[TRANSLATION_FRENCH] = "Parametres",
[TRANSLATION_GERMAN] = "Einstellungen",
[TRANSLATION_ENGLISH]= "Settings"
},
};
const char *translation_get_word(TranslationWord_e word)
{
uint8_t word_count = sizeof translation_dictionary / sizeof(*translation_dictionary);
uint8_t language = persistency_get_settings()->languageAndUI.language;
return translation_dictionary[word % word_count][language % TRANSLATED_LANGUAGES_COUNT];
}

View File

@ -0,0 +1,24 @@
#ifndef TRANSLATION_H
#define TRANSLATION_H
#define TRANSLATED_LANGUAGES_COUNT (3)
typedef enum TranslationLanguage
{
TRANSLATION_FRENCH = 0,
TRANSLATION_GERMAN,
TRANSLATION_ENGLISH
} TranslationLanguage_e;
typedef enum TranslationWord
{
TRANSLATION_WATCH = 0,
TRANSLATION_ALARM,
TRANSLATION_COMPASS,
TRANSLATION_ALTIMETER,
TRANSLATION_SETTINGS
} TranslationWord_e;
const char * translation_get_word(TranslationWord_e word);
#endif //TRANSLATION_H

View File

@ -58,6 +58,18 @@ void tls_set_rtc(struct tm *tblock);
*/ */
void tls_get_rtc(struct tm *tblock); void tls_get_rtc(struct tm *tblock);
/** NOT PART OF THE OFFICIAL SDK **/
/**
* @brief Checks if the RTC peripheral is running or not
*
* @return true
* @return false
*/
bool tls_is_rtc_running(void);
/**********************************/
/** /**
* @brief This function is used to register pmu rtc interrupt * @brief This function is used to register pmu rtc interrupt
* *

View File

@ -24,7 +24,7 @@
#define TLS_CONFIG_ONLY_FACTORY_ATCMD CFG_OFF #define TLS_CONFIG_ONLY_FACTORY_ATCMD CFG_OFF
/**Host Interface&Command**/ /**Host Interface&Command**/
#define TLS_CONFIG_HOSTIF CFG_ON #define TLS_CONFIG_HOSTIF CFG_OFF
#define TLS_CONFIG_AT_CMD (CFG_ON && TLS_CONFIG_HOSTIF) #define TLS_CONFIG_AT_CMD (CFG_ON && TLS_CONFIG_HOSTIF)
#define TLS_CONFIG_RI_CMD (CFG_ON && TLS_CONFIG_HOSTIF) #define TLS_CONFIG_RI_CMD (CFG_ON && TLS_CONFIG_HOSTIF)
#define TLS_CONFIG_RMMS (CFG_ON && TLS_CONFIG_HOSTIF) #define TLS_CONFIG_RMMS (CFG_ON && TLS_CONFIG_HOSTIF)
@ -36,15 +36,15 @@
/** SOCKET CONFIG **/ /** SOCKET CONFIG **/
#define TLS_CONFIG_SOCKET_STD CFG_ON #define TLS_CONFIG_SOCKET_STD CFG_ON
#define TLS_CONFIG_SOCKET_RAW CFG_ON #define TLS_CONFIG_SOCKET_RAW CFG_OFF
#define TLS_CONFIG_CMD_USE_RAW_SOCKET (CFG_ON && TLS_CONFIG_SOCKET_RAW) #define TLS_CONFIG_CMD_USE_RAW_SOCKET (CFG_ON && TLS_CONFIG_SOCKET_RAW)
#define TLS_CONFIG_CMD_NET_USE_LIST_FTR CFG_ON #define TLS_CONFIG_CMD_NET_USE_LIST_FTR CFG_OFF
#define TLS_CONFIG_HARD_CRYPTO CFG_ON #define TLS_CONFIG_HARD_CRYPTO CFG_OFF
#define TLS_CONFIG_NTO CFG_ON #define TLS_CONFIG_NTO CFG_OFF
#define TLS_CONFIG_CRYSTAL_24M CFG_OFF #define TLS_CONFIG_CRYSTAL_24M CFG_OFF
/** HTTP CLIENT **/ /** HTTP CLIENT **/
@ -54,17 +54,17 @@ HTTPS Lib
SSL LIB SSL LIB
CRYPTO CRYPTO
*/ */
#define TLS_CONFIG_HTTP_CLIENT (CFG_ON) #define TLS_CONFIG_HTTP_CLIENT (CFG_OFF)
#define TLS_CONFIG_HTTP_CLIENT_PROXY CFG_OFF #define TLS_CONFIG_HTTP_CLIENT_PROXY CFG_OFF
#define TLS_CONFIG_HTTP_CLIENT_AUTH_BASIC CFG_OFF #define TLS_CONFIG_HTTP_CLIENT_AUTH_BASIC CFG_OFF
#define TLS_CONFIG_HTTP_CLIENT_AUTH_DIGEST CFG_OFF #define TLS_CONFIG_HTTP_CLIENT_AUTH_DIGEST CFG_OFF
#define TLS_CONFIG_HTTP_CLIENT_AUTH (TLS_CONFIG_HTTP_CLIENT_AUTH_BASIC || TLS_CONFIG_HTTP_CLIENT_AUTH_DIGEST) #define TLS_CONFIG_HTTP_CLIENT_AUTH (TLS_CONFIG_HTTP_CLIENT_AUTH_BASIC || TLS_CONFIG_HTTP_CLIENT_AUTH_DIGEST)
#define TLS_CONFIG_HTTP_CLIENT_SECURE (CFG_ON && (TLS_CONFIG_USE_POLARSSL || TLS_CONFIG_USE_MBEDTLS)) #define TLS_CONFIG_HTTP_CLIENT_SECURE (CFG_OFF && (TLS_CONFIG_USE_POLARSSL || TLS_CONFIG_USE_MBEDTLS))
#define TLS_CONFIG_HTTP_CLIENT_TASK (CFG_ON && TLS_CONFIG_HTTP_CLIENT) #define TLS_CONFIG_HTTP_CLIENT_TASK (CFG_OFF && TLS_CONFIG_HTTP_CLIENT)
/*MatrixSSL will be used except one of the following two Macros is CFG_ON*/ /*MatrixSSL will be used except one of the following two Macros is CFG_ON*/
#define TLS_CONFIG_USE_POLARSSL CFG_OFF #define TLS_CONFIG_USE_POLARSSL CFG_OFF
#define TLS_CONFIG_USE_MBEDTLS CFG_ON #define TLS_CONFIG_USE_MBEDTLS CFG_OFF
#define TLS_CONFIG_SERVER_SIDE_SSL (CFG_ON && TLS_CONFIG_HTTP_CLIENT_SECURE && TLS_CONFIG_USE_MBEDTLS) /*MUST configure TLS_CONFIG_HTTP_CLIENT_SECURE CFG_ON */ #define TLS_CONFIG_SERVER_SIDE_SSL (CFG_ON && TLS_CONFIG_HTTP_CLIENT_SECURE && TLS_CONFIG_USE_MBEDTLS) /*MUST configure TLS_CONFIG_HTTP_CLIENT_SECURE CFG_ON */
@ -73,7 +73,7 @@ CRYPTO
#define TLS_CONFIG_IGMP CFG_ON #define TLS_CONFIG_IGMP CFG_ON
#define TLS_CONFIG_NTP CFG_ON #define TLS_CONFIG_NTP CFG_OFF
#if NIMBLE_FTR #if NIMBLE_FTR
#define TLS_CONFIG_BLE CFG_ON #define TLS_CONFIG_BLE CFG_ON

View File

@ -49,7 +49,7 @@
#define LV_MEM_CUSTOM 0 #define LV_MEM_CUSTOM 0
#if LV_MEM_CUSTOM == 0 #if LV_MEM_CUSTOM == 0
/*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/ /*Size of the memory available for `lv_mem_alloc()` in bytes (>= 2kB)*/
#define LV_MEM_SIZE (40 * 1024U) /*[bytes]*/ #define LV_MEM_SIZE (30 * 1024U) /*[bytes]*/
/*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/ /*Set an address for the memory pool instead of allocating it as a normal array. Can be in external SRAM too.*/
#define LV_MEM_ADR 0 /*0: unused*/ #define LV_MEM_ADR 0 /*0: unused*/

View File

@ -15,6 +15,7 @@
#include "lcd.h" #include "lcd.h"
#include "CST816D.h" #include "CST816D.h"
#include "watch_peripherals.h" #include "watch_peripherals.h"
#include "watch_settings.h"
#include "app_log.h" #include "app_log.h"
@ -50,17 +51,22 @@ static void touch_panel_isr(void *arg)
CST816D_read_touch_event(p); CST816D_read_touch_event(p);
} }
void touch_panel_feedback_cb(struct _lv_indev_drv_t *lv_indev_drv, uint8_t lv_event_code) static void touch_panel_feedback_cb(struct _lv_indev_drv_t *lv_indev_drv, uint8_t lv_event_code)
{ {
(void)lv_indev_drv; (void)lv_indev_drv;
uint16_t vibration_strength = persistency_get_settings()->display.display_vibrate_on_touch_strength*32;
uint32_t vibration_duration_ms = 0;
if(persistency_get_settings()->display.display_vibrate_on_touch_duration)
vibration_duration_ms = persistency_get_settings()->display.display_vibrate_on_touch_duration*50 + 50;
switch(lv_event_code) switch(lv_event_code)
{ {
case LV_EVENT_LONG_PRESSED: case LV_EVENT_LONG_PRESSED:
watch_peripherals_vibrate(255, 200); watch_peripherals_vibrate(255, vibration_duration_ms);
break; break;
case LV_EVENT_PRESSED: case LV_EVENT_PRESSED:
watch_peripherals_vibrate(200, 200); watch_peripherals_vibrate(vibration_strength > 255 ? 255 : vibration_strength, vibration_duration_ms);
break; break;
} }
} }
@ -135,6 +141,7 @@ static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
// Set the last pressed coordinates taking into account the current display orientation // Set the last pressed coordinates taking into account the current display orientation
switch(LCDConfig.LCDOrientation) switch(LCDConfig.LCDOrientation)
{ {
#if HARDWARE_PLATFORM == SMART_WATCH_BREADBOARD
case LCD_ORIENTATION_90: case LCD_ORIENTATION_90:
data->point.x = 239-last_y; data->point.x = 239-last_y;
data->point.y = last_x; data->point.y = last_x;
@ -151,6 +158,24 @@ static void touchpad_read(lv_indev_drv_t * indev_drv, lv_indev_data_t * data)
data->point.x = 239-last_x; data->point.x = 239-last_x;
data->point.y = 239-last_y; data->point.y = 239-last_y;
break; break;
#elif HARDWARE_PLATFORM == SMART_WATCH_PCB
case LCD_ORIENTATION_90:
data->point.x = last_y;
data->point.y = 239-last_x;
break;
case LCD_ORIENTATION_180:
data->point.x = 239-last_x;
data->point.y = 239-last_y;
break;
case LCD_ORIENTATION_270:
data->point.x = 239-last_y;
data->point.y = last_x;
break;
default:
data->point.x = last_x;
data->point.y = last_y;
break;
#endif
} }
} }

View File

@ -82,6 +82,13 @@ void tls_get_rtc(struct tm *tblock)
tblock->tm_sec = ctrl1 & 0x0000003f; tblock->tm_sec = ctrl1 & 0x0000003f;
} }
bool tls_is_rtc_running(void)
{
int ctrl2 = tls_reg_read32(HR_PMU_RTC_CTRL2);
return ctrl2 & (1 << 16) ? true : false;
}
void PMU_RTC_IRQHandler(void) void PMU_RTC_IRQHandler(void)
{ {
tls_reg_write32(HR_PMU_INTERRUPT_SRC, BIT(4)); /* clear rtc interrupt */ tls_reg_write32(HR_PMU_INTERRUPT_SRC, BIT(4)); /* clear rtc interrupt */

View File

@ -95,7 +95,7 @@ void _mutex_release (u32 *mutex)
u8 *TaskStartStk = NULL; u8 *TaskStartStk = NULL;
tls_os_task_t tststarthdl = NULL; tls_os_task_t tststarthdl = NULL;
#define TASK_USERMAIN_STK_SIZE 1024 #define TASK_USERMAIN_STK_SIZE 512
u8 *TaskUsermainStk = NULL; u8 *TaskUsermainStk = NULL;
tls_os_task_t tstusermainhdl = NULL; tls_os_task_t tstusermainhdl = NULL;

View File

@ -167,14 +167,14 @@ tls_bt_init(uint8_t uart_idx)
ble_hs_cfg.gatts_register_cb = on_svr_register_cb; ble_hs_cfg.gatts_register_cb = on_svr_register_cb;
ble_hs_cfg.store_status_cb = ble_store_util_status_rr; ble_hs_cfg.store_status_cb = ble_store_util_status_rr;
/* Initialize all packages. */ /* Initialize all packages. */
nimble_port_init(); nimble_port_init(); // 7 k ram gone --> 112691
/*Application levels code entry*/ /*Application levels code entry*/
tls_ble_gap_init(); tls_ble_gap_init(); // 0k ram gone
tls_bt_util_init(); tls_bt_util_init(); // 0k ram gone
/*Initialize the vuart interface and enable controller*/ /*Initialize the vuart interface and enable controller*/
ble_hci_vuart_init(uart_idx); ble_hci_vuart_init(uart_idx); // 47k gone --> 65423
/* As the last thing, process events from default event queue. */ /* As the last thing, process events from default event queue. */
tls_nimble_start(); tls_nimble_start(); // 3k gone --> 62175
while(bt_adapter_state == WM_BT_STATE_OFF) { while(bt_adapter_state == WM_BT_STATE_OFF) {
tls_os_time_delay(10); tls_os_time_delay(10);

View File

@ -15,6 +15,11 @@
extern "C" { extern "C" {
#endif #endif
/** NOT PART OF THE OFFICIAL SDK **/
int tls_bt_init(uint8_t uart_idx);
int tls_bt_deinit(void);
/**********************************/
typedef enum { typedef enum {
WM_BT_SYSTEM_ACTION_IDLE, WM_BT_SYSTEM_ACTION_IDLE,

View File

@ -109,9 +109,6 @@ const char *tls_bt_gap_evt_2_str(uint32_t event)
} }
} }
#define BLE_HS_ENOERR 0
const char *tls_bt_rc_2_str(uint32_t event) const char *tls_bt_rc_2_str(uint32_t event)
{ {
switch(event) { switch(event) {
@ -153,7 +150,33 @@ const char *tls_bt_rc_2_str(uint32_t event)
} }
} }
const char *tls_bt_addr_type_2_str(uint8_t addr_type)
{
switch(addr_type)
{
CASE_RETURN_STR(BLE_OWN_ADDR_PUBLIC)
CASE_RETURN_STR(BLE_OWN_ADDR_RANDOM)
CASE_RETURN_STR(BLE_OWN_ADDR_RPA_PUBLIC_DEFAULT)
CASE_RETURN_STR(BLE_OWN_ADDR_RPA_RANDOM_DEFAULT)
default:
return "unknown addr_type";
}
}
const char *tls_bt_access_opt_2_str(uint8_t op)
{
switch(op)
{
CASE_RETURN_STR(BLE_GATT_ACCESS_OP_READ_CHR)
CASE_RETURN_STR(BLE_GATT_ACCESS_OP_WRITE_CHR)
CASE_RETURN_STR(BLE_GATT_ACCESS_OP_READ_DSC)
CASE_RETURN_STR(BLE_GATT_ACCESS_OP_WRITE_DSC)
default:
return "unknown operation type";
}
}
static void async_evt_func(struct ble_npl_event *ev) static void async_evt_func(struct ble_npl_event *ev)
{ {

View File

@ -47,12 +47,15 @@ extern tls_bt_log_level_t tls_appl_trace_level;
#define TLS_BT_APPL_TRACE_EVENT(...) #define TLS_BT_APPL_TRACE_EVENT(...)
#define TLS_BT_APPL_TRACE_DEBUG(...) #define TLS_BT_APPL_TRACE_DEBUG(...)
#define TLS_BT_APPL_TRACE_VERBOSE(...) #define TLS_BT_APPL_TRACE_VERBOSE(...)
#endif #endif
#define BLE_HS_ENOERR 0
void tls_bt_log(uint32_t trace_set_mask, const char *fmt_str, ...); void tls_bt_log(uint32_t trace_set_mask, const char *fmt_str, ...);
const char *tls_bt_gap_evt_2_str(uint32_t event); const char *tls_bt_gap_evt_2_str(uint32_t event);
const char *tls_bt_rc_2_str(uint32_t event); const char *tls_bt_rc_2_str(uint32_t event);
const char *tls_bt_addr_type_2_str(uint8_t addr_type);
const char *tls_bt_access_opt_2_str(uint8_t op);
extern int tls_bt_util_init(void); extern int tls_bt_util_init(void);
extern int tls_bt_util_deinit(void); extern int tls_bt_util_deinit(void);

View File

@ -61,11 +61,11 @@
#endif #endif
#ifndef MYNEWT_VAL_MSYS_1_BLOCK_COUNT #ifndef MYNEWT_VAL_MSYS_1_BLOCK_COUNT
#define MYNEWT_VAL_MSYS_1_BLOCK_COUNT (24) #define MYNEWT_VAL_MSYS_1_BLOCK_COUNT (10)
#endif #endif
#ifndef MYNEWT_VAL_MSYS_1_BLOCK_SIZE #ifndef MYNEWT_VAL_MSYS_1_BLOCK_SIZE
#define MYNEWT_VAL_MSYS_1_BLOCK_SIZE (292) #define MYNEWT_VAL_MSYS_1_BLOCK_SIZE (100) // Default 292
#endif #endif
#ifndef MYNEWT_VAL_MSYS_1_SANITY_MIN_COUNT #ifndef MYNEWT_VAL_MSYS_1_SANITY_MIN_COUNT
@ -425,7 +425,7 @@
/*** @apache-mynewt-nimble/nimble/host */ /*** @apache-mynewt-nimble/nimble/host */
#ifndef MYNEWT_VAL_BLE_ATT_PREFERRED_MTU #ifndef MYNEWT_VAL_BLE_ATT_PREFERRED_MTU
#define MYNEWT_VAL_BLE_ATT_PREFERRED_MTU (512) #define MYNEWT_VAL_BLE_ATT_PREFERRED_MTU (256) // 512
#endif #endif
#ifndef MYNEWT_VAL_BLE_ATT_SVR_FIND_INFO #ifndef MYNEWT_VAL_BLE_ATT_SVR_FIND_INFO
@ -925,7 +925,7 @@
/*** @apache-mynewt-nimble/nimble/transport/socket */ /*** @apache-mynewt-nimble/nimble/transport/socket */
#ifndef MYNEWT_VAL_BLE_ACL_BUF_COUNT #ifndef MYNEWT_VAL_BLE_ACL_BUF_COUNT
#define MYNEWT_VAL_BLE_ACL_BUF_COUNT (36) #define MYNEWT_VAL_BLE_ACL_BUF_COUNT (8) // Default 36
#endif #endif
#ifndef MYNEWT_VAL_BLE_ACL_BUF_SIZE #ifndef MYNEWT_VAL_BLE_ACL_BUF_SIZE
@ -947,11 +947,11 @@
#endif #endif
#ifndef MYNEWT_VAL_BLE_HCI_EVT_HI_BUF_COUNT #ifndef MYNEWT_VAL_BLE_HCI_EVT_HI_BUF_COUNT
#define MYNEWT_VAL_BLE_HCI_EVT_HI_BUF_COUNT (16) #define MYNEWT_VAL_BLE_HCI_EVT_HI_BUF_COUNT (5) // Default 16
#endif #endif
#ifndef MYNEWT_VAL_BLE_HCI_EVT_LO_BUF_COUNT #ifndef MYNEWT_VAL_BLE_HCI_EVT_LO_BUF_COUNT
#define MYNEWT_VAL_BLE_HCI_EVT_LO_BUF_COUNT (96) #define MYNEWT_VAL_BLE_HCI_EVT_LO_BUF_COUNT (5) // Default 96
#endif #endif
#ifndef MYNEWT_VAL_BLE_SOCK_CLI_SYSINIT_STAGE #ifndef MYNEWT_VAL_BLE_SOCK_CLI_SYSINIT_STAGE

View File

@ -17,7 +17,7 @@ void tls_nimble_start(void)
{ {
tls_host_task_stack_ptr = (void *)tls_mem_alloc(MYNEWT_VAL(OS_HS_STACK_SIZE) * sizeof(uint32_t)); tls_host_task_stack_ptr = (void *)tls_mem_alloc(MYNEWT_VAL(OS_HS_STACK_SIZE) * sizeof(uint32_t));
assert(tls_host_task_stack_ptr != NULL); assert(tls_host_task_stack_ptr != NULL);
tls_os_task_create(&tls_host_task_hdl, "bth", tls_os_task_create(&tls_host_task_hdl, "ble_svc",
nimble_host_task, nimble_host_task,
(void *)0, (void *)0,
(void *)tls_host_task_stack_ptr, (void *)tls_host_task_stack_ptr,

View File

@ -77,7 +77,7 @@
#define configTICK_RATE_HZ ( ( portTickType ) 500u ) #define configTICK_RATE_HZ ( ( portTickType ) 500u )
#define configMAX_PRIORITIES (63) #define configMAX_PRIORITIES (63)
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 256 ) #define configMINIMAL_STACK_SIZE ( ( unsigned short ) 256 )
#define configTOTAL_HEAP_SIZE ( ( size_t ) 12 * 1024 ) #define configTOTAL_HEAP_SIZE ( ( size_t ) 4 * 1024 )
#define configMAX_TASK_NAME_LEN ( 10 ) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> #define configMAX_TASK_NAME_LEN ( 10 ) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define configUSE_TRACE_FACILITY 1 #define configUSE_TRACE_FACILITY 1
#define configUSE_16_BIT_TICKS 0 #define configUSE_16_BIT_TICKS 0

View File

@ -43,20 +43,22 @@ INCLUDES += -I $(TOP_DIR)/src/os/rtos/include
INCLUDES += -I $(TOP_DIR)/src/app/factorycmd INCLUDES += -I $(TOP_DIR)/src/app/factorycmd
INCLUDES += -I $(TOP_DIR)/src/app/bleapp INCLUDES += -I $(TOP_DIR)/src/app/bleapp
INCLUDES += -I $(TOP_DIR)/app/app_include
INCLUDES += -I $(TOP_DIR)/app
INCLUDES += -I $(TOP_DIR)/app/app_drivers/lcd INCLUDES += -I $(TOP_DIR)/app/app_drivers/lcd
INCLUDES += -I $(TOP_DIR)/app/app_drivers/mmc_sdio INCLUDES += -I $(TOP_DIR)/app/app_drivers/mmc_sdio
INCLUDES += -I $(TOP_DIR)/app/app_drivers/i2c INCLUDES += -I $(TOP_DIR)/app/app_drivers/i2c
INCLUDES += -I $(TOP_DIR)/app/app_drivers/watch_peripherals INCLUDES += -I $(TOP_DIR)/app/app_drivers/watch_peripherals
INCLUDES += -I $(TOP_DIR)/app/persistency INCLUDES += -I $(TOP_DIR)/app/app_include
INCLUDES += -I $(TOP_DIR)/app/ble
INCLUDES += -I $(TOP_DIR)/app/gfx INCLUDES += -I $(TOP_DIR)/app/gfx
INCLUDES += -I $(TOP_DIR)/app INCLUDES += -I $(TOP_DIR)/app/persistency
INCLUDES += -I $(TOP_DIR)/app/translation
#lvgl include #lvgl include
INCLUDES += -I $(TOP_DIR)/lvgl/lvgl_v8.3 INCLUDES += -I $(TOP_DIR)/lvgl/lvgl_v8.3
INCLUDES += -I $(TOP_DIR)/lvgl/lvgl_port INCLUDES += -I $(TOP_DIR)/lvgl/lvgl_port
#nimble host #nimble host
INCLUDES += -I $(TOP_DIR)/src/bt/blehost/ext/tinycrypt/include INCLUDES += -I $(TOP_DIR)/src/bt/blehost/ext/tinycrypt/include
INCLUDES += -I $(TOP_DIR)/src/bt/blehost/nimble/host/include INCLUDES += -I $(TOP_DIR)/src/bt/blehost/nimble/host/include

View File

@ -44,6 +44,9 @@
<Option compilerVar="CC" /> <Option compilerVar="CC" />
</Unit> </Unit>
<Unit filename="altimeter_screen.h" /> <Unit filename="altimeter_screen.h" />
<Unit filename="altimeter_screen_assets.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="common_screen_components.c"> <Unit filename="common_screen_components.c">
<Option compilerVar="CC" /> <Option compilerVar="CC" />
</Unit> </Unit>
@ -55,9 +58,7 @@
<Option compilerVar="CC" /> <Option compilerVar="CC" />
</Unit> </Unit>
<Unit filename="compass_screen.h" /> <Unit filename="compass_screen.h" />
<Unit filename="hour_hand.c"> <Unit filename="firmware_version.h" />
<Option compilerVar="CC" />
</Unit>
<Unit filename="lv_conf.h" /> <Unit filename="lv_conf.h" />
<Unit filename="lv_drivers/display/ILI9341.h" /> <Unit filename="lv_drivers/display/ILI9341.h" />
<Unit filename="lv_drivers/display/R61581.h" /> <Unit filename="lv_drivers/display/R61581.h" />
@ -1648,13 +1649,7 @@
<Option compilerVar="CC" /> <Option compilerVar="CC" />
</Unit> </Unit>
<Unit filename="menu_screen.h" /> <Unit filename="menu_screen.h" />
<Unit filename="minute_hand.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="rsrc/hour_hand.png" /> <Unit filename="rsrc/hour_hand.png" />
<Unit filename="second_hand.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="settings_screen.c"> <Unit filename="settings_screen.c">
<Option compilerVar="CC" /> <Option compilerVar="CC" />
</Unit> </Unit>
@ -1666,9 +1661,6 @@
<Option compilerVar="CC" /> <Option compilerVar="CC" />
</Unit> </Unit>
<Unit filename="watch_face.h" /> <Unit filename="watch_face.h" />
<Unit filename="watch_img.c">
<Option compilerVar="CC" />
</Unit>
<Unit filename="watch_mask.c"> <Unit filename="watch_mask.c">
<Option compilerVar="CC" /> <Option compilerVar="CC" />
</Unit> </Unit>

View File

@ -2,24 +2,39 @@
<CodeBlocks_layout_file> <CodeBlocks_layout_file>
<FileVersion major="1" minor="0" /> <FileVersion major="1" minor="0" />
<ActiveTarget name="Debug" /> <ActiveTarget name="Debug" />
<File name="lvgl\src\misc\lv_types.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\core\lv_obj_style_gen.h" open="0" top="0" tabpos="11" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="1969" topLine="47" /> <Cursor1 position="29532" topLine="612" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\src\font\lv_font_montserrat_30.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\font\lv_symbol_def.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="869" topLine="0" /> <Cursor1 position="1135" topLine="14" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\src\lv_api_map.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\core\lv_disp.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="722" topLine="32" /> <Cursor1 position="7126" topLine="230" />
</Cursor> </Cursor>
</File> </File>
<File name="lv_drivers\indev\keyboard.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lv_drivers\win_drv.h" open="0" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="440" topLine="14" /> <Cursor1 position="585" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\widgets\spinbox\lv_spinbox.h" open="0" top="0" tabpos="18" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="4262" topLine="120" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_pos.c" open="0" top="0" tabpos="12" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="10562" topLine="336" />
</Cursor>
</File>
<File name="compass_assets.c" open="0" top="0" tabpos="13" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="143" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\src\misc\lv_style.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\misc\lv_style.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
@ -27,39 +42,44 @@
<Cursor1 position="9059" topLine="238" /> <Cursor1 position="9059" topLine="238" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\src\widgets\roller\lv_roller.h" open="0" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\widgets\list\lv_list.h" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="715" topLine="26" /> <Cursor1 position="721" topLine="16" />
</Cursor> </Cursor>
</File> </File>
<File name="lv_drivers\win32drv\win32drv.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="menu_screen.c" open="1" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="524" topLine="954" /> <Cursor1 position="3627" topLine="67" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\src\core\lv_obj_pos.h" open="0" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\lvgl.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="7730" topLine="167" /> <Cursor1 position="0" topLine="138" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\src\draw\lv_draw_rect.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\demos\widgets\assets\img_demo_widgets_avatar.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="539" topLine="9" /> <Cursor1 position="1282774" topLine="472" />
</Cursor> </Cursor>
</File> </File>
<File name="menu_screen.c" open="1" top="0" tabpos="9" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\widgets\label\lv_label.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="1391" topLine="23" /> <Cursor1 position="1299" topLine="36" />
</Cursor> </Cursor>
</File> </File>
<File name="compass_screen.c" open="1" top="0" tabpos="12" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\core\lv_disp.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="6408" topLine="136" /> <Cursor1 position="615" topLine="25" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\demos\widgets\lv_demo_widgets.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\misc\lv_types.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="456" topLine="6" /> <Cursor1 position="1969" topLine="47" />
</Cursor>
</File>
<File name="firmware_version.h" open="1" top="0" tabpos="9" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="160" topLine="0" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\src\core\lv_indev_scroll.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\core\lv_indev_scroll.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
@ -67,29 +87,44 @@
<Cursor1 position="14405" topLine="323" /> <Cursor1 position="14405" topLine="323" />
</Cursor> </Cursor>
</File> </File>
<File name="watch_face.c" open="1" top="1" tabpos="11" split="0" active="1" splitpos="702" zoom_1="-1" zoom_2="-1"> <File name="altimeter_screen.h" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="3268" topLine="76" /> <Cursor1 position="1028" topLine="30" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\src\widgets\menu\lv_menu.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\examples\widgets\menu\lv_example_menu_5.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="8169" topLine="288" /> <Cursor1 position="7631" topLine="141" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\lv_conf_template.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\widgets\roller\lv_roller.h" open="0" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="0" topLine="56" /> <Cursor1 position="715" topLine="26" />
</Cursor> </Cursor>
</File> </File>
<File name="lv_drivers\win32drv\win32drv.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\core\lv_obj.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="0" topLine="15" /> <Cursor1 position="7842" topLine="283" />
</Cursor> </Cursor>
</File> </File>
<File name="common_screen_components.c" open="1" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\examples\widgets\bar\lv_example_bar_6.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="246" topLine="0" /> <Cursor1 position="181" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\draw\lv_draw_img.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5230" topLine="191" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_timer.h" open="1" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="635" topLine="36" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_event.h" open="0" top="0" tabpos="19" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5517" topLine="93" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\src\widgets\imgbtn\lv_imgbtn.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\widgets\imgbtn\lv_imgbtn.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
@ -97,14 +132,141 @@
<Cursor1 position="2184" topLine="61" /> <Cursor1 position="2184" topLine="61" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\src\misc\lv_area.h" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\layouts\flex\lv_flex.c" open="0" top="0" tabpos="8" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="1789" topLine="60" /> <Cursor1 position="3097" topLine="74" />
</Cursor>
</File>
<File name="lvgl\src\widgets\imgbtn\lv_imgbtn.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2129" topLine="53" />
</Cursor>
</File>
<File name="compass_screen.h" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1253" topLine="18" />
</Cursor>
</File>
<File name="watch_face.c" open="1" top="0" tabpos="1" split="0" active="1" splitpos="702" zoom_1="-1" zoom_2="-1">
<Cursor>
<Cursor1 position="649" topLine="389" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_indev.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3034" topLine="107" />
</Cursor>
</File>
<File name="lvgl\demos\widgets\lv_demo_widgets.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="456" topLine="6" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_tree.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1234" topLine="139" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\src\misc\lv_color.c" open="0" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\misc\lv_color.c" open="0" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="6907" topLine="258" /> <Cursor1 position="10782" topLine="316" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_timer.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5053" topLine="144" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_tree.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2082" topLine="62" />
</Cursor>
</File>
<File name="lv_drivers\indev\keyboard.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="440" topLine="14" />
</Cursor>
</File>
<File name="lvgl\src\widgets\menu\lv_menu.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3321" topLine="109" />
</Cursor>
</File>
<File name="lv_drv_conf.h" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="6602" topLine="208" />
</Cursor>
</File>
<File name="common_screen_components.c" open="1" top="0" tabpos="8" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="498" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_anim.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3835" topLine="68" />
</Cursor>
</File>
<File name="settings_screen.h" open="1" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="527" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\widgets\img\lv_img.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1863" topLine="59" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_refr.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2447" topLine="75" />
</Cursor>
</File>
<File name="lvgl\src\font\lv_font.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5535" topLine="120" />
</Cursor>
</File>
<File name="watch_casio_assets.c" open="1" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3791697" topLine="77" />
</Cursor>
<Folding>
<Collapse line="8" />
<Collapse line="994" />
<Collapse line="1386" />
<Collapse line="1915" />
<Collapse line="2436" />
<Collapse line="2584" />
<Collapse line="2752" />
<Collapse line="2969" />
<Collapse line="3186" />
<Collapse line="3403" />
</Folding>
</File>
<File name="lvgl\src\core\lv_obj_scroll.h" open="0" top="0" tabpos="16" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1988" topLine="67" />
</Cursor>
</File>
<File name="lvgl\demos\widgets\lv_demo_widgets.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2825" topLine="122" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj.h" open="0" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="8074" topLine="159" />
</Cursor>
</File>
<File name="compass_screen.c" open="0" top="0" tabpos="11" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="6172" topLine="154" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_area.h" open="0" top="0" tabpos="15" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1789" topLine="74" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\src\core\lv_obj_style.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\core\lv_obj_style.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
@ -117,210 +279,24 @@
<Cursor1 position="1563" topLine="27" /> <Cursor1 position="1563" topLine="27" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\examples\widgets\menu\lv_example_menu_5.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="7631" topLine="141" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_log.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1509" topLine="59" />
</Cursor>
</File>
<File name="settings_screen.h" open="1" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="860" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\widgets\label\lv_label.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1299" topLine="24" />
</Cursor>
</File>
<File name="lvgl\src\libs\ffmpeg\lv_ffmpeg.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5784" topLine="170" />
</Cursor>
</File>
<File name="lvgl\src\font\lv_symbol_def.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1135" topLine="14" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_class.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3011" topLine="100" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_anim.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3835" topLine="68" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_class.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\core\lv_obj_class.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="1857" topLine="35" /> <Cursor1 position="1857" topLine="35" />
</Cursor> </Cursor>
</File> </File>
<File name="altimeter_screen.h" open="1" top="0" tabpos="8" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\hal\lv_hal_disp.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="151" topLine="6" /> <Cursor1 position="11123" topLine="327" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\src\core\lv_disp.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="menu_screen.h" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="615" topLine="25" />
</Cursor>
</File>
<File name="lvgl\examples\widgets\bar\lv_example_bar_6.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="181" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_style_gen.h" open="0" top="0" tabpos="11" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="28878" topLine="605" />
</Cursor>
</File>
<File name="lvgl\src\layouts\flex\lv_flex.c" open="0" top="0" tabpos="8" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3097" topLine="74" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_log.h" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2557" topLine="68" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_refr.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2447" topLine="75" />
</Cursor>
</File>
<File name="lvgl\demos\widgets\assets\img_demo_widgets_avatar.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1282774" topLine="472" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_disp.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="7136" topLine="245" />
</Cursor>
</File>
<File name="lvgl\src\hal\lv_hal_disp.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="823" topLine="24" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_scroll.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="12525" topLine="363" />
</Cursor>
</File>
<File name="lvgl\src\font\lv_font_montserrat_12.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="22" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_color.h" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="6812" topLine="211" />
</Cursor>
</File>
<File name="menu_screen.h" open="1" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="48" topLine="0" /> <Cursor1 position="48" topLine="0" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\src\widgets\img\lv_img.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lv_drivers\win32drv\win32drv.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="7018" topLine="202" /> <Cursor1 position="524" topLine="954" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_style_gen.c" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="18315" topLine="576" />
</Cursor>
</File>
<File name="watch_img.c" open="0" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="4150889" topLine="0" />
</Cursor>
</File>
<File name="lvgl\src\widgets\menu\lv_menu.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3706" topLine="117" />
</Cursor>
</File>
<File name="settings_screen.c" open="0" top="0" tabpos="8" split="2" active="1" splitpos="513" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5410" topLine="32" />
<Cursor2 position="10475" topLine="18" />
</Cursor>
</File>
<File name="lv_drv_conf.h" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="6602" topLine="208" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj.h" open="0" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2767" topLine="86" />
</Cursor>
</File>
<File name="altimeter_screen.c" open="1" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1511" topLine="33" />
</Cursor>
</File>
<File name="main.c" open="1" top="0" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="2252" topLine="0" />
</Cursor>
</File>
<File name="watch_casio_assets.c" open="0" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3451942" topLine="1065" />
</Cursor>
<Folding>
<Collapse line="8" />
<Collapse line="995" />
</Folding>
</File>
<File name="lv_drivers\display\monitor.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="289" topLine="31" />
</Cursor>
</File>
<File name="lvgl\src\font\lv_font_fmt_txt.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="24" />
</Cursor>
</File>
<File name="watch_menu_icons.c" open="1" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="951965" topLine="439" />
</Cursor>
<Folding>
<Collapse line="2" />
<Collapse line="195" />
<Collapse line="388" />
<Collapse line="581" />
<Collapse line="774" />
<Collapse line="967" />
<Collapse line="1546" />
<Collapse line="1729" />
<Collapse line="1739" />
</Folding>
</File>
<File name="lv_drivers\lv_drv_conf_template.h" open="0" top="0" tabpos="11" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="10670" topLine="390" />
</Cursor>
</File>
<File name="lvgl\src\widgets\list\lv_list.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1261" topLine="45" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\src\hal\lv_hal_indev.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\hal\lv_hal_indev.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
@ -328,74 +304,59 @@
<Cursor1 position="5065" topLine="123" /> <Cursor1 position="5065" topLine="123" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\src\layouts\grid\lv_grid.h" open="0" top="0" tabpos="13" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\libs\ffmpeg\lv_ffmpeg.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="579" topLine="17" /> <Cursor1 position="5784" topLine="170" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\src\core\lv_obj_tree.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lv_drivers\display\monitor.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="1234" topLine="34" /> <Cursor1 position="289" topLine="31" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\src\core\lv_obj_scroll.h" open="0" top="0" tabpos="9" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="altimeter_screen.c" open="0" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="624" topLine="31" /> <Cursor1 position="13638" topLine="409" />
</Cursor> </Cursor>
</File> </File>
<File name="common_screen_components.h" open="0" top="0" tabpos="8" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\lv_api_map.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="229" topLine="0" /> <Cursor1 position="722" topLine="32" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\src\widgets\list\lv_list.h" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\draw\lv_img_buf.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="402" topLine="16" /> <Cursor1 position="6210" topLine="113" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\src\core\lv_event.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="common_screen_components.h" open="1" top="1" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="7293" topLine="150" /> <Cursor1 position="215" topLine="0" />
</Cursor> </Cursor>
</File> </File>
<File name="lv_drivers\win_drv.h" open="0" top="0" tabpos="10" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\font\lv_font_montserrat_30.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="585" topLine="0" /> <Cursor1 position="869" topLine="0" />
</Cursor> </Cursor>
</File> </File>
<File name="compass_screen.h" open="1" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="main.c" open="0" top="0" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="1253" topLine="23" /> <Cursor1 position="1457" topLine="45" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\src\misc\lv_timer.h" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\widgets\menu\lv_menu.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="1085" topLine="33" /> <Cursor1 position="3706" topLine="117" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\demos\widgets\lv_demo_widgets.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lv_drivers\lv_drv_conf_template.h" open="0" top="0" tabpos="11" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="2825" topLine="122" /> <Cursor1 position="10670" topLine="390" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\src\layouts\flex\lv_flex.h" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="settings_screen.c" open="1" top="0" tabpos="4" split="0" active="1" splitpos="513" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="950" topLine="43" /> <Cursor1 position="4139" topLine="82" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_indev.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3034" topLine="107" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1873" topLine="48" />
</Cursor>
</File>
<File name="watch_face.h" open="1" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="989" topLine="16" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\src\hal\lv_hal_indev.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\hal\lv_hal_indev.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
@ -403,34 +364,64 @@
<Cursor1 position="3566" topLine="102" /> <Cursor1 position="3566" topLine="102" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\src\draw\lv_img_buf.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\misc\lv_log.h" open="0" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="610" topLine="17" /> <Cursor1 position="2557" topLine="68" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\src\font\lv_font.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\widgets\label\lv_label.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="5535" topLine="120" /> <Cursor1 position="5648" topLine="194" />
</Cursor>
</File>
<File name="lvgl\src\layouts\flex\lv_flex.h" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="950" topLine="43" />
</Cursor>
</File>
<File name="lvgl\src\font\lv_font_montserrat_12.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="22" />
</Cursor>
</File>
<File name="lvgl\src\font\lv_font_fmt_txt.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="24" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_log.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1509" topLine="59" />
</Cursor>
</File>
<File name="lv_drivers\win32drv\win32drv.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="15" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_class.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3011" topLine="100" />
</Cursor> </Cursor>
</File> </File>
<File name="lv_conf.h" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lv_conf.h" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="12839" topLine="299" /> <Cursor1 position="12839" topLine="10" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\src\core\lv_obj_pos.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\widgets\chart\lv_chart.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="29967" topLine="918" /> <Cursor1 position="11658" topLine="336" />
</Cursor> </Cursor>
</File> </File>
<File name="minute_hand.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\hal\lv_hal_disp.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="52426" topLine="414" /> <Cursor1 position="823" topLine="24" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\src\widgets\imgbtn\lv_imgbtn.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\widgets\img\lv_img.h" open="0" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="2129" topLine="53" /> <Cursor1 position="4439" topLine="123" />
</Cursor> </Cursor>
</File> </File>
<File name="lvgl\src\widgets\tileview\lv_tileview.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\widgets\tileview\lv_tileview.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
@ -442,9 +433,79 @@
<Collapse line="995" /> <Collapse line="995" />
</Folding> </Folding>
</File> </File>
<File name="lvgl\src\hal\lv_hal_disp.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0"> <File name="lvgl\src\core\lv_obj_style_gen.c" open="0" top="0" tabpos="7" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor> <Cursor>
<Cursor1 position="11123" topLine="327" /> <Cursor1 position="19855" topLine="604" />
</Cursor>
</File>
<File name="watch_face.h" open="0" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="713" topLine="33" />
</Cursor>
</File>
<File name="altimeter_screen_assets.c" open="0" top="0" tabpos="19" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="96342" topLine="161" />
</Cursor>
</File>
<File name="lvgl\src\misc\lv_color.h" open="0" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="8562" topLine="290" />
</Cursor>
</File>
<File name="lvgl\lv_conf_template.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="0" topLine="56" />
</Cursor>
</File>
<File name="lvgl\src\widgets\list\lv_list.c" open="1" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="2" zoom_2="0">
<Cursor>
<Cursor1 position="2391" topLine="74" />
</Cursor>
</File>
<File name="lvgl\src\draw\lv_draw_rect.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="539" topLine="9" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_scroll.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="12525" topLine="363" />
</Cursor>
</File>
<File name="watch_menu_icons.c" open="0" top="0" tabpos="18" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="869291" topLine="156" />
</Cursor>
<Folding>
<Collapse line="2" />
<Collapse line="185" />
<Collapse line="195" />
<Collapse line="378" />
<Collapse line="388" />
<Collapse line="571" />
<Collapse line="581" />
<Collapse line="764" />
<Collapse line="774" />
<Collapse line="957" />
<Collapse line="967" />
<Collapse line="1150" />
<Collapse line="1160" />
<Collapse line="1343" />
<Collapse line="1353" />
<Collapse line="1536" />
<Collapse line="1546" />
<Collapse line="1729" />
</Folding>
</File>
<File name="lvgl\src\layouts\grid\lv_grid.h" open="0" top="0" tabpos="13" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="579" topLine="17" />
</Cursor>
</File>
<File name="lvgl\src\core\lv_obj_pos.h" open="0" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="7730" topLine="167" />
</Cursor> </Cursor>
</File> </File>
</CodeBlocks_layout_file> </CodeBlocks_layout_file>

View File

@ -1,6 +1,18 @@
#include <stdio.h>
#include "altimeter_screen.h" #include "altimeter_screen.h"
#include "menu_screen.h" #include "menu_screen.h"
static void create_pressure_content(AltimeterScreen_t * const altimeterScreen);
static void create_altitude_content(AltimeterScreen_t * const altimeterScreen);
static void create_altitude_setting_content(AltimeterScreen_t * const altimeterScreen);
static void destroy_pressure_content(AltimeterScreen_t * const altimeterScreen);
static void destroy_altitude_content(AltimeterScreen_t * const altimeterScreen);
static void destroy_altitude_setting_content(AltimeterScreen_t * const altimeterScreen);
static void update_min_and_max_pressure_data(AltimeterScreen_t * const altimeterScreen, float minPressure, float maxPressure);
static void gesture_event_cb(lv_event_t *e) static void gesture_event_cb(lv_event_t *e)
{ {
AltimeterScreen_t *altimeterScreen = e->user_data; AltimeterScreen_t *altimeterScreen = e->user_data;
@ -22,15 +34,81 @@ static void gesture_event_cb(lv_event_t * e)
break; break;
case LV_DIR_TOP: case LV_DIR_TOP:
LV_LOG_USER("GESTURE : TOP"); LV_LOG_USER("GESTURE : TOP");
if(altimeterScreen->displayedView != ALTITUDE_VIEW && altimeterScreen->displayedView != ALTITUDE_SETTING_VIEW)
{
destroy_pressure_content(altimeterScreen);
create_altitude_content(altimeterScreen);
altimeterScreen->displayedView = ALTITUDE_VIEW;
}
break; break;
case LV_DIR_BOTTOM: case LV_DIR_BOTTOM:
LV_LOG_USER("GESTURE : BOTTOM"); LV_LOG_USER("GESTURE : BOTTOM");
if(altimeterScreen->displayedView != PRESSURE_VIEW && altimeterScreen->displayedView != ALTITUDE_SETTING_VIEW)
{
destroy_altitude_content(altimeterScreen);
create_pressure_content(altimeterScreen);
altimeterScreen->displayedView = PRESSURE_VIEW;
}
break; break;
default: default:
LV_LOG_USER("GESTURE : %u", gesture); LV_LOG_USER("GESTURE : %u", gesture);
} }
} }
/*static lv_chart_cursor_t * cursor;
static void chart_event_cb(lv_event_t * e)
{
static int32_t last_id = -1;
lv_event_code_t code = lv_event_get_code(e);
lv_obj_t * obj = lv_event_get_target(e);
AltimeterScreen_t *altimeterScreen = e->user_data;
if(code == LV_EVENT_VALUE_CHANGED)
{
last_id = lv_chart_get_pressed_point(obj);
if(last_id != LV_CHART_POINT_NONE)
{
lv_chart_set_cursor_point(obj, cursor, NULL, last_id);
}
}
else if(code == LV_EVENT_DRAW_PART_END)
{
lv_obj_draw_part_dsc_t * dsc = lv_event_get_draw_part_dsc(e);
if(!lv_obj_draw_part_check_type(dsc, &lv_chart_class, LV_CHART_DRAW_PART_CURSOR)) return;
if(dsc->p1 == NULL || dsc->p2 == NULL || dsc->p1->y != dsc->p2->y || last_id < 0) return;
lv_coord_t * data_array = altimeterScreen->pressure_data_points;
lv_coord_t v = data_array[last_id];
char buf[16];
lv_snprintf(buf, sizeof(buf), "%d", v);
lv_point_t size;
lv_txt_get_size(&size, buf, LV_FONT_DEFAULT, 0, 0, LV_COORD_MAX, LV_TEXT_FLAG_NONE);
lv_area_t a;
a.y2 = dsc->p1->y - 5;
a.y1 = a.y2 - size.y - 10;
a.x1 = dsc->p1->x + 10;
a.x2 = a.x1 + size.x + 10;
lv_draw_rect_dsc_t draw_rect_dsc;
lv_draw_rect_dsc_init(&draw_rect_dsc);
draw_rect_dsc.bg_color = lv_palette_main(LV_PALETTE_BLUE);
draw_rect_dsc.radius = 3;
lv_draw_rect(dsc->draw_ctx, &draw_rect_dsc, &a);
lv_draw_label_dsc_t draw_label_dsc;
lv_draw_label_dsc_init(&draw_label_dsc);
draw_label_dsc.color = lv_color_white();
a.x1 += 5;
a.x2 -= 5;
a.y1 += 5;
a.y2 -= 5;
lv_draw_label(dsc->draw_ctx, &draw_label_dsc, &a, buf, NULL);
}
}*/
static void cleanup_event_cb(lv_event_t *e) static void cleanup_event_cb(lv_event_t *e)
{ {
AltimeterScreen_t *altimeterScreen = e->user_data; AltimeterScreen_t *altimeterScreen = e->user_data;
@ -38,22 +116,152 @@ static void cleanup_event_cb(lv_event_t * e)
LV_LOG_USER("cleanup"); LV_LOG_USER("cleanup");
} }
static void reset_event_cb(lv_event_t *e)
{
AltimeterScreen_t *altimeterScreen = e->user_data;
update_min_and_max_pressure_data(altimeterScreen, 0.0, 0.0); //NULL to reset
memset(altimeterScreen->pressure_data_points, 0, sizeof(altimeterScreen->pressure_data_points));
memset(altimeterScreen->pressure_data_points_float, 0, sizeof(altimeterScreen->pressure_data_points_float));
//Update the chart if it is currently on the screen
if(altimeterScreen->pressureChart.chart)
{
lv_chart_refresh(altimeterScreen->pressureChart.chart);
}
LV_LOG_USER("reset event cb");
}
static void update_altitude_info(AltimeterScreen_t * const altimeterScreen)
{
sprintf(altimeterScreen->mainValue.value_text, "%.1f", altimeterScreen->lastReadAltitude - altimeterScreen->altitudeOffset);
sprintf(altimeterScreen->vsiValue.value_unit_text, "VSI : %s%.1f\nm/s", altimeterScreen->vsiFloat > 0 ? "+":"", altimeterScreen->vsiFloat);
lv_label_set_text_static(altimeterScreen->mainValue.value, altimeterScreen->mainValue.value_text);
lv_label_set_text_static(altimeterScreen->vsiValue.value_unit, altimeterScreen->vsiValue.value_unit_text);
}
static void calibrate_altitude_event_cb(lv_event_t *e)
{
AltimeterScreen_t *altimeterScreen = e->user_data;
//If an offset was applied we clear it
if(altimeterScreen->altitudeOffset)
{
altimeterScreen->altitudeOffset = 0;
}
else
{
//We compute the offset needed to set the altitude to zero
altimeterScreen->altitudeOffset = altimeterScreen->lastReadAltitude;
}
altimeterScreen->vsiFloat = 0;
update_altitude_info(altimeterScreen);
altimeterScreen->vsiFloat = altimeterScreen->lastReadAltitude;
LV_LOG_USER("calibrate altitude event cb");
}
static void set_altitude_event_cb(lv_event_t *e)
{
AltimeterScreen_t *altimeterScreen = e->user_data;
destroy_altitude_content(altimeterScreen);
//Hide the main value
lv_obj_add_flag(altimeterScreen->mainValue.value, LV_OBJ_FLAG_HIDDEN);
lv_obj_add_flag(altimeterScreen->mainValue.unit, LV_OBJ_FLAG_HIDDEN);
create_altitude_setting_content(altimeterScreen);
altimeterScreen->displayedView = ALTITUDE_SETTING_VIEW;
LV_LOG_USER("set altitude event cb");
}
//Set button clicked on the altitude setting page
static void apply_altitude_event_cb(lv_event_t *e)
{
AltimeterScreen_t *altimeterScreen = e->user_data;
int32_t spinbox_value = lv_spinbox_get_value(altimeterScreen->altitudeOffset_spinbox);
destroy_altitude_setting_content(altimeterScreen);
//Show the main value
lv_obj_clear_flag(altimeterScreen->mainValue.value, LV_OBJ_FLAG_HIDDEN);
lv_obj_clear_flag(altimeterScreen->mainValue.unit, LV_OBJ_FLAG_HIDDEN);
create_altitude_content(altimeterScreen);
altimeterScreen->displayedView = ALTITUDE_VIEW;
altimeterScreen->altitudeOffset = altimeterScreen->lastReadAltitude - (spinbox_value / 10.0);
altimeterScreen->vsiFloat = 0;
update_altitude_info(altimeterScreen);
altimeterScreen->vsiFloat = altimeterScreen->lastReadAltitude;
LV_LOG_USER("apply altitude event cb");
}
static void lv_spinbox_increment_event_cb(lv_event_t *e)
{
AltimeterScreen_t *altimeterScreen = e->user_data;
lv_event_code_t code = lv_event_get_code(e);
if(code == LV_EVENT_SHORT_CLICKED || code == LV_EVENT_LONG_PRESSED_REPEAT) {
lv_spinbox_increment(altimeterScreen->altitudeOffset_spinbox);
}
}
static void lv_spinbox_decrement_event_cb(lv_event_t *e)
{
AltimeterScreen_t *altimeterScreen = e->user_data;
lv_event_code_t code = lv_event_get_code(e);
if(code == LV_EVENT_SHORT_CLICKED || code == LV_EVENT_LONG_PRESSED_REPEAT) {
lv_spinbox_decrement(altimeterScreen->altitudeOffset_spinbox);
}
}
static void measurements_update_timer_cb(lv_timer_t *timer) static void measurements_update_timer_cb(lv_timer_t *timer)
{ {
AltimeterScreen_t *altimeterScreen = timer->user_data; AltimeterScreen_t *altimeterScreen = timer->user_data;
if(altimeterScreen->measurementCb) if(altimeterScreen->measurementCb)
{ {
float temperature, pressure, altitude; float temperature, pressure;
LV_LOG_USER("Updating measurements"); LV_LOG_USER("Updating measurements");
altimeterScreen->measurementCb(&temperature, &pressure, &altitude); altimeterScreen->measurementCb(&temperature, &pressure, &altimeterScreen->lastReadAltitude);
//Compute and display the VSI
//We multiply by 2 because one measurement is done every 0.5 second.
altimeterScreen->vsiFloat = (altimeterScreen->lastReadAltitude - altimeterScreen->vsiFloat) * 2;
switch(altimeterScreen->displayedView)
{
case ALTITUDE_VIEW:
update_altitude_info(altimeterScreen);
break;
case PRESSURE_VIEW:
sprintf(altimeterScreen->mainValue.value_text, "%.2f", pressure);
break;
default:
break;
}
altimeterScreen->vsiFloat = altimeterScreen->lastReadAltitude;
if(altimeterScreen->mainValue.value)
{
lv_label_set_text_static(altimeterScreen->mainValue.value, altimeterScreen->mainValue.value_text);
}
//Mock up part needs to be changed on embedded target
altimeter_screen_shift_chart_pressure_measurement(altimeterScreen, pressure);
} }
else else
{ {
LV_LOG_USER("measurementCb is NULL, be sure to register a callback !"); LV_LOG_USER("measurementCb is NULL, be sure to register a callback !");
} }
} }
void altimeter_screen_init(AltimeterScreen_t * const altimeterScreen) void altimeter_screen_init(AltimeterScreen_t * const altimeterScreen)
@ -78,6 +286,50 @@ void altimeter_screen_register_measurement_cb(AltimeterScreen_t * const altimete
altimeterScreen->measurementCb = MeasurementCb; altimeterScreen->measurementCb = MeasurementCb;
} }
void altimeter_screen_shift_chart_pressure_measurement(AltimeterScreen_t * const altimeterScreen, float pressure)
{
if(!altimeterScreen)
{
LV_LOG_ERROR("NULL pointer given !");
return;
}
uint8_t numberOfDataPoints = sizeof(altimeterScreen->pressure_data_points) / sizeof(altimeterScreen->pressure_data_points[0]);
memmove(altimeterScreen->pressure_data_points_float, &altimeterScreen->pressure_data_points_float[1], (numberOfDataPoints - 1) * sizeof(altimeterScreen->pressure_data_points_float[0]));
altimeterScreen->pressure_data_points_float[numberOfDataPoints-1] = pressure;
memmove(altimeterScreen->pressure_data_points, &altimeterScreen->pressure_data_points[1], (numberOfDataPoints - 1) * sizeof(altimeterScreen->pressure_data_points[0]));
altimeterScreen->pressure_data_points[(numberOfDataPoints - 1)] = pressure;
uint8_t minIndex = 0, maxIndex = 0;
float min = altimeterScreen->pressure_data_points_float[0], max = altimeterScreen->pressure_data_points_float[0];
//Recompute the min and max of the series :
for(uint8_t i = 1; i < numberOfDataPoints; i++)
{
if(min > altimeterScreen->pressure_data_points_float[i])
{
min = altimeterScreen->pressure_data_points_float[i];
minIndex = i;
}
if(max < altimeterScreen->pressure_data_points_float[i])
{
max = altimeterScreen->pressure_data_points_float[i];
maxIndex = i;
}
}
//Update the chart if it is currently on the screen
if(altimeterScreen->pressureChart.chart)
{
//Set the range of the Y axis of the chart using the min and max
lv_chart_set_range(altimeterScreen->pressureChart.chart, LV_CHART_AXIS_PRIMARY_Y, altimeterScreen->pressure_data_points[minIndex], altimeterScreen->pressure_data_points[maxIndex]);
lv_chart_refresh(altimeterScreen->pressureChart.chart);
}
update_min_and_max_pressure_data(altimeterScreen, min, max);
}
void altimeter_screen_create(AltimeterScreen_t * const altimeterScreen) void altimeter_screen_create(AltimeterScreen_t * const altimeterScreen)
{ {
if(!altimeterScreen) if(!altimeterScreen)
@ -97,13 +349,55 @@ void altimeter_screen_create(AltimeterScreen_t * const altimeterScreen)
} }
altimeterScreen->display = lv_obj_create(NULL); altimeterScreen->display = lv_obj_create(NULL);
lv_obj_set_style_bg_color(altimeterScreen->display, lv_color_make(85, 88, 90), LV_PART_MAIN); lv_obj_set_style_bg_color(altimeterScreen->display, lv_color_make(0xFF,0xFF,0xFF), LV_PART_MAIN);/*
lv_obj_set_style_radius(altimeterScreen->display, LV_RADIUS_CIRCLE, LV_PART_MAIN);*/
lv_obj_t *inner_circle = lv_obj_create(altimeterScreen->display); if(altimeterScreen->inner_circle)
lv_obj_center(inner_circle); {
lv_obj_set_size(inner_circle, 210, 210); LV_LOG_ERROR("inner_circle should be NULL here !");
lv_obj_set_style_radius(inner_circle, LV_RADIUS_CIRCLE, LV_PART_MAIN); lv_obj_del(altimeterScreen->inner_circle);
altimeterScreen->inner_circle = NULL;
}
altimeterScreen->inner_circle = lv_obj_create(altimeterScreen->display);
lv_obj_center(altimeterScreen->inner_circle);
lv_obj_set_size(altimeterScreen->inner_circle, 240, 240);
lv_obj_set_style_radius(altimeterScreen->inner_circle, LV_RADIUS_CIRCLE, LV_PART_MAIN);
lv_obj_set_style_border_color(altimeterScreen->inner_circle, lv_color_make(22, 145, 147), LV_PART_MAIN);
lv_obj_set_style_border_width(altimeterScreen->inner_circle, 15, LV_PART_MAIN);
//Set up common label
if(altimeterScreen->mainValue.value || altimeterScreen->mainValue.unit)
{
LV_LOG_ERROR("value or unit should be NULL here !");
lv_obj_del(altimeterScreen->mainValue.value);
lv_obj_del(altimeterScreen->mainValue.unit);
altimeterScreen->mainValue.value = NULL;
altimeterScreen->mainValue.unit = NULL;
}
altimeterScreen->mainValue.value = lv_label_create(altimeterScreen->display);
lv_obj_set_style_text_font(altimeterScreen->mainValue.value, &lv_font_montserrat_30, LV_PART_MAIN);
lv_obj_align(altimeterScreen->mainValue.value, LV_ALIGN_TOP_MID, 0, 40);
lv_label_set_text_static(altimeterScreen->mainValue.value, altimeterScreen->mainValue.value_text);
altimeterScreen->mainValue.unit = lv_label_create(altimeterScreen->display);
lv_obj_set_style_text_font(altimeterScreen->mainValue.unit, &lv_font_montserrat_30, LV_PART_MAIN);
//Setup the right screen content
switch(altimeterScreen->displayedView)
{
case ALTITUDE_VIEW:
create_altitude_content(altimeterScreen);
break;
case PRESSURE_VIEW:
create_pressure_content(altimeterScreen);
break;
default : //We probably left when in setting mode, so force altitude view
create_altitude_content(altimeterScreen);
altimeterScreen->displayedView = ALTITUDE_VIEW;
}
//We register the event callback to handle gestures //We register the event callback to handle gestures
lv_obj_add_event_cb(altimeterScreen->display, &(gesture_event_cb), LV_EVENT_GESTURE, altimeterScreen); lv_obj_add_event_cb(altimeterScreen->display, &(gesture_event_cb), LV_EVENT_GESTURE, altimeterScreen);
@ -132,3 +426,184 @@ void altimeter_screen_destroy(AltimeterScreen_t * const altimeterScreen)
memset(altimeterScreen, 0, offsetof(AltimeterScreen_t, displayedView)); memset(altimeterScreen, 0, offsetof(AltimeterScreen_t, displayedView));
} }
static void create_pressure_content(AltimeterScreen_t * const altimeterScreen)
{
//We declare all the needed assets by the pressure content
LV_IMG_DECLARE(watch_asset_reset_icon)
lv_obj_t *reset_btn = lv_img_create(altimeterScreen->inner_circle);
lv_img_set_src(reset_btn, &watch_asset_reset_icon);
lv_obj_align(reset_btn, LV_ALIGN_CENTER, 0 ,0);
lv_obj_add_flag(reset_btn, LV_OBJ_FLAG_ADV_HITTEST | LV_OBJ_FLAG_CLICKABLE);
lv_obj_add_event_cb(reset_btn, &(reset_event_cb), LV_EVENT_CLICKED, altimeterScreen);
lv_label_set_text_static(altimeterScreen->mainValue.unit, "hPa");
lv_obj_align_to(altimeterScreen->mainValue.unit, altimeterScreen->mainValue.value, LV_ALIGN_CENTER, 0, 25);
//Set the min and max text
if(altimeterScreen->minValue.value_unit || altimeterScreen->maxValue.value_unit)
{
LV_LOG_ERROR("minValue or maxValue should be NULL here !");
lv_obj_del(altimeterScreen->minValue.value_unit);
lv_obj_del(altimeterScreen->maxValue.value_unit);
altimeterScreen->minValue.value_unit = NULL;
altimeterScreen->maxValue.value_unit = NULL;
}
altimeterScreen->minValue.value_unit = lv_label_create(altimeterScreen->inner_circle);
lv_obj_set_style_text_font(altimeterScreen->minValue.value_unit, &lv_font_montserrat_14, LV_PART_MAIN);
lv_obj_align(altimeterScreen->minValue.value_unit, LV_ALIGN_BOTTOM_LEFT, 0, -50);
sprintf(altimeterScreen->minValue.value_unit_text, "min:\n%.2f hPa", altimeterScreen->minValueFloat);
lv_label_set_text_static(altimeterScreen->minValue.value_unit, altimeterScreen->minValue.value_unit_text);
altimeterScreen->maxValue.value_unit = lv_label_create(altimeterScreen->inner_circle);
lv_obj_set_style_text_font(altimeterScreen->maxValue.value_unit, &lv_font_montserrat_14, LV_PART_MAIN);
lv_obj_align(altimeterScreen->maxValue.value_unit, LV_ALIGN_BOTTOM_RIGHT, 0, -50);
lv_obj_set_style_text_align(altimeterScreen->maxValue.value_unit, LV_TEXT_ALIGN_RIGHT, LV_PART_MAIN);
sprintf(altimeterScreen->maxValue.value_unit_text, "max:\n%.2f hPa", altimeterScreen->maxValueFloat);
lv_label_set_text_static(altimeterScreen->maxValue.value_unit, altimeterScreen->maxValue.value_unit_text);
//Pressure chart and trend part:
if(altimeterScreen->pressureChart.chart)
{
LV_LOG_ERROR("chart should be NULL here !");
lv_obj_del(altimeterScreen->pressureChart.chart);
altimeterScreen->pressureChart.chart = NULL;
}
altimeterScreen->pressureChart.chart = lv_chart_create(altimeterScreen->inner_circle);
lv_obj_align(altimeterScreen->pressureChart.chart, LV_ALIGN_CENTER, 0, 65);
lv_obj_set_size(altimeterScreen->pressureChart.chart, 165, 45);
lv_chart_set_type(altimeterScreen->pressureChart.chart, LV_CHART_TYPE_LINE);
lv_chart_set_point_count(altimeterScreen->pressureChart.chart, sizeof(altimeterScreen->pressure_data_points) / sizeof(altimeterScreen->pressure_data_points[0]));
lv_obj_set_style_border_width(altimeterScreen->pressureChart.chart, 0, LV_PART_MAIN);
lv_obj_set_style_radius(altimeterScreen->pressureChart.chart, 0, LV_PART_MAIN);
//cursor = lv_chart_add_cursor(altimeterScreen->pressureChart.chart, lv_palette_main(LV_PALETTE_BLUE), LV_DIR_LEFT | LV_DIR_BOTTOM);
lv_chart_series_t *primary_Y_series = lv_chart_add_series(altimeterScreen->pressureChart.chart, lv_color_make(139, 180, 150), LV_CHART_AXIS_PRIMARY_Y);
lv_chart_set_ext_y_array(altimeterScreen->pressureChart.chart, primary_Y_series, altimeterScreen->pressure_data_points);
//lv_obj_add_event_cb(altimeterScreen->pressureChart.chart, &(chart_event_cb), LV_EVENT_ALL, altimeterScreen);
}
static void create_altitude_content(AltimeterScreen_t * const altimeterScreen)
{
//We declare all the needed assets by the pressure content
LV_IMG_DECLARE(altimeter_asset_calibration_icon)
LV_IMG_DECLARE(watch_menu_settings_icon)
lv_label_set_text_static(altimeterScreen->mainValue.unit, "m");
lv_obj_align_to(altimeterScreen->mainValue.unit, altimeterScreen->mainValue.value, LV_ALIGN_CENTER, 0, 25);
lv_obj_t *calibration_btn = lv_img_create(altimeterScreen->inner_circle);
lv_img_set_src(calibration_btn, &altimeter_asset_calibration_icon);
lv_obj_align(calibration_btn, LV_ALIGN_CENTER, 52 ,5);
lv_obj_add_flag(calibration_btn, LV_OBJ_FLAG_ADV_HITTEST | LV_OBJ_FLAG_CLICKABLE);
lv_obj_add_event_cb(calibration_btn, &(calibrate_altitude_event_cb), LV_EVENT_CLICKED, altimeterScreen);
lv_obj_t *setting_btn = lv_img_create(altimeterScreen->inner_circle);
lv_img_set_src(setting_btn, &watch_menu_settings_icon);
lv_obj_align(setting_btn, LV_ALIGN_CENTER, -52 ,5);
lv_obj_add_flag(setting_btn, LV_OBJ_FLAG_ADV_HITTEST | LV_OBJ_FLAG_CLICKABLE);
lv_obj_add_event_cb(setting_btn, &(set_altitude_event_cb), LV_EVENT_CLICKED, altimeterScreen);
//Create VSI label
if(altimeterScreen->vsiValue.value_unit)
{
LV_LOG_ERROR("vsiValue should be NULL here !");
lv_obj_del(altimeterScreen->vsiValue.value_unit);
altimeterScreen->vsiValue.value_unit = NULL;
}
altimeterScreen->vsiValue.value_unit = lv_label_create(altimeterScreen->inner_circle);
lv_obj_align(altimeterScreen->vsiValue.value_unit, LV_ALIGN_BOTTOM_MID, 0, 0);
lv_obj_set_style_text_color(altimeterScreen->vsiValue.value_unit, lv_color_make(51, 102, 255), LV_PART_MAIN);
lv_obj_set_style_text_font(altimeterScreen->vsiValue.value_unit, &lv_font_montserrat_24, LV_PART_MAIN);
lv_obj_set_style_text_align(altimeterScreen->vsiValue.value_unit, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN);
sprintf(altimeterScreen->vsiValue.value_unit_text, "VSI : 0.0\nm/s");
lv_label_set_text_static(altimeterScreen->vsiValue.value_unit, altimeterScreen->vsiValue.value_unit_text);
}
static void create_altitude_setting_content(AltimeterScreen_t * const altimeterScreen)
{
lv_obj_t *desc = lv_label_create(altimeterScreen->inner_circle);
lv_obj_set_style_text_font(desc, &lv_font_montserrat_16, LV_PART_MAIN);
lv_obj_align(desc, LV_ALIGN_CENTER, 0, -45);
lv_label_set_text(desc, "Set altitude to :");
if(altimeterScreen->altitudeOffset_spinbox)
{
LV_LOG_ERROR("spinner should be NULL here !");
lv_obj_del(altimeterScreen->altitudeOffset_spinbox);
altimeterScreen->altitudeOffset_spinbox = NULL;
}
altimeterScreen->altitudeOffset_spinbox = lv_spinbox_create(altimeterScreen->inner_circle);
lv_obj_set_align(altimeterScreen->altitudeOffset_spinbox, LV_ALIGN_CENTER);
lv_obj_set_width(altimeterScreen->altitudeOffset_spinbox, lv_pct(50));
lv_spinbox_set_digit_format(altimeterScreen->altitudeOffset_spinbox, 5, 4);
//Max 9000 and min -1000 since we have a digit after the comma
lv_spinbox_set_range(altimeterScreen->altitudeOffset_spinbox, -10000, 90000);
lv_spinbox_set_cursor_pos(altimeterScreen->altitudeOffset_spinbox, 3);
lv_coord_t spinbox_height = lv_obj_get_height(altimeterScreen->altitudeOffset_spinbox);
lv_obj_t *inc_btn = lv_btn_create(altimeterScreen->inner_circle);
lv_obj_set_size(inc_btn, spinbox_height, spinbox_height);
lv_obj_align_to(inc_btn, altimeterScreen->altitudeOffset_spinbox, LV_ALIGN_OUT_RIGHT_MID, 5, 0);
lv_obj_set_style_bg_img_src(inc_btn, LV_SYMBOL_PLUS, LV_PART_MAIN);
lv_obj_add_event_cb(inc_btn, &(lv_spinbox_increment_event_cb), LV_EVENT_ALL, altimeterScreen);
lv_obj_t *dec_btn = lv_btn_create(altimeterScreen->inner_circle);
lv_obj_set_size(dec_btn, spinbox_height, spinbox_height);
lv_obj_align_to(dec_btn, altimeterScreen->altitudeOffset_spinbox, LV_ALIGN_OUT_LEFT_MID, -5, 0);
lv_obj_set_style_bg_img_src(dec_btn, LV_SYMBOL_MINUS, LV_PART_MAIN);
lv_obj_add_event_cb(dec_btn, &(lv_spinbox_decrement_event_cb), LV_EVENT_ALL, altimeterScreen);
lv_obj_t *set_btn = lv_btn_create(altimeterScreen->inner_circle);
lv_obj_align(set_btn, LV_ALIGN_CENTER, 0, 50);
lv_obj_t *set_btn_lbl = lv_label_create(set_btn);
lv_label_set_text(set_btn_lbl, "Set");
lv_obj_center(set_btn_lbl);
lv_obj_add_event_cb(set_btn, &(apply_altitude_event_cb), LV_EVENT_CLICKED, altimeterScreen);
}
static void destroy_pressure_content(AltimeterScreen_t * const altimeterScreen)
{
lv_obj_clean(altimeterScreen->inner_circle);
altimeterScreen->maxValue.value_unit = NULL;
altimeterScreen->minValue.value_unit = NULL;
altimeterScreen->pressureChart.chart = NULL;
}
static void destroy_altitude_content(AltimeterScreen_t * const altimeterScreen)
{
lv_obj_clean(altimeterScreen->inner_circle);
altimeterScreen->vsiValue.value_unit = NULL;
}
static void destroy_altitude_setting_content(AltimeterScreen_t * const altimeterScreen)
{
lv_obj_clean(altimeterScreen->inner_circle);
altimeterScreen->altitudeOffset_spinbox = NULL;
}
static void update_min_and_max_pressure_data(AltimeterScreen_t * const altimeterScreen, float minPressure, float maxPressure)
{
altimeterScreen->minValueFloat = minPressure;
altimeterScreen->maxValueFloat = maxPressure;
if(altimeterScreen->minValue.value_unit)
{
sprintf(altimeterScreen->minValue.value_unit_text, "min:\n%.2f hPa", altimeterScreen->minValueFloat);
lv_label_set_text_static(altimeterScreen->minValue.value_unit, altimeterScreen->minValue.value_unit_text);
}
if(altimeterScreen->maxValue.value_unit)
{
sprintf(altimeterScreen->maxValue.value_unit_text, "max:\n%.2f hPa", altimeterScreen->maxValueFloat);
lv_label_set_text_static(altimeterScreen->maxValue.value_unit, altimeterScreen->maxValue.value_unit_text);
}
}

View File

@ -6,7 +6,8 @@
typedef enum DisplayedView typedef enum DisplayedView
{ {
PRESSURE_VIEW = 0, PRESSURE_VIEW = 0,
ALTITUDE_VIEW ALTITUDE_VIEW,
ALTITUDE_SETTING_VIEW
} DisplayedView_e; } DisplayedView_e;
typedef struct MainValue typedef struct MainValue
@ -14,34 +15,51 @@ typedef struct MainValue
lv_obj_t *value; lv_obj_t *value;
lv_obj_t *unit; lv_obj_t *unit;
char value_text[10]; char value_text[10];
char value_unit[5];
} MainValue_t; } MainValue_t;
typedef struct MinMaxValue typedef struct MinMaxVSIValue
{ {
lv_obj_t *value_unit; lv_obj_t *value_unit;
char value_unit_text[20]; char value_unit_text[20];
} MinMaxValue_t; } MinMaxVSIValue_t;
typedef void(*MeasurementCb_t)(float * const temperature, float * const pressure, float * const altitude); typedef void(*MeasurementCb_t)(float * const temperature, float * const pressure, float * const altitude);
typedef struct PressureChart
{
lv_obj_t *chart;
} PressureChart_t;
typedef struct AltimeterScreen typedef struct AltimeterScreen
{ {
//Can be erased attributes //Can be erased attributes
lv_obj_t *display; lv_obj_t *display;
lv_obj_t *inner_circle;
lv_obj_t *altitudeOffset_spinbox;
PressureChart_t pressureChart;
lv_timer_t *measurementUpdateTimer; lv_timer_t *measurementUpdateTimer;
MainValue_t mainValue; MainValue_t mainValue;
MinMaxValue_t minValue; MinMaxVSIValue_t minValue;
MinMaxValue_t maxValue; MinMaxVSIValue_t maxValue;
MinMaxVSIValue_t vsiValue;
float vsiFloat;
float lastReadAltitude;
//Should not be erased attributes //Should not be erased attributes
DisplayedView_e displayedView; DisplayedView_e displayedView;
MeasurementCb_t measurementCb; MeasurementCb_t measurementCb;
float minValueFloat;
float maxValueFloat;
float altitudeOffset;
lv_coord_t pressure_data_points[10];
float pressure_data_points_float[10];
} AltimeterScreen_t; } AltimeterScreen_t;
void altimeter_screen_init(AltimeterScreen_t * const altimeterScreen); void altimeter_screen_init(AltimeterScreen_t * const altimeterScreen);
void altimeter_screen_register_measurement_cb(AltimeterScreen_t * const altimeterScreen, MeasurementCb_t MeasurementCb); void altimeter_screen_register_measurement_cb(AltimeterScreen_t * const altimeterScreen, MeasurementCb_t MeasurementCb);
void altimeter_screen_shift_chart_pressure_measurement(AltimeterScreen_t * const altimeterScreen, float pressure);
void altimeter_screen_create(AltimeterScreen_t * const altimeterScreen); void altimeter_screen_create(AltimeterScreen_t * const altimeterScreen);
void altimeter_screen_destroy(AltimeterScreen_t * const altimeterScreen); void altimeter_screen_destroy(AltimeterScreen_t * const altimeterScreen);

View File

@ -0,0 +1,194 @@
#include "lvgl.h"
const LV_ATTRIBUTE_LARGE_CONST uint8_t calibration_icon_chroma_map[] = {
#if LV_COLOR_DEPTH == 1 || LV_COLOR_DEPTH == 8
/*Pixel format: Red: 3 bit, Green: 3 bit, Blue: 2 bit*/
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xbb, 0xbb, 0xbb, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x4e, 0x4e, 0x6e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x4e, 0x4e, 0x4e, 0x4e, 0x72, 0x72, 0x6e, 0x4e, 0x4e, 0x4e, 0x4e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x4e, 0x4e, 0x76, 0xbf, 0xbf, 0xbf, 0xbf, 0x9b, 0x4e, 0x4e, 0x4e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x4e, 0x4e, 0x76, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xdf, 0x9b, 0x4e, 0x4e, 0x4e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x4e, 0x4e, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0x72, 0x4e, 0x4e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c,
0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x6e, 0x4e, 0x72, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0x97, 0x4e, 0x4e, 0x4e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7,
0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x6e, 0x4e, 0x72, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0x9b, 0x4e, 0x4e, 0x4e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7,
0xbb, 0xbb, 0xbb, 0xbb, 0xb7, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x6e, 0x4e, 0x6e, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0x76, 0x4e, 0x4e, 0x4e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xbb, 0xbb, 0xbb, 0xbb,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x4e, 0x4e, 0x9b, 0xdf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0x4e, 0x4e, 0x4e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xbb, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x4e, 0x4e, 0x4e, 0x9b, 0xbf, 0xbf, 0xbf, 0xbf, 0xbf, 0x6e, 0x4e, 0x4e, 0x4e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x4e, 0x4e, 0x4e, 0x72, 0x97, 0x9b, 0x76, 0x4e, 0x4e, 0x4e, 0x4e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x6e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x4e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x4e, 0x4e, 0x4e, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xbb, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xbb, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xbb, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0xb7, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0xb7, 0xb7, 0xbb, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c, 0x1c,
#endif
#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 0
/*Pixel format: Red: 5 bit, Green: 6 bit, Blue: 5 bit*/
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x56, 0x95, 0xd8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x56, 0x95, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x56, 0x95, 0xd8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x56, 0x95, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x97, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x56, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x95, 0x56, 0x95, 0x56, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x97, 0x9d, 0x98, 0xa5, 0xb8, 0xa5, 0x97, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x95, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x36, 0x95, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x95, 0x77, 0x9d, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x97, 0xa5, 0x56, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0x77, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x36, 0x95, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x95, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x36, 0x95, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x76, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x77, 0x9d, 0x56, 0x95, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x77, 0x9d, 0x56, 0x95, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x2e, 0x53, 0x0d, 0x4b, 0xed, 0x4a, 0xcd, 0x4a, 0x0d, 0x4b, 0x2e, 0x53, 0x0d, 0x4b, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x56, 0x95, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x0d, 0x4b, 0x2e, 0x53, 0xcd, 0x4a, 0x2e, 0x53, 0x31, 0x64, 0x51, 0x6c, 0x8f, 0x5b, 0xcc, 0x4a, 0x0d, 0x53, 0x0d, 0x53, 0x0d, 0x4b, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x56, 0x9d, 0x97, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x56, 0x95, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x2e, 0x53, 0xcc, 0x4a, 0xf3, 0x74, 0x5c, 0xa7, 0xfe, 0xaf, 0xfe, 0xb7, 0xbd, 0xaf, 0xd6, 0x85, 0xed, 0x4a, 0x0d, 0x53, 0x0d, 0x4b, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x76, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x2d, 0x53, 0xcd, 0x4a, 0xf3, 0x74, 0xfe, 0xb7, 0xfe, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xff, 0xb7, 0x17, 0x8e, 0xed, 0x4a, 0x2e, 0x53, 0x2e, 0x53, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x56, 0x9d, 0x97, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x0d, 0x4b, 0x2e, 0x53, 0x9c, 0xa7, 0xfe, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfe, 0xb7, 0x31, 0x64, 0xed, 0x4a, 0x2e, 0x53, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x4e, 0x53, 0xcd, 0x4a, 0x31, 0x64, 0xfe, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfe, 0xb7, 0x75, 0x7d, 0xcc, 0x4a, 0x2e, 0x53, 0xed, 0x4a, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x36, 0x95, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d,
0x56, 0x95, 0x56, 0x95, 0x56, 0x95, 0x56, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x4e, 0x53, 0xcc, 0x4a, 0x51, 0x6c, 0xfe, 0xb7, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xdd, 0xaf, 0xfe, 0xb7, 0xb6, 0x85, 0xac, 0x4a, 0x2e, 0x53, 0x0d, 0x4b, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x36, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x95, 0x56, 0x95, 0x56, 0x95,
0xd8, 0xa5, 0xd8, 0xa5, 0xd8, 0xa5, 0xb8, 0xa5, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x97, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x4e, 0x53, 0xed, 0x4a, 0x8f, 0x5b, 0xdd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfe, 0xb7, 0x92, 0x6c, 0xcd, 0x4a, 0x2e, 0x53, 0xed, 0x4a, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x77, 0x9d, 0x56, 0x9d, 0xb8, 0xa5, 0xd8, 0xa5, 0xb8, 0xa5, 0xd8, 0xa5,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x2d, 0x53, 0xcc, 0x4a, 0xd6, 0x85, 0xff, 0xb7, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfe, 0xb7, 0x1a, 0x9f, 0x0d, 0x53, 0x0d, 0x4b, 0x2e, 0x53, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x97, 0x9d, 0x56, 0x9d, 0x56, 0x95, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x0d, 0x4b, 0x0d, 0x53, 0xed, 0x4a, 0x17, 0x8e, 0xfe, 0xb7, 0xfe, 0xb7, 0xff, 0xb7, 0xfe, 0xb7, 0xfa, 0x9e, 0x6f, 0x53, 0xed, 0x4a, 0x0d, 0x53, 0x2e, 0x53, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x56, 0x9d, 0x97, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x0d, 0x53, 0x0d, 0x53, 0xed, 0x4a, 0x11, 0x64, 0x75, 0x7d, 0x96, 0x85, 0x92, 0x6c, 0x2d, 0x53, 0xed, 0x4a, 0x2e, 0x53, 0x0d, 0x4b, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x77, 0x9d, 0x56, 0x95, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x0d, 0x4b, 0x0d, 0x53, 0x2e, 0x53, 0xed, 0x4a, 0xcc, 0x4a, 0xcc, 0x4a, 0xcd, 0x4a, 0x0d, 0x53, 0x2d, 0x53, 0x0d, 0x4b, 0x6f, 0x53, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x56, 0x95, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x56, 0x95, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x77, 0x9d, 0x36, 0x95, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x0d, 0x4b, 0x0d, 0x4b, 0x0d, 0x4b, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x77, 0x9d, 0x77, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x77, 0x9d, 0x77, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x95, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0x77, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x36, 0x95, 0xd8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x56, 0x95, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x95, 0xd8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xb8, 0xa5, 0x56, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x76, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x76, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x95, 0x77, 0x9d, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x56, 0x95, 0x56, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x95, 0x56, 0x95, 0x56, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x95, 0x56, 0x95, 0x77, 0x9d, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xb8, 0xa5, 0x97, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x77, 0x9d, 0xb8, 0xa5, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x56, 0x95, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x95, 0x56, 0x95, 0xd8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x56, 0x95, 0xb8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0x56, 0x9d, 0x56, 0x95, 0xd8, 0xa5, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07,
#endif
#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP != 0
/*Pixel format: Red: 5 bit, Green: 6 bit, Blue: 5 bit BUT the 2 bytes are swapped*/
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x95, 0x56, 0xa5, 0xd8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x95, 0x56, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x95, 0x56, 0xa5, 0xd8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x95, 0x56, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0xa5, 0x97, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x95, 0x56, 0x95, 0x56, 0x9d, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x97, 0xa5, 0x98, 0xa5, 0xb8, 0x9d, 0x97, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x95, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x36, 0x9d, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0x56, 0x9d, 0x77, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0xa5, 0x97, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x77, 0x95, 0x56, 0x9d, 0x77, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x36, 0x9d, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0x77, 0x95, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x36, 0x9d, 0x77, 0x9d, 0x77, 0x95, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x9d, 0x77, 0x95, 0x56, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x9d, 0x77, 0x95, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x76, 0x9d, 0x77, 0x95, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x9d, 0x77, 0x95, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x9d, 0x77, 0x95, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x9d, 0x77, 0x95, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x53, 0x2e, 0x4b, 0x0d, 0x4a, 0xed, 0x4a, 0xcd, 0x4b, 0x0d, 0x53, 0x2e, 0x4b, 0x0d, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x95, 0x56, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x4b, 0x0d, 0x53, 0x2e, 0x4a, 0xcd, 0x53, 0x2e, 0x64, 0x31, 0x6c, 0x51, 0x5b, 0x8f, 0x4a, 0xcc, 0x53, 0x0d, 0x53, 0x0d, 0x4b, 0x0d, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x97, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x95, 0x56, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x53, 0x2e, 0x4a, 0xcc, 0x74, 0xf3, 0xa7, 0x5c, 0xaf, 0xfe, 0xb7, 0xfe, 0xaf, 0xbd, 0x85, 0xd6, 0x4a, 0xed, 0x53, 0x0d, 0x4b, 0x0d, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x76, 0x9d, 0x56, 0x9d, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x53, 0x2d, 0x4a, 0xcd, 0x74, 0xf3, 0xb7, 0xfe, 0xaf, 0xfe, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xb7, 0xff, 0x8e, 0x17, 0x4a, 0xed, 0x53, 0x2e, 0x53, 0x2e, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x97, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x4b, 0x0d, 0x53, 0x2e, 0xa7, 0x9c, 0xaf, 0xfe, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xb7, 0xfe, 0x64, 0x31, 0x4a, 0xed, 0x53, 0x2e, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x95, 0x56, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x53, 0x4e, 0x4a, 0xcd, 0x64, 0x31, 0xaf, 0xfe, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xb7, 0xfe, 0x7d, 0x75, 0x4a, 0xcc, 0x53, 0x2e, 0x4a, 0xed, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x36, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56,
0x95, 0x56, 0x95, 0x56, 0x95, 0x56, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x95, 0x56, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x53, 0x4e, 0x4a, 0xcc, 0x6c, 0x51, 0xb7, 0xfe, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xdd, 0xb7, 0xfe, 0x85, 0xb6, 0x4a, 0xac, 0x53, 0x2e, 0x4b, 0x0d, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x36, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0x56, 0x95, 0x56, 0x95, 0x56,
0xa5, 0xd8, 0xa5, 0xd8, 0xa5, 0xd8, 0xa5, 0xb8, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x97, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x53, 0x4e, 0x4a, 0xed, 0x5b, 0x8f, 0xaf, 0xdd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xb7, 0xfe, 0x6c, 0x92, 0x4a, 0xcd, 0x53, 0x2e, 0x4a, 0xed, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0xa5, 0xb8, 0xa5, 0xd8, 0xa5, 0xb8, 0xa5, 0xd8,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x53, 0x2d, 0x4a, 0xcc, 0x85, 0xd6, 0xb7, 0xff, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xaf, 0xfd, 0xb7, 0xfe, 0x9f, 0x1a, 0x53, 0x0d, 0x4b, 0x0d, 0x53, 0x2e, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x97, 0x9d, 0x56, 0x95, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x4b, 0x0d, 0x53, 0x0d, 0x4a, 0xed, 0x8e, 0x17, 0xb7, 0xfe, 0xb7, 0xfe, 0xb7, 0xff, 0xb7, 0xfe, 0x9e, 0xfa, 0x53, 0x6f, 0x4a, 0xed, 0x53, 0x0d, 0x53, 0x2e, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x9d, 0x56, 0xa5, 0x97, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x53, 0x0d, 0x53, 0x0d, 0x4a, 0xed, 0x64, 0x11, 0x7d, 0x75, 0x85, 0x96, 0x6c, 0x92, 0x53, 0x2d, 0x4a, 0xed, 0x53, 0x2e, 0x4b, 0x0d, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x9d, 0x77, 0x95, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x4b, 0x0d, 0x53, 0x0d, 0x53, 0x2e, 0x4a, 0xed, 0x4a, 0xcc, 0x4a, 0xcc, 0x4a, 0xcd, 0x53, 0x0d, 0x53, 0x2d, 0x4b, 0x0d, 0x53, 0x6f, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x95, 0x56, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x53, 0x2e, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x95, 0x56, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x9d, 0x77, 0x95, 0x36, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x4b, 0x0d, 0x4b, 0x0d, 0x4b, 0x0d, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0x77, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x9d, 0x77, 0x95, 0x56, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0x77, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0x56, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x77, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0x36, 0xa5, 0xd8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x95, 0x56, 0x9d, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0x56, 0xa5, 0xd8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0xa5, 0xb8, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x76, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x76, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x95, 0x56, 0x9d, 0x77, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x95, 0x56, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x95, 0x56, 0x95, 0x56, 0x95, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x56, 0x95, 0x56, 0x95, 0x56, 0x9d, 0x77, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0xa5, 0xb8, 0x9d, 0x97, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x77, 0xa5, 0xb8, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x77, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x9d, 0x77, 0x9d, 0x56, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x95, 0x56, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x95, 0x56, 0x95, 0x56, 0xa5, 0xd8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x95, 0x56, 0xa5, 0xb8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x9d, 0x56, 0x95, 0x56, 0xa5, 0xd8, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0, 0x07, 0xe0,
#endif
#if LV_COLOR_DEPTH == 32
/*Pixel format: Fix 0xFF: 8 bit, Red: 8 bit, Green: 8 bit, Blue: 8 bit*/
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xc0, 0xb6, 0xa0, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xbf, 0xb5, 0x9f, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xb0, 0xa6, 0x92, 0xff, 0xc0, 0xb6, 0xa0, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb0, 0xa7, 0x93, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xbf, 0xb5, 0x9f, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb5, 0xab, 0x97, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xad, 0x98, 0xff, 0xb3, 0xa9, 0x94, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb5, 0xab, 0x97, 0xff, 0xbb, 0xb0, 0x9c, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0xb0, 0xa7, 0x93, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb2, 0xa8, 0x95, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb0, 0xa7, 0x93, 0xff, 0xb2, 0xa9, 0x95, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb1, 0xa7, 0x94, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb9, 0xae, 0x9a, 0xff, 0xbc, 0xb1, 0x9d, 0xff, 0xbc, 0xb2, 0x9d, 0xff, 0xba, 0xb0, 0x9b, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb0, 0xa7, 0x93, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xae, 0xa4, 0x91, 0xff, 0xb4, 0xaa, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb6, 0xac, 0x97, 0xff, 0xc2, 0xb3, 0xa1, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb8, 0xaf, 0x9c, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb2, 0xa8, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb5, 0xac, 0x96, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb1, 0xa7, 0x94, 0xff, 0xb3, 0xa9, 0x94, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb0, 0xa5, 0x93, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xaf, 0xa6, 0x92, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb0, 0xa7, 0x93, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb4, 0xaa, 0x95, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xae, 0xa4, 0x91, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb0, 0xa6, 0x92, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb4, 0xaa, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xbc, 0xb3, 0x9d, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb3, 0xaa, 0x96, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb0, 0xa6, 0x92, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb6, 0xad, 0x98, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb3, 0xa9, 0x94, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x6e, 0x65, 0x4d, 0xff, 0x6e, 0x64, 0x4e, 0xff, 0x6e, 0x65, 0x50, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb4, 0xaa, 0x95, 0xff, 0xb0, 0xa7, 0x93, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xaf, 0xa6, 0x92, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb0, 0xa7, 0x93, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x6c, 0x62, 0x4d, 0xff, 0x6a, 0x5f, 0x4b, 0xff, 0x65, 0x5a, 0x48, 0xff, 0x64, 0x59, 0x47, 0xff, 0x68, 0x5e, 0x4a, 0xff, 0x6c, 0x62, 0x4d, 0xff, 0x6a, 0x60, 0x4b, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0xbf, 0xb4, 0x9f, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb5, 0xab, 0x97, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x6a, 0x61, 0x4b, 0xff, 0x6d, 0x63, 0x4d, 0xff, 0x64, 0x59, 0x47, 0xff, 0x6e, 0x65, 0x4e, 0xff, 0x88, 0x84, 0x61, 0xff, 0x8b, 0x87, 0x64, 0xff, 0x76, 0x6e, 0x54, 0xff, 0x63, 0x58, 0x47, 0xff, 0x6b, 0x61, 0x4c, 0xff, 0x6b, 0x61, 0x4c, 0xff, 0x6a, 0x5f, 0x4b, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb1, 0xa7, 0x94, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xb8, 0xae, 0x9a, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb0, 0xa8, 0x93, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0xc2, 0xb3, 0xa1, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x6d, 0x63, 0x4d, 0xff, 0x63, 0x57, 0x46, 0xff, 0x99, 0x9a, 0x6d, 0xff, 0xde, 0xe9, 0xa0, 0xff, 0xee, 0xff, 0xab, 0xff, 0xf0, 0xff, 0xac, 0xff, 0xe5, 0xf4, 0xa5, 0xff, 0xb2, 0xb8, 0x7f, 0xff, 0x67, 0x5c, 0x49, 0xff, 0x6b, 0x60, 0x4c, 0xff, 0x69, 0x60, 0x4b, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb3, 0xaa, 0x92, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb6, 0xac, 0x98, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb2, 0xa8, 0x95, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x6b, 0x62, 0x4c, 0xff, 0x64, 0x58, 0x47, 0xff, 0x99, 0x9a, 0x6e, 0xff, 0xf1, 0xff, 0xad, 0xff, 0xee, 0xff, 0xab, 0xff, 0xe9, 0xfc, 0xa7, 0xff, 0xe9, 0xfc, 0xa7, 0xff, 0xeb, 0xfe, 0xa9, 0xff, 0xf6, 0xff, 0xb1, 0xff, 0xb8, 0xc0, 0x84, 0xff, 0x66, 0x5b, 0x48, 0xff, 0x6c, 0x62, 0x4c, 0xff, 0x6c, 0x62, 0x4d, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb1, 0xa8, 0x93, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb5, 0xab, 0x97, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb3, 0xa9, 0x94, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb8, 0xae, 0x9a, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x69, 0x5f, 0x4b, 0xff, 0x6e, 0x65, 0x4e, 0xff, 0xdf, 0xef, 0xa0, 0xff, 0xee, 0xfe, 0xaa, 0xff, 0xe8, 0xfb, 0xa6, 0xff, 0xeb, 0xfe, 0xa9, 0xff, 0xeb, 0xfe, 0xa9, 0xff, 0xea, 0xfd, 0xa8, 0xff, 0xe8, 0xfb, 0xa6, 0xff, 0xf1, 0xff, 0xad, 0xff, 0x86, 0x82, 0x60, 0xff, 0x65, 0x5a, 0x48, 0xff, 0x6d, 0x63, 0x4d, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb0, 0xa7, 0x93, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0xb1, 0xa8, 0x94, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xb1, 0xa7, 0x94, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb0, 0xa7, 0x93, 0xff, 0xbc, 0xb2, 0x9d, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x71, 0x68, 0x50, 0xff, 0x64, 0x58, 0x47, 0xff, 0x88, 0x84, 0x61, 0xff, 0xee, 0xfd, 0xab, 0xff, 0xe8, 0xfc, 0xa6, 0xff, 0xeb, 0xfd, 0xa8, 0xff, 0xea, 0xfd, 0xa8, 0xff, 0xeb, 0xfe, 0xa9, 0xff, 0xeb, 0xfe, 0xa9, 0xff, 0xe7, 0xfa, 0xa6, 0xff, 0xf3, 0xfe, 0xaf, 0xff, 0xa9, 0xad, 0x79, 0xff, 0x62, 0x56, 0x45, 0xff, 0x6e, 0x64, 0x4e, 0xff, 0x69, 0x5d, 0x48, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xaf, 0xa5, 0x92, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xb1, 0xa8, 0x94, 0xff,
0xb1, 0xa7, 0x93, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb0, 0xa7, 0x93, 0xff, 0xbc, 0xb2, 0x9d, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x71, 0x68, 0x50, 0xff, 0x63, 0x57, 0x46, 0xff, 0x8b, 0x88, 0x64, 0xff, 0xf0, 0xfe, 0xac, 0xff, 0xe8, 0xfb, 0xa6, 0xff, 0xeb, 0xfe, 0xa9, 0xff, 0xeb, 0xfe, 0xa9, 0xff, 0xeb, 0xfe, 0xa9, 0xff, 0xea, 0xfd, 0xa8, 0xff, 0xe8, 0xf9, 0xa7, 0xff, 0xf3, 0xfe, 0xaf, 0xff, 0xad, 0xb3, 0x7c, 0xff, 0x61, 0x55, 0x44, 0xff, 0x6d, 0x65, 0x4f, 0xff, 0x69, 0x60, 0x4b, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xaf, 0xa5, 0x92, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb1, 0xa7, 0x94, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb1, 0xa7, 0x93, 0xff,
0xc0, 0xb6, 0xa0, 0xff, 0xc0, 0xb6, 0xa0, 0xff, 0xc0, 0xb6, 0xa0, 0xff, 0xbf, 0xb5, 0x9f, 0xff, 0xb5, 0xab, 0x97, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xba, 0xb0, 0x9b, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x71, 0x68, 0x50, 0xff, 0x67, 0x5d, 0x4a, 0xff, 0x76, 0x6e, 0x54, 0xff, 0xe6, 0xf6, 0xa5, 0xff, 0xeb, 0xfc, 0xa8, 0xff, 0xea, 0xfd, 0xa8, 0xff, 0xeb, 0xfe, 0xa9, 0xff, 0xea, 0xfd, 0xa8, 0xff, 0xeb, 0xfe, 0xa9, 0xff, 0xe7, 0xfa, 0xa6, 0xff, 0xf3, 0xff, 0xae, 0xff, 0x92, 0x91, 0x68, 0xff, 0x64, 0x58, 0x47, 0xff, 0x6e, 0x64, 0x4e, 0xff, 0x69, 0x5d, 0x48, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xbd, 0xb3, 0x9e, 0xff, 0xc0, 0xb6, 0xa0, 0xff, 0xc0, 0xb5, 0xa0, 0xff, 0xc0, 0xb6, 0xa0, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb5, 0xab, 0x97, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x6b, 0x62, 0x4c, 0xff, 0x63, 0x57, 0x46, 0xff, 0xb2, 0xb8, 0x80, 0xff, 0xf6, 0xff, 0xb1, 0xff, 0xe8, 0xfb, 0xa6, 0xff, 0xe8, 0xfb, 0xa7, 0xff, 0xe8, 0xfb, 0xa7, 0xff, 0xe7, 0xfa, 0xa6, 0xff, 0xf3, 0xff, 0xae, 0xff, 0xd2, 0xdf, 0x97, 0xff, 0x6b, 0x61, 0x4c, 0xff, 0x6b, 0x60, 0x4b, 0xff, 0x6c, 0x62, 0x4c, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb5, 0xab, 0x97, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xba, 0xb0, 0x9b, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x69, 0x60, 0x4b, 0xff, 0x6b, 0x61, 0x4c, 0xff, 0x67, 0x5c, 0x49, 0xff, 0xb8, 0xc0, 0x84, 0xff, 0xf1, 0xff, 0xad, 0xff, 0xf3, 0xff, 0xaf, 0xff, 0xf4, 0xff, 0xaf, 0xff, 0xf3, 0xff, 0xae, 0xff, 0xd1, 0xdd, 0x96, 0xff, 0x74, 0x6c, 0x53, 0xff, 0x68, 0x5d, 0x4a, 0xff, 0x6a, 0x61, 0x4c, 0xff, 0x70, 0x65, 0x4f, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb3, 0xa9, 0x94, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb8, 0xaf, 0x9c, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x6b, 0x61, 0x4c, 0xff, 0x6b, 0x60, 0x4c, 0xff, 0x66, 0x5b, 0x48, 0xff, 0x86, 0x81, 0x5f, 0xff, 0xa9, 0xac, 0x79, 0xff, 0xae, 0xb1, 0x7c, 0xff, 0x92, 0x90, 0x68, 0xff, 0x6b, 0x62, 0x4c, 0xff, 0x68, 0x5d, 0x4a, 0xff, 0x6d, 0x63, 0x4d, 0xff, 0x68, 0x5e, 0x4a, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb0, 0xa7, 0x92, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb7, 0xad, 0x98, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb0, 0xa7, 0x93, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x6a, 0x5f, 0x4b, 0xff, 0x6a, 0x60, 0x4c, 0xff, 0x6c, 0x62, 0x4d, 0xff, 0x66, 0x5b, 0x48, 0xff, 0x62, 0x56, 0x46, 0xff, 0x62, 0x56, 0x45, 0xff, 0x64, 0x59, 0x47, 0xff, 0x6b, 0x61, 0x4c, 0xff, 0x6b, 0x62, 0x4c, 0xff, 0x68, 0x5e, 0x4a, 0xff, 0x75, 0x6a, 0x52, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb0, 0xa7, 0x93, 0xff, 0xbd, 0xb3, 0x9e, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x6c, 0x62, 0x4d, 0xff, 0x6e, 0x64, 0x4e, 0xff, 0x6e, 0x65, 0x4f, 0xff, 0x6e, 0x65, 0x4f, 0xff, 0x6e, 0x64, 0x4e, 0xff, 0x6c, 0x63, 0x4d, 0xff, 0x70, 0x65, 0x4f, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0xc0, 0xb5, 0xa0, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb1, 0xa7, 0x94, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb0, 0xa5, 0x92, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x69, 0x60, 0x4b, 0xff, 0x69, 0x60, 0x4b, 0xff, 0x69, 0x60, 0x4b, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb0, 0xa6, 0x92, 0xff, 0xbf, 0xb4, 0x9f, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb0, 0xa7, 0x93, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb7, 0xad, 0x98, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb5, 0xac, 0x96, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb0, 0xa6, 0x92, 0xff, 0xc1, 0xb5, 0xa0, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xaf, 0xa6, 0x92, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xad, 0xa4, 0x90, 0xff, 0xc3, 0xb9, 0xa3, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb2, 0xa8, 0x95, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0xc3, 0xb8, 0xa3, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xbc, 0xb3, 0x9d, 0xff, 0xb0, 0xa6, 0x92, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb3, 0xaa, 0x97, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xaf, 0xaa, 0x92, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0xb7, 0xac, 0x98, 0xff, 0xc1, 0xb5, 0xa0, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xad, 0x98, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb0, 0xa7, 0x93, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb1, 0xa7, 0x94, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb2, 0xa8, 0x95, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xb0, 0xa6, 0x93, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xbf, 0xb4, 0x9f, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xbf, 0xb5, 0x9f, 0xff, 0xb9, 0xaf, 0x9a, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb7, 0xad, 0x99, 0xff, 0xbd, 0xb3, 0x9e, 0xff, 0xc0, 0xb5, 0x9f, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb5, 0xab, 0x97, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb4, 0xaa, 0x96, 0xff, 0xb3, 0xa9, 0x95, 0xff, 0xb5, 0xab, 0x97, 0xff, 0xb2, 0xa8, 0x94, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xbd, 0xb3, 0x9d, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb0, 0xa7, 0x93, 0xff, 0xb0, 0xa6, 0x92, 0xff, 0xc0, 0xb6, 0xa0, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xbf, 0xb5, 0x9f, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xb1, 0xa8, 0x94, 0xff, 0xb1, 0xa7, 0x93, 0xff, 0xc0, 0xb6, 0xa0, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff,
#endif
};
const lv_img_dsc_t altimeter_asset_calibration_icon = {
.header.cf = LV_IMG_CF_TRUE_COLOR_CHROMA_KEYED,
.header.always_zero = 0,
.header.reserved = 0,
.header.w = 42,
.header.h = 42,
.data_size = 1764 * LV_COLOR_SIZE / 8,
.data = calibration_icon_chroma_map,
};

View File

@ -1,16 +1,58 @@
#include "lvgl.h" #include "lvgl.h"
/***
* It is needed to have a reference on two header_titles because when
* switching from one screen using a header to an other screen which is also using one
* the header of the new screen will be created BEFORE the header of the previous screen
* is deleted ...
*/
/* A reference to the current and previous header title */
static lv_obj_t *header_title[2] = {NULL, NULL};
/* Pointer to the header_title to use */
lv_obj_t **header_title_p = &header_title[0];
static void cleanup_event_cb(lv_event_t * e)
{
lv_obj_t **header_title_deleted_p = e->user_data;
*header_title_deleted_p = NULL;
LV_LOG_USER("header_title cleanup");
}
void common_screen_header_component(lv_obj_t *parent, const char * title, lv_coord_t height) void common_screen_header_component(lv_obj_t *parent, const char * title, lv_coord_t height)
{ {
if(header_title[0] == NULL)
header_title_p = &header_title[0];
else if(header_title[1] == NULL)
header_title_p = &header_title[1];
else
{
LV_LOG_ERROR("no free header_title");
return;
}
lv_obj_t *header = lv_obj_create(parent); lv_obj_t *header = lv_obj_create(parent);
lv_obj_set_style_bg_color(header, lv_color_make(129, 141,181), LV_PART_MAIN); lv_obj_set_style_bg_color(header, lv_color_make(129, 141,181), LV_PART_MAIN);
lv_obj_set_size(header, lv_disp_get_hor_res(NULL), height); lv_obj_set_size(header, lv_disp_get_hor_res(NULL), height);
lv_obj_set_style_radius(header, 0, LV_PART_MAIN); lv_obj_set_style_radius(header, 0, LV_PART_MAIN);
lv_obj_set_style_border_width(header, 0, LV_PART_MAIN); lv_obj_set_style_border_width(header, 0, LV_PART_MAIN);
lv_obj_clear_flag(header, LV_OBJ_FLAG_SCROLLABLE);
lv_obj_t *header_title = lv_label_create(header); *header_title_p = lv_label_create(header);
lv_label_set_text_static(header_title, title); lv_label_set_text_static(*header_title_p, title);
lv_obj_set_style_text_color(header_title, lv_color_white(), LV_PART_MAIN); lv_obj_set_style_text_align(*header_title_p, LV_TEXT_ALIGN_CENTER, LV_PART_MAIN);
lv_obj_set_style_text_font(header_title, &lv_font_montserrat_30, LV_PART_MAIN); lv_obj_set_style_text_color(*header_title_p, lv_color_white(), LV_PART_MAIN);
lv_obj_set_align(header_title, LV_ALIGN_CENTER); lv_obj_set_style_text_font(*header_title_p, &lv_font_montserrat_30, LV_PART_MAIN);
lv_obj_set_width(*header_title_p, 150);
lv_obj_set_align(*header_title_p, LV_ALIGN_CENTER);
lv_label_set_long_mode(*header_title_p, LV_LABEL_LONG_SCROLL_CIRCULAR);
/* Once the current header_title is destroyed, mark it as NULL to prevent any crashes when trying to change it's title */
lv_obj_add_event_cb(*header_title_p, &(cleanup_event_cb), LV_EVENT_DELETE, header_title_p);
}
void common_screen_header_update_title(const char * title)
{
if(!*header_title_p)return;
lv_label_set_text_static(*header_title_p, title);
} }

View File

@ -3,6 +3,20 @@
#include "lvgl.h" #include "lvgl.h"
/**
* @brief Adds a screen header with the defined title to the screen passed as parent with the provided height.
*
* @param parent the screen to which the header will be added
* @param title a string used as the header's title
* @param height the height in pixel of the header
*/
void common_screen_header_component(lv_obj_t *parent, const char * title, lv_coord_t height); void common_screen_header_component(lv_obj_t *parent, const char * title, lv_coord_t height);
/**
* @brief Updates the current title of displayed screen header
*
* @param title a string used as the new header's title
*/
void common_screen_header_update_title(const char * title);
#endif //COMMON_SCREEN_COMPONENTS_H #endif //COMMON_SCREEN_COMPONENTS_H

View File

@ -0,0 +1,7 @@
#ifndef FIRMWARE_VERSION_H
#define FIRMWARE_VERSION_H
#define FIRMWARE_VERSION "0.0.1" //Firmware creation
#define FIRMWARE_TIME_DATE (__TIME__" "__DATE__)
#endif //FIRMWARE_VERSION_H

View File

@ -1,338 +0,0 @@
#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef LV_ATTRIBUTE_MEM_ALIGN
#define LV_ATTRIBUTE_MEM_ALIGN
#endif
#ifndef LV_ATTRIBUTE_IMG_HOUR_HAND
#define LV_ATTRIBUTE_IMG_HOUR_HAND
#endif
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_HOUR_HAND uint8_t hour_hand_map[] = {
#if LV_COLOR_DEPTH == 1 || LV_COLOR_DEPTH == 8
/*Pixel format: Alpha 8 bit, Red: 3 bit, Green: 3 bit, Blue: 2 bit*/
0x00, 0x00, 0x00, 0x00, 0x49, 0xc0, 0x6d, 0xff, 0x49, 0xff, 0x24, 0x20, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x24, 0xff, 0x49, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xb6, 0x45, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb6, 0xff, 0xb7, 0x6f, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb6, 0xff, 0xdb, 0x54, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb6, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb6, 0xff, 0xdb, 0x32, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb6, 0xff, 0xdb, 0x39, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xdb, 0xff, 0xb7, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb6, 0xff, 0xdb, 0x80, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb6, 0xff, 0xdb, 0x07, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xdb, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb6, 0xff, 0xdb, 0x45, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xdb, 0xff, 0xb7, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb6, 0xff, 0xb6, 0x66, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x24, 0xff, 0x49, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x24, 0xff, 0x49, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0x92, 0xff, 0x92, 0x59, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x24, 0xff, 0x6d, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x24, 0xff, 0x49, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x24, 0xff, 0x6d, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xdb, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb7, 0xff, 0xb6, 0x68, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0xb6, 0xff, 0x6e, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x24, 0x1d, 0x24, 0xd2, 0x24, 0xff, 0x25, 0xff, 0x49, 0xff, 0x6d, 0x35, 0x00, 0x00,
0x00, 0x00, 0x92, 0xbd, 0x6d, 0xde, 0x49, 0x56, 0x6e, 0x56, 0x49, 0xc6, 0x49, 0xd9, 0x6d, 0x38,
0x00, 0x00, 0xb7, 0xb2, 0x92, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x6c, 0x24, 0x78,
0xb7, 0xff, 0xb7, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x2f, 0x92, 0xdc,
0xb7, 0xff, 0xb7, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x0d, 0x49, 0xaa,
0xb6, 0xff, 0x6e, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x40, 0xdb, 0xf1,
0x00, 0x00, 0x92, 0xec, 0x49, 0x64, 0x24, 0x11, 0x6e, 0x0c, 0x25, 0x3c, 0x92, 0xa1, 0xdb, 0x79,
0x00, 0x00, 0x49, 0x8a, 0x25, 0xea, 0x00, 0xbb, 0x00, 0xb6, 0x49, 0xe6, 0x92, 0xc1, 0x92, 0x1d,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0x6d, 0xff, 0x6d, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0x6d, 0xff, 0x6e, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0x6d, 0xff, 0x6e, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0x6d, 0xff, 0x6e, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0x6d, 0xff, 0x6e, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0x6d, 0xff, 0x6e, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0x6d, 0xff, 0x6e, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0x6d, 0xff, 0x6e, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0x6d, 0xff, 0x6d, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0x6d, 0xff, 0x92, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0x8c, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x6e, 0xbd, 0xdb, 0xff, 0xdb, 0xff, 0xb7, 0xfb, 0xb7, 0x2f, 0x00, 0x00,
#endif
#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 0
/*Pixel format: Alpha 8 bit, Red: 5 bit, Green: 6 bit, Blue: 5 bit*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x42, 0xc0, 0xcb, 0x5a, 0xff, 0x8a, 0x52, 0xff, 0xc3, 0x18, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x10, 0xc0, 0x00, 0x00, 0xff, 0xa2, 0x10, 0xff, 0xa6, 0x31, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x10, 0xc0, 0x00, 0x00, 0xff, 0x41, 0x08, 0xff, 0x8e, 0x73, 0xff, 0x92, 0x94, 0x45, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x76, 0xb5, 0xff, 0x18, 0xc6, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x35, 0xad, 0xff, 0xd7, 0xbd, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x55, 0xad, 0xff, 0xf8, 0xc5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x55, 0xad, 0xff, 0xf8, 0xc5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x55, 0xad, 0xff, 0xf8, 0xc5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x35, 0xad, 0xff, 0xf8, 0xc5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x55, 0xad, 0xff, 0xf7, 0xbd, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x55, 0xad, 0xff, 0xf8, 0xc5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x55, 0xad, 0xff, 0xf7, 0xbd, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x75, 0xad, 0xff, 0x96, 0xb5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xf3, 0x9c, 0xff, 0x75, 0xad, 0x6f, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xb2, 0x94, 0xff, 0xb6, 0xb5, 0x54, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x14, 0xa5, 0xff, 0xf7, 0xbd, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x75, 0xad, 0xff, 0xf8, 0xc5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x55, 0xad, 0xff, 0xf8, 0xc5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x55, 0xad, 0xff, 0xf8, 0xc5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x55, 0xad, 0xff, 0xf8, 0xc5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x55, 0xad, 0xff, 0xf8, 0xc5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x55, 0xad, 0xff, 0xf8, 0xc5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x55, 0xad, 0xff, 0xf8, 0xc5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x76, 0xb5, 0xff, 0xb7, 0xbd, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x20, 0x00, 0xff, 0x14, 0xa5, 0xff, 0xd7, 0xbd, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x20, 0x00, 0xff, 0xf4, 0xa4, 0xff, 0xd7, 0xbd, 0x32, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x76, 0xb5, 0xff, 0x18, 0xc6, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x55, 0xad, 0xff, 0xf8, 0xc5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x96, 0xb5, 0xff, 0xd7, 0xbd, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x20, 0x00, 0xff, 0x34, 0xa5, 0xff, 0xf7, 0xbd, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x21, 0x08, 0xff, 0xf4, 0xa4, 0xff, 0xd7, 0xbd, 0x39, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xd7, 0xbd, 0xff, 0x96, 0xb5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x21, 0x08, 0xff, 0xb3, 0x9c, 0xff, 0xb6, 0xb5, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x21, 0x08, 0xff, 0xb3, 0x9c, 0xff, 0xd7, 0xbd, 0x07, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xb6, 0xb5, 0xff, 0xf7, 0xbd, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x21, 0x08, 0xff, 0xd3, 0x9c, 0xff, 0xd7, 0xbd, 0x45, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x20, 0x00, 0xff, 0x75, 0xad, 0xff, 0xf8, 0xc5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xb7, 0xbd, 0xff, 0x55, 0xad, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x41, 0x08, 0xff, 0xd3, 0x9c, 0xff, 0xb3, 0x9c, 0x66, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0xa3, 0x18, 0xff, 0x8a, 0x52, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0xa3, 0x18, 0xff, 0x8a, 0x52, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x61, 0x08, 0xff, 0x51, 0x8c, 0xff, 0x10, 0x84, 0x59, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0xa3, 0x18, 0xff, 0xcb, 0x5a, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0xc3, 0x18, 0xff, 0x49, 0x4a, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0xa3, 0x18, 0xff, 0xcb, 0x5a, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x21, 0x08, 0xff, 0x96, 0xb5, 0xff, 0xf8, 0xc5, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x21, 0x08, 0xff, 0x76, 0xb5, 0xff, 0x18, 0xc6, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x21, 0x08, 0xff, 0x96, 0xb5, 0xff, 0x18, 0xc6, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x21, 0x08, 0xff, 0x76, 0xb5, 0xff, 0x18, 0xc6, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x21, 0x08, 0xff, 0x96, 0xb5, 0xff, 0x18, 0xc6, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x21, 0x08, 0xff, 0x76, 0xb5, 0xff, 0x18, 0xc6, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xc0, 0x00, 0x00, 0xff, 0x21, 0x08, 0xff, 0xb6, 0xb5, 0xff, 0xf7, 0xbd, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x41, 0x08, 0xff, 0x35, 0xad, 0xff, 0xf7, 0xbd, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x41, 0x08, 0xff, 0x96, 0xb5, 0xff, 0xd3, 0x9c, 0x68, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xff, 0x21, 0x08, 0xff, 0x92, 0x94, 0xff, 0x4d, 0x6b, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xe3, 0x18, 0x1d, 0xe4, 0x20, 0xd2, 0xe4, 0x20, 0xff, 0x25, 0x29, 0xff, 0x49, 0x4a, 0xff, 0xaa, 0x52, 0x35, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0xef, 0x7b, 0xbd, 0xcb, 0x5a, 0xde, 0xa6, 0x31, 0x56, 0x8e, 0x73, 0x56, 0x29, 0x4a, 0xc6, 0x49, 0x4a, 0xd9, 0xeb, 0x5a, 0x38,
0x00, 0x00, 0x00, 0x35, 0xad, 0xb2, 0x10, 0x84, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x4a, 0x6c, 0x04, 0x21, 0x78,
0x55, 0xad, 0xff, 0x55, 0xad, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x10, 0x2f, 0x8e, 0x73, 0xdc,
0x76, 0xb5, 0xff, 0x34, 0xa5, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x29, 0x0d, 0x86, 0x31, 0xaa,
0xd3, 0x9c, 0xff, 0x4d, 0x6b, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xab, 0x5a, 0x40, 0xd7, 0xbd, 0xf1,
0x00, 0x00, 0x00, 0x72, 0x94, 0xec, 0xa6, 0x31, 0x64, 0x04, 0x21, 0x11, 0x6d, 0x6b, 0x0c, 0x65, 0x29, 0x3c, 0x31, 0x8c, 0xa1, 0x18, 0xc6, 0x79,
0x00, 0x00, 0x00, 0xe7, 0x39, 0x8a, 0x04, 0x21, 0xea, 0x82, 0x10, 0xbb, 0x41, 0x08, 0xb6, 0x69, 0x4a, 0xe6, 0x10, 0x84, 0xc1, 0xae, 0x73, 0x1d,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xcb, 0x5a, 0xff, 0x0c, 0x63, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xcb, 0x5a, 0xff, 0x2d, 0x6b, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xcb, 0x5a, 0xff, 0x2d, 0x6b, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xcb, 0x5a, 0xff, 0x2d, 0x6b, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xcb, 0x5a, 0xff, 0x2d, 0x6b, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xcb, 0x5a, 0xff, 0x4d, 0x6b, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0xc0, 0x20, 0x00, 0xff, 0x00, 0x00, 0xff, 0xcb, 0x5a, 0xff, 0x2d, 0x6b, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xcb, 0x5a, 0xff, 0x4d, 0x6b, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0xc0, 0x20, 0x00, 0xff, 0x00, 0x00, 0xff, 0xcb, 0x5a, 0xff, 0x0c, 0x63, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0xc0, 0x20, 0x00, 0xff, 0x00, 0x00, 0xff, 0xaa, 0x52, 0xff, 0x10, 0x84, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x08, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x28, 0x42, 0xff, 0x18, 0xc6, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8e, 0x73, 0xbd, 0x18, 0xc6, 0xff, 0xd7, 0xbd, 0xff, 0x96, 0xb5, 0xfb, 0x96, 0xb5, 0x2f, 0x00, 0x00, 0x00,
#endif
#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP != 0
/*Pixel format: Alpha 8 bit, Red: 5 bit, Green: 6 bit, Blue: 5 bit BUT the 2 color bytes are swapped*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x08, 0xc0, 0x5a, 0xcb, 0xff, 0x52, 0x8a, 0xff, 0x18, 0xc3, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x62, 0xc0, 0x00, 0x00, 0xff, 0x10, 0xa2, 0xff, 0x31, 0xa6, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x41, 0xff, 0x73, 0x8e, 0xff, 0x94, 0x92, 0x45, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xb5, 0x76, 0xff, 0xc6, 0x18, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x35, 0xff, 0xbd, 0xd7, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x55, 0xff, 0xc5, 0xf8, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x55, 0xff, 0xc5, 0xf8, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x55, 0xff, 0xc5, 0xf8, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x35, 0xff, 0xc5, 0xf8, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x55, 0xff, 0xbd, 0xf7, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x55, 0xff, 0xc5, 0xf8, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x55, 0xff, 0xbd, 0xf7, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x75, 0xff, 0xb5, 0x96, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x9c, 0xf3, 0xff, 0xad, 0x75, 0x6f, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x94, 0xb2, 0xff, 0xb5, 0xb6, 0x54, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xa5, 0x14, 0xff, 0xbd, 0xf7, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x75, 0xff, 0xc5, 0xf8, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x55, 0xff, 0xc5, 0xf8, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x55, 0xff, 0xc5, 0xf8, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x55, 0xff, 0xc5, 0xf8, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x55, 0xff, 0xc5, 0xf8, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x55, 0xff, 0xc5, 0xf8, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x55, 0xff, 0xc5, 0xf8, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xb5, 0x76, 0xff, 0xbd, 0xb7, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x20, 0xff, 0xa5, 0x14, 0xff, 0xbd, 0xd7, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x20, 0xff, 0xa4, 0xf4, 0xff, 0xbd, 0xd7, 0x32, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xb5, 0x76, 0xff, 0xc6, 0x18, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xad, 0x55, 0xff, 0xc5, 0xf8, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xb5, 0x96, 0xff, 0xbd, 0xd7, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x20, 0xff, 0xa5, 0x34, 0xff, 0xbd, 0xf7, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x21, 0xff, 0xa4, 0xf4, 0xff, 0xbd, 0xd7, 0x39, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xbd, 0xd7, 0xff, 0xb5, 0x96, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x21, 0xff, 0x9c, 0xb3, 0xff, 0xb5, 0xb6, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x21, 0xff, 0x9c, 0xb3, 0xff, 0xbd, 0xd7, 0x07, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xb5, 0xb6, 0xff, 0xbd, 0xf7, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x21, 0xff, 0x9c, 0xd3, 0xff, 0xbd, 0xd7, 0x45, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x20, 0xff, 0xad, 0x75, 0xff, 0xc5, 0xf8, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0xbd, 0xb7, 0xff, 0xad, 0x55, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x41, 0xff, 0x9c, 0xd3, 0xff, 0x9c, 0xb3, 0x66, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x18, 0xa3, 0xff, 0x52, 0x8a, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x18, 0xa3, 0xff, 0x52, 0x8a, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x61, 0xff, 0x8c, 0x51, 0xff, 0x84, 0x10, 0x59, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x18, 0xa3, 0xff, 0x5a, 0xcb, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x18, 0xc3, 0xff, 0x4a, 0x49, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x18, 0xa3, 0xff, 0x5a, 0xcb, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x21, 0xff, 0xb5, 0x96, 0xff, 0xc5, 0xf8, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x21, 0xff, 0xb5, 0x76, 0xff, 0xc6, 0x18, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x21, 0xff, 0xb5, 0x96, 0xff, 0xc6, 0x18, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x21, 0xff, 0xb5, 0x76, 0xff, 0xc6, 0x18, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x21, 0xff, 0xb5, 0x96, 0xff, 0xc6, 0x18, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x21, 0xff, 0xb5, 0x76, 0xff, 0xc6, 0x18, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x21, 0xff, 0xb5, 0xb6, 0xff, 0xbd, 0xf7, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x41, 0xff, 0xad, 0x35, 0xff, 0xbd, 0xf7, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x41, 0xff, 0xb5, 0x96, 0xff, 0x9c, 0xd3, 0x68, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xff, 0x08, 0x21, 0xff, 0x94, 0x92, 0xff, 0x6b, 0x4d, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x18, 0xe3, 0x1d, 0x20, 0xe4, 0xd2, 0x20, 0xe4, 0xff, 0x29, 0x25, 0xff, 0x4a, 0x49, 0xff, 0x52, 0xaa, 0x35, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x7b, 0xef, 0xbd, 0x5a, 0xcb, 0xde, 0x31, 0xa6, 0x56, 0x73, 0x8e, 0x56, 0x4a, 0x29, 0xc6, 0x4a, 0x49, 0xd9, 0x5a, 0xeb, 0x38,
0x00, 0x00, 0x00, 0xad, 0x35, 0xb2, 0x84, 0x10, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4a, 0x49, 0x6c, 0x21, 0x04, 0x78,
0xad, 0x55, 0xff, 0xad, 0x55, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 0x2f, 0x73, 0x8e, 0xdc,
0xb5, 0x76, 0xff, 0xa5, 0x34, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x45, 0x0d, 0x31, 0x86, 0xaa,
0x9c, 0xd3, 0xff, 0x6b, 0x4d, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0xab, 0x40, 0xbd, 0xd7, 0xf1,
0x00, 0x00, 0x00, 0x94, 0x72, 0xec, 0x31, 0xa6, 0x64, 0x21, 0x04, 0x11, 0x6b, 0x6d, 0x0c, 0x29, 0x65, 0x3c, 0x8c, 0x31, 0xa1, 0xc6, 0x18, 0x79,
0x00, 0x00, 0x00, 0x39, 0xe7, 0x8a, 0x21, 0x04, 0xea, 0x10, 0x82, 0xbb, 0x08, 0x41, 0xb6, 0x4a, 0x69, 0xe6, 0x84, 0x10, 0xc1, 0x73, 0xae, 0x1d,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x41, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xcb, 0xff, 0x63, 0x0c, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xcb, 0xff, 0x6b, 0x2d, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xcb, 0xff, 0x6b, 0x2d, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xcb, 0xff, 0x6b, 0x2d, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xcb, 0xff, 0x6b, 0x2d, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xcb, 0xff, 0x6b, 0x4d, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x41, 0xc0, 0x00, 0x20, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xcb, 0xff, 0x6b, 0x2d, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x41, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xcb, 0xff, 0x6b, 0x4d, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x41, 0xc0, 0x00, 0x20, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xcb, 0xff, 0x63, 0x0c, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x41, 0xc0, 0x00, 0x20, 0xff, 0x00, 0x00, 0xff, 0x52, 0xaa, 0xff, 0x84, 0x10, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x21, 0xc0, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x42, 0x28, 0xff, 0xc6, 0x18, 0x8c, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x8e, 0xbd, 0xc6, 0x18, 0xff, 0xbd, 0xd7, 0xff, 0xb5, 0x96, 0xfb, 0xb5, 0x96, 0x2f, 0x00, 0x00, 0x00,
#endif
#if LV_COLOR_DEPTH == 32
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x3e, 0x3e, 0xc0, 0x59, 0x59, 0x59, 0xff, 0x4f, 0x4f, 0x4f, 0xff, 0x18, 0x18, 0x18, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0d, 0x0d, 0x0d, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x13, 0x13, 0x13, 0xff, 0x32, 0x32, 0x32, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x06, 0x06, 0x06, 0xff, 0x6f, 0x6f, 0x6f, 0xff, 0x90, 0x90, 0x90, 0x45, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xad, 0xad, 0xad, 0xff, 0xc1, 0xc1, 0xc1, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa4, 0xa4, 0xa4, 0xff, 0xb8, 0xb8, 0xb8, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa6, 0xa6, 0xa6, 0xff, 0xbc, 0xbc, 0xbc, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa6, 0xa6, 0xa6, 0xff, 0xbc, 0xbc, 0xbc, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa6, 0xa6, 0xa6, 0xff, 0xbc, 0xbc, 0xbc, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa5, 0xa5, 0xa5, 0xff, 0xbc, 0xbc, 0xbc, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa6, 0xa6, 0xa6, 0xff, 0xba, 0xba, 0xba, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa6, 0xa6, 0xa6, 0xff, 0xbc, 0xbc, 0xbc, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa8, 0xa8, 0xa8, 0xff, 0xba, 0xba, 0xba, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xaa, 0xaa, 0xaa, 0xff, 0xb1, 0xb1, 0xb1, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x9a, 0x9a, 0x9a, 0xff, 0xaa, 0xaa, 0xaa, 0x6f, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x01, 0x01, 0x01, 0xff, 0x92, 0x92, 0x92, 0xff, 0xb3, 0xb3, 0xb3, 0x54, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa0, 0xa0, 0xa0, 0xff, 0xba, 0xba, 0xba, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xaa, 0xaa, 0xaa, 0xff, 0xbd, 0xbd, 0xbd, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa8, 0xa8, 0xa8, 0xff, 0xbc, 0xbc, 0xbc, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa8, 0xa8, 0xa8, 0xff, 0xbd, 0xbd, 0xbd, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa8, 0xa8, 0xa8, 0xff, 0xbd, 0xbd, 0xbd, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa9, 0xa9, 0xa9, 0xff, 0xbd, 0xbd, 0xbd, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa9, 0xa9, 0xa9, 0xff, 0xbd, 0xbd, 0xbd, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xa9, 0xa9, 0xa9, 0xff, 0xbd, 0xbd, 0xbd, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xad, 0xad, 0xad, 0xff, 0xb4, 0xb4, 0xb4, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x02, 0x02, 0x02, 0xff, 0x9f, 0x9f, 0x9f, 0xff, 0xb8, 0xb8, 0xb8, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x02, 0x02, 0x02, 0xff, 0x9c, 0x9c, 0x9c, 0xff, 0xb8, 0xb8, 0xb8, 0x32, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xad, 0xad, 0xad, 0xff, 0xbf, 0xbf, 0xbf, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x01, 0x01, 0x01, 0xff, 0xa8, 0xa8, 0xa8, 0xff, 0xbd, 0xbd, 0xbd, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x01, 0x01, 0x01, 0xff, 0xaf, 0xaf, 0xaf, 0xff, 0xb6, 0xb6, 0xb6, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x03, 0x03, 0x03, 0xff, 0xa2, 0xa2, 0xa2, 0xff, 0xba, 0xba, 0xba, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x04, 0x04, 0x04, 0xff, 0x9c, 0x9c, 0x9c, 0xff, 0xb7, 0xb7, 0xb7, 0x39, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xb7, 0xb7, 0xb7, 0xff, 0xaf, 0xaf, 0xaf, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x05, 0x05, 0x05, 0xff, 0x95, 0x95, 0x95, 0xff, 0xb3, 0xb3, 0xb3, 0x80, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x05, 0x05, 0x05, 0xff, 0x95, 0x95, 0x95, 0xff, 0xb6, 0xb6, 0xb6, 0x07, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x01, 0x01, 0x01, 0xff, 0xb3, 0xb3, 0xb3, 0xff, 0xba, 0xba, 0xba, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x05, 0x05, 0x05, 0xff, 0x98, 0x98, 0x98, 0xff, 0xb9, 0xb9, 0xb9, 0x45, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x02, 0x02, 0x02, 0xff, 0xaa, 0xaa, 0xaa, 0xff, 0xbc, 0xbc, 0xbc, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x01, 0x01, 0x01, 0xff, 0xb4, 0xb4, 0xb4, 0xff, 0xa8, 0xa8, 0xa8, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x06, 0x06, 0x06, 0xff, 0x97, 0x97, 0x97, 0xff, 0x94, 0x94, 0x94, 0x66, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x15, 0x15, 0x15, 0xff, 0x4e, 0x4e, 0x4e, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x15, 0x15, 0x15, 0xff, 0x4e, 0x4e, 0x4e, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x0a, 0x0a, 0x0a, 0xff, 0x87, 0x87, 0x87, 0xff, 0x7e, 0x7e, 0x7e, 0x59, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x14, 0x14, 0x14, 0xff, 0x57, 0x57, 0x57, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x17, 0x17, 0x17, 0xff, 0x48, 0x48, 0x48, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x15, 0x15, 0x15, 0xff, 0x58, 0x58, 0x58, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x04, 0x04, 0x04, 0xff, 0xaf, 0xaf, 0xaf, 0xff, 0xbd, 0xbd, 0xbd, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x04, 0x04, 0x04, 0xff, 0xad, 0xad, 0xad, 0xff, 0xc1, 0xc1, 0xc1, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x04, 0x04, 0x04, 0xff, 0xae, 0xae, 0xae, 0xff, 0xc1, 0xc1, 0xc1, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x05, 0x05, 0x05, 0xff, 0xad, 0xad, 0xad, 0xff, 0xbf, 0xbf, 0xbf, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x04, 0x04, 0x04, 0xff, 0xae, 0xae, 0xae, 0xff, 0xbf, 0xbf, 0xbf, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x05, 0x05, 0x05, 0xff, 0xac, 0xac, 0xac, 0xff, 0xbf, 0xbf, 0xbf, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x05, 0x05, 0x05, 0xff, 0xb2, 0xb2, 0xb2, 0xff, 0xba, 0xba, 0xba, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x07, 0x07, 0x07, 0xff, 0xa5, 0xa5, 0xa5, 0xff, 0xba, 0xba, 0xba, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x07, 0x07, 0x07, 0xff, 0xaf, 0xaf, 0xaf, 0xff, 0x98, 0x98, 0x98, 0x68, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x05, 0x05, 0x05, 0xff, 0x91, 0x91, 0x91, 0xff, 0x66, 0x66, 0x66, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x1a, 0x1a, 0x1a, 0x1d, 0x1d, 0x1d, 0x1d, 0xd2, 0x1d, 0x1d, 0x1d, 0xff, 0x25, 0x25, 0x25, 0xff, 0x49, 0x49, 0x49, 0xff, 0x52, 0x52, 0x52, 0x35, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x7b, 0x7b, 0x7b, 0xbd, 0x56, 0x56, 0x56, 0xde, 0x32, 0x32, 0x32, 0x56, 0x6e, 0x6e, 0x6e, 0x56, 0x44, 0x44, 0x44, 0xc6, 0x47, 0x47, 0x47, 0xd9, 0x5b, 0x5b, 0x5b, 0x38,
0x00, 0x00, 0x00, 0x00, 0xa5, 0xa5, 0xa5, 0xb2, 0x80, 0x80, 0x80, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x47, 0x47, 0x6c, 0x1e, 0x1e, 0x1e, 0x78,
0xa7, 0xa7, 0xa7, 0xff, 0xa9, 0xa9, 0xa9, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x2f, 0x70, 0x70, 0x70, 0xdc,
0xac, 0xac, 0xac, 0xff, 0xa3, 0xa3, 0xa3, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x27, 0x27, 0x0d, 0x30, 0x30, 0x30, 0xaa,
0x96, 0x96, 0x96, 0xff, 0x69, 0x69, 0x69, 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x54, 0x54, 0x40, 0xb6, 0xb6, 0xb6, 0xf1,
0x00, 0x00, 0x00, 0x00, 0x8c, 0x8c, 0x8c, 0xec, 0x33, 0x33, 0x33, 0x64, 0x1e, 0x1e, 0x1e, 0x11, 0x6a, 0x6a, 0x6a, 0x0c, 0x2a, 0x2a, 0x2a, 0x3c, 0x85, 0x85, 0x85, 0xa1, 0xbe, 0xbe, 0xbe, 0x79,
0x00, 0x00, 0x00, 0x00, 0x3b, 0x3b, 0x3b, 0x8a, 0x20, 0x20, 0x20, 0xea, 0x0f, 0x0f, 0x0f, 0xbb, 0x07, 0x07, 0x07, 0xb6, 0x4b, 0x4b, 0x4b, 0xe6, 0x80, 0x80, 0x80, 0xc1, 0x72, 0x72, 0x72, 0x1d,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x58, 0x58, 0x58, 0xff, 0x5f, 0x5f, 0x5f, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0xc0, 0x01, 0x01, 0x01, 0xff, 0x00, 0x00, 0x00, 0xff, 0x56, 0x56, 0x56, 0xff, 0x64, 0x64, 0x64, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x57, 0x57, 0x57, 0xff, 0x64, 0x64, 0x64, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0xc0, 0x01, 0x01, 0x01, 0xff, 0x00, 0x00, 0x00, 0xff, 0x56, 0x56, 0x56, 0xff, 0x64, 0x64, 0x64, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x57, 0x57, 0x57, 0xff, 0x64, 0x64, 0x64, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0xc0, 0x01, 0x01, 0x01, 0xff, 0x00, 0x00, 0x00, 0xff, 0x57, 0x57, 0x57, 0xff, 0x66, 0x66, 0x66, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0xc0, 0x02, 0x02, 0x02, 0xff, 0x00, 0x00, 0x00, 0xff, 0x57, 0x57, 0x57, 0xff, 0x64, 0x64, 0x64, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x09, 0x09, 0xc0, 0x01, 0x01, 0x01, 0xff, 0x00, 0x00, 0x00, 0xff, 0x56, 0x56, 0x56, 0xff, 0x68, 0x68, 0x68, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0xc0, 0x02, 0x02, 0x02, 0xff, 0x00, 0x00, 0x00, 0xff, 0x57, 0x57, 0x57, 0xff, 0x5f, 0x5f, 0x5f, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0xc0, 0x03, 0x03, 0x03, 0xff, 0x00, 0x00, 0x00, 0xff, 0x53, 0x53, 0x53, 0xff, 0x80, 0x80, 0x80, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0xc0, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x43, 0x43, 0x43, 0xff, 0xc1, 0xc1, 0xc1, 0x8c, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6f, 0x6f, 0x6f, 0xbd, 0xbe, 0xbe, 0xbe, 0xff, 0xb6, 0xb6, 0xb6, 0xff, 0xaf, 0xaf, 0xaf, 0xfb, 0xae, 0xae, 0xae, 0x2f, 0x00, 0x00, 0x00, 0x00,
#endif
};
const lv_img_dsc_t hour_hand = {
.header.cf = LV_IMG_CF_TRUE_COLOR_ALPHA,
.header.always_zero = 0,
.header.reserved = 0,
.header.w = 8,
.header.h = 75,
.data_size = 600 * LV_IMG_PX_SIZE_ALPHA_BYTE,
.data = hour_hand_map,
};

View File

@ -58,6 +58,15 @@ static void date_time_cb(struct tm * const dateTime)
*dateTime = *tm; *dateTime = *tm;
} }
static void alti_meas_cb(float * const temperature, float * const pressure, float * const altitude)
{
static float a = 425.5;
*temperature = (rand() % 20) + 10;
*pressure = (float)rand()/(float)(RAND_MAX) * 50 + 980;
a += 2;
*altitude = a;//(rand() % 700) + 10.2;
}
WatchFace_t watchFace; WatchFace_t watchFace;
MenuScreen_t menuScreen; MenuScreen_t menuScreen;
CompassScreen_t compassScreen; CompassScreen_t compassScreen;
@ -66,6 +75,7 @@ AltimeterScreen_t altimeterScreen;
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int nCmdShow) int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLine, int nCmdShow)
{ {
srand(time(NULL));
/*Initialize LittlevGL*/ /*Initialize LittlevGL*/
lv_init(); lv_init();
@ -89,11 +99,15 @@ int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCmdLi
settings_screen_init(&settingsScreen); settings_screen_init(&settingsScreen);
altimeter_screen_init(&altimeterScreen); altimeter_screen_init(&altimeterScreen);
altimeter_screen_register_measurement_cb(&altimeterScreen, &(alti_meas_cb));
watch_face_register_date_time_cb(&watchFace, &(date_time_cb)); watch_face_register_date_time_cb(&watchFace, &(date_time_cb));
watch_face_create(&watchFace); watch_face_create(&watchFace);
lv_scr_load(watchFace.display); lv_scr_load(watchFace.display);
watch_face_set_step_count(&watchFace, 10258);
//settings_screen(); //settings_screen();
//watch_face(); //watch_face();

View File

@ -81,8 +81,7 @@ static void menu_screen_add_item(lv_obj_t *scroll_item_container, uint8_t positi
//lv_obj_t *item_btn = lv_imgbtn_create(scroll_item_container); //lv_obj_t *item_btn = lv_imgbtn_create(scroll_item_container);
lv_obj_t *item_btn = lv_img_create(scroll_item_container); lv_obj_t *item_btn = lv_img_create(scroll_item_container);
lv_obj_set_size(item_btn, itemImg->header.w, itemImg->header.h); lv_obj_set_size(item_btn, itemImg->header.w, itemImg->header.h);
lv_obj_add_flag(item_btn, LV_OBJ_FLAG_ADV_HITTEST); lv_obj_add_flag(item_btn, LV_OBJ_FLAG_ADV_HITTEST | LV_OBJ_FLAG_CLICKABLE);
lv_obj_add_flag(item_btn, LV_OBJ_FLAG_CLICKABLE);
lv_obj_set_pos(item_btn, 42, 52 * position); lv_obj_set_pos(item_btn, 42, 52 * position);
//lv_imgbtn_set_src(item_btn, LV_IMGBTN_STATE_RELEASED, NULL, itemImg, NULL); //lv_imgbtn_set_src(item_btn, LV_IMGBTN_STATE_RELEASED, NULL, itemImg, NULL);
lv_img_set_src(item_btn, itemImg); lv_img_set_src(item_btn, itemImg);

View File

@ -1,438 +0,0 @@
#if defined(LV_LVGL_H_INCLUDE_SIMPLE)
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#ifndef LV_ATTRIBUTE_MEM_ALIGN
#define LV_ATTRIBUTE_MEM_ALIGN
#endif
#ifndef LV_ATTRIBUTE_IMG_MINUTE_HAND
#define LV_ATTRIBUTE_IMG_MINUTE_HAND
#endif
const LV_ATTRIBUTE_MEM_ALIGN LV_ATTRIBUTE_LARGE_CONST LV_ATTRIBUTE_IMG_MINUTE_HAND uint8_t minute_hand_map[] = {
#if LV_COLOR_DEPTH == 1 || LV_COLOR_DEPTH == 8
/*Pixel format: Alpha 8 bit, Red: 3 bit, Green: 3 bit, Blue: 2 bit*/
0x00, 0x00, 0x00, 0x00, 0x6d, 0xff, 0x49, 0xff, 0x6e, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xff, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xff, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xff, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xff, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xff, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xff, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xff, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xff, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xff, 0xff, 0xdb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x49, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6d, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x92, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x92, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x92, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x92, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x92, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x92, 0xff, 0xdb, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x6e, 0xff, 0xb7, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x49, 0xff, 0x6d, 0xff, 0x92, 0xff, 0x00, 0x00,
0x00, 0x00, 0x49, 0xff, 0x49, 0x72, 0x00, 0x00, 0x00, 0x00, 0x25, 0xe7, 0xb6, 0xc7,
0x49, 0xee, 0x49, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0xff,
0x49, 0xff, 0x92, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x49,
0x49, 0xff, 0x92, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x92, 0xff,
0x00, 0x00, 0x49, 0xff, 0x49, 0x09, 0x00, 0x00, 0x00, 0x00, 0x6d, 0x10, 0xdb, 0xfb,
0x00, 0x00, 0x49, 0x2a, 0x24, 0xff, 0x00, 0xf7, 0x00, 0xf7, 0x49, 0xff, 0xb7, 0x2a,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x24, 0xff, 0x24, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x00, 0xff, 0x24, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x00, 0xff, 0x24, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x00, 0xff, 0x24, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x00, 0xff, 0x24, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x00, 0xff, 0x24, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x00, 0xff, 0x24, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x00, 0xff, 0x24, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x00, 0xff, 0x24, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x24, 0xff, 0x24, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x24, 0xff, 0x00, 0xff, 0x00, 0xff, 0x92, 0xff, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x6e, 0xff, 0xb6, 0xff, 0x92, 0xff, 0xdb, 0xff, 0x00, 0x00,
#endif
#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP == 0
/*Pixel format: Alpha 8 bit, Red: 5 bit, Green: 6 bit, Blue: 5 bit*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xaa, 0x52, 0xff, 0x69, 0x4a, 0xff, 0x4d, 0x6b, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x10, 0xff, 0x00, 0x00, 0xff, 0xe7, 0x39, 0xff, 0x79, 0xce, 0xff, 0xd7, 0xbd, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xc7, 0x39, 0xff, 0x79, 0xce, 0xff, 0xd7, 0xbd, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xe7, 0x39, 0xff, 0x79, 0xce, 0xff, 0xf7, 0xbd, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xe7, 0x39, 0xff, 0x7a, 0xd6, 0xff, 0xf7, 0xbd, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xe8, 0x41, 0xff, 0x7a, 0xd6, 0xff, 0xf7, 0xbd, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xe7, 0x39, 0xff, 0x7a, 0xd6, 0xff, 0xf7, 0xbd, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xe8, 0x41, 0xff, 0x7a, 0xd6, 0xff, 0xf8, 0xc5, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xe7, 0x39, 0xff, 0x7a, 0xd6, 0xff, 0xf8, 0xc5, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xe8, 0x41, 0xff, 0x7a, 0xd6, 0xff, 0xf8, 0xc5, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x08, 0x42, 0xff, 0x7a, 0xd6, 0xff, 0xf8, 0xc5, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x08, 0x42, 0xff, 0x7a, 0xd6, 0xff, 0xf8, 0xc5, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x08, 0x42, 0xff, 0x9a, 0xd6, 0xff, 0xd7, 0xbd, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x08, 0x42, 0xff, 0x9a, 0xd6, 0xff, 0xd7, 0xbd, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x08, 0x42, 0xff, 0x9a, 0xd6, 0xff, 0xf7, 0xbd, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x28, 0x42, 0xff, 0x9a, 0xd6, 0xff, 0xd7, 0xbd, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x28, 0x42, 0xff, 0x9a, 0xd6, 0xff, 0xf7, 0xbd, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x28, 0x42, 0xff, 0x9a, 0xd6, 0xff, 0xf7, 0xbd, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x29, 0x4a, 0xff, 0x9a, 0xd6, 0xff, 0xf8, 0xc5, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x29, 0x4a, 0xff, 0x9a, 0xd6, 0xff, 0xf8, 0xc5, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x29, 0x4a, 0xff, 0x9a, 0xd6, 0xff, 0xf8, 0xc5, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x29, 0x4a, 0xff, 0x9a, 0xd6, 0xff, 0xf8, 0xc5, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x29, 0x4a, 0xff, 0x9a, 0xd6, 0xff, 0x18, 0xc6, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x49, 0x4a, 0xff, 0xba, 0xd6, 0xff, 0xd7, 0xbd, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x49, 0x4a, 0xff, 0x9a, 0xd6, 0xff, 0xd7, 0xbd, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x49, 0x4a, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x69, 0x4a, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x69, 0x4a, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x6a, 0x52, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x6a, 0x52, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x8a, 0x52, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x8a, 0x52, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x8a, 0x52, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x8a, 0x52, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x8a, 0x52, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x8a, 0x52, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x8a, 0x52, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x8a, 0x52, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xaa, 0x52, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xab, 0x5a, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xab, 0x5a, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xab, 0x5a, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xcb, 0x5a, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xcb, 0x5a, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xcb, 0x5a, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xeb, 0x5a, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xeb, 0x5a, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xeb, 0x5a, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xeb, 0x5a, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xec, 0x62, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xec, 0x62, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xec, 0x62, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xec, 0x62, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x0c, 0x63, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x0c, 0x63, 0xff, 0x59, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x0c, 0x63, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x0c, 0x63, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x2c, 0x63, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x2c, 0x63, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x2d, 0x6b, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x2d, 0x6b, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x2d, 0x6b, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x4d, 0x6b, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x4d, 0x6b, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x4d, 0x6b, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x4d, 0x6b, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x4d, 0x6b, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x4d, 0x6b, 0xff, 0x7a, 0xd6, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x4d, 0x6b, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x6d, 0x6b, 0xff, 0x7a, 0xd6, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x6e, 0x73, 0xff, 0x79, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x6e, 0x73, 0xff, 0x7a, 0xd6, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x6e, 0x73, 0xff, 0x7a, 0xd6, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x8e, 0x73, 0xff, 0x7a, 0xd6, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x8e, 0x73, 0xff, 0x7a, 0xd6, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x8e, 0x73, 0xff, 0x7a, 0xd6, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x8e, 0x73, 0xff, 0x7a, 0xd6, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xae, 0x73, 0xff, 0x7a, 0xd6, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x8e, 0x73, 0xff, 0x9a, 0xd6, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0xcf, 0x7b, 0xff, 0x39, 0xce, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x4d, 0x6b, 0xff, 0x75, 0xad, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0xff, 0x6a, 0x52, 0xff, 0xab, 0x5a, 0xff, 0x8e, 0x73, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x08, 0x42, 0xff, 0x49, 0x4a, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x31, 0xe7, 0xb2, 0x94, 0xc7,
0x49, 0x4a, 0xee, 0x69, 0x4a, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc7, 0x39, 0xff,
0x6a, 0x52, 0xff, 0xef, 0x7b, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x31, 0x49,
0x28, 0x42, 0xff, 0xef, 0x7b, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0x7b, 0xff,
0x00, 0x00, 0x00, 0xc7, 0x39, 0xff, 0xc7, 0x39, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8a, 0x52, 0x10, 0xf8, 0xc5, 0xfb,
0x00, 0x00, 0x00, 0x8a, 0x52, 0x2a, 0xc3, 0x18, 0xff, 0x41, 0x08, 0xf7, 0x41, 0x08, 0xf7, 0xa6, 0x31, 0xff, 0x35, 0xad, 0x2a,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x82, 0x10, 0xff, 0xe3, 0x18, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0x10, 0xff, 0x00, 0x00, 0xff, 0x82, 0x10, 0xff, 0x04, 0x21, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x82, 0x10, 0xff, 0x04, 0x21, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x82, 0x10, 0xff, 0x04, 0x21, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x82, 0x10, 0xff, 0x04, 0x21, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x82, 0x10, 0xff, 0x04, 0x21, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x82, 0x10, 0xff, 0x04, 0x21, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0x10, 0xff, 0x00, 0x00, 0xff, 0x82, 0x10, 0xff, 0x04, 0x21, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x00, 0x00, 0xff, 0x82, 0x10, 0xff, 0x04, 0x21, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0xff, 0x20, 0x00, 0xff, 0x82, 0x10, 0xff, 0xe3, 0x18, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa2, 0x10, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x72, 0x94, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x6b, 0xff, 0xb3, 0x9c, 0xff, 0x71, 0x8c, 0xff, 0xf7, 0xbd, 0xff, 0x00, 0x00, 0x00,
#endif
#if LV_COLOR_DEPTH == 16 && LV_COLOR_16_SWAP != 0
/*Pixel format: Alpha 8 bit, Red: 5 bit, Green: 6 bit, Blue: 5 bit BUT the 2 color bytes are swapped*/
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0xaa, 0xff, 0x4a, 0x69, 0xff, 0x6b, 0x4d, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x82, 0xff, 0x00, 0x00, 0xff, 0x39, 0xe7, 0xff, 0xce, 0x79, 0xff, 0xbd, 0xd7, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x39, 0xc7, 0xff, 0xce, 0x79, 0xff, 0xbd, 0xd7, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x39, 0xe7, 0xff, 0xce, 0x79, 0xff, 0xbd, 0xf7, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x39, 0xe7, 0xff, 0xd6, 0x7a, 0xff, 0xbd, 0xf7, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x41, 0xe8, 0xff, 0xd6, 0x7a, 0xff, 0xbd, 0xf7, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x39, 0xe7, 0xff, 0xd6, 0x7a, 0xff, 0xbd, 0xf7, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x41, 0xe8, 0xff, 0xd6, 0x7a, 0xff, 0xc5, 0xf8, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x39, 0xe7, 0xff, 0xd6, 0x7a, 0xff, 0xc5, 0xf8, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x41, 0xe8, 0xff, 0xd6, 0x7a, 0xff, 0xc5, 0xf8, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x42, 0x08, 0xff, 0xd6, 0x7a, 0xff, 0xc5, 0xf8, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x42, 0x08, 0xff, 0xd6, 0x7a, 0xff, 0xc5, 0xf8, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x42, 0x08, 0xff, 0xd6, 0x9a, 0xff, 0xbd, 0xd7, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x42, 0x08, 0xff, 0xd6, 0x9a, 0xff, 0xbd, 0xd7, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x42, 0x08, 0xff, 0xd6, 0x9a, 0xff, 0xbd, 0xf7, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x42, 0x28, 0xff, 0xd6, 0x9a, 0xff, 0xbd, 0xd7, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x42, 0x28, 0xff, 0xd6, 0x9a, 0xff, 0xbd, 0xf7, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x42, 0x28, 0xff, 0xd6, 0x9a, 0xff, 0xbd, 0xf7, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x4a, 0x29, 0xff, 0xd6, 0x9a, 0xff, 0xc5, 0xf8, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x4a, 0x29, 0xff, 0xd6, 0x9a, 0xff, 0xc5, 0xf8, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x4a, 0x29, 0xff, 0xd6, 0x9a, 0xff, 0xc5, 0xf8, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xe3, 0xff, 0x00, 0x00, 0xff, 0x4a, 0x29, 0xff, 0xd6, 0x9a, 0xff, 0xc5, 0xf8, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x4a, 0x29, 0xff, 0xd6, 0x9a, 0xff, 0xc6, 0x18, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x4a, 0x49, 0xff, 0xd6, 0xba, 0xff, 0xbd, 0xd7, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x4a, 0x49, 0xff, 0xd6, 0x9a, 0xff, 0xbd, 0xd7, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x4a, 0x49, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x4a, 0x69, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x4a, 0x69, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x52, 0x6a, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x52, 0x6a, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x52, 0x8a, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x52, 0x8a, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x52, 0x8a, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x52, 0x8a, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x52, 0x8a, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x52, 0x8a, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x52, 0x8a, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x52, 0x8a, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x52, 0xaa, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xab, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xab, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xab, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xcb, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xcb, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xcb, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xeb, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xeb, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xeb, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x5a, 0xeb, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x62, 0xec, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x62, 0xec, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x62, 0xec, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x62, 0xec, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x63, 0x0c, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x63, 0x0c, 0xff, 0xce, 0x59, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x63, 0x0c, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x63, 0x0c, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x63, 0x2c, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x63, 0x2c, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x6b, 0x2d, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x6b, 0x2d, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x6b, 0x2d, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x6b, 0x4d, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x6b, 0x4d, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x6b, 0x4d, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x6b, 0x4d, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x6b, 0x4d, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x6b, 0x4d, 0xff, 0xd6, 0x7a, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x6b, 0x4d, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x6b, 0x6d, 0xff, 0xd6, 0x7a, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x73, 0x6e, 0xff, 0xce, 0x79, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x73, 0x6e, 0xff, 0xd6, 0x7a, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x73, 0x6e, 0xff, 0xd6, 0x7a, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x73, 0x8e, 0xff, 0xd6, 0x7a, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x73, 0x8e, 0xff, 0xd6, 0x7a, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x73, 0x8e, 0xff, 0xd6, 0x7a, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x73, 0x8e, 0xff, 0xd6, 0x7a, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x73, 0xae, 0xff, 0xd6, 0x7a, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x73, 0x8e, 0xff, 0xd6, 0x9a, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x7b, 0xcf, 0xff, 0xce, 0x39, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xc3, 0xff, 0x00, 0x00, 0xff, 0x6b, 0x4d, 0xff, 0xad, 0x75, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x41, 0xff, 0x52, 0x6a, 0xff, 0x5a, 0xab, 0xff, 0x73, 0x8e, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x42, 0x08, 0xff, 0x4a, 0x49, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x86, 0xe7, 0x94, 0xb2, 0xc7,
0x4a, 0x49, 0xee, 0x4a, 0x69, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0xc7, 0xff,
0x52, 0x6a, 0xff, 0x7b, 0xef, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x66, 0x49,
0x42, 0x28, 0xff, 0x7b, 0xef, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0xef, 0xff,
0x00, 0x00, 0x00, 0x39, 0xc7, 0xff, 0x39, 0xc7, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x8a, 0x10, 0xc5, 0xf8, 0xfb,
0x00, 0x00, 0x00, 0x52, 0x8a, 0x2a, 0x18, 0xc3, 0xff, 0x08, 0x41, 0xf7, 0x08, 0x41, 0xf7, 0x31, 0xa6, 0xff, 0xad, 0x35, 0x2a,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x10, 0x82, 0xff, 0x18, 0xe3, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xa2, 0xff, 0x00, 0x00, 0xff, 0x10, 0x82, 0xff, 0x21, 0x04, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x10, 0x82, 0xff, 0x21, 0x04, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x10, 0x82, 0xff, 0x21, 0x04, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x10, 0x82, 0xff, 0x21, 0x04, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x10, 0x82, 0xff, 0x21, 0x04, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x10, 0x82, 0xff, 0x21, 0x04, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xa2, 0xff, 0x00, 0x00, 0xff, 0x10, 0x82, 0xff, 0x21, 0x04, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x00, 0xff, 0x10, 0x82, 0xff, 0x21, 0x04, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xa3, 0xff, 0x00, 0x20, 0xff, 0x10, 0x82, 0xff, 0x18, 0xe3, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0xa2, 0xff, 0x00, 0x00, 0xff, 0x00, 0x00, 0xff, 0x94, 0x72, 0xff, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6b, 0x4d, 0xff, 0x9c, 0xb3, 0xff, 0x8c, 0x71, 0xff, 0xbd, 0xf7, 0xff, 0x00, 0x00, 0x00,
#endif
#if LV_COLOR_DEPTH == 32
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x53, 0x53, 0xff, 0x4a, 0x4a, 0x4a, 0xff, 0x68, 0x68, 0x68, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x11, 0x11, 0xff, 0x00, 0x00, 0x00, 0xff, 0x3a, 0x3a, 0x3a, 0xff, 0xcb, 0xcb, 0xcb, 0xff, 0xb9, 0xb9, 0xb9, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0xff, 0x00, 0x00, 0x00, 0xff, 0x39, 0x39, 0x39, 0xff, 0xcb, 0xcb, 0xcb, 0xff, 0xb9, 0xb9, 0xb9, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x3a, 0x3a, 0x3a, 0xff, 0xcb, 0xcb, 0xcb, 0xff, 0xbb, 0xbb, 0xbb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0xff, 0x00, 0x00, 0x00, 0xff, 0x3b, 0x3b, 0x3b, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xbb, 0xbb, 0xbb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x3c, 0x3c, 0x3c, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xbb, 0xbb, 0xbb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x3b, 0x3b, 0x3b, 0xff, 0xcd, 0xcd, 0xcd, 0xff, 0xbb, 0xbb, 0xbb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x3c, 0x3c, 0x3c, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0xbc, 0xbc, 0xbc, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x3b, 0x3b, 0x3b, 0xff, 0xcd, 0xcd, 0xcd, 0xff, 0xbc, 0xbc, 0xbc, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x3c, 0x3c, 0x3c, 0xff, 0xcd, 0xcd, 0xcd, 0xff, 0xbc, 0xbc, 0xbc, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x3e, 0x3e, 0x3e, 0xff, 0xcd, 0xcd, 0xcd, 0xff, 0xbc, 0xbc, 0xbc, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x3f, 0x3f, 0xff, 0xcd, 0xcd, 0xcd, 0xff, 0xbc, 0xbc, 0xbc, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x3f, 0x3f, 0xff, 0xce, 0xce, 0xce, 0xff, 0xb9, 0xb9, 0xb9, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x41, 0x41, 0x41, 0xff, 0xce, 0xce, 0xce, 0xff, 0xb9, 0xb9, 0xb9, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x41, 0x41, 0x41, 0xff, 0xce, 0xce, 0xce, 0xff, 0xbb, 0xbb, 0xbb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x42, 0x42, 0x42, 0xff, 0xcf, 0xcf, 0xcf, 0xff, 0xb9, 0xb9, 0xb9, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x42, 0x42, 0x42, 0xff, 0xd0, 0xd0, 0xd0, 0xff, 0xbb, 0xbb, 0xbb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0xff, 0x00, 0x00, 0x00, 0xff, 0x43, 0x43, 0x43, 0xff, 0xd0, 0xd0, 0xd0, 0xff, 0xbb, 0xbb, 0xbb, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x44, 0x44, 0x44, 0xff, 0xd0, 0xd0, 0xd0, 0xff, 0xbc, 0xbc, 0xbc, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x45, 0x45, 0x45, 0xff, 0xd0, 0xd0, 0xd0, 0xff, 0xbc, 0xbc, 0xbc, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0xff, 0x45, 0x45, 0x45, 0xff, 0xd1, 0xd1, 0xd1, 0xff, 0xbc, 0xbc, 0xbc, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1a, 0x1a, 0x1a, 0xff, 0x00, 0x00, 0x00, 0xff, 0x45, 0x45, 0x45, 0xff, 0xd1, 0xd1, 0xd1, 0xff, 0xbc, 0xbc, 0xbc, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0xff, 0x00, 0x00, 0x00, 0xff, 0x44, 0x44, 0x44, 0xff, 0xd1, 0xd1, 0xd1, 0xff, 0xbe, 0xbe, 0xbe, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0xff, 0x00, 0x00, 0x00, 0xff, 0x46, 0x46, 0x46, 0xff, 0xd2, 0xd2, 0xd2, 0xff, 0xb9, 0xb9, 0xb9, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x47, 0x47, 0x47, 0xff, 0xd0, 0xd0, 0xd0, 0xff, 0xb7, 0xb7, 0xb7, 0xb7,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0xff, 0x00, 0x00, 0x00, 0xff, 0x49, 0x49, 0x49, 0xff, 0xc6, 0xc6, 0xc6, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0xff, 0x00, 0x00, 0x00, 0xff, 0x4a, 0x4a, 0x4a, 0xff, 0xc7, 0xc7, 0xc7, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x4b, 0x4b, 0x4b, 0xff, 0xc8, 0xc8, 0xc8, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x4c, 0x4c, 0x4c, 0xff, 0xc8, 0xc8, 0xc8, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x4d, 0x4d, 0x4d, 0xff, 0xc8, 0xc8, 0xc8, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x4e, 0x4e, 0x4e, 0xff, 0xc8, 0xc8, 0xc8, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0xff, 0x00, 0x00, 0x00, 0xff, 0x4f, 0x4f, 0x4f, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0xff, 0x00, 0x00, 0x00, 0xff, 0x4f, 0x4f, 0x4f, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x50, 0x50, 0x50, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x51, 0x51, 0x51, 0xff, 0xca, 0xca, 0xca, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x51, 0x51, 0x51, 0xff, 0xca, 0xca, 0xca, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x51, 0x51, 0x51, 0xff, 0xc8, 0xc8, 0xc8, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0xff, 0x00, 0x00, 0x00, 0xff, 0x51, 0x51, 0x51, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x53, 0x53, 0x53, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0xff, 0x00, 0x00, 0x00, 0xff, 0x54, 0x54, 0x54, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x55, 0x55, 0x55, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0xff, 0x00, 0x00, 0x00, 0xff, 0x55, 0x55, 0x55, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x57, 0x57, 0x57, 0xff, 0xc8, 0xc8, 0xc8, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x58, 0x58, 0x58, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x59, 0x59, 0x59, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x5a, 0x5a, 0x5a, 0xff, 0xca, 0xca, 0xca, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x5b, 0x5b, 0x5b, 0xff, 0xca, 0xca, 0xca, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x5b, 0x5b, 0x5b, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0xff, 0x00, 0x00, 0x00, 0xff, 0x5b, 0x5b, 0x5b, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x5c, 0x5c, 0x5c, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x5d, 0x5d, 0x5d, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0xff, 0x00, 0x00, 0x00, 0xff, 0x5c, 0x5c, 0x5c, 0xff, 0xca, 0xca, 0xca, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x5d, 0x5d, 0x5d, 0xff, 0xca, 0xca, 0xca, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x5e, 0x5e, 0x5e, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0xff, 0x00, 0x00, 0x00, 0xff, 0x5f, 0x5f, 0x5f, 0xff, 0xc9, 0xc9, 0xc9, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x5f, 0x5f, 0x5f, 0xff, 0xca, 0xca, 0xca, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0xff, 0x00, 0x00, 0x00, 0xff, 0x60, 0x60, 0x60, 0xff, 0xca, 0xca, 0xca, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0xff, 0x00, 0x00, 0x00, 0xff, 0x62, 0x62, 0x62, 0xff, 0xca, 0xca, 0xca, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x63, 0x63, 0x63, 0xff, 0xca, 0xca, 0xca, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x64, 0x64, 0x64, 0xff, 0xcb, 0xcb, 0xcb, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0xff, 0x65, 0x65, 0x65, 0xff, 0xcb, 0xcb, 0xcb, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0xff, 0x65, 0x65, 0x65, 0xff, 0xcb, 0xcb, 0xcb, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x66, 0x66, 0x66, 0xff, 0xcb, 0xcb, 0xcb, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x67, 0x67, 0x67, 0xff, 0xca, 0xca, 0xca, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x67, 0x67, 0x67, 0xff, 0xcb, 0xcb, 0xcb, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x68, 0x68, 0x68, 0xff, 0xcb, 0xcb, 0xcb, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0xff, 0x00, 0x00, 0x00, 0xff, 0x68, 0x68, 0x68, 0xff, 0xcb, 0xcb, 0xcb, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x68, 0x68, 0x68, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x69, 0x69, 0x69, 0xff, 0xcb, 0xcb, 0xcb, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x6a, 0x6a, 0x6a, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x6c, 0x6c, 0x6c, 0xff, 0xcb, 0xcb, 0xcb, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0xff, 0x00, 0x00, 0x00, 0xff, 0x6d, 0x6d, 0x6d, 0xff, 0xcc, 0xcc, 0xcc, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x6d, 0x6d, 0x6d, 0xff, 0xcd, 0xcd, 0xcd, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0xff, 0x00, 0x00, 0x00, 0xff, 0x6f, 0x6f, 0x6f, 0xff, 0xcd, 0xcd, 0xcd, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x70, 0x70, 0x70, 0xff, 0xcd, 0xcd, 0xcd, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x18, 0xff, 0x00, 0x00, 0x00, 0xff, 0x70, 0x70, 0x70, 0xff, 0xcd, 0xcd, 0xcd, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x71, 0x71, 0x71, 0xff, 0xcd, 0xcd, 0xcd, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x16, 0x16, 0xff, 0x00, 0x00, 0x00, 0xff, 0x72, 0x72, 0x72, 0xff, 0xcd, 0xcd, 0xcd, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x00, 0x00, 0x00, 0xff, 0x71, 0x71, 0x71, 0xff, 0xcf, 0xcf, 0xcf, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0xff, 0x01, 0x01, 0x01, 0xff, 0x77, 0x77, 0x77, 0xff, 0xc4, 0xc4, 0xc4, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x17, 0xff, 0x00, 0x00, 0x00, 0xff, 0x66, 0x66, 0x66, 0xff, 0xaa, 0xaa, 0xaa, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0xff, 0x4d, 0x4d, 0x4d, 0xff, 0x54, 0x54, 0x54, 0xff, 0x70, 0x70, 0x70, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x3f, 0x3f, 0x3f, 0xff, 0x48, 0x48, 0x48, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2e, 0x2e, 0x2e, 0xe7, 0x93, 0x93, 0x93, 0xc7,
0x46, 0x46, 0x46, 0xee, 0x4a, 0x4a, 0x4a, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x39, 0x39, 0xff,
0x4d, 0x4d, 0x4d, 0xff, 0x7a, 0x7a, 0x7a, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x2d, 0x2d, 0x49,
0x42, 0x42, 0x42, 0xff, 0x7a, 0x7a, 0x7a, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7b, 0x7b, 0x7b, 0xff,
0x00, 0x00, 0x00, 0x00, 0x39, 0x39, 0x39, 0xff, 0x39, 0x39, 0x39, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x50, 0x50, 0x10, 0xbc, 0xbc, 0xbc, 0xfb,
0x00, 0x00, 0x00, 0x00, 0x4f, 0x4f, 0x4f, 0x2a, 0x18, 0x18, 0x18, 0xff, 0x09, 0x09, 0x09, 0xf7, 0x07, 0x07, 0x07, 0xf7, 0x32, 0x32, 0x32, 0xff, 0xa4, 0xa4, 0xa4, 0x2a,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0xff, 0x00, 0x00, 0x00, 0xff, 0x10, 0x10, 0x10, 0xff, 0x1b, 0x1b, 0x1b, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x13, 0x13, 0xff, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x0f, 0x0f, 0xff, 0x1f, 0x1f, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0xff, 0x00, 0x00, 0x00, 0xff, 0x0e, 0x0e, 0x0e, 0xff, 0x1f, 0x1f, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0xff, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x0f, 0x0f, 0xff, 0x1f, 0x1f, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0xff, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x0f, 0x0f, 0xff, 0x1f, 0x1f, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0xff, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x0f, 0x0f, 0xff, 0x1f, 0x1f, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0xff, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x0f, 0x0f, 0xff, 0x1f, 0x1f, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x13, 0x13, 0xff, 0x00, 0x00, 0x00, 0xff, 0x0e, 0x0e, 0x0e, 0xff, 0x1f, 0x1f, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x14, 0x14, 0xff, 0x00, 0x00, 0x00, 0xff, 0x0f, 0x0f, 0x0f, 0xff, 0x1f, 0x1f, 0x1f, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x15, 0x15, 0xff, 0x02, 0x02, 0x02, 0xff, 0x10, 0x10, 0x10, 0xff, 0x1b, 0x1b, 0x1b, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x12, 0x12, 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0x8c, 0x8c, 0x8c, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x68, 0x68, 0xff, 0x94, 0x94, 0x94, 0xff, 0x8b, 0x8b, 0x8b, 0xff, 0xba, 0xba, 0xba, 0xff, 0x00, 0x00, 0x00, 0x00,
#endif
};
const lv_img_dsc_t minute_hand = {
.header.cf = LV_IMG_CF_TRUE_COLOR_ALPHA,
.header.always_zero = 0,
.header.reserved = 0,
.header.w = 7,
.header.h = 100,
.data_size = 700 * LV_IMG_PX_SIZE_ALPHA_BYTE,
.data = minute_hand_map,
};

Binary file not shown.

After

Width:  |  Height:  |  Size: 221 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 216 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 451 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 91 KiB

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Some files were not shown because too many files have changed in this diff Show More