Initial commit

This commit is contained in:
unknown 2023-08-11 00:29:02 -04:00
commit 5ab7512417
629 changed files with 77781 additions and 0 deletions

50
.gitignore vendored Normal file
View File

@ -0,0 +1,50 @@
# These are some examples of commonly ignored file patterns.
# You should customize this list as applicable to your project.
# Learn more about .gitignore:
# https://www.atlassian.com/git/tutorials/saving-changes/gitignore
# Node artifact files
node_modules/
dist/
# Compiled Java class files
*.class
# Compiled Python bytecode
*.py[cod]
# Log files
*.log
# Package files
*.jar
# Maven
target/
dist/
# JetBrains IDE
.idea/
# Unit test reports
TEST*.xml
# Generated by MacOS
.DS_Store
# Generated by Windows
Thumbs.db
# Applications
*.app
*.exe
*.war
# Large media files
*.mp4
*.tiff
*.avi
*.flv
*.mov
*.wmv

51
bom.txt Normal file
View File

@ -0,0 +1,51 @@
1. LILYGO® TTGO T-Beam V1.1 SX1262 LORA 915MHZ ESP32 WiFi Wireless Bluetooth Module GPS NEO-M8N IPEX 18650 $41.85
https://www.aliexpress.com/item/4001287221970.html?spm=a2g0s.9042311.0.0.1f854c4dBQY7TG
2. EVE3-35A-IPS-BLH-TPN-F128 $64.5
https://www.matrixorbital.com/eve3-35a-ips
3. MCP23017 $13
https://www.aliexpress.com/item/32957655097.html?spm=a2g0s.9042311.0.0.1f854c4dBQY7TG
4. SGY-9250 $9
https://www.aliexpress.com/item/1904051617.html?spm=a2g0s.9042311.0.0.1f854c4dBQY7TG
5. 76342-303LF x2 $2 or CES-103-01-G-D
https://www.newark.com/amphenol-icc/76342-303lf/connector-rcpt-6pos-2row-2-54mm/dp/62K8357
6. B3S-1000P x6 $2
https://www.newark.com/omron-electronic-components/b3s-1000p/switch-tactile-spst-no-50ma-smd/dp/50B6363
7. MOLEX 15134-0800 $2.5
https://www.newark.com/molex/15134-0800/cable-assy-8pos-rcpt-rcpt-2/dp/33AC8053
8. MOLEX 53048-0810 $1
https://www.newark.com/molex/53048-0810/connector-header-8pos-1row-1-25mm/dp/98K9836
9. SPC20493 or XG8T-0631 x2 $1
https://www.newark.com/multicomp/spc20493/board-board-connector-header-6way/dp/93K5746
https://www.newark.com/omron-electronic-components/xg8t-0631/connector-header-6-position-2row/dp/05M2064
10. S2B-PH-SM4-TB(LF)(SN) $0.8
https://www.newark.com/jst-japan-solderless-terminals/s2b-ph-sm4-tb-lf-sn/wire-to-board-connector-header/dp/38K8067
11. GM5539 5mm $0.5
https://www.amazon.com/gp/product/B01N7V536K/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1
12. Optional DWM1000 $21
https://www.mouser.com/ProductDetail/772-DWM1000/
13. 10mmx2mm Mini Tiny Vibration Motors 10000rpm Flat Coin Button-Type Micro DC Vibrating Motor $1
https://www.amazon.com/gp/product/B073YFR5WR/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1
14. HTSW-150-06-G-S
https://www.digikey.com/en/products/detail/samtec-inc/HTSW-150-06-G-S/8085307
15. Adafruit NPN Bipolar Transistors (PN2222)
https://www.amazon.com/gp/product/B00XW2OK7M/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1
case+hw $10
glass $3
pcb $3
$133/153

6
compiler_script.py Normal file
View File

@ -0,0 +1,6 @@
Import("env")
env.Replace(
AR="xtensa-esp32-elf-gcc-ar",
RANLIB="xtensa-esp32-elf-gcc-ranlib",
)

BIN
data/at.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

BIN
data/gps.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 423 B

View File

@ -0,0 +1,28 @@
/*
This file is automatically generated
calibri_14_L1
C Source
*/
#include "App_Common.h"
#define FONT_HANDLE (1)
#define FONT_FILE_ADDRESS (RAM_G + 153600)
#define FIRST_CHARACTER (32)
void Load_Font()
{
Gpu_CoCmd_Dlstart(phost);
App_WrCoCmd_Buffer(phost, CLEAR(1, 1, 1));
App_WrCoCmd_Buffer(phost, COLOR_RGB(255, 255, 255));
Gpu_Hal_LoadImageToMemory(phost, "path\\to\\calibri_14_L1.raw", FONT_FILE_ADDRESS, LOAD);
Gpu_CoCmd_SetFont2(phost, FONT_HANDLE, FONT_FILE_ADDRESS, FIRST_CHARACTER);
Gpu_CoCmd_Text(phost, 0, 0, FONT_HANDLE, 0, "AaBbCcDdEeFf");
App_WrCoCmd_Buffer(phost, DISPLAY());
Gpu_CoCmd_Swap(phost);
App_Flush_Co_Buffer(phost);
Gpu_Hal_WaitCmdfifo_empty(phost);
}
/* end of file */

View File

@ -0,0 +1 @@
{"name": "calibri_14_L1", "type": "legacyfont", "format": "L1", "size": 14, "base_line": 11, "caps_height": 9, "mid_line": 7}

Binary file not shown.

View File

@ -0,0 +1,110 @@
/*Command Line: fnt_cvt.exe -f legacy -C BT81X -i Q:/fonts/calibri.ttf -s 14 -d 153600 -c setfont2 -l 32 -a -o D:/Projects/Embedded/AirsoftTracker/fonts*/
/*95 characters have been converted */
/* 148 Metric Block Begin +++ */
/*('file properties ', 'format ', 'L1', ' stride ', 2, ' width ', 14, 'height', 14)*/
{
/* Widths */
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,6,7,7,10,10,3,4,4,7,7,4,4,4,6,7,7,7,7,7,7,7,7,7,7,4,4,7,7,7,6,13,8,8,8,9,7,6,9,9,4,4,7,6,12,9,9,7,10,8,6,7,9,8,13,7,7,7,4,6,4,7,8,4,7,7,6,7,7,5,7,7,3,4,7,3,11,7,7,7,7,5,5,5,7,7,10,6,7,6,4,6,5,7,0,
/* Format */
1,0,0,0,
/* Stride */
2,0,0,0,
/* Max Width */
14,0,0,0,
/* Max Height */
14,0,0,0,
/* Raw Data Address in Decimal: <153748> */
148,88,2,0,
/* 148 Metric Block End --- */
/*Bitmap Raw Data begin +++*/
/*The expected raw bitmap size is 2660 Bytes */
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,
64,0,64,0,64,0,64,0,64,0,64,0,0,0,64,0,64,0,0,0,0,0,0,0,0,0,88,0,80,0,80,0,
64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,36,0,36,0,126,0,36,0,
72,0,252,0,72,0,72,0,72,0,0,0,0,0,0,0,0,0,16,0,56,0,68,0,64,0,96,0,56,0,4,0,
4,0,68,0,120,0,32,0,32,0,0,0,0,0,0,0,113,0,81,0,18,0,84,0,123,128,10,128,18,0,34,128,
35,128,0,0,0,0,0,0,0,0,60,0,36,0,36,0,44,0,56,0,57,0,77,0,71,0,103,0,61,128,0,0,
0,0,0,0,0,0,64,0,64,0,64,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,32,0,32,0,32,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,32,0,32,0,32,0,0,0,64,0,
64,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,64,0,64,0,0,0,32,0,248,0,112,0,
248,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,16,0,
16,0,124,0,16,0,16,0,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,64,0,64,0,64,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,128,0,0,0,
0,0,0,0,0,0,8,0,8,0,24,0,16,0,16,0,32,0,32,0,32,0,64,0,64,0,192,0,128,0,0,0,
0,0,0,0,56,0,68,0,68,0,70,0,70,0,70,0,68,0,68,0,56,0,0,0,0,0,0,0,0,0,0,0,
32,0,224,0,32,0,32,0,32,0,32,0,32,0,32,0,248,0,0,0,0,0,0,0,0,0,0,0,56,0,76,0,
4,0,12,0,8,0,24,0,48,0,96,0,124,0,0,0,0,0,0,0,0,0,0,0,56,0,76,0,4,0,8,0,
56,0,12,0,4,0,76,0,120,0,0,0,0,0,0,0,0,0,0,0,8,0,24,0,40,0,40,0,72,0,72,0,
254,0,8,0,8,0,0,0,0,0,0,0,0,0,0,0,124,0,64,0,64,0,120,0,12,0,4,0,4,0,76,0,
120,0,0,0,0,0,0,0,0,0,0,0,28,0,32,0,64,0,124,0,68,0,70,0,68,0,100,0,56,0,0,0,
0,0,0,0,0,0,0,0,124,0,4,0,4,0,8,0,8,0,16,0,16,0,48,0,32,0,0,0,0,0,0,0,
0,0,0,0,56,0,68,0,68,0,108,0,56,0,68,0,68,0,68,0,56,0,0,0,0,0,0,0,0,0,0,0,
56,0,68,0,68,0,68,0,124,0,4,0,4,0,12,0,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
192,0,192,0,0,0,0,0,0,0,192,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,0,
96,0,0,0,0,0,96,0,96,0,64,0,64,0,0,0,0,0,0,0,0,0,4,0,24,0,96,0,192,0,96,0,
24,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,0,0,0,0,0,124,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,48,0,12,0,12,0,48,0,64,0,0,0,0,0,
0,0,0,0,0,0,120,0,76,0,4,0,12,0,56,0,32,0,32,0,0,0,48,0,48,0,0,0,0,0,0,0,
0,0,0,0,15,0,48,192,64,64,79,64,146,64,146,64,146,64,159,128,192,0,96,0,62,0,0,0,0,0,0,0,
24,0,24,0,60,0,36,0,36,0,102,0,126,0,66,0,195,0,0,0,0,0,0,0,0,0,0,0,240,0,136,0,
136,0,136,0,248,0,140,0,132,0,140,0,248,0,0,0,0,0,0,0,0,0,0,0,28,0,34,0,64,0,64,0,
64,0,64,0,64,0,98,0,60,0,0,0,0,0,0,0,0,0,0,0,248,0,140,0,134,0,130,0,130,0,130,0,
134,0,140,0,248,0,0,0,0,0,0,0,0,0,0,0,248,0,128,0,128,0,128,0,248,0,128,0,128,0,128,0,
248,0,0,0,0,0,0,0,0,0,0,0,248,0,128,0,128,0,128,0,248,0,128,0,128,0,128,0,128,0,0,0,
0,0,0,0,0,0,0,0,30,0,33,0,64,0,64,0,79,0,65,0,65,0,35,0,30,0,0,0,0,0,0,0,
0,0,0,0,134,0,134,0,134,0,134,0,254,0,134,0,134,0,134,0,134,0,0,0,0,0,0,0,0,0,0,0,
128,0,128,0,128,0,128,0,128,0,128,0,128,0,128,0,128,0,0,0,0,0,0,0,0,0,0,0,32,0,32,0,
32,0,32,0,32,0,32,0,32,0,32,0,224,0,0,0,0,0,0,0,0,0,0,0,140,0,152,0,144,0,224,0,
224,0,176,0,144,0,136,0,140,0,0,0,0,0,0,0,0,0,0,0,128,0,128,0,128,0,128,0,128,0,128,0,
128,0,128,0,248,0,0,0,0,0,0,0,0,0,0,0,192,192,225,192,161,64,161,64,146,64,146,64,156,64,140,64,
140,64,0,0,0,0,0,0,0,0,0,0,194,0,226,0,162,0,178,0,146,0,154,0,142,0,134,0,134,0,0,0,
0,0,0,0,0,0,0,0,30,0,35,0,65,0,65,0,65,128,65,0,65,0,99,0,30,0,0,0,0,0,0,0,
0,0,0,0,240,0,136,0,140,0,136,0,136,0,240,0,128,0,128,0,128,0,0,0,0,0,0,0,0,0,0,0,
30,0,35,0,65,0,65,0,65,128,65,0,65,0,99,0,63,0,0,192,0,0,0,0,0,0,0,0,248,0,136,0,
140,0,136,0,240,0,152,0,136,0,140,0,132,0,0,0,0,0,0,0,0,0,0,0,56,0,64,0,64,0,96,0,
56,0,12,0,4,0,12,0,120,0,0,0,0,0,0,0,0,0,0,0,254,0,16,0,16,0,16,0,16,0,16,0,
16,0,16,0,16,0,0,0,0,0,0,0,0,0,0,0,130,0,130,0,130,0,130,0,130,0,130,0,134,0,68,0,
56,0,0,0,0,0,0,0,0,0,0,0,195,0,66,0,66,0,102,0,36,0,36,0,60,0,24,0,24,0,0,0,
0,0,0,0,0,0,0,0,66,16,70,16,70,32,101,32,41,32,41,96,41,192,56,192,16,192,0,0,0,0,0,0,
0,0,0,0,70,0,100,0,44,0,56,0,24,0,56,0,44,0,68,0,70,0,0,0,0,0,0,0,0,0,0,0,
196,0,68,0,104,0,40,0,48,0,16,0,16,0,16,0,16,0,0,0,0,0,0,0,0,0,0,0,124,0,12,0,
8,0,24,0,16,0,32,0,96,0,64,0,252,0,0,0,0,0,0,0,0,0,224,0,128,0,128,0,128,0,128,0,
128,0,128,0,128,0,128,0,128,0,128,0,224,0,0,0,0,0,128,0,64,0,64,0,64,0,32,0,32,0,32,0,
16,0,16,0,24,0,8,0,8,0,0,0,0,0,96,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,
32,0,32,0,96,0,0,0,0,0,0,0,16,0,56,0,40,0,76,0,68,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,
0,0,64,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,56,0,76,0,4,0,60,0,68,0,76,0,124,0,0,0,0,0,0,0,0,0,128,0,128,0,128,0,
184,0,200,0,140,0,140,0,140,0,200,0,176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,0,64,0,
64,0,64,0,64,0,64,0,56,0,0,0,0,0,0,0,0,0,4,0,4,0,4,0,60,0,76,0,68,0,68,0,
68,0,76,0,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,0,68,0,68,0,124,0,64,0,64,0,
60,0,0,0,0,0,0,0,0,0,48,0,96,0,64,0,240,0,64,0,64,0,64,0,64,0,64,0,64,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,60,0,72,0,72,0,72,0,120,0,64,0,120,0,68,0,196,0,120,0,
0,0,128,0,128,0,128,0,176,0,200,0,136,0,136,0,136,0,136,0,136,0,0,0,0,0,0,0,0,0,0,0,
64,0,0,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,
32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,32,0,96,0,0,0,128,0,128,0,128,0,152,0,176,0,
224,0,224,0,176,0,144,0,136,0,0,0,0,0,0,0,0,0,128,0,128,0,128,0,128,0,128,0,128,0,128,0,
128,0,128,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,179,0,204,128,136,128,136,128,136,128,136,128,
136,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,176,0,200,0,136,0,136,0,136,0,136,0,136,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,56,0,100,0,70,0,66,0,70,0,68,0,56,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,184,0,200,0,140,0,140,0,140,0,200,0,240,0,128,0,128,0,128,0,0,0,0,0,
0,0,0,0,60,0,76,0,68,0,68,0,68,0,76,0,60,0,4,0,4,0,4,0,0,0,0,0,0,0,0,0,
176,0,192,0,128,0,128,0,128,0,128,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,0,64,0,
64,0,48,0,24,0,8,0,112,0,0,0,0,0,0,0,0,0,0,0,64,0,64,0,240,0,64,0,64,0,64,0,
64,0,96,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,0,136,0,136,0,136,0,136,0,216,0,
120,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,0,68,0,72,0,72,0,40,0,48,0,48,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,204,192,76,128,76,128,76,128,51,0,51,0,51,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,72,0,72,0,48,0,48,0,48,0,72,0,204,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,196,0,68,0,72,0,104,0,40,0,48,0,48,0,16,0,32,0,32,0,0,0,0,0,0,0,0,0,
120,0,16,0,16,0,32,0,32,0,64,0,120,0,0,0,0,0,0,0,0,0,48,0,32,0,32,0,32,0,32,0,
64,0,96,0,32,0,32,0,32,0,32,0,48,0,0,0,0,0,64,0,64,0,64,0,64,0,64,0,64,0,64,0,
64,0,64,0,64,0,64,0,64,0,64,0,0,0,96,0,32,0,32,0,32,0,32,0,16,0,32,0,32,0,32,0,
32,0,32,0,64,0,0,0,0,0,0,0,0,0,98,0,84,0,140,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,
/*Bitmap Raw Data end ---*/
}

View File

@ -0,0 +1,98 @@
95 characters are converted
Character Index No.
32
! 33
" 34
# 35
$ 36
% 37
& 38
' 39
( 40
) 41
* 42
+ 43
, 44
- 45
. 46
/ 47
0 48
1 49
2 50
3 51
4 52
5 53
6 54
7 55
8 56
9 57
: 58
; 59
< 60
= 61
> 62
? 63
@ 64
A 65
B 66
C 67
D 68
E 69
F 70
G 71
H 72
I 73
J 74
K 75
L 76
M 77
N 78
O 79
P 80
Q 81
R 82
S 83
T 84
U 85
V 86
W 87
X 88
Y 89
Z 90
[ 91
\ 92
] 93
^ 94
_ 95
` 96
a 97
b 98
c 99
d 100
e 101
f 102
g 103
h 104
i 105
j 106
k 107
l 108
m 109
n 110
o 111
p 112
q 113
r 114
s 115
t 116
u 117
v 118
w 119
x 120
y 121
z 122
{ 123
| 124
} 125
~ 126

View File

@ -0,0 +1,28 @@
/*
This file is automatically generated
calibri_14_L2
C Source
*/
#include "App_Common.h"
#define FONT_HANDLE (1)
#define FONT_FILE_ADDRESS (RAM_G + 153600)
#define FIRST_CHARACTER (32)
void Load_Font()
{
Gpu_CoCmd_Dlstart(phost);
App_WrCoCmd_Buffer(phost, CLEAR(1, 1, 1));
App_WrCoCmd_Buffer(phost, COLOR_RGB(255, 255, 255));
Gpu_Hal_LoadImageToMemory(phost, "path\\to\\calibri_14_L2.raw", FONT_FILE_ADDRESS, LOAD);
Gpu_CoCmd_SetFont2(phost, FONT_HANDLE, FONT_FILE_ADDRESS, FIRST_CHARACTER);
Gpu_CoCmd_Text(phost, 0, 0, FONT_HANDLE, 0, "AaBbCcDdEeFf");
App_WrCoCmd_Buffer(phost, DISPLAY());
Gpu_CoCmd_Swap(phost);
App_Flush_Co_Buffer(phost);
Gpu_Hal_WaitCmdfifo_empty(phost);
}
/* end of file */

View File

@ -0,0 +1 @@
{"name": "calibri_14_L2", "type": "legacyfont", "format": "L2", "size": 14, "base_line": 11, "caps_height": 9, "mid_line": 7}

Binary file not shown.

View File

@ -0,0 +1,193 @@
/*Command Line: fnt_cvt.exe -f legacy -C BT81X -i Q:/fonts/calibri.ttf -s 14 -d 153600 -c setfont2 -l 32 -a -o D:/Projects/Embedded/AirsoftTracker/fonts*/
/*95 characters have been converted */
/* 148 Metric Block Begin +++ */
/*('file properties ', 'format ', 'L2', ' stride ', 4, ' width ', 14, 'height', 14)*/
{
/* Widths */
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,6,7,7,10,10,3,4,4,7,7,4,4,4,6,7,7,7,7,7,7,7,7,7,7,4,4,7,7,7,6,13,8,8,8,9,7,6,9,9,4,4,7,6,12,9,9,7,10,8,6,7,9,8,13,7,7,7,4,6,4,7,8,4,7,7,6,7,7,5,7,7,3,4,7,3,11,7,7,7,7,5,5,5,7,7,10,6,7,6,4,6,5,7,0,
/* Format */
17,0,0,0,
/* Stride */
4,0,0,0,
/* Max Width */
14,0,0,0,
/* Max Height */
14,0,0,0,
/* Raw Data Address in Decimal: <153748> */
148,88,2,0,
/* 148 Metric Block End --- */
/*Bitmap Raw Data begin +++*/
/*The expected raw bitmap size is 5320 Bytes */
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,0,0,0,
48,0,0,0,48,0,0,0,48,0,0,0,48,0,0,0,48,0,0,0,48,0,0,0,0,0,0,0,48,0,0,0,
48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50,128,0,0,50,64,0,0,50,64,0,0,
49,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,48,0,0,12,96,0,0,127,248,0,0,24,96,0,0,
36,144,0,0,191,244,0,0,36,192,0,0,48,192,0,0,48,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
1,64,0,0,2,64,0,0,27,208,0,0,52,96,0,0,48,0,0,0,41,0,0,0,11,208,0,0,0,112,0,0,
0,52,0,0,96,112,0,0,47,144,0,0,9,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
46,2,64,0,99,6,0,0,82,76,0,0,99,36,0,0,46,155,128,0,1,140,144,0,3,24,80,0,9,12,144,0,
24,11,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,224,0,0,28,52,0,0,24,36,0,0,
13,160,0,0,11,128,0,0,30,131,0,0,52,163,0,0,112,62,0,0,56,46,0,0,27,226,192,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,48,0,0,0,48,0,0,0,48,0,0,0,48,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,9,0,0,0,12,0,0,0,24,0,0,0,36,0,0,0,52,0,0,0,48,0,0,0,48,0,0,0,
48,0,0,0,52,0,0,0,36,0,0,0,24,0,0,0,12,0,0,0,9,0,0,0,0,0,0,0,48,0,0,0,
36,0,0,0,24,0,0,0,28,0,0,0,12,0,0,0,13,0,0,0,13,0,0,0,13,0,0,0,13,0,0,0,
28,0,0,0,24,0,0,0,36,0,0,0,48,0,0,0,0,0,0,0,12,0,0,0,170,128,0,0,46,0,0,0,
170,128,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,3,0,0,0,
3,0,0,0,127,244,0,0,3,0,0,0,3,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,36,0,0,0,36,0,0,0,48,0,0,0,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,126,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,144,0,0,0,208,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,208,0,0,1,192,0,0,2,128,0,0,3,0,0,0,6,0,0,0,
9,0,0,0,12,0,0,0,24,0,0,0,36,0,0,0,112,0,0,0,160,0,0,0,208,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,27,208,0,0,52,112,0,0,112,36,0,0,96,40,0,0,96,40,0,0,96,40,0,0,
112,36,0,0,52,112,0,0,31,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
29,0,0,0,169,0,0,0,73,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,
191,208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,128,0,0,32,160,0,0,
0,112,0,0,0,160,0,0,0,208,0,0,2,128,0,0,10,0,0,0,40,0,0,0,127,244,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,128,0,0,32,160,0,0,0,96,0,0,1,208,0,0,
31,128,0,0,0,176,0,0,0,52,0,0,96,176,0,0,47,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1,208,0,0,3,144,0,0,9,144,0,0,28,144,0,0,36,144,0,0,96,144,0,0,
191,248,0,0,0,144,0,0,0,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
47,224,0,0,52,0,0,0,52,0,0,0,63,144,0,0,0,176,0,0,0,52,0,0,0,48,0,0,96,160,0,0,
47,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,224,0,0,25,16,0,0,
48,0,0,0,59,224,0,0,116,116,0,0,112,40,0,0,48,36,0,0,56,112,0,0,27,208,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,244,0,0,0,52,0,0,0,96,0,0,0,208,0,0,
1,192,0,0,2,64,0,0,7,0,0,0,10,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,27,208,0,0,52,112,0,0,48,48,0,0,41,160,0,0,11,192,0,0,52,112,0,0,
96,36,0,0,116,116,0,0,31,208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
27,144,0,0,52,112,0,0,96,52,0,0,116,116,0,0,47,180,0,0,0,52,0,0,0,112,0,0,17,224,0,0,
63,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
160,0,0,0,160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,0,0,0,160,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,0,0,0,
40,0,0,0,0,0,0,0,0,0,0,0,40,0,0,0,40,0,0,0,48,0,0,0,96,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,100,0,0,2,208,0,0,45,0,0,0,176,0,0,0,45,0,0,0,
2,208,0,0,0,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,127,244,0,0,0,0,0,0,0,0,0,0,127,244,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
100,0,0,0,26,64,0,0,0,164,0,0,1,180,0,0,26,64,0,0,100,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,47,128,0,0,32,160,0,0,0,96,0,0,0,160,0,0,11,128,0,0,
9,0,0,0,9,0,0,0,0,0,0,0,10,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,1,190,64,0,14,65,160,0,36,0,48,0,97,250,36,0,147,73,36,0,150,9,48,0,
150,28,96,0,147,235,128,0,160,0,0,0,57,0,0,0,11,253,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
2,192,0,0,6,208,0,0,10,160,0,0,13,112,0,0,28,52,0,0,40,40,0,0,63,252,0,0,112,13,0,0,
160,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,191,64,0,0,145,208,0,0,
144,144,0,0,145,192,0,0,191,128,0,0,144,160,0,0,144,112,0,0,144,160,0,0,191,128,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,228,0,0,29,24,0,0,52,0,0,0,112,0,0,0,
112,0,0,0,112,0,0,0,52,0,0,0,45,24,0,0,11,228,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,191,144,0,0,144,176,0,0,144,40,0,0,144,28,0,0,144,28,0,0,144,28,0,0,
144,40,0,0,144,176,0,0,191,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
191,192,0,0,144,0,0,0,144,0,0,0,144,0,0,0,191,128,0,0,144,0,0,0,144,0,0,0,144,0,0,0,
191,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,191,128,0,0,144,0,0,0,
144,0,0,0,144,0,0,0,191,128,0,0,144,0,0,0,144,0,0,0,144,0,0,0,144,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,249,0,0,29,6,0,0,52,0,0,0,112,0,0,0,
112,190,0,0,112,6,0,0,52,6,0,0,29,10,0,0,6,249,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,144,40,0,0,144,40,0,0,144,40,0,0,144,40,0,0,191,248,0,0,144,40,0,0,
144,40,0,0,144,40,0,0,144,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
144,0,0,0,144,0,0,0,144,0,0,0,144,0,0,0,144,0,0,0,144,0,0,0,144,0,0,0,144,0,0,0,
144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,13,0,0,0,
13,0,0,0,13,0,0,0,13,0,0,0,13,0,0,0,13,0,0,0,13,0,0,0,248,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,144,160,0,0,146,128,0,0,151,0,0,0,173,0,0,0,
172,0,0,0,154,0,0,0,147,64,0,0,145,192,0,0,144,160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,144,0,0,0,144,0,0,0,144,0,0,0,144,0,0,0,144,0,0,0,144,0,0,0,
144,0,0,0,144,0,0,0,191,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
180,1,224,0,168,2,160,0,156,3,96,0,153,6,96,0,151,13,96,0,147,88,96,0,146,164,96,0,144,240,96,0,
144,160,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,176,28,0,0,184,28,0,0,
157,28,0,0,154,28,0,0,147,92,0,0,146,156,0,0,144,236,0,0,144,124,0,0,144,40,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,248,0,0,29,10,0,0,52,3,64,0,112,2,64,0,
112,2,128,0,112,2,64,0,52,3,64,0,45,10,0,0,7,248,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,191,64,0,0,145,208,0,0,144,160,0,0,144,144,0,0,145,208,0,0,190,64,0,0,
144,0,0,0,144,0,0,0,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
6,248,0,0,29,10,0,0,52,3,64,0,112,2,64,0,112,2,128,0,112,2,64,0,52,3,64,0,45,10,0,0,
11,251,64,0,0,1,160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,191,128,0,0,145,208,0,0,
144,160,0,0,145,208,0,0,191,64,0,0,146,128,0,0,144,208,0,0,144,160,0,0,144,112,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,128,0,0,52,80,0,0,112,0,0,0,57,0,0,0,
11,128,0,0,0,160,0,0,0,112,0,0,80,160,0,0,47,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,255,248,0,0,7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,7,0,0,0,
7,0,0,0,7,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
144,24,0,0,208,24,0,0,208,24,0,0,208,24,0,0,208,24,0,0,208,24,0,0,144,40,0,0,116,116,0,0,
31,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,10,0,0,112,13,0,0,
52,28,0,0,40,40,0,0,28,52,0,0,13,112,0,0,10,160,0,0,7,208,0,0,3,128,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,28,7,0,112,45,6,0,52,57,9,0,40,102,12,0,
24,147,28,0,12,147,104,0,9,194,164,0,11,129,240,0,7,64,224,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,112,40,0,0,40,112,0,0,28,160,0,0,10,192,0,0,7,128,0,0,10,192,0,0,
28,160,0,0,52,52,0,0,96,40,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
160,36,0,0,112,112,0,0,40,144,0,0,29,192,0,0,11,64,0,0,7,0,0,0,7,0,0,0,7,0,0,0,
7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,240,0,0,0,160,0,0,
1,208,0,0,2,128,0,0,7,0,0,0,13,0,0,0,40,0,0,0,112,0,0,0,191,244,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,184,0,0,0,144,0,0,0,144,0,0,0,144,0,0,0,144,0,0,0,
144,0,0,0,144,0,0,0,144,0,0,0,144,0,0,0,144,0,0,0,144,0,0,0,184,0,0,0,0,0,0,0,
0,0,0,0,144,0,0,0,96,0,0,0,48,0,0,0,36,0,0,0,24,0,0,0,12,0,0,0,9,0,0,0,
7,0,0,0,3,64,0,0,2,128,0,0,1,192,0,0,0,208,0,0,0,0,0,0,0,0,0,0,124,0,0,0,
12,0,0,0,12,0,0,0,12,0,0,0,12,0,0,0,12,0,0,0,12,0,0,0,12,0,0,0,12,0,0,0,
12,0,0,0,12,0,0,0,124,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,64,0,0,10,128,0,0,
24,208,0,0,36,160,0,0,48,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,63,255,0,0,
0,0,0,0,36,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,27,128,0,0,36,160,0,0,0,96,0,0,31,224,0,0,116,96,0,0,112,160,0,0,
47,160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,0,0,208,0,0,0,208,0,0,0,
223,128,0,0,225,208,0,0,208,160,0,0,208,160,0,0,208,160,0,0,225,208,0,0,223,64,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,27,128,0,0,52,80,0,0,
112,0,0,0,96,0,0,0,112,0,0,0,52,80,0,0,31,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,36,0,0,0,36,0,0,0,36,0,0,27,180,0,0,52,180,0,0,112,36,0,0,112,36,0,0,
112,52,0,0,52,180,0,0,31,164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,11,144,0,0,52,112,0,0,112,52,0,0,127,244,0,0,112,0,0,0,52,0,0,0,
27,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,64,0,0,40,0,0,0,36,0,0,0,
191,0,0,0,36,0,0,0,36,0,0,0,36,0,0,0,36,0,0,0,36,0,0,0,36,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,31,240,0,0,52,208,0,0,
112,144,0,0,52,208,0,0,63,128,0,0,96,0,0,0,63,208,0,0,96,112,0,0,160,112,0,0,47,144,0,0,
0,0,0,0,192,0,0,0,208,0,0,0,208,0,0,0,223,64,0,0,225,192,0,0,208,208,0,0,208,144,0,0,
208,144,0,0,208,144,0,0,192,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,
52,0,0,0,0,0,0,0,48,0,0,0,52,0,0,0,52,0,0,0,52,0,0,0,52,0,0,0,52,0,0,0,
48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,
9,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,9,0,0,0,13,0,0,0,
12,0,0,0,120,0,0,0,0,0,0,0,192,0,0,0,208,0,0,0,208,0,0,0,210,128,0,0,218,0,0,0,
232,0,0,0,232,0,0,0,218,0,0,0,215,64,0,0,193,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,192,0,0,0,208,0,0,0,208,0,0,0,208,0,0,0,208,0,0,0,208,0,0,0,208,0,0,0,
208,0,0,0,208,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,223,95,64,0,225,225,192,0,208,208,192,0,208,208,208,0,208,208,208,0,208,208,208,0,
192,192,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
223,64,0,0,225,192,0,0,208,208,0,0,208,144,0,0,208,144,0,0,208,144,0,0,192,144,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,208,0,0,56,116,0,0,
112,40,0,0,96,24,0,0,112,40,0,0,52,116,0,0,27,208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,223,128,0,0,225,208,0,0,208,160,0,0,208,160,0,0,
208,160,0,0,225,208,0,0,239,64,0,0,208,0,0,0,208,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,27,164,0,0,52,180,0,0,112,36,0,0,112,36,0,0,112,52,0,0,52,180,0,0,
31,164,0,0,0,36,0,0,0,36,0,0,0,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
222,0,0,0,224,0,0,0,208,0,0,0,208,0,0,0,208,0,0,0,208,0,0,0,192,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,47,128,0,0,112,0,0,0,
52,0,0,0,30,64,0,0,2,128,0,0,1,128,0,0,126,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,36,0,0,0,36,0,0,0,191,64,0,0,36,0,0,0,36,0,0,0,36,0,0,0,
36,0,0,0,40,0,0,0,31,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,192,144,0,0,192,144,0,0,192,144,0,0,192,144,0,0,208,144,0,0,162,208,0,0,
126,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
160,48,0,0,112,96,0,0,48,144,0,0,36,192,0,0,25,128,0,0,15,64,0,0,11,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,160,160,0,112,240,144,0,
48,176,192,0,37,165,128,0,26,90,64,0,14,14,0,0,10,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,144,0,0,53,192,0,0,31,64,0,0,15,0,0,0,
26,64,0,0,53,192,0,0,160,160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,160,48,0,0,112,96,0,0,52,144,0,0,40,192,0,0,29,128,0,0,15,64,0,0,
11,0,0,0,6,0,0,0,9,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
127,128,0,0,2,64,0,0,7,0,0,0,13,0,0,0,24,0,0,0,48,0,0,0,127,192,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,12,0,0,0,28,0,0,0,24,0,0,0,24,0,0,0,
112,0,0,0,40,0,0,0,24,0,0,0,28,0,0,0,28,0,0,0,12,0,0,0,11,0,0,0,0,0,0,0,
0,0,0,0,96,0,0,0,96,0,0,0,96,0,0,0,96,0,0,0,96,0,0,0,96,0,0,0,96,0,0,0,
96,0,0,0,96,0,0,0,96,0,0,0,96,0,0,0,96,0,0,0,96,0,0,0,0,0,0,0,56,0,0,0,
28,0,0,0,12,0,0,0,12,0,0,0,13,0,0,0,7,0,0,0,9,0,0,0,12,0,0,0,12,0,0,0,
12,0,0,0,28,0,0,0,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,45,24,0,0,
103,36,0,0,145,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,
/*Bitmap Raw Data end ---*/
}

View File

@ -0,0 +1,98 @@
95 characters are converted
Character Index No.
32
! 33
" 34
# 35
$ 36
% 37
& 38
' 39
( 40
) 41
* 42
+ 43
, 44
- 45
. 46
/ 47
0 48
1 49
2 50
3 51
4 52
5 53
6 54
7 55
8 56
9 57
: 58
; 59
< 60
= 61
> 62
? 63
@ 64
A 65
B 66
C 67
D 68
E 69
F 70
G 71
H 72
I 73
J 74
K 75
L 76
M 77
N 78
O 79
P 80
Q 81
R 82
S 83
T 84
U 85
V 86
W 87
X 88
Y 89
Z 90
[ 91
\ 92
] 93
^ 94
_ 95
` 96
a 97
b 98
c 99
d 100
e 101
f 102
g 103
h 104
i 105
j 106
k 107
l 108
m 109
n 110
o 111
p 112
q 113
r 114
s 115
t 116
u 117
v 118
w 119
x 120
y 121
z 122
{ 123
| 124
} 125
~ 126

View File

@ -0,0 +1,28 @@
/*
This file is automatically generated
calibri_14_L4
C Source
*/
#include "App_Common.h"
#define FONT_HANDLE (1)
#define FONT_FILE_ADDRESS (RAM_G + 153600)
#define FIRST_CHARACTER (32)
void Load_Font()
{
Gpu_CoCmd_Dlstart(phost);
App_WrCoCmd_Buffer(phost, CLEAR(1, 1, 1));
App_WrCoCmd_Buffer(phost, COLOR_RGB(255, 255, 255));
Gpu_Hal_LoadImageToMemory(phost, "path\\to\\calibri_14_L4.raw", FONT_FILE_ADDRESS, LOAD);
Gpu_CoCmd_SetFont2(phost, FONT_HANDLE, FONT_FILE_ADDRESS, FIRST_CHARACTER);
Gpu_CoCmd_Text(phost, 0, 0, FONT_HANDLE, 0, "AaBbCcDdEeFf");
App_WrCoCmd_Buffer(phost, DISPLAY());
Gpu_CoCmd_Swap(phost);
App_Flush_Co_Buffer(phost);
Gpu_Hal_WaitCmdfifo_empty(phost);
}
/* end of file */

View File

@ -0,0 +1 @@
{"name": "calibri_14_L4", "type": "legacyfont", "format": "L4", "size": 14, "base_line": 11, "caps_height": 9, "mid_line": 7}

Binary file not shown.

View File

@ -0,0 +1,317 @@
/*Command Line: fnt_cvt.exe -f legacy -C BT81X -i Q:/fonts/calibri.ttf -s 14 -d 153600 -c setfont2 -l 32 -a -o D:/Projects/Embedded/AirsoftTracker/fonts*/
/*95 characters have been converted */
/* 148 Metric Block Begin +++ */
/*('file properties ', 'format ', 'L4', ' stride ', 7, ' width ', 14, 'height', 14)*/
{
/* Widths */
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,6,7,7,10,10,3,4,4,7,7,4,4,4,6,7,7,7,7,7,7,7,7,7,7,4,4,7,7,7,6,13,8,8,8,9,7,6,9,9,4,4,7,6,12,9,9,7,10,8,6,7,9,8,13,7,7,7,4,6,4,7,8,4,7,7,6,7,7,5,7,7,3,4,7,3,11,7,7,7,7,5,5,5,7,7,10,6,7,6,4,6,5,7,0,
/* Format */
2,0,0,0,
/* Stride */
7,0,0,0,
/* Max Width */
14,0,0,0,
/* Max Height */
14,0,0,0,
/* Raw Data Address in Decimal: <153748> */
148,88,2,0,
/* 148 Metric Block End --- */
/*Bitmap Raw Data begin +++*/
/*The expected raw bitmap size is 9310 Bytes */
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,31,32,0,0,0,0,0,31,32,0,0,0,0,0,31,32,0,0,0,0,0,15,32,
0,0,0,0,0,15,16,0,0,0,0,0,15,16,0,0,0,0,0,14,16,0,0,0,0,0,0,0,0,0,0,0,
0,46,32,0,0,0,0,0,46,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,15,25,128,0,0,0,0,15,25,112,0,0,0,0,14,8,112,0,0,0,0,
13,7,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,29,0,0,0,0,2,208,76,0,0,
0,0,95,255,255,160,0,0,0,6,144,120,0,0,0,0,8,112,150,0,0,0,0,191,255,255,64,0,0,0,12,64,
210,0,0,0,0,13,32,241,0,0,0,0,14,1,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,7,96,0,0,0,0,0,9,80,0,0,0,0,4,207,231,0,0,0,0,14,97,58,
0,0,0,0,31,32,0,0,0,0,0,12,196,0,0,0,0,0,1,142,213,0,0,0,0,0,0,127,32,0,0,0,
0,0,14,80,0,0,0,89,33,110,32,0,0,0,27,239,196,0,0,0,0,0,133,0,0,0,0,0,0,148,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,233,0,10,80,0,0,90,
29,32,106,0,0,0,119,10,66,209,0,0,0,106,29,44,48,0,0,0,27,232,135,142,177,0,0,0,4,178,209,166,
0,0,0,29,36,160,119,0,0,0,181,2,209,165,0,0,6,144,0,158,176,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,141,235,16,0,0,0,4,226,29,112,0,0,
0,6,192,12,112,0,0,0,2,244,156,16,0,0,0,0,175,161,0,0,0,0,7,219,176,14,32,0,0,47,49,202,
47,16,0,0,63,0,45,233,0,0,0,30,129,42,251,16,0,0,4,207,232,25,224,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,32,0,0,0,0,0,15,16,0,0,
0,0,0,14,16,0,0,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,180,0,0,0,0,0,2,224,
0,0,0,0,0,7,144,0,0,0,0,0,11,96,0,0,0,0,0,14,48,0,0,0,0,0,15,32,0,0,0,0,
0,31,32,0,0,0,0,0,31,32,0,0,0,0,0,14,64,0,0,0,0,0,11,96,0,0,0,0,0,7,160,0,
0,0,0,0,2,224,0,0,0,0,0,0,180,0,0,0,0,0,0,0,0,0,0,0,0,29,16,0,0,0,0,0,
10,96,0,0,0,0,0,6,160,0,0,0,0,0,3,224,0,0,0,0,0,0,242,0,0,0,0,0,0,228,0,0,
0,0,0,0,213,0,0,0,0,0,0,228,0,0,0,0,0,0,243,0,0,0,0,0,3,240,0,0,0,0,0,6,
176,0,0,0,0,0,11,96,0,0,0,0,0,30,16,0,0,0,0,0,0,0,0,0,0,0,0,0,208,0,0,0,
0,0,184,200,160,0,0,0,0,27,250,0,0,0,0,0,184,200,160,0,0,0,0,0,208,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,15,0,0,0,0,0,
0,15,0,0,0,0,0,127,255,255,112,0,0,0,0,15,0,0,0,0,0,0,15,0,0,0,0,0,0,14,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,112,0,0,0,0,0,12,96,
0,0,0,0,0,45,16,0,0,0,0,0,133,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,127,251,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,198,0,0,0,0,
0,0,214,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,211,0,0,0,0,0,4,208,0,0,0,0,0,9,128,0,0,0,0,0,30,32,0,0,0,
0,0,92,0,0,0,0,0,0,182,0,0,0,0,0,1,225,0,0,0,0,0,7,160,0,0,0,0,0,12,80,0,
0,0,0,0,62,0,0,0,0,0,0,137,0,0,0,0,0,0,211,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,207,213,0,0,0,0,13,113,95,32,0,0,0,78,0,12,96,
0,0,0,107,0,10,128,0,0,0,123,0,9,144,0,0,0,107,0,10,128,0,0,0,94,0,12,96,0,0,0,30,
113,110,16,0,0,0,4,223,196,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,231,0,0,0,0,0,155,199,0,0,0,0,0,48,167,
0,0,0,0,0,0,167,0,0,0,0,0,0,167,0,0,0,0,0,0,167,0,0,0,0,0,0,167,0,0,0,0,
0,0,167,0,0,0,0,0,191,255,244,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,222,178,0,0,0,0,27,33,203,0,0,0,0,
0,0,125,0,0,0,0,0,0,155,0,0,0,0,0,2,228,0,0,0,0,0,28,128,0,0,0,0,0,186,0,0,
0,0,0,11,160,0,0,0,0,0,63,255,255,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,222,178,0,0,0,0,11,33,186,0,0,
0,0,0,0,124,0,0,0,0,0,3,214,0,0,0,0,5,255,194,0,0,0,0,0,2,157,16,0,0,0,0,0,
47,48,0,0,0,73,33,142,16,0,0,0,26,238,179,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,246,0,0,0,0,0,45,199,
0,0,0,0,0,167,183,0,0,0,0,3,208,183,0,0,0,0,12,64,183,0,0,0,0,106,0,183,0,0,0,0,
175,255,255,144,0,0,0,0,0,183,0,0,0,0,0,0,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,255,250,0,0,0,0,13,
48,0,0,0,0,0,13,48,0,0,0,0,0,13,254,179,0,0,0,0,1,1,158,16,0,0,0,0,0,31,48,0,
0,0,0,0,31,32,0,0,0,72,17,172,0,0,0,0,27,238,162,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,125,252,16,0,0,
0,7,179,3,0,0,0,0,14,32,0,0,0,0,0,47,174,232,0,0,0,0,79,81,62,64,0,0,0,78,0,10,
128,0,0,0,47,32,11,96,0,0,0,13,145,94,32,0,0,0,3,207,212,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,79,255,255,96,
0,0,0,0,0,30,48,0,0,0,0,0,123,0,0,0,0,0,0,213,0,0,0,0,0,5,208,0,0,0,0,0,
12,112,0,0,0,0,0,63,16,0,0,0,0,0,170,0,0,0,0,0,1,243,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,206,
214,0,0,0,0,14,96,95,16,0,0,0,31,32,31,32,0,0,0,9,196,184,0,0,0,0,1,206,210,0,0,0,
0,29,112,126,32,0,0,0,108,0,11,112,0,0,0,78,48,62,80,0,0,0,7,223,215,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
5,206,195,0,0,0,0,46,65,125,0,0,0,0,108,0,14,48,0,0,0,78,48,62,80,0,0,0,8,238,190,80,
0,0,0,0,0,14,64,0,0,0,0,0,79,16,0,0,0,19,3,216,0,0,0,0,29,253,112,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,153,0,0,0,0,0,0,153,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,153,0,0,0,0,0,0,153,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,144,0,0,0,0,0,
9,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,160,0,0,0,0,0,9,144,0,0,
0,0,0,13,32,0,0,0,0,0,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,64,0,0,0,0,41,213,0,0,0,0,24,231,0,0,0,
0,0,142,32,0,0,0,0,0,24,214,0,0,0,0,0,0,41,212,0,0,0,0,0,0,59,64,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,79,255,255,
64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,79,255,255,64,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75,64,0,0,0,0,0,4,
172,80,0,0,0,0,0,2,156,64,0,0,0,0,3,173,64,0,0,0,4,188,80,0,0,0,0,75,64,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,8,238,161,0,0,0,0,26,18,185,0,0,0,0,0,0,108,0,0,0,0,0,1,185,0,0,0,
0,0,159,177,0,0,0,0,0,151,0,0,0,0,0,0,151,0,0,0,0,0,0,0,0,0,0,0,0,0,169,0,
0,0,0,0,0,169,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,206,236,112,0,0,2,217,49,20,201,0,0,12,112,0,0,
47,32,0,76,4,222,152,12,64,0,151,30,82,198,12,64,0,180,91,0,195,14,32,0,195,108,22,242,123,0,0,181,
45,232,158,194,0,0,138,0,0,0,0,0,0,46,147,0,0,0,0,0,2,157,255,246,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,208,0,0,0,0,0,60,212,0,0,0,0,0,136,
138,0,0,0,0,0,211,78,16,0,0,0,4,224,14,80,0,0,0,9,144,9,176,0,0,0,14,255,255,241,0,0,
0,94,16,0,230,0,0,0,168,0,0,139,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,207,254,112,0,0,0,0,197,3,228,0,0,0,0,
197,0,198,0,0,0,0,197,4,226,0,0,0,0,207,255,177,0,0,0,0,197,2,171,0,0,0,0,197,0,78,0,
0,0,0,197,1,171,0,0,0,0,207,254,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,109,252,80,0,0,0,7,228,19,176,0,
0,0,30,96,0,0,0,0,0,79,16,0,0,0,0,0,95,0,0,0,0,0,0,79,16,0,0,0,0,0,31,80,
0,0,0,0,0,8,212,19,177,0,0,0,0,141,252,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,207,254,163,0,0,0,0,197,2,158,
32,0,0,0,197,0,11,160,0,0,0,197,0,6,224,0,0,0,197,0,4,240,0,0,0,197,0,6,208,0,0,0,
197,0,11,144,0,0,0,197,2,158,32,0,0,0,207,254,162,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,207,255,240,0,0,0,0,197,
0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,207,255,128,0,0,0,0,197,0,0,0,0,
0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,207,255,241,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,207,255,192,0,0,0,
0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,207,255,144,0,0,0,0,197,0,0,
0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75,238,179,
0,0,0,5,230,17,90,0,0,0,29,96,0,0,0,0,0,79,0,0,0,0,0,0,93,0,159,251,0,0,0,79,
0,0,108,0,0,0,30,96,0,108,0,0,0,7,230,17,140,0,0,0,0,92,239,197,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197,0,
9,128,0,0,0,197,0,9,128,0,0,0,197,0,9,128,0,0,0,197,0,9,128,0,0,0,207,255,255,128,0,0,
0,197,0,9,128,0,0,0,197,0,9,128,0,0,0,197,0,9,128,0,0,0,197,0,9,128,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,
0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,212,0,0,0,0,0,0,213,0,0,0,0,0,0,213,0,0,0,0,0,0,213,0,0,0,0,0,0,213,
0,0,0,0,0,0,213,0,0,0,0,0,0,213,0,0,0,0,0,1,227,0,0,0,0,0,238,144,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,197,0,185,0,0,0,0,197,8,193,0,0,0,0,197,94,32,0,0,0,0,200,227,0,0,0,0,0,
204,209,0,0,0,0,0,198,201,0,0,0,0,0,197,46,80,0,0,0,0,197,5,226,0,0,0,0,197,0,155,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,
0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,197,0,0,0,0,0,0,207,255,
176,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,191,64,0,3,235,0,0,204,160,0,10,204,0,0,198,242,0,30,108,0,0,197,183,0,
121,92,0,0,197,93,0,211,92,0,0,197,14,69,192,92,0,0,197,8,171,96,92,0,0,197,2,254,16,92,0,0,
196,0,185,0,92,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,190,32,3,208,0,0,0,205,144,4,208,0,0,0,199,243,4,208,0,0,0,196,
155,4,208,0,0,0,196,30,68,208,0,0,0,196,8,196,208,0,0,0,196,1,233,208,0,0,0,196,0,111,208,0,
0,0,196,0,12,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,108,254,161,0,0,0,7,228,2,188,0,0,0,30,80,0,31,80,0,
0,63,0,0,11,112,0,0,78,0,0,10,144,0,0,63,0,0,12,112,0,0,31,64,0,31,48,0,0,9,211,2,
203,0,0,0,0,125,253,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,191,253,96,0,0,0,0,197,4,244,0,0,0,0,197,0,184,0,
0,0,0,197,0,183,0,0,0,0,197,5,243,0,0,0,0,207,252,80,0,0,0,0,197,0,0,0,0,0,0,197,
0,0,0,0,0,0,197,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,254,145,0,0,0,7,228,2,188,0,0,0,30,80,
0,31,64,0,0,63,0,0,11,112,0,0,78,0,0,10,144,0,0,63,0,0,12,112,0,0,31,64,0,31,64,0,
0,9,211,2,203,0,0,0,0,141,253,174,113,0,0,0,0,0,3,169,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,207,254,128,0,0,0,0,197,3,229,0,0,0,0,
197,0,184,0,0,0,0,197,4,228,0,0,0,0,207,255,80,0,0,0,0,197,26,176,0,0,0,0,197,1,243,0,
0,0,0,197,0,169,0,0,0,0,197,0,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,222,161,0,0,0,0,47,65,118,0,0,
0,0,79,16,0,0,0,0,0,29,179,0,0,0,0,0,2,175,161,0,0,0,0,0,2,202,0,0,0,0,0,0,
93,0,0,0,0,119,17,185,0,0,0,0,42,238,145,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,223,255,255,160,0,0,0,0,63,0,
0,0,0,0,0,63,0,0,0,0,0,0,63,0,0,0,0,0,0,63,0,0,0,0,0,0,63,0,0,0,0,0,
0,63,0,0,0,0,0,0,63,0,0,0,0,0,0,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197,0,5,192,0,0,0,213,
0,5,192,0,0,0,213,0,5,192,0,0,0,213,0,5,192,0,0,0,213,0,5,192,0,0,0,213,0,5,192,0,
0,0,183,0,8,160,0,0,0,110,65,78,80,0,0,0,7,222,198,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,0,0,153,0,0,
0,94,0,0,228,0,0,0,30,64,4,224,0,0,0,10,144,9,144,0,0,0,4,224,13,48,0,0,0,0,228,77,
0,0,0,0,0,153,136,0,0,0,0,0,78,211,0,0,0,0,0,13,192,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,0,7,208,
0,62,0,78,0,12,243,0,122,0,14,64,30,183,0,182,0,10,128,75,107,0,242,0,6,192,135,47,20,208,0,2,
241,196,13,72,128,0,0,198,224,9,140,64,0,0,141,176,5,222,0,0,0,79,112,1,234,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,109,16,
9,160,0,0,0,12,128,62,32,0,0,0,4,226,184,0,0,0,0,0,172,225,0,0,0,0,0,79,144,0,0,0,
0,0,186,226,0,0,0,0,5,208,170,0,0,0,0,29,80,47,48,0,0,0,124,0,9,176,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
153,0,12,112,0,0,0,63,32,78,16,0,0,0,10,144,183,0,0,0,0,3,228,225,0,0,0,0,0,174,112,0,
0,0,0,0,79,16,0,0,0,0,0,63,0,0,0,0,0,0,63,0,0,0,0,0,0,63,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,127,255,255,16,0,0,0,0,0,139,0,0,0,0,0,3,227,0,0,0,0,0,12,128,0,0,0,0,0,109,
0,0,0,0,0,2,228,0,0,0,0,0,10,160,0,0,0,0,0,78,16,0,0,0,0,0,143,255,255,48,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,160,0,
0,0,0,0,166,0,0,0,0,0,0,166,0,0,0,0,0,0,166,0,0,0,0,0,0,166,0,0,0,0,0,0,
166,0,0,0,0,0,0,166,0,0,0,0,0,0,166,0,0,0,0,0,0,166,0,0,0,0,0,0,166,0,0,0,
0,0,0,166,0,0,0,0,0,0,175,160,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197,
0,0,0,0,0,0,122,0,0,0,0,0,0,46,16,0,0,0,0,0,11,96,0,0,0,0,0,6,192,0,0,0,
0,0,1,226,0,0,0,0,0,0,167,0,0,0,0,0,0,77,0,0,0,0,0,0,14,48,0,0,0,0,0,9,
144,0,0,0,0,0,3,224,0,0,0,0,0,0,212,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,95,224,0,0,0,0,0,1,240,0,0,0,0,0,1,240,0,0,0,0,0,1,240,0,0,0,0,0,1,240,0,
0,0,0,0,1,240,0,0,0,0,0,1,240,0,0,0,0,0,1,240,0,0,0,0,0,1,240,0,0,0,0,0,
1,240,0,0,0,0,0,1,240,0,0,0,0,0,95,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,111,64,0,0,0,0,0,201,176,0,0,0,0,4,193,227,0,0,0,0,11,
96,138,0,0,0,0,46,16,46,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,255,255,254,0,0,0,
0,0,0,0,0,0,0,12,64,0,0,0,0,0,2,193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,206,
177,0,0,0,0,11,49,184,0,0,0,0,0,0,122,0,0,0,0,6,223,250,0,0,0,0,62,48,122,0,0,0,
0,78,34,202,0,0,0,0,10,237,154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,226,0,0,0,0,0,0,227,0,0,0,0,0,0,227,0,0,0,0,0,0,
231,222,128,0,0,0,0,236,35,229,0,0,0,0,227,0,153,0,0,0,0,227,0,138,0,0,0,0,227,0,153,0,
0,0,0,236,35,228,0,0,0,0,230,238,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,3,206,177,0,0,0,0,30,113,102,0,0,0,0,78,0,0,0,0,0,0,108,0,0,0,0,0,0,78,0,
0,0,0,0,0,30,97,102,0,0,0,0,4,223,178,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,64,0,0,0,0,0,12,80,0,0,0,0,0,12,
80,0,0,0,3,206,141,80,0,0,0,13,113,143,80,0,0,0,62,0,12,80,0,0,0,93,0,12,80,0,0,0,
78,0,13,80,0,0,0,14,97,143,80,0,0,0,4,222,138,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,2,190,195,0,0,0,0,13,113,109,0,0,0,0,62,0,13,48,0,0,0,95,255,255,48,0,
0,0,77,0,0,0,0,0,0,29,113,0,0,0,0,0,3,206,255,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,206,80,0,0,0,0,8,161,16,0,0,0,
0,10,112,0,0,0,0,0,191,255,16,0,0,0,0,10,112,0,0,0,0,0,10,112,0,0,0,0,0,10,112,0,
0,0,0,0,10,112,0,0,0,0,0,10,112,0,0,0,0,0,10,112,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,5,223,255,32,0,0,0,30,50,212,0,0,0,0,61,0,151,0,0,0,0,30,
50,212,0,0,0,0,45,222,128,0,0,0,0,91,0,0,0,0,0,0,30,254,214,0,0,0,0,123,1,95,16,0,
0,0,154,17,110,0,0,0,0,43,238,195,0,0,0,0,0,0,0,0,0,0,0,226,0,0,0,0,0,0,227,0,
0,0,0,0,0,227,0,0,0,0,0,0,231,222,112,0,0,0,0,236,36,242,0,0,0,0,227,0,213,0,0,0,
0,227,0,197,0,0,0,0,227,0,197,0,0,0,0,227,0,197,0,0,0,0,226,0,181,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,
14,48,0,0,0,0,0,0,0,0,0,0,0,0,14,32,0,0,0,0,0,14,48,0,0,0,0,0,14,48,0,0,
0,0,0,14,48,0,0,0,0,0,14,48,0,0,0,0,0,14,48,0,0,0,0,0,14,32,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33,0,0,0,
0,0,0,213,0,0,0,0,0,0,0,0,0,0,0,0,0,196,0,0,0,0,0,0,196,0,0,0,0,0,0,196,
0,0,0,0,0,0,196,0,0,0,0,0,0,196,0,0,0,0,0,0,196,0,0,0,0,0,0,196,0,0,0,0,
0,0,212,0,0,0,0,0,1,226,0,0,0,0,0,78,144,0,0,0,0,0,0,0,0,0,0,0,0,226,0,0,
0,0,0,0,227,0,0,0,0,0,0,227,0,0,0,0,0,0,227,10,160,0,0,0,0,227,156,16,0,0,0,0,
233,193,0,0,0,0,0,235,192,0,0,0,0,0,227,200,0,0,0,0,0,227,62,64,0,0,0,0,226,6,208,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,226,
0,0,0,0,0,0,227,0,0,0,0,0,0,227,0,0,0,0,0,0,227,0,0,0,0,0,0,227,0,0,0,0,
0,0,227,0,0,0,0,0,0,227,0,0,0,0,0,0,227,0,0,0,0,0,0,227,0,0,0,0,0,0,226,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,229,222,101,222,80,0,0,236,38,252,
38,224,0,0,227,0,243,0,242,0,0,227,0,227,0,243,0,0,227,0,227,0,243,0,0,227,0,227,0,243,0,0,
226,0,226,0,226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,229,222,112,0,0,0,0,236,
36,242,0,0,0,0,227,0,213,0,0,0,0,227,0,197,0,0,0,0,227,0,197,0,0,0,0,227,0,197,0,0,
0,0,226,0,181,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,191,215,0,0,0,
0,13,129,78,80,0,0,0,78,0,8,160,0,0,0,92,0,7,176,0,0,0,78,0,9,144,0,0,0,30,113,78,
48,0,0,0,3,206,213,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,228,222,128,0,
0,0,0,236,35,229,0,0,0,0,227,0,153,0,0,0,0,227,0,138,0,0,0,0,227,0,153,0,0,0,0,236,
35,228,0,0,0,0,232,238,112,0,0,0,0,227,0,0,0,0,0,0,227,0,0,0,0,0,0,226,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,206,
154,64,0,0,0,13,113,143,80,0,0,0,62,0,12,80,0,0,0,93,0,12,80,0,0,0,78,0,13,80,0,0,
0,14,97,143,80,0,0,0,4,222,140,80,0,0,0,0,0,12,80,0,0,0,0,0,12,80,0,0,0,0,0,12,
64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
230,233,0,0,0,0,0,236,17,0,0,0,0,0,228,0,0,0,0,0,0,227,0,0,0,0,0,0,227,0,0,0,
0,0,0,227,0,0,0,0,0,0,226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,8,239,128,0,0,0,0,61,16,0,0,0,0,0,46,64,0,0,0,0,0,5,220,48,0,0,0,0,0,8,
192,0,0,0,0,0,7,192,0,0,0,0,111,252,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,96,0,0,0,0,0,10,112,0,
0,0,0,0,191,255,48,0,0,0,0,10,112,0,0,0,0,0,10,112,0,0,0,0,0,10,112,0,0,0,0,0,
10,112,0,0,0,0,0,9,145,16,0,0,0,0,3,222,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,226,0,196,0,0,0,0,242,0,197,0,0,0,0,242,0,197,0,0,0,0,242,0,197,0,0,
0,0,227,0,197,0,0,0,0,200,24,245,0,0,0,0,61,232,180,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,168,0,46,0,0,0,0,109,0,123,0,0,0,0,31,32,197,0,0,0,0,11,113,225,
0,0,0,0,5,198,160,0,0,0,0,1,253,80,0,0,0,0,0,174,16,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,137,0,153,0,136,0,0,77,0,221,0,197,0,0,31,34,206,33,225,0,0,11,
101,154,101,176,0,0,6,169,85,169,96,0,0,2,236,17,236,32,0,0,0,204,0,204,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,108,0,167,0,0,0,0,13,100,209,0,0,0,0,4,237,80,0,0,0,
0,0,222,0,0,0,0,0,6,204,112,0,0,0,0,30,68,225,0,0,0,0,138,0,169,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,0,46,0,0,0,0,93,0,123,0,0,0,0,30,48,198,0,
0,0,0,10,130,241,0,0,0,0,5,214,160,0,0,0,0,0,237,80,0,0,0,0,0,158,16,0,0,0,0,0,
122,0,0,0,0,0,0,198,0,0,0,0,0,2,226,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,79,255,176,0,0,0,0,0,11,112,0,0,0,0,0,93,
0,0,0,0,0,0,213,0,0,0,0,0,7,176,0,0,0,0,0,46,32,0,0,0,0,0,95,255,224,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,190,0,
0,0,0,0,2,225,0,0,0,0,0,3,208,0,0,0,0,0,3,192,0,0,0,0,0,7,160,0,0,0,0,0,
110,32,0,0,0,0,0,8,144,0,0,0,0,0,3,192,0,0,0,0,0,3,208,0,0,0,0,0,3,208,0,0,
0,0,0,2,224,0,0,0,0,0,0,174,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75,
0,0,0,0,0,0,91,0,0,0,0,0,0,91,0,0,0,0,0,0,91,0,0,0,0,0,0,91,0,0,0,0,
0,0,91,0,0,0,0,0,0,91,0,0,0,0,0,0,91,0,0,0,0,0,0,91,0,0,0,0,0,0,91,0,
0,0,0,0,0,91,0,0,0,0,0,0,91,0,0,0,0,0,0,75,0,0,0,0,0,0,0,0,0,0,0,0,
0,47,128,0,0,0,0,0,3,224,0,0,0,0,0,1,240,0,0,0,0,0,1,240,0,0,0,0,0,0,227,0,
0,0,0,0,0,95,32,0,0,0,0,0,198,0,0,0,0,0,0,240,0,0,0,0,0,1,240,0,0,0,0,0,
1,240,0,0,0,0,0,3,224,0,0,0,0,0,46,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,229,5,128,0,0,0,105,61,41,96,0,0,0,133,
5,235,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
/*Bitmap Raw Data end ---*/
}

View File

@ -0,0 +1,98 @@
95 characters are converted
Character Index No.
32
! 33
" 34
# 35
$ 36
% 37
& 38
' 39
( 40
) 41
* 42
+ 43
, 44
- 45
. 46
/ 47
0 48
1 49
2 50
3 51
4 52
5 53
6 54
7 55
8 56
9 57
: 58
; 59
< 60
= 61
> 62
? 63
@ 64
A 65
B 66
C 67
D 68
E 69
F 70
G 71
H 72
I 73
J 74
K 75
L 76
M 77
N 78
O 79
P 80
Q 81
R 82
S 83
T 84
U 85
V 86
W 87
X 88
Y 89
Z 90
[ 91
\ 92
] 93
^ 94
_ 95
` 96
a 97
b 98
c 99
d 100
e 101
f 102
g 103
h 104
i 105
j 106
k 107
l 108
m 109
n 110
o 111
p 112
q 113
r 114
s 115
t 116
u 117
v 118
w 119
x 120
y 121
z 122
{ 123
| 124
} 125
~ 126

View File

@ -0,0 +1,28 @@
/*
This file is automatically generated
calibri_14_L8
C Source
*/
#include "App_Common.h"
#define FONT_HANDLE (1)
#define FONT_FILE_ADDRESS (RAM_G + 153600)
#define FIRST_CHARACTER (32)
void Load_Font()
{
Gpu_CoCmd_Dlstart(phost);
App_WrCoCmd_Buffer(phost, CLEAR(1, 1, 1));
App_WrCoCmd_Buffer(phost, COLOR_RGB(255, 255, 255));
Gpu_Hal_LoadImageToMemory(phost, "path\\to\\calibri_14_L8.raw", FONT_FILE_ADDRESS, LOAD);
Gpu_CoCmd_SetFont2(phost, FONT_HANDLE, FONT_FILE_ADDRESS, FIRST_CHARACTER);
Gpu_CoCmd_Text(phost, 0, 0, FONT_HANDLE, 0, "AaBbCcDdEeFf");
App_WrCoCmd_Buffer(phost, DISPLAY());
Gpu_CoCmd_Swap(phost);
App_Flush_Co_Buffer(phost);
Gpu_Hal_WaitCmdfifo_empty(phost);
}
/* end of file */

View File

@ -0,0 +1 @@
{"name": "calibri_14_L8", "type": "legacyfont", "format": "L8", "size": 14, "base_line": 11, "caps_height": 9, "mid_line": 7}

Binary file not shown.

View File

@ -0,0 +1,608 @@
/*Command Line: fnt_cvt.exe -f legacy -C BT81X -i Q:/fonts/calibri.ttf -s 14 -d 153600 -c setfont2 -l 32 -a -o D:/Projects/Embedded/AirsoftTracker/fonts*/
/*95 characters have been converted */
/* 148 Metric Block Begin +++ */
/*('file properties ', 'format ', 'L8', ' stride ', 14, ' width ', 14, 'height', 14)*/
{
/* Widths */
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,5,6,7,7,10,10,3,4,4,7,7,4,4,4,6,7,7,7,7,7,7,7,7,7,7,4,4,7,7,7,6,13,8,8,8,9,7,6,9,9,4,4,7,6,12,9,9,7,10,8,6,7,9,8,13,7,7,7,4,6,4,7,8,4,7,7,6,7,7,5,7,7,3,4,7,3,11,7,7,7,7,5,5,5,7,7,10,6,7,6,4,6,5,7,0,
/* Format */
3,0,0,0,
/* Stride */
14,0,0,0,
/* Max Width */
14,0,0,0,
/* Max Height */
14,0,0,0,
/* Raw Data Address in Decimal: <153748> */
148,88,2,0,
/* 148 Metric Block End --- */
/*Bitmap Raw Data begin +++*/
/*The expected raw bitmap size is 18620 Bytes */
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,248,32,0,0,0,0,0,0,0,0,0,0,0,
15,255,34,0,0,0,0,0,0,0,0,0,0,0,11,255,30,0,0,0,0,0,0,0,0,0,0,0,7,255,26,0,
0,0,0,0,0,0,0,0,0,0,2,255,21,0,0,0,0,0,0,0,0,0,0,0,0,254,17,0,0,0,0,0,
0,0,0,0,0,0,0,242,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,29,243,42,0,0,0,0,0,0,0,0,0,0,0,29,243,42,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,247,23,150,130,0,0,0,0,0,
0,0,0,0,0,253,17,146,125,0,0,0,0,0,0,0,0,0,0,243,5,135,113,0,0,0,0,0,0,0,0,0,
0,216,0,118,98,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,3,242,6,23,228,0,0,0,0,0,0,0,0,0,36,223,0,61,198,0,0,0,0,
0,0,0,0,85,255,255,255,255,255,170,0,0,0,0,0,0,0,0,103,157,0,124,133,0,0,0,0,0,0,0,0,
0,138,121,0,161,97,0,0,0,0,0,0,0,0,179,255,255,255,255,255,73,0,0,0,0,0,0,0,0,202,61,0,
222,38,0,0,0,0,0,0,0,0,0,228,34,0,247,12,0,0,0,0,0,0,0,0,0,243,8,14,236,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,104,0,0,0,0,0,0,0,0,0,0,0,
0,146,87,0,0,0,0,0,0,0,0,0,0,62,204,251,234,114,0,0,0,0,0,0,0,0,5,237,100,10,57,171,
0,0,0,0,0,0,0,0,23,255,31,0,0,0,0,0,0,0,0,0,0,0,0,203,203,68,1,0,0,0,0,0,
0,0,0,0,0,16,143,239,221,80,0,0,0,0,0,0,0,0,0,0,0,8,124,251,38,0,0,0,0,0,0,0,
0,0,0,0,0,232,82,0,0,0,0,0,0,0,79,149,31,10,94,243,28,0,0,0,0,0,0,0,25,179,246,247,
198,65,0,0,0,0,0,0,0,0,0,0,144,92,0,0,0,0,0,0,0,0,0,0,0,0,161,66,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,176,240,148,0,0,0,162,91,0,0,0,0,0,88,172,
17,219,40,0,96,172,0,0,0,0,0,0,121,120,0,173,68,37,213,16,0,0,0,0,0,0,97,171,14,215,41,201,
59,0,0,0,0,0,0,0,13,191,241,138,141,126,135,240,185,12,0,0,0,0,0,0,0,71,192,36,218,18,172,96,
0,0,0,0,0,0,23,214,28,65,176,0,117,124,0,0,0,0,0,1,183,80,0,41,219,15,167,90,0,0,0,0,
0,106,147,0,0,0,154,242,179,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,129,228,243,179,14,0,0,0,0,0,0,0,0,69,237,40,24,214,115,0,0,0,0,0,
0,0,0,103,207,0,0,196,114,0,0,0,0,0,0,0,0,32,249,68,146,211,14,0,0,0,0,0,0,0,0,0,
165,254,164,14,0,0,0,0,0,0,0,0,0,119,221,194,189,5,0,233,38,0,0,0,0,0,26,252,43,17,212,168,
31,249,9,0,0,0,0,0,59,253,5,0,26,217,233,156,0,0,0,0,0,0,16,243,134,13,31,172,249,192,24,0,
0,0,0,0,0,66,206,249,230,143,22,150,231,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,6,249,28,0,0,0,0,0,0,0,0,0,0,0,0,253,21,0,0,0,0,0,
0,0,0,0,0,0,0,243,9,0,0,0,0,0,0,0,0,0,0,0,0,219,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,182,70,0,0,0,0,0,0,0,0,0,0,0,33,232,4,
0,0,0,0,0,0,0,0,0,0,0,117,161,0,0,0,0,0,0,0,0,0,0,0,0,187,99,0,0,0,0,0,
0,0,0,0,0,0,0,235,59,0,0,0,0,0,0,0,0,0,0,0,7,255,36,0,0,0,0,0,0,0,0,0,
0,0,20,255,27,0,0,0,0,0,0,0,0,0,0,0,10,255,37,0,0,0,0,0,0,0,0,0,0,0,0,240,
62,0,0,0,0,0,0,0,0,0,0,0,0,195,104,0,0,0,0,0,0,0,0,0,0,0,0,126,166,0,0,0,
0,0,0,0,0,0,0,0,0,40,236,5,0,0,0,0,0,0,0,0,0,0,0,0,186,73,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,229,9,0,0,0,0,0,0,0,0,0,0,0,
0,178,95,0,0,0,0,0,0,0,0,0,0,0,0,103,178,0,0,0,0,0,0,0,0,0,0,0,0,43,244,2,
0,0,0,0,0,0,0,0,0,0,0,5,251,40,0,0,0,0,0,0,0,0,0,0,0,0,233,68,0,0,0,0,
0,0,0,0,0,0,0,0,223,80,0,0,0,0,0,0,0,0,0,0,0,0,234,69,0,0,0,0,0,0,0,0,
0,0,0,6,252,43,0,0,0,0,0,0,0,0,0,0,0,44,247,4,0,0,0,0,0,0,0,0,0,0,0,105,
183,0,0,0,0,0,0,0,0,0,0,0,0,179,99,0,0,0,0,0,0,0,0,0,0,0,15,230,10,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,3,227,0,5,0,0,0,0,0,
0,0,0,0,185,128,199,142,166,0,0,0,0,0,0,0,0,0,11,179,255,167,7,0,0,0,0,0,0,0,0,0,
185,129,199,143,166,0,0,0,0,0,0,0,0,0,5,3,229,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,3,243,0,0,0,0,0,0,0,0,0,0,0,0,4,255,0,0,0,0,0,0,0,0,0,0,
0,0,4,255,0,0,0,0,0,0,0,0,0,0,120,255,255,255,255,255,112,0,0,0,0,0,0,0,0,0,4,255,
0,0,0,0,0,0,0,0,0,0,0,0,4,255,0,0,0,0,0,0,0,0,0,0,0,0,3,245,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,184,120,0,0,0,0,0,0,0,0,0,0,0,0,207,106,0,
0,0,0,0,0,0,0,0,0,0,40,226,11,0,0,0,0,0,0,0,0,0,0,0,143,87,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,121,255,255,195,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,212,97,0,0,0,0,0,0,0,0,
0,0,0,0,216,100,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,2,221,48,0,0,0,0,0,0,0,0,0,0,0,66,221,0,0,0,
0,0,0,0,0,0,0,0,0,159,128,0,0,0,0,0,0,0,0,0,0,0,10,241,36,0,0,0,0,0,0,0,
0,0,0,0,90,198,0,0,0,0,0,0,0,0,0,0,0,0,183,105,0,0,0,0,0,0,0,0,0,0,0,23,
246,19,0,0,0,0,0,0,0,0,0,0,0,114,175,0,0,0,0,0,0,0,0,0,0,0,0,207,82,0,0,0,
0,0,0,0,0,0,0,0,44,238,7,0,0,0,0,0,0,0,0,0,0,0,138,152,0,0,0,0,0,0,0,0,
0,0,0,0,218,57,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,201,248,
223,89,0,0,0,0,0,0,0,0,2,225,122,9,88,250,33,0,0,0,0,0,0,0,66,233,1,0,0,207,106,0,
0,0,0,0,0,0,106,191,0,0,0,165,134,0,0,0,0,0,0,0,122,181,0,0,0,154,150,0,0,0,0,0,
0,0,110,190,0,0,0,163,133,0,0,0,0,0,0,0,80,233,1,0,0,205,95,0,0,0,0,0,0,0,10,242,
114,12,95,241,13,0,0,0,0,0,0,0,0,72,217,249,210,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,83,230,119,0,0,0,0,0,0,0,0,0,0,152,185,203,124,0,0,0,0,0,0,0,0,0,0,44,0,176,124,
0,0,0,0,0,0,0,0,0,0,0,0,176,124,0,0,0,0,0,0,0,0,0,0,0,0,176,124,0,0,0,0,
0,0,0,0,0,0,0,0,176,124,0,0,0,0,0,0,0,0,0,0,0,0,176,124,0,0,0,0,0,0,0,0,
0,0,0,0,176,124,0,0,0,0,0,0,0,0,0,0,187,255,255,255,255,73,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,110,219,244,191,38,0,0,0,0,0,0,0,0,10,187,41,23,199,186,0,0,0,0,0,0,0,0,
0,0,0,0,112,223,0,0,0,0,0,0,0,0,0,0,0,0,152,181,0,0,0,0,0,0,0,0,0,0,0,31,
245,64,0,0,0,0,0,0,0,0,0,0,9,202,141,0,0,0,0,0,0,0,0,0,0,7,182,169,2,0,0,0,
0,0,0,0,0,0,3,179,173,4,0,0,0,0,0,0,0,0,0,0,47,255,255,255,255,255,67,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,109,221,246,195,38,0,0,0,0,0,0,0,0,8,187,42,20,192,177,0,0,0,0,
0,0,0,0,0,0,0,0,122,203,0,0,0,0,0,0,0,0,0,0,2,45,219,110,0,0,0,0,0,0,0,0,
0,91,255,255,196,30,0,0,0,0,0,0,0,0,0,0,1,28,159,229,12,0,0,0,0,0,0,0,0,0,0,0,
31,255,50,0,0,0,0,0,0,0,68,149,31,15,138,235,10,0,0,0,0,0,0,0,16,165,238,243,195,55,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,117,252,102,0,0,0,0,0,0,0,0,0,0,26,227,201,112,
0,0,0,0,0,0,0,0,0,0,164,111,180,112,0,0,0,0,0,0,0,0,0,57,213,4,180,112,0,0,0,0,
0,0,0,0,1,203,71,0,180,112,0,0,0,0,0,0,0,0,96,178,0,0,180,112,0,0,0,0,0,0,0,0,
164,255,255,255,255,255,158,0,0,0,0,0,0,0,0,0,0,0,180,112,0,0,0,0,0,0,0,0,0,0,0,0,
175,107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,208,255,255,255,171,0,0,0,0,0,0,0,0,0,220,
44,0,0,0,0,0,0,0,0,0,0,0,0,220,44,0,0,0,0,0,0,0,0,0,0,0,0,216,251,244,195,55,
0,0,0,0,0,0,0,0,0,11,5,25,153,234,11,0,0,0,0,0,0,0,0,0,0,0,11,254,57,0,0,0,
0,0,0,0,0,0,0,0,18,255,38,0,0,0,0,0,0,0,72,134,21,24,164,201,1,0,0,0,0,0,0,0,
25,179,243,234,166,26,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,116,220,249,210,13,0,0,0,0,0,
0,0,0,118,193,43,7,50,4,0,0,0,0,0,0,0,3,235,30,0,0,0,0,0,0,0,0,0,0,0,41,248,
178,244,230,136,1,0,0,0,0,0,0,0,63,248,81,9,52,240,76,0,0,0,0,0,0,0,62,245,0,0,0,175,
128,0,0,0,0,0,0,0,33,255,29,0,0,190,110,0,0,0,0,0,0,0,0,215,152,14,80,245,29,0,0,0,
0,0,0,0,0,49,205,249,216,68,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,255,255,255,255,255,104,0,
0,0,0,0,0,0,0,0,0,0,18,245,48,0,0,0,0,0,0,0,0,0,0,0,121,195,0,0,0,0,0,0,
0,0,0,0,0,5,228,86,0,0,0,0,0,0,0,0,0,0,0,90,228,4,0,0,0,0,0,0,0,0,0,0,
0,202,124,0,0,0,0,0,0,0,0,0,0,0,59,249,22,0,0,0,0,0,0,0,0,0,0,0,172,162,0,0,
0,0,0,0,0,0,0,0,0,23,248,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,70,207,246,
223,98,0,0,0,0,0,0,0,0,5,241,94,8,78,253,24,0,0,0,0,0,0,0,17,255,31,0,14,252,29,0,
0,0,0,0,0,0,0,153,207,73,187,135,0,0,0,0,0,0,0,0,0,14,205,246,216,36,0,0,0,0,0,0,
0,0,14,214,114,7,116,239,36,0,0,0,0,0,0,0,96,207,0,0,0,190,117,0,0,0,0,0,0,0,72,243,
59,6,49,234,77,0,0,0,0,0,0,0,0,122,225,248,221,118,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,84,210,245,207,55,0,0,0,0,0,0,0,0,41,246,72,12,116,228,4,0,0,0,0,0,0,0,100,201,0,0,
2,238,57,0,0,0,0,0,0,0,73,242,51,8,50,231,90,0,0,0,0,0,0,0,1,140,232,243,193,235,93,0,
0,0,0,0,0,0,0,0,0,0,0,237,67,0,0,0,0,0,0,0,0,0,0,0,63,247,14,0,0,0,0,0,
0,0,13,47,5,47,223,139,0,0,0,0,0,0,0,0,24,216,250,221,126,3,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
157,156,0,0,0,0,0,0,0,0,0,0,0,0,158,157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,156,155,0,0,0,0,0,0,0,0,0,0,0,0,158,157,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,157,156,0,0,0,0,0,0,0,0,0,0,0,
0,158,157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,132,166,0,0,0,0,0,0,0,0,0,0,0,0,155,150,0,0,0,0,0,
0,0,0,0,0,0,7,229,38,0,0,0,0,0,0,0,0,0,0,0,91,135,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,46,183,
61,0,0,0,0,0,0,0,0,0,30,161,217,80,0,0,0,0,0,0,0,0,16,139,233,117,6,0,0,0,0,0,
0,0,0,0,128,237,39,0,0,0,0,0,0,0,0,0,0,0,16,138,228,109,4,0,0,0,0,0,0,0,0,0,
0,0,30,161,213,74,0,0,0,0,0,0,0,0,0,0,0,0,47,184,62,0,0,0,0,0,0,0,0,0,0,0,
0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75,255,255,255,255,255,
65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,75,255,255,255,255,255,65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,71,192,72,0,0,0,0,0,0,0,0,0,0,0,0,63,
178,205,88,3,0,0,0,0,0,0,0,0,0,0,0,39,153,212,64,0,0,0,0,0,0,0,0,0,0,48,166,219,
66,0,0,0,0,0,0,0,0,68,186,208,91,3,0,0,0,0,0,0,0,0,72,193,73,0,0,0,0,0,0,0,
0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,2,140,233,236,166,18,0,0,0,0,0,0,0,0,18,175,25,27,191,152,0,0,
0,0,0,0,0,0,0,0,0,0,99,204,0,0,0,0,0,0,0,0,0,0,0,20,184,161,0,0,0,0,0,0,
0,0,0,0,146,249,183,24,0,0,0,0,0,0,0,0,0,0,155,124,0,0,0,0,0,0,0,0,0,0,0,0,
146,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,166,149,0,0,
0,0,0,0,0,0,0,0,0,0,166,149,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,124,
208,241,246,208,113,3,0,0,0,0,0,30,217,158,53,13,12,67,207,159,0,0,0,0,0,198,114,0,0,0,0,0,
31,247,31,0,0,0,68,207,0,71,220,238,146,136,0,204,76,0,0,0,147,118,13,237,79,26,212,104,0,200,71,0,
0,0,195,69,79,193,0,0,209,49,3,240,28,0,0,0,211,56,98,200,14,99,252,29,115,190,0,0,0,0,185,82,
30,222,242,137,147,246,196,32,0,0,0,0,138,175,0,0,0,0,0,0,0,0,0,0,0,0,26,233,152,43,7,0,
0,0,0,0,0,0,0,0,0,31,157,226,250,255,255,107,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,208,227,4,0,0,0,0,0,0,0,0,0,0,50,212,217,73,0,0,0,0,0,0,0,0,0,0,141,135,
139,164,0,0,0,0,0,0,0,0,0,2,228,57,60,243,10,0,0,0,0,0,0,0,0,66,233,2,2,235,89,0,
0,0,0,0,0,0,0,157,158,0,0,159,180,0,0,0,0,0,0,0,7,240,255,255,255,255,251,20,0,0,0,0,
0,0,82,238,9,0,0,7,235,105,0,0,0,0,0,0,165,139,0,0,0,0,132,189,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,197,255,254,235,127,0,0,0,0,0,0,0,0,0,212,88,3,58,246,69,0,0,0,0,0,0,0,0,
212,88,0,0,206,106,0,0,0,0,0,0,0,0,212,88,2,61,240,37,0,0,0,0,0,0,0,0,212,255,255,255,
191,24,0,0,0,0,0,0,0,0,212,88,1,28,177,190,0,0,0,0,0,0,0,0,212,88,0,0,72,245,0,0,
0,0,0,0,0,0,212,88,0,18,165,194,0,0,0,0,0,0,0,0,197,255,255,244,179,31,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,102,215,248,212,92,0,0,0,0,0,0,0,0,114,237,76,12,54,193,5,0,0,
0,0,0,0,9,240,98,0,0,0,0,0,0,0,0,0,0,0,61,255,17,0,0,0,0,0,0,0,0,0,0,0,
83,247,0,0,0,0,0,0,0,0,0,0,0,0,70,255,11,0,0,0,0,0,0,0,0,0,0,0,18,247,83,0,
0,0,0,0,0,0,0,0,0,0,0,135,228,68,11,50,187,12,0,0,0,0,0,0,0,4,130,226,249,210,96,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,197,255,254,236,172,43,0,0,0,0,0,0,0,0,212,92,2,30,156,243,
41,0,0,0,0,0,0,0,212,92,0,0,0,187,168,0,0,0,0,0,0,0,212,92,0,0,0,98,231,0,0,0,
0,0,0,0,212,92,0,0,0,76,247,0,0,0,0,0,0,0,212,92,0,0,0,103,225,0,0,0,0,0,0,0,
212,92,0,0,0,184,160,0,0,0,0,0,0,0,212,92,1,27,145,241,37,0,0,0,0,0,0,0,197,255,253,234,
170,41,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197,255,255,255,251,5,0,0,0,0,0,0,0,0,212,92,
0,0,0,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0,
0,0,0,0,0,0,0,0,212,255,255,255,130,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0,0,0,0,0,
0,0,0,0,212,92,0,0,0,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0,0,0,0,0,0,0,0,0,
197,255,255,255,253,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,197,255,255,255,200,0,0,0,0,0,0,0,
0,0,212,92,0,0,0,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0,0,0,0,0,0,0,0,0,212,92,
0,0,0,0,0,0,0,0,0,0,0,0,212,255,255,255,152,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0,
0,0,0,0,0,0,0,0,212,92,0,0,0,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0,0,0,0,0,
0,0,0,0,206,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,190,244,241,185,57,
0,0,0,0,0,0,0,80,244,107,14,20,93,173,0,0,0,0,0,0,9,228,105,0,0,0,0,0,0,0,0,0,
0,0,66,252,8,0,0,0,0,0,0,0,0,0,0,0,91,229,0,0,156,255,255,192,0,0,0,0,0,0,74,252,
7,0,0,0,96,204,0,0,0,0,0,0,16,245,100,0,0,0,96,204,0,0,0,0,0,0,0,115,243,103,22,14,
140,203,0,0,0,0,0,0,0,0,88,201,246,247,199,84,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,205,85,0,0,
0,153,133,0,0,0,0,0,0,0,212,92,0,0,0,160,140,0,0,0,0,0,0,0,212,92,0,0,0,160,140,0,
0,0,0,0,0,0,212,92,0,0,0,160,140,0,0,0,0,0,0,0,212,255,255,255,255,255,140,0,0,0,0,0,
0,0,212,92,0,0,0,160,140,0,0,0,0,0,0,0,212,92,0,0,0,160,140,0,0,0,0,0,0,0,212,92,
0,0,0,160,140,0,0,0,0,0,0,0,206,86,0,0,0,154,134,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
205,86,0,0,0,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0,0,0,0,0,0,0,0,0,212,92,0,0,
0,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0,0,0,
0,0,0,0,0,0,212,92,0,0,0,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0,0,0,0,0,0,0,
0,0,212,92,0,0,0,0,0,0,0,0,0,0,0,0,206,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,213,74,0,0,0,0,0,0,0,0,0,0,0,0,220,80,0,0,0,0,0,0,0,0,0,0,
0,0,220,80,0,0,0,0,0,0,0,0,0,0,0,0,220,80,0,0,0,0,0,0,0,0,0,0,0,0,220,80,
0,0,0,0,0,0,0,0,0,0,0,0,220,80,0,0,0,0,0,0,0,0,0,0,0,0,222,78,0,0,0,0,
0,0,0,0,0,0,0,21,246,51,0,0,0,0,0,0,0,0,0,0,235,246,161,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,205,86,0,2,180,148,0,0,0,0,0,0,0,0,212,92,0,135,206,10,0,0,0,0,
0,0,0,0,212,92,80,231,29,0,0,0,0,0,0,0,0,0,212,131,234,57,0,0,0,0,0,0,0,0,0,0,
212,210,217,9,0,0,0,0,0,0,0,0,0,0,212,96,197,154,0,0,0,0,0,0,0,0,0,0,212,92,31,239,
88,0,0,0,0,0,0,0,0,0,212,92,0,84,242,37,0,0,0,0,0,0,0,0,206,86,0,0,149,195,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,205,86,0,0,0,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0,
0,0,0,0,0,0,0,0,212,92,0,0,0,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0,0,0,0,0,
0,0,0,0,212,92,0,0,0,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0,0,0,0,0,0,0,0,0,
212,92,0,0,0,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0,0,0,0,0,0,0,0,0,197,255,255,255,
184,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,193,247,65,0,0,0,0,53,246,189,0,0,0,0,212,200,
177,0,0,0,0,168,196,204,0,0,0,0,212,105,248,26,0,0,23,239,104,204,0,0,0,0,212,80,179,123,0,0,
123,158,88,204,0,0,0,0,212,80,81,222,1,3,225,55,88,204,0,0,0,0,212,80,5,233,69,79,208,0,88,204,
0,0,0,0,212,80,0,140,170,184,105,0,88,204,0,0,0,0,212,80,0,41,250,242,14,0,88,204,0,0,0,0,
206,75,0,0,194,153,0,0,83,198,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,194,233,27,0,0,59,213,0,0,0,0,0,
0,0,212,226,159,0,0,64,220,0,0,0,0,0,0,0,212,111,249,46,0,64,220,0,0,0,0,0,0,0,212,75,
154,184,0,64,220,0,0,0,0,0,0,0,212,76,24,244,69,64,220,0,0,0,0,0,0,0,212,76,0,129,203,65,
220,0,0,0,0,0,0,0,212,76,0,12,232,145,220,0,0,0,0,0,0,0,212,76,0,0,104,248,220,0,0,0,
0,0,0,0,206,71,0,0,3,201,204,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,105,212,249,236,163,25,
0,0,0,0,0,0,0,112,234,68,7,33,189,212,5,0,0,0,0,0,9,237,84,0,0,0,18,247,77,0,0,0,
0,0,49,254,8,0,0,0,0,194,120,0,0,0,0,0,75,241,0,0,0,0,0,174,145,0,0,0,0,0,54,254,
4,0,0,0,0,196,126,0,0,0,0,0,17,252,71,0,0,0,22,249,55,0,0,0,0,0,0,156,223,55,5,38,
199,179,0,0,0,0,0,0,0,3,122,225,250,229,145,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,195,255,254,225,
109,0,0,0,0,0,0,0,0,0,212,92,4,73,247,73,0,0,0,0,0,0,0,0,212,92,0,0,183,142,0,0,
0,0,0,0,0,0,212,92,0,0,184,127,0,0,0,0,0,0,0,0,212,92,7,84,248,46,0,0,0,0,0,0,
0,0,212,255,247,207,77,0,0,0,0,0,0,0,0,0,212,92,0,0,0,0,0,0,0,0,0,0,0,0,212,92,
0,0,0,0,0,0,0,0,0,0,0,0,206,87,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,105,212,249,235,159,22,0,0,0,0,0,0,0,112,234,68,7,33,189,199,0,0,0,0,0,0,9,237,83,0,
0,0,18,247,73,0,0,0,0,0,49,254,7,0,0,0,0,194,121,0,0,0,0,0,75,241,0,0,0,0,0,174,
145,0,0,0,0,0,54,254,5,0,0,0,0,196,125,0,0,0,0,0,17,252,72,0,0,0,23,250,63,0,0,0,
0,0,0,157,223,55,5,38,199,193,0,0,0,0,0,0,0,6,137,226,250,224,163,237,113,10,0,0,0,0,0,0,
0,0,0,0,0,44,176,154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,197,255,254,230,132,2,0,0,0,0,0,0,0,0,212,92,3,54,242,87,0,0,0,0,0,0,0,0,
212,92,0,0,190,129,0,0,0,0,0,0,0,0,212,92,4,65,242,62,0,0,0,0,0,0,0,0,212,255,255,252,
85,0,0,0,0,0,0,0,0,0,212,92,19,174,181,0,0,0,0,0,0,0,0,0,212,92,0,25,250,50,0,0,
0,0,0,0,0,0,212,92,0,0,173,154,0,0,0,0,0,0,0,0,206,86,0,0,71,239,5,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,90,218,245,174,19,0,0,0,0,0,0,0,0,30,249,66,14,118,96,0,0,0,0,
0,0,0,0,62,248,10,0,0,0,0,0,0,0,0,0,0,0,11,223,195,49,0,0,0,0,0,0,0,0,0,0,
0,26,165,252,174,20,0,0,0,0,0,0,0,0,0,0,0,38,207,172,0,0,0,0,0,0,0,0,0,0,0,0,
91,222,0,0,0,0,0,0,0,0,116,122,21,23,182,159,0,0,0,0,0,0,0,0,26,171,243,235,159,16,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,218,255,255,255,255,255,172,0,0,0,0,0,0,0,0,0,44,255,0,0,
0,0,0,0,0,0,0,0,0,0,44,255,0,0,0,0,0,0,0,0,0,0,0,0,44,255,0,0,0,0,0,0,
0,0,0,0,0,0,44,255,0,0,0,0,0,0,0,0,0,0,0,0,44,255,0,0,0,0,0,0,0,0,0,0,
0,0,44,255,0,0,0,0,0,0,0,0,0,0,0,0,44,255,0,0,0,0,0,0,0,0,0,0,0,0,40,249,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,209,78,0,0,0,82,205,0,0,0,0,0,0,0,216,84,
0,0,0,88,212,0,0,0,0,0,0,0,216,84,0,0,0,88,212,0,0,0,0,0,0,0,216,84,0,0,0,88,
212,0,0,0,0,0,0,0,216,84,0,0,0,88,212,0,0,0,0,0,0,0,214,87,0,0,0,90,208,0,0,0,
0,0,0,0,183,123,0,0,0,128,174,0,0,0,0,0,0,0,96,234,66,10,62,235,78,0,0,0,0,0,0,0,
0,114,220,246,212,94,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,167,143,0,0,0,0,145,152,0,0,0,0,
0,0,88,231,2,0,0,2,231,71,0,0,0,0,0,0,10,244,64,0,0,62,234,4,0,0,0,0,0,0,0,165,
151,0,0,147,148,0,0,0,0,0,0,0,0,76,234,3,1,229,59,0,0,0,0,0,0,0,0,5,237,69,60,224,
1,0,0,0,0,0,0,0,0,0,153,156,144,136,0,0,0,0,0,0,0,0,0,0,64,237,227,47,0,0,0,0,
0,0,0,0,0,0,2,223,208,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,125,180,0,0,0,126,229,1,
0,0,53,237,0,0,62,246,7,0,0,196,255,50,0,0,123,176,0,0,4,240,65,0,10,242,187,119,0,0,190,103,
0,0,0,173,134,0,70,192,108,189,0,8,247,31,0,0,0,101,203,0,135,127,37,248,10,67,213,0,0,0,0,28,
252,18,200,63,0,222,73,133,140,0,0,0,0,0,212,97,242,7,0,152,142,199,68,0,0,0,0,0,139,221,189,0,
0,81,221,240,7,0,0,0,0,0,62,251,118,0,0,14,243,170,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,225,11,0,
0,150,165,0,0,0,0,0,0,0,3,211,130,0,45,246,36,0,0,0,0,0,0,0,0,67,246,29,187,136,0,0,
0,0,0,0,0,0,0,0,175,212,230,12,0,0,0,0,0,0,0,0,0,0,74,255,146,0,0,0,0,0,0,0,
0,0,0,0,195,172,243,26,0,0,0,0,0,0,0,0,0,91,223,7,177,162,0,0,0,0,0,0,0,0,12,228,
87,0,39,250,55,0,0,0,0,0,0,0,124,196,0,0,0,145,190,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
161,158,0,0,0,196,113,0,0,0,0,0,0,0,46,250,33,0,67,238,14,0,0,0,0,0,0,0,0,174,151,0,
188,125,0,0,0,0,0,0,0,0,0,48,245,68,238,15,0,0,0,0,0,0,0,0,0,0,175,239,126,0,0,0,
0,0,0,0,0,0,0,0,64,255,15,0,0,0,0,0,0,0,0,0,0,0,48,255,0,0,0,0,0,0,0,0,
0,0,0,0,48,255,0,0,0,0,0,0,0,0,0,0,0,0,43,249,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,116,255,255,255,255,250,12,0,0,0,0,0,0,0,0,0,0,0,137,195,0,0,0,0,0,0,0,0,
0,0,0,45,245,43,0,0,0,0,0,0,0,0,0,0,2,199,133,0,0,0,0,0,0,0,0,0,0,0,106,220,
8,0,0,0,0,0,0,0,0,0,0,26,240,69,0,0,0,0,0,0,0,0,0,0,0,172,164,0,0,0,0,0,
0,0,0,0,0,0,74,237,22,0,0,0,0,0,0,0,0,0,0,0,139,255,255,255,255,255,54,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,165,255,163,0,0,0,
0,0,0,0,0,0,0,0,176,96,0,0,0,0,0,0,0,0,0,0,0,0,176,96,0,0,0,0,0,0,0,0,
0,0,0,0,176,96,0,0,0,0,0,0,0,0,0,0,0,0,176,96,0,0,0,0,0,0,0,0,0,0,0,0,
176,96,0,0,0,0,0,0,0,0,0,0,0,0,176,96,0,0,0,0,0,0,0,0,0,0,0,0,176,96,0,0,
0,0,0,0,0,0,0,0,0,0,176,96,0,0,0,0,0,0,0,0,0,0,0,0,176,96,0,0,0,0,0,0,
0,0,0,0,0,0,176,96,0,0,0,0,0,0,0,0,0,0,0,0,166,255,163,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,202,78,
0,0,0,0,0,0,0,0,0,0,0,0,117,173,0,0,0,0,0,0,0,0,0,0,0,0,27,246,17,0,0,0,
0,0,0,0,0,0,0,0,0,189,103,0,0,0,0,0,0,0,0,0,0,0,0,96,196,0,0,0,0,0,0,0,
0,0,0,0,0,13,245,33,0,0,0,0,0,0,0,0,0,0,0,0,167,125,0,0,0,0,0,0,0,0,0,0,
0,0,75,218,0,0,0,0,0,0,0,0,0,0,0,0,4,233,55,0,0,0,0,0,0,0,0,0,0,0,0,146,
148,0,0,0,0,0,0,0,0,0,0,0,0,54,236,5,0,0,0,0,0,0,0,0,0,0,0,0,214,71,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,89,255,243,0,0,0,0,0,0,0,0,0,0,0,0,20,255,0,0,0,0,0,0,0,0,0,0,0,0,20,
255,0,0,0,0,0,0,0,0,0,0,0,0,20,255,0,0,0,0,0,0,0,0,0,0,0,0,20,255,0,0,0,
0,0,0,0,0,0,0,0,0,20,255,0,0,0,0,0,0,0,0,0,0,0,0,20,255,0,0,0,0,0,0,0,
0,0,0,0,0,20,255,0,0,0,0,0,0,0,0,0,0,0,0,20,255,0,0,0,0,0,0,0,0,0,0,0,
0,20,255,0,0,0,0,0,0,0,0,0,0,0,0,20,255,0,0,0,0,0,0,0,0,0,0,0,89,255,245,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,94,250,68,0,0,0,0,0,0,0,
0,0,0,0,211,157,187,0,0,0,0,0,0,0,0,0,0,71,210,10,238,49,0,0,0,0,0,0,0,0,0,186,
108,0,141,165,0,0,0,0,0,0,0,0,37,241,16,0,34,245,23,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,249,255,255,255,255,255,241,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,201,75,0,0,0,0,0,0,0,0,0,0,0,0,31,206,11,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,74,211,244,
186,23,0,0,0,0,0,0,0,0,8,186,43,16,189,136,0,0,0,0,0,0,0,0,0,0,0,0,116,172,0,0,
0,0,0,0,0,0,0,110,215,248,255,176,0,0,0,0,0,0,0,0,59,239,51,4,112,176,0,0,0,0,0,0,
0,0,74,231,33,38,199,176,0,0,0,0,0,0,0,0,4,165,244,220,148,171,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,237,39,0,0,0,0,0,0,0,0,
0,0,0,0,244,44,0,0,0,0,0,0,0,0,0,0,0,0,244,44,0,0,0,0,0,0,0,0,0,0,0,0,
244,111,218,245,141,1,0,0,0,0,0,0,0,0,244,202,33,48,239,83,0,0,0,0,0,0,0,0,244,50,0,0,
157,154,0,0,0,0,0,0,0,0,244,44,0,0,130,172,0,0,0,0,0,0,0,0,244,48,0,0,159,147,0,0,
0,0,0,0,0,0,244,197,29,51,240,65,0,0,0,0,0,0,0,0,236,97,230,231,119,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,50,199,245,186,24,0,0,0,0,0,0,0,0,10,233,114,14,107,98,0,0,0,0,0,0,0,0,
72,235,2,0,0,0,0,0,0,0,0,0,0,0,94,210,0,0,0,0,0,0,0,0,0,0,0,0,70,233,1,0,
0,0,0,0,0,0,0,0,0,0,13,237,109,13,100,105,0,0,0,0,0,0,0,0,0,65,213,247,185,28,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,202,74,0,0,0,0,0,0,0,0,0,0,0,0,208,80,0,0,0,0,0,0,0,0,0,0,0,0,208,
80,0,0,0,0,0,0,0,0,55,208,237,143,213,80,0,0,0,0,0,0,0,4,227,121,14,130,255,80,0,0,0,
0,0,0,0,55,240,4,0,0,212,80,0,0,0,0,0,0,0,80,216,0,0,0,208,80,0,0,0,0,0,0,0,
62,238,2,0,0,214,80,0,0,0,0,0,0,0,8,238,110,14,136,252,80,0,0,0,0,0,0,0,0,72,228,242,
131,173,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,38,189,244,212,52,0,0,0,0,0,0,0,0,3,217,122,13,96,227,
5,0,0,0,0,0,0,0,55,234,1,0,0,229,52,0,0,0,0,0,0,0,83,255,255,255,255,254,59,0,0,0,
0,0,0,0,62,227,0,0,0,0,0,0,0,0,0,0,0,0,9,228,112,12,0,0,0,0,0,0,0,0,0,0,
0,51,196,245,255,250,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,34,209,246,81,0,0,0,0,0,0,0,0,0,0,141,170,10,16,0,0,0,0,0,0,0,
0,0,0,166,121,0,0,0,0,0,0,0,0,0,0,0,181,255,255,252,10,0,0,0,0,0,0,0,0,0,0,168,
120,0,0,0,0,0,0,0,0,0,0,0,0,168,120,0,0,0,0,0,0,0,0,0,0,0,0,168,120,0,0,0,
0,0,0,0,0,0,0,0,0,168,120,0,0,0,0,0,0,0,0,0,0,0,0,168,120,0,0,0,0,0,0,0,
0,0,0,0,0,162,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,225,255,255,255,33,0,0,0,0,0,
0,0,19,242,58,26,218,75,0,0,0,0,0,0,0,0,58,216,0,0,157,118,0,0,0,0,0,0,0,0,23,243,
53,26,220,74,0,0,0,0,0,0,0,0,32,223,224,238,141,0,0,0,0,0,0,0,0,0,88,185,6,0,0,0,
0,0,0,0,0,0,0,0,19,241,253,242,216,100,0,0,0,0,0,0,0,0,125,184,6,11,77,253,13,0,0,0,
0,0,0,0,146,175,19,9,97,236,3,0,0,0,0,0,0,0,27,180,239,243,196,58,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,237,39,0,0,0,0,0,0,0,0,0,0,0,0,244,44,0,0,
0,0,0,0,0,0,0,0,0,0,244,44,0,0,0,0,0,0,0,0,0,0,0,0,244,111,219,235,122,0,0,0,
0,0,0,0,0,0,244,203,32,62,252,36,0,0,0,0,0,0,0,0,244,50,0,0,213,79,0,0,0,0,0,0,
0,0,244,44,0,0,200,88,0,0,0,0,0,0,0,0,244,44,0,0,200,88,0,0,0,0,0,0,0,0,244,44,
0,0,200,88,0,0,0,0,0,0,0,0,237,39,0,0,194,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,49,6,0,0,0,0,0,0,0,0,0,0,0,
7,242,52,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,237,39,0,
0,0,0,0,0,0,0,0,0,0,0,244,44,0,0,0,0,0,0,0,0,0,0,0,0,244,44,0,0,0,0,0,
0,0,0,0,0,0,0,244,44,0,0,0,0,0,0,0,0,0,0,0,0,244,44,0,0,0,0,0,0,0,0,0,
0,0,0,244,44,0,0,0,0,0,0,0,0,0,0,0,0,237,39,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,11,0,0,0,0,0,0,
0,0,0,0,0,0,219,86,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,205,70,0,0,0,0,0,0,0,0,0,0,0,0,212,76,0,0,0,0,0,0,0,0,0,0,0,0,212,76,
0,0,0,0,0,0,0,0,0,0,0,0,212,76,0,0,0,0,0,0,0,0,0,0,0,0,212,76,0,0,0,0,
0,0,0,0,0,0,0,0,212,76,0,0,0,0,0,0,0,0,0,0,0,0,212,76,0,0,0,0,0,0,0,0,
0,0,0,0,215,72,0,0,0,0,0,0,0,0,0,0,1,25,246,37,0,0,0,0,0,0,0,0,0,0,63,246,
154,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,237,39,0,0,0,0,
0,0,0,0,0,0,0,0,244,44,0,0,0,0,0,0,0,0,0,0,0,0,244,44,0,0,0,0,0,0,0,0,
0,0,0,0,244,44,3,175,165,0,0,0,0,0,0,0,0,0,244,44,146,196,10,0,0,0,0,0,0,0,0,0,
244,152,208,15,0,0,0,0,0,0,0,0,0,0,244,188,204,5,0,0,0,0,0,0,0,0,0,0,244,52,211,139,
0,0,0,0,0,0,0,0,0,0,244,44,44,246,70,0,0,0,0,0,0,0,0,0,237,39,0,106,227,5,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,237,39,
0,0,0,0,0,0,0,0,0,0,0,0,244,44,0,0,0,0,0,0,0,0,0,0,0,0,244,44,0,0,0,0,
0,0,0,0,0,0,0,0,244,44,0,0,0,0,0,0,0,0,0,0,0,0,244,44,0,0,0,0,0,0,0,0,
0,0,0,0,244,44,0,0,0,0,0,0,0,0,0,0,0,0,244,44,0,0,0,0,0,0,0,0,0,0,0,0,
244,44,0,0,0,0,0,0,0,0,0,0,0,0,244,44,0,0,0,0,0,0,0,0,0,0,0,0,238,40,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,236,93,225,237,107,80,226,230,93,0,0,0,0,0,244,201,29,96,251,199,
29,94,241,7,0,0,0,0,244,50,0,2,251,50,0,2,253,36,0,0,0,0,244,44,0,0,244,44,0,0,248,44,
0,0,0,0,244,44,0,0,244,44,0,0,248,44,0,0,0,0,244,44,0,0,244,44,0,0,248,44,0,0,0,0,
237,39,0,0,237,39,0,0,240,39,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,236,92,222,235,122,0,0,0,0,0,0,0,0,0,244,203,
32,62,252,36,0,0,0,0,0,0,0,0,244,50,0,0,213,79,0,0,0,0,0,0,0,0,244,44,0,0,200,88,
0,0,0,0,0,0,0,0,244,44,0,0,200,88,0,0,0,0,0,0,0,0,244,44,0,0,200,88,0,0,0,0,
0,0,0,0,237,39,0,0,194,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,35,189,247,221,115,0,0,0,0,0,0,
0,0,4,219,133,16,60,238,81,0,0,0,0,0,0,0,64,237,4,0,0,144,164,0,0,0,0,0,0,0,91,210,
0,0,0,114,186,0,0,0,0,0,0,0,69,235,2,0,0,145,156,0,0,0,0,0,0,0,10,232,124,15,60,238,
59,0,0,0,0,0,0,0,0,53,199,245,223,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,236,75,216,245,144,2,0,0,
0,0,0,0,0,0,244,201,36,46,236,84,0,0,0,0,0,0,0,0,244,50,0,0,155,154,0,0,0,0,0,0,
0,0,244,44,0,0,130,172,0,0,0,0,0,0,0,0,244,49,0,0,160,147,0,0,0,0,0,0,0,0,244,199,
30,53,241,65,0,0,0,0,0,0,0,0,244,128,231,230,119,0,0,0,0,0,0,0,0,0,244,44,0,0,0,0,
0,0,0,0,0,0,0,0,244,44,0,0,0,0,0,0,0,0,0,0,0,0,237,39,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,207,244,
148,176,75,0,0,0,0,0,0,0,4,227,121,14,130,254,80,0,0,0,0,0,0,0,55,240,4,0,0,212,80,0,
0,0,0,0,0,0,80,216,0,0,0,208,80,0,0,0,0,0,0,0,62,238,2,0,0,214,80,0,0,0,0,0,
0,0,8,238,110,14,136,255,80,0,0,0,0,0,0,0,0,72,229,242,133,210,80,0,0,0,0,0,0,0,0,0,
0,0,0,208,80,0,0,0,0,0,0,0,0,0,0,0,0,208,80,0,0,0,0,0,0,0,0,0,0,0,0,202,
74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
236,103,241,145,0,0,0,0,0,0,0,0,0,0,244,203,21,17,0,0,0,0,0,0,0,0,0,0,244,61,0,0,
0,0,0,0,0,0,0,0,0,0,244,44,0,0,0,0,0,0,0,0,0,0,0,0,244,44,0,0,0,0,0,0,
0,0,0,0,0,0,244,44,0,0,0,0,0,0,0,0,0,0,0,0,237,39,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,136,237,255,143,0,0,0,0,0,0,0,0,0,53,227,22,0,0,0,0,0,0,0,0,0,0,0,
41,244,72,0,0,0,0,0,0,0,0,0,0,0,0,91,225,206,48,0,0,0,0,0,0,0,0,0,0,0,3,134,
204,0,0,0,0,0,0,0,0,0,0,0,3,111,201,0,0,0,0,0,0,0,0,0,107,255,252,208,53,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,169,105,0,0,0,0,0,0,0,0,0,0,0,0,176,112,0,0,0,
0,0,0,0,0,0,0,0,187,255,255,255,51,0,0,0,0,0,0,0,0,0,0,176,112,0,0,0,0,0,0,0,
0,0,0,0,0,176,112,0,0,0,0,0,0,0,0,0,0,0,0,176,112,0,0,0,0,0,0,0,0,0,0,0,
0,175,113,0,0,0,0,0,0,0,0,0,0,0,0,156,159,14,9,0,0,0,0,0,0,0,0,0,0,52,226,242,
43,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,244,32,0,0,202,74,0,0,0,0,0,0,0,0,252,36,0,0,208,80,
0,0,0,0,0,0,0,0,252,36,0,0,208,80,0,0,0,0,0,0,0,0,252,36,0,0,208,80,0,0,0,0,
0,0,0,0,243,46,0,0,212,80,0,0,0,0,0,0,0,0,202,140,13,130,254,80,0,0,0,0,0,0,0,0,
57,215,236,144,179,75,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,171,129,0,0,37,243,7,0,0,0,0,0,0,0,96,216,
0,0,118,179,0,0,0,0,0,0,0,0,16,249,42,0,199,92,0,0,0,0,0,0,0,0,0,179,124,25,246,14,
0,0,0,0,0,0,0,0,0,93,207,105,176,0,0,0,0,0,0,0,0,0,0,14,247,213,90,0,0,0,0,0,
0,0,0,0,0,0,169,242,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,140,152,0,0,159,157,0,0,136,144,0,0,
0,0,76,223,0,0,225,227,0,0,206,78,0,0,0,0,10,247,33,30,212,232,37,17,246,11,0,0,0,0,0,184,
100,91,145,162,103,81,185,0,0,0,0,0,0,110,167,152,80,91,169,146,110,0,0,0,0,0,0,35,233,212,18,21,
232,212,35,0,0,0,0,0,0,0,210,201,0,0,198,212,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,209,4,0,171,124,0,0,
0,0,0,0,0,0,6,217,109,68,228,11,0,0,0,0,0,0,0,0,0,73,238,215,88,0,0,0,0,0,0,0,
0,0,0,1,225,240,5,0,0,0,0,0,0,0,0,0,0,96,206,212,115,0,0,0,0,0,0,0,0,0,15,232,
64,70,241,23,0,0,0,0,0,0,0,0,136,172,0,0,177,148,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,170,133,0,0,
36,244,8,0,0,0,0,0,0,0,92,222,0,0,119,180,0,0,0,0,0,0,0,0,12,245,51,0,201,94,0,0,
0,0,0,0,0,0,0,169,135,27,247,15,0,0,0,0,0,0,0,0,0,79,220,108,176,0,0,0,0,0,0,0,
0,0,0,6,239,225,89,0,0,0,0,0,0,0,0,0,0,0,154,246,12,0,0,0,0,0,0,0,0,0,0,0,
126,177,0,0,0,0,0,0,0,0,0,0,0,0,210,101,0,0,0,0,0,0,0,0,0,0,0,28,244,26,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
64,255,255,255,191,0,0,0,0,0,0,0,0,0,0,0,0,187,119,0,0,0,0,0,0,0,0,0,0,0,81,220,
7,0,0,0,0,0,0,0,0,0,0,7,222,77,0,0,0,0,0,0,0,0,0,0,0,124,184,0,0,0,0,0,
0,0,0,0,0,0,28,239,40,0,0,0,0,0,0,0,0,0,0,0,89,255,255,255,234,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,183,231,0,0,
0,0,0,0,0,0,0,0,0,36,237,9,0,0,0,0,0,0,0,0,0,0,0,47,216,0,0,0,0,0,0,0,
0,0,0,0,0,53,212,0,0,0,0,0,0,0,0,0,0,0,1,127,173,0,0,0,0,0,0,0,0,0,0,0,
96,239,41,0,0,0,0,0,0,0,0,0,0,0,1,138,161,0,0,0,0,0,0,0,0,0,0,0,0,55,209,0,
0,0,0,0,0,0,0,0,0,0,0,48,216,0,0,0,0,0,0,0,0,0,0,0,0,47,217,0,0,0,0,0,
0,0,0,0,0,0,0,33,238,8,0,0,0,0,0,0,0,0,0,0,0,0,178,230,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,75,185,
0,0,0,0,0,0,0,0,0,0,0,0,80,192,0,0,0,0,0,0,0,0,0,0,0,0,80,192,0,0,0,0,
0,0,0,0,0,0,0,0,80,192,0,0,0,0,0,0,0,0,0,0,0,0,80,192,0,0,0,0,0,0,0,0,
0,0,0,0,80,192,0,0,0,0,0,0,0,0,0,0,0,0,80,192,0,0,0,0,0,0,0,0,0,0,0,0,
80,192,0,0,0,0,0,0,0,0,0,0,0,0,80,192,0,0,0,0,0,0,0,0,0,0,0,0,80,192,0,0,
0,0,0,0,0,0,0,0,0,0,80,192,0,0,0,0,0,0,0,0,0,0,0,0,80,192,0,0,0,0,0,0,
0,0,0,0,0,0,75,186,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,39,247,134,0,0,0,0,0,0,0,0,0,0,0,0,46,237,0,0,0,0,0,0,0,0,0,0,0,0,16,
251,0,0,0,0,0,0,0,0,0,0,0,0,15,252,0,0,0,0,0,0,0,0,0,0,0,0,2,241,55,0,0,
0,0,0,0,0,0,0,0,0,0,87,253,38,0,0,0,0,0,0,0,0,0,0,0,200,94,0,0,0,0,0,0,
0,0,0,0,0,4,254,8,0,0,0,0,0,0,0,0,0,0,0,15,252,0,0,0,0,0,0,0,0,0,0,0,
0,17,250,0,0,0,0,0,0,0,0,0,0,0,0,50,231,0,0,0,0,0,0,0,0,0,0,0,38,246,123,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,17,199,236,82,0,79,138,0,0,0,0,0,0,0,110,149,46,229,42,150,102,0,0,0,0,0,0,0,139,78,
0,84,239,191,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
/*Bitmap Raw Data end ---*/
}

View File

@ -0,0 +1,98 @@
95 characters are converted
Character Index No.
32
! 33
" 34
# 35
$ 36
% 37
& 38
' 39
( 40
) 41
* 42
+ 43
, 44
- 45
. 46
/ 47
0 48
1 49
2 50
3 51
4 52
5 53
6 54
7 55
8 56
9 57
: 58
; 59
< 60
= 61
> 62
? 63
@ 64
A 65
B 66
C 67
D 68
E 69
F 70
G 71
H 72
I 73
J 74
K 75
L 76
M 77
N 78
O 79
P 80
Q 81
R 82
S 83
T 84
U 85
V 86
W 87
X 88
Y 89
Z 90
[ 91
\ 92
] 93
^ 94
_ 95
` 96
a 97
b 98
c 99
d 100
e 101
f 102
g 103
h 104
i 105
j 106
k 107
l 108
m 109
n 110
o 111
p 112
q 113
r 114
s 115
t 116
u 117
v 118
w 119
x 120
y 121
z 122
{ 123
| 124
} 125
~ 126

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

5
hw.txt Normal file
View File

@ -0,0 +1,5 @@
1. R2 & R3 10K, R1 - 1K
2. Molex cable 33mm
3. Ground plane between screen & board. Capton tape+Copper Foil Tape, solder to board ground via 22 cable

BIN
images/at.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
images/gps.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

9
include/version.h Normal file
View File

@ -0,0 +1,9 @@
// AUTO GENERATED FILE, DO NOT EDIT
#ifndef VERSION
#define VERSION "1.0.1203"
#endif
#ifndef BUILD_TIMESTAMP
#define BUILD_TIMESTAMP "2023-07-18 14:37:23.725627"
#endif

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,838 @@
/*
This is a library written for the u-blox ZED-F9P and NEO-M8P-2
SparkFun sells these at its website: www.sparkfun.com
Do you like this library? Help support SparkFun. Buy a board!
https://www.sparkfun.com/products/16481
https://www.sparkfun.com/products/15136
https://www.sparkfun.com/products/15005
https://www.sparkfun.com/products/15733
https://www.sparkfun.com/products/15193
https://www.sparkfun.com/products/15210
Written by Nathan Seidle @ SparkFun Electronics, September 6th, 2018
This library handles configuring and handling the responses
from a u-blox GPS module. Works with most modules from u-blox including
the Zed-F9P, NEO-M8P-2, NEO-M9N, ZOE-M8Q, SAM-M8Q, and many others.
https://github.com/sparkfun/SparkFun_Ublox_Arduino_Library
Development environment specifics:
Arduino IDE 1.8.5
SparkFun code, firmware, and software is released under the MIT License(http://opensource.org/licenses/MIT).
The MIT License (MIT)
Copyright (c) 2016 SparkFun Electronics
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
associated documentation files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to
do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial
portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT
NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef __u_blox_config_keys_h__
#define __u_blox_config_keys_h__
//The following consts are used to generate KEY values for the advanced protocol functions of VELGET/SET/DEL
const uint8_t VAL_SIZE_1 = 0x01; //One bit
const uint8_t VAL_SIZE_8 = 0x02; //One byte
const uint8_t VAL_SIZE_16 = 0x03; //Two bytes
const uint8_t VAL_SIZE_32 = 0x04; //Four bytes
const uint8_t VAL_SIZE_64 = 0x05; //Eight bytes
//These are the Bitfield layers definitions for the UBX-CFG-VALSET message (not to be confused with Bitfield deviceMask in UBX-CFG-CFG)
const uint8_t VAL_LAYER_RAM = (1 << 0);
const uint8_t VAL_LAYER_BBR = (1 << 1);
const uint8_t VAL_LAYER_FLASH = (1 << 2);
const uint8_t VAL_LAYER_ALL = VAL_LAYER_RAM | VAL_LAYER_BBR | VAL_LAYER_FLASH; //Not valid with getVal()
//Below are various Groups, IDs, and sizes for various settings
//These can be used to call getVal/setVal/delVal
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint8_t VAL_ID_PROT_UBX = 0x01;
const uint8_t VAL_ID_PROT_NMEA = 0x02;
const uint8_t VAL_ID_PROT_RTCM3 = 0x04;
const uint8_t VAL_GROUP_I2C = 0x51;
const uint8_t VAL_GROUP_I2COUTPROT = 0x72;
const uint8_t VAL_GROUP_UART1INPROT = 0x73;
const uint8_t VAL_GROUP_UART1OUTPROT = 0x74;
const uint8_t VAL_GROUP_UART2INPROT = 0x75;
const uint8_t VAL_GROUP_UART2OUTPROT = 0x76;
const uint8_t VAL_GROUP_USBINPROT = 0x77;
const uint8_t VAL_GROUP_USBOUTPROT = 0x78;
const uint8_t VAL_GROUP_UART_SIZE = VAL_SIZE_1; //All fields in UART group are currently 1 bit
const uint8_t VAL_GROUP_I2C_SIZE = VAL_SIZE_8; //All fields in I2C group are currently 1 byte
const uint8_t VAL_ID_I2C_ADDRESS = 0x01;
//Below are the key values for a given configuration setting
//CFG-BDS: BeiDou system configuration
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_BDS_USE_PRN_1_TO_5 = 0x10340014; // Use BeiDou geostationary satellites (PRN 1-5)
//CFG-GEOFENCE: Geofencing configuration
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_GEOFENCE_CONFLVL = 0x20240011; // Required confidence level for state evaluation
const uint32_t UBLOX_CFG_GEOFENCE_USE_PIO = 0x10240012; // Use PIO combined fence state output
const uint32_t UBLOX_CFG_GEOFENCE_PINPOL = 0x20240013; // PIO pin polarity
const uint32_t UBLOX_CFG_GEOFENCE_PIN = 0x20240014; // PIO pin number
const uint32_t UBLOX_CFG_GEOFENCE_USE_FENCE1 = 0x10240020; // Use frst geofence
const uint32_t UBLOX_CFG_GEOFENCE_FENCE1_LAT = 0x40240021; // Latitude of the first geofence circle center
const uint32_t UBLOX_CFG_GEOFENCE_FENCE1_LON = 0x40240022; // Longitude of the first geofence circle center
const uint32_t UBLOX_CFG_GEOFENCE_FENCE1_RAD = 0x40240023; // Radius of the first geofence circle
const uint32_t UBLOX_CFG_GEOFENCE_USE_FENCE2 = 0x10240030; // Use second geofence
const uint32_t UBLOX_CFG_GEOFENCE_FENCE2_LAT = 0x40240031; // Latitude of the second geofence circle center
const uint32_t UBLOX_CFG_GEOFENCE_FENCE2_LON = 0x40240032; // Longitude of the second geofence circle center
const uint32_t UBLOX_CFG_GEOFENCE_FENCE2_RAD = 0x40240033; // Radius of the second geofence circle
const uint32_t UBLOX_CFG_GEOFENCE_USE_FENCE3 = 0x10240040; // Use third geofence
const uint32_t UBLOX_CFG_GEOFENCE_FENCE3_LAT = 0x40240041; // Latitude of the third geofence circle center
const uint32_t UBLOX_CFG_GEOFENCE_FENCE3_LON = 0x40240042; // Longitude of the third geofence circle center
const uint32_t UBLOX_CFG_GEOFENCE_FENCE3_RAD = 0x40240043; // Radius of the third geofence circle
const uint32_t UBLOX_CFG_GEOFENCE_USE_FENCE4 = 0x10240050; // Use fourth geofence
const uint32_t UBLOX_CFG_GEOFENCE_FENCE4_LAT = 0x40240051; // Latitude of the fourth geofence circle center
const uint32_t UBLOX_CFG_GEOFENCE_FENCE4_LON = 0x40240052; // Longitude of the fourth geofence circle center
const uint32_t UBLOX_CFG_GEOFENCE_FENCE4_RAD = 0x40240053; // Radius of the fourth geofence circle
//CFG-HW: Hardware configuration
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_HW_ANT_CFG_VOLTCTRL = 0x10a3002e; // Active antenna voltage control flag
const uint32_t UBLOX_CFG_HW_ANT_CFG_SHORTDET = 0x10a3002f; // Short antenna detection flag
const uint32_t UBLOX_CFG_HW_ANT_CFG_SHORTDET_POL = 0x10a30030; // Short antenna detection polarity
const uint32_t UBLOX_CFG_HW_ANT_CFG_OPENDET = 0x10a30031; // Open antenna detection flag
const uint32_t UBLOX_CFG_HW_ANT_CFG_OPENDET_POL = 0x10a30032; // Open antenna detection polarity
const uint32_t UBLOX_CFG_HW_ANT_CFG_PWRDOWN = 0x10a30033; // Power down antenna flag
const uint32_t UBLOX_CFG_HW_ANT_CFG_PWRDOWN_POL = 0x10a30034; // Power down antenna logic polarity
const uint32_t UBLOX_CFG_HW_ANT_CFG_RECOVER = 0x10a30035; // Automatic recovery from short state flag
const uint32_t UBLOX_CFG_HW_ANT_SUP_SWITCH_PIN = 0x20a30036; // ANT1 PIO number
const uint32_t UBLOX_CFG_HW_ANT_SUP_SHORT_PIN = 0x20a30037; // ANT0 PIO number
const uint32_t UBLOX_CFG_HW_ANT_SUP_OPEN_PIN = 0x20a30038; // ANT2 PIO number
const uint32_t UBLOX_CFG_HW_ANT_SUP_ENGINE = 0x20a30054; // Antenna supervisor engine selection
const uint32_t UBLOX_CFG_HW_ANT_SUP_SHORT_THR = 0x20a30055; // Antenna supervisor MADC engine short detection threshold
const uint32_t UBLOX_CFG_HW_ANT_SUP_OPEN_THR = 0x20a30056; // Antenna supervisor MADC engine open detection threshold
//CFG-I2C: Configuration of the I2C interface
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_I2C_ADDRESS = 0x20510001; // I2C slave address of the receiver (7 bits)
const uint32_t UBLOX_CFG_I2C_EXTENDEDTIMEOUT = 0x10510002; // Flag to disable timeouting the interface after 1.5 s
const uint32_t UBLOX_CFG_I2C_ENABLED = 0x10510003; // Flag to indicate if the I2C interface should be enabled
//CFG-I2CINPROT: Input protocol configuration of the I2C interface
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_I2CINPROT_UBX = 0x10710001; // Flag to indicate if UBX should be an input protocol on I2C
const uint32_t UBLOX_CFG_I2CINPROT_NMEA = 0x10710002; // Flag to indicate if NMEA should be an input protocol on I2C
const uint32_t UBLOX_CFG_I2CINPROT_RTCM3X = 0x10710004; // Flag to indicate if RTCM3X should be an input protocol on I2C
//CFG-I2COUTPROT: Output protocol configuration of the I2C interface
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_I2COUTPROT_UBX = 0x10720001; // Flag to indicate if UBX should be an output protocol on I2C
const uint32_t UBLOX_CFG_I2COUTPROT_NMEA = 0x10720002; // Flag to indicate if NMEA should be an output protocol on I2C
const uint32_t UBLOX_CFG_I2COUTPROT_RTCM3X = 0x10720004; // Flag to indicate if RTCM3X should be an output protocol on I2C
//CFG-INFMSG: Information message configuration
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_INFMSG_UBX_I2C = 0x20920001; // Information message enable flags for the UBX protocol on the I2C interface
const uint32_t UBLOX_CFG_INFMSG_UBX_UART1 = 0x20920002; // Information message enable flags for the UBX protocol on the UART1 interface
const uint32_t UBLOX_CFG_INFMSG_UBX_UART2 = 0x20920003; // Information message enable flags for the UBX protocol on the UART2 interface
const uint32_t UBLOX_CFG_INFMSG_UBX_USB = 0x20920004; // Information message enable flags for the UBX protocol on the USB interface
const uint32_t UBLOX_CFG_INFMSG_UBX_SPI = 0x20920005; // Information message enable flags for the UBX protocol on the SPI interface
const uint32_t UBLOX_CFG_INFMSG_NMEA_I2C = 0x20920006; // Information message enable flags for the NMEA protocol on the I2C interface
const uint32_t UBLOX_CFG_INFMSG_NMEA_UART1 = 0x20920007; // Information message enable flags for the NMEA protocol on the UART1 interface
const uint32_t UBLOX_CFG_INFMSG_NMEA_UART2 = 0x20920008; // Information message enable flags for the NMEA protocol on the UART2 interface
const uint32_t UBLOX_CFG_INFMSG_NMEA_USB = 0x20920009; // Information message enable flags for the NMEA protocol on the USB interface
const uint32_t UBLOX_CFG_INFMSG_NMEA_SPI = 0x2092000a; // Information message enable flags for the NMEA protocol on the SPI interface
//CFG-ITFM: Jamming and interference monitor configuration
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_ITFM_BBTHRESHOLD = 0x20410001; // Broadband jamming detection threshold
const uint32_t UBLOX_CFG_ITFM_CWTHRESHOLD = 0x20410002; // CW jamming detection threshold
const uint32_t UBLOX_CFG_ITFM_ENABLE = 0x1041000d; // Enable interference detection
const uint32_t UBLOX_CFG_ITFM_ANTSETTING = 0x20410010; // Antenna setting
const uint32_t UBLOX_CFG_ITFM_ENABLE_AUX = 0x10410013; // Scan auxiliary bands
//CFG-LOGFILTER: Data logger configuration
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_LOGFILTER_RECORD_ENA = 0x10de0002; // Recording enabled
const uint32_t UBLOX_CFG_LOGFILTER_ONCE_PER_WAKE_UP_ENA = 0x10de0003; // Once per wake up
const uint32_t UBLOX_CFG_LOGFILTER_APPLY_ALL_FILTERS = 0x10de0004; // Apply all filter settings
const uint32_t UBLOX_CFG_LOGFILTER_MIN_INTERVAL = 0x30de0005; // Minimum time interval between loggedpositions
const uint32_t UBLOX_CFG_LOGFILTER_TIME_THRS = 0x30de0006; // Time threshold
const uint32_t UBLOX_CFG_LOGFILTER_SPEED_THRS = 0x30de0007; // Speed threshold
const uint32_t UBLOX_CFG_LOGFILTER_POSITION_THRS = 0x40de0008; // Position threshold
//CFG-MOT: Motion detector configuration
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_MOT_GNSSSPEED_THRS = 0x20250038; // GNSS speed threshold below which platform is considered as stationary (a.k.a. static hold threshold)
const uint32_t UBLOX_CFG_MOT_GNSSDIST_THRS = 0x3025003b; // Distance above which GNSS-based stationary motion is exit (a.k.a. static hold distance threshold)
// CFG-MSGOUT: Message output configuration
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
// For each message and port a separate output rate (per second, per epoch) can be configured.
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_DTM_I2C = 0x209100a6; //Output rate of the NMEA-GX-DTM message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_DTM_SPI = 0x209100aa; //Output rate of the NMEA-GX-DTM message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_DTM_UART1 = 0x209100a7; //Output rate of the NMEA-GX-DTM message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_DTM_UART2 = 0x209100a8; //Output rate of the NMEA-GX-DTM message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_DTM_USB = 0x209100a9; //Output rate of the NMEA-GX-DTM message on port USB
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GBS_I2C = 0x209100dd; //Output rate of the NMEA-GX-GBS message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GBS_SPI = 0x209100e1; //Output rate of the NMEA-GX-GBS message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GBS_UART1 = 0x209100de; //Output rate of the NMEA-GX-GBS message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GBS_UART2 = 0x209100df; //Output rate of the NMEA-GX-GBS message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GBS_USB = 0x209100e0; //Output rate of the NMEA-GX-GBS message on port USB
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GGA_I2C = 0x209100ba; //Output rate of the NMEA-GX-GGA message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GGA_SPI = 0x209100be; //Output rate of the NMEA-GX-GGA message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GGA_UART1 = 0x209100bb; //Output rate of the NMEA-GX-GGA message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GGA_UART2 = 0x209100bc; //Output rate of the NMEA-GX-GGA message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GGA_USB = 0x209100bd; //Output rate of the NMEA-GX-GGA message on port USB
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GLL_I2C = 0x209100c9; //Output rate of the NMEA-GX-GLL message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GLL_SPI = 0x209100cd; //Output rate of the NMEA-GX-GLL message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GLL_UART1 = 0x209100ca; //Output rate of the NMEA-GX-GLL message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GLL_UART2 = 0x209100cb; //Output rate of the NMEA-GX-GLL message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GLL_USB = 0x209100cc; //Output rate of the NMEA-GX-GLL message on port USB
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GNS_I2C = 0x209100b5; //Output rate of the NMEA-GX-GNS message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GNS_SPI = 0x209100b9; //Output rate of the NMEA-GX-GNS message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GNS_UART1 = 0x209100b6; //Output rate of the NMEA-GX-GNS message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GNS_UART2 = 0x209100b7; //Output rate of the NMEA-GX-GNS message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GNS_USB = 0x209100b8; //Output rate of the NMEA-GX-GNS message on port USB
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GRS_I2C = 0x209100ce; //Output rate of the NMEA-GX-GRS message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GRS_SPI = 0x209100d2; //Output rate of the NMEA-GX-GRS message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GRS_UART1 = 0x209100cf; //Output rate of the NMEA-GX-GRS message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GRS_UART2 = 0x209100d0; //Output rate of the NMEA-GX-GRS message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GRS_USB = 0x209100d1; //Output rate of the NMEA-GX-GRS message on port USB
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GSA_I2C = 0x209100bf; //Output rate of the NMEA-GX-GSA message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GSA_SPI = 0x209100c3; //Output rate of the NMEA-GX-GSA message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GSA_UART1 = 0x209100c0; //Output rate of the NMEA-GX-GSA message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GSA_UART2 = 0x209100c1; //Output rate of the NMEA-GX-GSA message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GSA_USB = 0x209100c2; //Output rate of the NMEA-GX-GSA message on port USB
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GST_I2C = 0x209100d3; //Output rate of the NMEA-GX-GST message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GST_SPI = 0x209100d7; //Output rate of the NMEA-GX-GST message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GST_UART1 = 0x209100d4; //Output rate of the NMEA-GX-GST message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GST_UART2 = 0x209100d5; //Output rate of the NMEA-GX-GST message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GST_USB = 0x209100d6; //Output rate of the NMEA-GX-GST message on port USB
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GSV_I2C = 0x209100c4; //Output rate of the NMEA-GX-GSV message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GSV_SPI = 0x209100c8; //Output rate of the NMEA-GX-GSV message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GSV_UART1 = 0x209100c5; //Output rate of the NMEA-GX-GSV message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GSV_UART2 = 0x209100c6; //Output rate of the NMEA-GX-GSV message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_GSV_USB = 0x209100c7; //Output rate of the NMEA-GX-GSV message on port USB
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_RLM_I2C = 0x20910400; //Output rate of the NMEA-GX-RLM message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_RLM_SPI = 0x20910404; //Output rate of the NMEA-GX-RLM message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_RLM_UART1 = 0x20910401; //Output rate of the NMEA-GX-RLM message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_RLM_UART2 = 0x20910402; //Output rate of the NMEA-GX-RLM message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_RLM_USB = 0x20910403; //Output rate of the NMEA-GX-RLM message on port USB
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_RMC_I2C = 0x209100ab; //Output rate of the NMEA-GX-RMC message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_RMC_SPI = 0x209100af; //Output rate of the NMEA-GX-RMC message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_RMC_UART1 = 0x209100ac; //Output rate of the NMEA-GX-RMC message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_RMC_UART2 = 0x209100ad; //Output rate of the NMEA-GX-RMC message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_RMC_USB = 0x209100ae; //Output rate of the NMEA-GX-RMC message on port USB
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_VLW_I2C = 0x209100e7; //Output rate of the NMEA-GX-VLW message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_VLW_SPI = 0x209100eb; //Output rate of the NMEA-GX-VLW message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_VLW_UART1 = 0x209100e8; //Output rate of the NMEA-GX-VLW message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_VLW_UART2 = 0x209100e9; //Output rate of the NMEA-GX-VLW message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_VLW_USB = 0x209100ea; //Output rate of the NMEA-GX-VLW message on port USB
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_VTG_I2C = 0x209100b0; //Output rate of the NMEA-GX-VTG message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_VTG_SPI = 0x209100b4; //Output rate of the NMEA-GX-VTG message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_VTG_UART1 = 0x209100b1; //Output rate of the NMEA-GX-VTG message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_VTG_UART2 = 0x209100b2; //Output rate of the NMEA-GX-VTG message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_VTG_USB = 0x209100b3; //Output rate of the NMEA-GX-VTG message on port USB
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_ZDA_I2C = 0x209100d8; //Output rate of the NMEA-GX-ZDA message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_ZDA_SPI = 0x209100dc; //Output rate of the NMEA-GX-ZDA message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_ZDA_UART1 = 0x209100d9; //Output rate of the NMEA-GX-ZDA message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_ZDA_UART2 = 0x209100da; //Output rate of the NMEA-GX-ZDA message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_NMEA_ID_ZDA_USB = 0x209100db; //Output rate of the NMEA-GX-ZDA message on port USB
const uint32_t UBLOX_CFG_MSGOUT_PUBX_ID_POLYP_I2C = 0x209100ec; //Output rate of the NMEA-GX-PUBX00 message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_PUBX_ID_POLYP_SPI = 0x209100f0; //Output rate of the NMEA-GX-PUBX00 message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_PUBX_ID_POLYP_UART1 = 0x209100ed; //Output rate of the NMEA-GX-PUBX00 message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_PUBX_ID_POLYP_UART2 = 0x209100ee; //Output rate of the NMEA-GX-PUBX00 message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_PUBX_ID_POLYP_USB = 0x209100ef; //Output rate of the NMEA-GX-PUBX00 message on port USB
const uint32_t UBLOX_CFG_MSGOUT_PUBX_ID_POLYS_I2C = 0x209100f1; //Output rate of the NMEA-GX-PUBX03 message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_PUBX_ID_POLYS_SPI = 0x209100f5; //Output rate of the NMEA-GX-PUBX03 message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_PUBX_ID_POLYS_UART1 = 0x209100f2; //Output rate of the NMEA-GX-PUBX03 message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_PUBX_ID_POLYS_UART2 = 0x209100f3; //Output rate of the NMEA-GX-PUBX03 message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_PUBX_ID_POLYS_USB = 0x209100f4; //Output rate of the NMEA-GX-PUBX03 message on port USB
const uint32_t UBLOX_CFG_MSGOUT_PUBX_ID_POLYT_I2C = 0x209100f6; //Output rate of the NMEA-GX-PUBX04 message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_PUBX_ID_POLYT_SPI = 0x209100fa; //Output rate of the NMEA-GX-PUBX04 message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_PUBX_ID_POLYT_UART1 = 0x209100f7; //Output rate of the NMEA-GX-PUBX04 message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_PUBX_ID_POLYT_UART2 = 0x209100f8; //Output rate of the NMEA-GX-PUBX04 message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_PUBX_ID_POLYT_USB = 0x209100f9; //Output rate of the NMEA-GX-PUBX04 message on port USB
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1005_I2C = 0x209102bd; //Output rate of the RTCM-3X-TYPE1005 message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1005_SPI = 0x209102c1; //Output rate of the RTCM-3X-TYPE1005 message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1005_UART1 = 0x209102be;//Output rate of the RTCM-3X-TYPE1005 message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1005_UART2 = 0x209102bf;//Output rate of the RTCM-3X-TYPE1005 message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1005_USB = 0x209102c0; //Output rate of the RTCM-3X-TYPE1005 message on port USB
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1074_I2C = 0x2091035e; //Output rate of the RTCM-3X-TYPE1074 message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1074_SPI = 0x20910362; //Output rate of the RTCM-3X-TYPE1074 message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1074_UART1 = 0x2091035f;//Output rate of the RTCM-3X-TYPE1074 message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1074_UART2 = 0x20910360;//Output rate of the RTCM-3X-TYPE1074 message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1074_USB = 0x20910361; //Output rate of the RTCM-3X-TYPE1074 message on port USB
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1077_I2C = 0x209102cc; //Output rate of the RTCM-3X-TYPE1077 message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1077_SPI = 0x209102d0; //Output rate of the RTCM-3X-TYPE1077 message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1077_UART1 = 0x209102cd;//Output rate of the RTCM-3X-TYPE1077 message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1077_UART2 = 0x209102ce;//Output rate of the RTCM-3X-TYPE1077 message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1077_USB = 0x209102cf; //Output rate of the RTCM-3X-TYPE1077 message on port USB
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1084_I2C = 0x20910363; //Output rate of the RTCM-3X-TYPE1084 message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1084_SPI = 0x20910367; //Output rate of the RTCM-3X-TYPE1084 message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1084_UART1 = 0x20910364;//Output rate of the RTCM-3X-TYPE1084 message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1084_UART2 = 0x20910365;//Output rate of the RTCM-3X-TYPE1084 message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1084_USB = 0x20910366; //Output rate of the RTCM-3X-TYPE1084 message on port USB
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1087_I2C = 0x209102d1; //Output rate of the RTCM-3X-TYPE1087 message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1087_SPI = 0x209102d5; //Output rate of the RTCM-3X-TYPE1087 message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1087_UART1 = 0x209102d2;//Output rate of the RTCM-3X-TYPE1087 message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1087_UART2 = 0x209102d3;//Output rate of the RTCM-3X-TYPE1087 message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1087_USB = 0x209102d4; //Output rate of the RTCM-3X-TYPE1087 message on port USB
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1094_I2C = 0x20910368; //Output rate of the RTCM-3X-TYPE1094 message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1094_SPI = 0x2091036c; //Output rate of the RTCM-3X-TYPE1094 message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1094_UART1 = 0x20910369;//Output rate of the RTCM-3X-TYPE1094 message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1094_UART2 = 0x2091036a;//Output rate of the RTCM-3X-TYPE1094 message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1094_USB = 0x2091036b; //Output rate of the RTCM-3X-TYPE1094 message on port USB
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1097_I2C = 0x20910318; //Output rate of the RTCM-3X-TYPE1097 message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1097_SPI = 0x2091031c; //Output rate of the RTCM-3X-TYPE1097 message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1097_UART1 = 0x20910319;//Output rate of the RTCM-3X-TYPE1097 message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1097_UART2 = 0x2091031a;//Output rate of the RTCM-3X-TYPE1097 message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1097_USB = 0x2091031b; //Output rate of the RTCM-3X-TYPE1097 message on port USB
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1124_I2C = 0x2091036d; //Output rate of the RTCM-3X-TYPE1124 message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1124_SPI = 0x20910371; //Output rate of the RTCM-3X-TYPE1124 message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1124_UART1 = 0x2091036e;//Output rate of the RTCM-3X-TYPE1124 message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1124_UART2 = 0x2091036f;//Output rate of the RTCM-3X-TYPE1124 message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1124_USB = 0x20910370; //Output rate of the RTCM-3X-TYPE1124 message on port USB
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1127_I2C = 0x209102d6; //Output rate of the RTCM-3X-TYPE1127 message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1127_SPI = 0x209102da; //Output rate of the RTCM-3X-TYPE1127 message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1127_UART1 = 0x209102d7;//Output rate of the RTCM-3X-TYPE1127 message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1127_UART2 = 0x209102d8;//Output rate of the RTCM-3X-TYPE1127 message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1127_USB = 0x209102d9; //Output rate of the RTCM-3X-TYPE1127 message on port USB
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1230_I2C = 0x20910303; //Output rate of the RTCM-3X-TYPE1230 message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1230_SPI = 0x20910307; //Output rate of the RTCM-3X-TYPE1230 message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1230_UART1 = 0x20910304;//Output rate of the RTCM-3X-TYPE1230 message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1230_UART2 = 0x20910305;//Output rate of the RTCM-3X-TYPE1230 message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE1230_USB = 0x20910306; //Output rate of the RTCM-3X-TYPE1230 message on port USB
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE4072_0_I2C = 0x209102fe;//Output rate of the RTCM-3X-TYPE4072_0 message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE4072_0_SPI = 0x20910302;//Output rate of the RTCM-3X-TYPE4072_0 message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE4072_0_UART1 = 0x209102ff; //Output rate of the RTCM-3X-TYPE4072_0 message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE4072_0_UART2 = 0x20910300; //Output rate of the RTCM-3X-TYPE4072_0 message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE4072_0_USB = 0x20910301;//Output rate of the RTCM-3X-TYPE4072_0 message on port USB
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE4072_1_I2C = 0x20910381;//Output rate of the RTCM-3X-TYPE4072_1 message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE4072_1_SPI = 0x20910385;//Output rate of the RTCM-3X-TYPE4072_1 message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE4072_1_UART1 = 0x20910382; //Output rate of the RTCM-3X-TYPE4072_1 message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE4072_1_UART2 = 0x20910383; //Output rate of the RTCM-3X-TYPE4072_1 message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_RTCM_3X_TYPE4072_1_USB = 0x20910384;//Output rate of the RTCM-3X-TYPE4072_1 message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_LOG_INFO_I2C = 0x20910259; //Output rate of the UBX-LOG-INFO message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_LOG_INFO_SPI = 0x2091025d; //Output rate of the UBX-LOG-INFO message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_LOG_INFO_UART1 = 0x2091025a; //Output rate of the UBX-LOG-INFO message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_LOG_INFO_UART2 = 0x2091025b; //Output rate of the UBX-LOG-INFO message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_LOG_INFO_USB = 0x2091025c; //Output rate of the UBX-LOG-INFO message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_COMMS_I2C = 0x2091034f; //Output rate of the UBX-MON-COMMS message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_COMMS_SPI = 0x20910353; //Output rate of the UBX-MON-COMMS message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_COMMS_UART1 = 0x20910350; //Output rate of the UBX-MON-COMMS message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_COMMS_UART2 = 0x20910351; //Output rate of the UBX-MON-COMMS message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_COMMS_USB = 0x20910352; //Output rate of the UBX-MON-COMMS message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_HW2_I2C = 0x209101b9; //Output rate of the UBX-MON-HW2 message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_HW2_SPI = 0x209101bd; //Output rate of the UBX-MON-HW2 message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_HW2_UART1 = 0x209101ba; //Output rate of the UBX-MON-HW2 message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_HW2_UART2 = 0x209101bb; //Output rate of the UBX-MON-HW2 message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_HW2_USB = 0x209101bc; //Output rate of the UBX-MON-HW2 message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_HW3_I2C = 0x20910354; //Output rate of the UBX-MON-HW3 message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_HW3_SPI = 0x20910358; //Output rate of the UBX-MON-HW3 message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_HW3_UART1 = 0x20910355; //Output rate of the UBX-MON-HW3 message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_HW3_UART2 = 0x20910356; //Output rate of the UBX-MON-HW3 message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_HW3_USB = 0x20910357; //Output rate of the UBX-MON-HW3 message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_HW_I2C = 0x209101b4; //Output rate of the UBX-MON-HW message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_HW_SPI = 0x209101b8; //Output rate of the UBX-MON-HW message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_HW_UART1 = 0x209101b5; //Output rate of the UBX-MON-HW message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_HW_UART2 = 0x209101b6; //Output rate of the UBX-MON-HW message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_HW_USB = 0x209101b7; //Output rate of the UBX-MON-HW message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_IO_I2C = 0x209101a5; //Output rate of the UBX-MON-IO message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_IO_SPI = 0x209101a9; //Output rate of the UBX-MON-IO message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_IO_UART1 = 0x209101a6; //Output rate of the UBX-MON-IO message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_IO_UART2 = 0x209101a7; //Output rate of the UBX-MON-IO message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_IO_USB = 0x209101a8; //Output rate of the UBX-MON-IO message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_MSGPP_I2C = 0x20910196; //Output rate of the UBX-MON-MSGPP message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_MSGPP_SPI = 0x2091019a; //Output rate of the UBX-MON-MSGPP message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_MSGPP_UART1 = 0x20910197; //Output rate of the UBX-MON-MSGPP message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_MSGPP_UART2 = 0x20910198; //Output rate of the UBX-MON-MSGPP message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_MSGPP_USB = 0x20910199; //Output rate of the UBX-MON-MSGPP message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_RF_I2C = 0x20910359; //Output rate of the UBX-MON-RF message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_RF_SPI = 0x2091035d; //Output rate of the UBX-MON-RF message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_RF_UART1 = 0x2091035a; //Output rate of the UBX-MON-RF message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_RF_UART2 = 0x2091035b; //Output rate of the UBX-MON-RF message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_RF_USB = 0x2091035c; // Output rate of the UBX-MON-RF message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_RXBUF_I2C = 0x209101a0; // Output rate of the UBX-MON-RXBUF message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_RXBUF_SPI = 0x209101a4; // Output rate of the UBX-MON-RXBUF message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_RXBUF_UART1 = 0x209101a1; // Output rate of the UBX-MON-RXBUF message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_RXBUF_UART2 = 0x209101a2; // Output rate of the UBX-MON-RXBUF message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_RXBUF_USB = 0x209101a3; // Output rate of the UBX-MON-RXBUF message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_RXR_I2C = 0x20910187; // Output rate of the UBX-MON-RXR message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_RXR_SPI = 0x2091018b; // Output rate of the UBX-MON-RXR message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_RXR_UART1 = 0x20910188; // Output rate of the UBX-MON-RXR message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_RXR_UART2 = 0x20910189; // Output rate of the UBX-MON-RXR message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_RXR_USB = 0x2091018a; // Output rate of the UBX-MON-RXR message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_SPAN_I2C = 0x2091038b; // Output rate of the UBX-MON-SPAN message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_SPAN_SPI = 0x2091038f; // Output rate of the UBX-MON-SPAN message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_SPAN_UART1 = 0x2091038c; // Output rate of the UBX-MON-SPAN message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_SPAN_UART2 = 0x2091038d; // Output rate of the UBX-MON-SPAN message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_SPAN_USB = 0x2091038e; // Output rate of the UBX-MON-SPAN message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_TXBUF_I2C = 0x2091019b; // Output rate of the UBX-MON-TXBUF message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_TXBUF_SPI = 0x2091019f; // Output rate of the UBX-MON-TXBUF message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_TXBUF_UART1 = 0x2091019c; // Output rate of the UBX-MON-TXBUF message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_TXBUF_UART2 = 0x2091019d; // Output rate of the UBX-MON-TXBUF message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_MON_TXBUF_USB = 0x2091019e; // Output rate of the UBX-MON-TXBUF message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_ATT_I2C = 0x2091001f; // Output rate of the UBX_NAV_ATT message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_ATT_SPI = 0x20910023; // Output rate of the UBX_NAV_ATT message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_ATT_UART1 = 0x20910020; // Output rate of the UBX_NAV_ATT message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_ATT_UART2 = 0x20910021; // Output rate of the UBX_NAV_ATT message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_ATT_USB = 0x20910022; // Output rate of the UBX_NAV_ATT message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_CLOCK_I2C = 0x20910065; // Output rate of the UBX-NAV-CLOCK message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_CLOCK_SPI = 0x20910069; // Output rate of the UBX-NAV-CLOCK message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_CLOCK_UART1 = 0x20910066; // Output rate of the UBX-NAV-CLOCK message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_CLOCK_UART2 = 0x20910067; // Output rate of the UBX-NAV-CLOCK message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_CLOCK_USB = 0x20910068; // Output rate of the UBX-NAV-CLOCK message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_DOP_I2C = 0x20910038; // Output rate of the UBX-NAV-DOP message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_DOP_SPI = 0x2091003c; // Output rate of the UBX-NAV-DOP message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_DOP_UART1 = 0x20910039; // Output rate of the UBX-NAV-DOP message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_DOP_UART2 = 0x2091003a; // Output rate of the UBX-NAV-DOP message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_DOP_USB = 0x2091003b; // Output rate of the UBX-NAV-DOP message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_EOE_I2C = 0x2091015f; // Output rate of the UBX-NAV-EOE message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_EOE_SPI = 0x20910163; // Output rate of the UBX-NAV-EOE message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_EOE_UART1 = 0x20910160; // Output rate of the UBX-NAV-EOE message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_EOE_UART2 = 0x20910161; // Output rate of the UBX-NAV-EOE message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_EOE_USB = 0x20910162; // Output rate of the UBX-NAV-EOE message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_GEOFENCE_I2C = 0x209100a1; // Output rate of the UBX-NAV-GEOFENCE message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_GEOFENCE_SPI = 0x209100a5; // Output rate of the UBX-NAV-GEOFENCE message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_GEOFENCE_UART1 = 0x209100a2;// Output rate of the UBX-NAV-GEOFENCE message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_GEOFENCE_UART2 = 0x209100a3;// Output rate of the UBX-NAV-GEOFENCE message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_GEOFENCE_USB = 0x209100a4; // Output rate of the UBX-NAV-GEOFENCE message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_HPPOSECEF_I2C = 0x2091002e;// Output rate of the UBX-NAV-HPPOSECEF message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_HPPOSECEF_SPI = 0x20910032;// Output rate of the UBX-NAV-HPPOSECEF message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_HPPOSECEF_UART1 = 0x2091002f;// Output rate of the UBX-NAV-HPPOSECEF message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_HPPOSECEF_UART2 = 0x20910030;// Output rate of the UBX-NAV-HPPOSECEF message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_HPPOSECEF_USB = 0x20910031;// Output rate of the UBX-NAV-HPPOSECEF message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_HPPOSLLH_I2C = 0x20910033; // Output rate of the UBX-NAV-HPPOSLLH message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_HPPOSLLH_SPI = 0x20910037; // Output rate of the UBX-NAV-HPPOSLLH message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_HPPOSLLH_UART1 = 0x20910034;// Output rate of the UBX-NAV-HPPOSLLH message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_HPPOSLLH_UART2 = 0x20910035;// Output rate of the UBX-NAV-HPPOSLLH message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_HPPOSLLH_USB = 0x20910036; // Output rate of the UBX-NAV-HPPOSLLH message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_ODO_I2C = 0x2091007e; // Output rate of the UBX-NAV-ODO message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_ODO_SPI = 0x20910082; // Output rate of the UBX-NAV-ODO message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_ODO_UART1 = 0x2091007f; // Output rate of the UBX-NAV-ODO message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_ODO_UART2 = 0x20910080; // Output rate of the UBX-NAV-ODO message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_ODO_USB = 0x20910081; // Output rate of the UBX-NAV-ODO message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_ORB_I2C = 0x20910010; // Output rate of the UBX-NAV-ORB message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_ORB_SPI = 0x20910014; // Output rate of the UBX-NAV-ORB message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_ORB_UART1 = 0x20910011; // Output rate of the UBX-NAV-ORB message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_ORB_UART2 = 0x20910012; // Output rate of the UBX-NAV-ORB message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_ORB_USB = 0x20910013; // Output rate of the UBX-NAV-ORB message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_POSECEF_I2C = 0x20910024; // Output rate of the UBX-NAV-POSECEF message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_POSECEF_SPI = 0x20910028; // Output rate of the UBX-NAV-POSECEF message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_POSECEF_UART1 = 0x20910025;// Output rate of the UBX-NAV-POSECEF message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_POSECEF_UART2 = 0x20910026;// Output rate of the UBX-NAV-POSECEF message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_POSECEF_USB = 0x20910027; // Output rate of the UBX-NAV-POSECEF message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_POSLLH_I2C = 0x20910029; // Output rate of the UBX-NAV-POSLLH message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_POSLLH_SPI = 0x2091002d; // Output rate of the UBX-NAV-POSLLH message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_POSLLH_UART1 = 0x2091002a; // Output rate of the UBX-NAV-POSLLH message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_POSLLH_UART2 = 0x2091002b; // Output rate of the UBX-NAV-POSLLH message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_POSLLH_USB = 0x2091002c; // Output rate of the UBX-NAV-POSLLH message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_PVT_I2C = 0x20910006; // Output rate of the UBX-NAV-PVT message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_PVT_SPI = 0x2091000a; // Output rate of the UBX-NAV-PVT message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_PVT_UART1 = 0x20910007; // Output rate of the UBX-NAV-PVT message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_PVT_UART2 = 0x20910008; // Output rate of the UBX-NAV-PVT message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_PVT_USB = 0x20910009; // Output rate of the UBX-NAV-PVT message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_RELPOSNED_I2C = 0x2091008d; // Output rate of the UBX-NAV-RELPOSNED message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_RELPOSNED_SPI = 0x20910091;// Output rate of the UBX-NAV-RELPOSNED message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_RELPOSNED_UART1 = 0x2091008e;// Output rate of the UBX-NAV-RELPOSNED message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_RELPOSNED_UART2 = 0x2091008f;// Output rate of the UBX-NAV-RELPOSNED message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_RELPOSNED_USB = 0x20910090;// Output rate of the UBX-NAV-RELPOSNED message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SAT_I2C = 0x20910015; // Output rate of the UBX-NAV-SAT message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SAT_SPI = 0x20910019; // Output rate of the UBX-NAV-SAT message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SAT_UART1 = 0x20910016; // Output rate of the UBX-NAV-SAT message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SAT_UART2 = 0x20910017; // Output rate of the UBX-NAV-SAT message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SAT_USB = 0x20910018; // Output rate of the UBX-NAV-SAT message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SBAS_I2C = 0x2091006a; // Output rate of the UBX-NAV-SBAS message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SBAS_SPI = 0x2091006e; // Output rate of the UBX-NAV-SBAS message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SBAS_UART1 = 0x2091006b; // Output rate of the UBX-NAV-SBAS message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SBAS_UART2 = 0x2091006c; // Output rate of the UBX-NAV-SBAS message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SBAS_USB = 0x2091006d; // Output rate of the UBX-NAV-SBAS message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SIG_I2C = 0x20910345; // Output rate of the UBX-NAV-SIG message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SIG_SPI = 0x20910349; // Output rate of the UBX-NAV-SIG message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SIG_UART1 = 0x20910346; // Output rate of the UBX-NAV-SIG message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SIG_UART2 = 0x20910347; // Output rate of the UBX-NAV-SIG message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SIG_USB = 0x20910348; // Output rate of the UBX-NAV-SIG message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SLAS_I2C = 0x20910336; // Output rate of the UBX-NAV-SLAS message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SLAS_SPI = 0x2091033a; // Output rate of the UBX-NAV-SLAS message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SLAS_UART1 = 0x20910337; // Output rate of the UBX-NAV-SLAS message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SLAS_UART2 = 0x20910338; // Output rate of the UBX-NAV-SLAS message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SLAS_USB = 0x20910339; // Output rate of the UBX-NAV-SLAS message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_STATUS_I2C = 0x2091001a; // Output rate of the UBX-NAV-STATUS message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_STATUS_SPI = 0x2091001e; // Output rate of the UBX-NAV-STATUS message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_STATUS_UART1 = 0x2091001b; // Output rate of the UBX-NAV-STATUS message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_STATUS_UART2 = 0x2091001c; // Output rate of the UBX-NAV-STATUS message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_STATUS_USB = 0x2091001d; // Output rate of the UBX-NAV-STATUS message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SVIN_I2C = 0x20910088; // Output rate of the UBX-NAV-SVIN message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SVIN_SPI = 0x2091008c; // Output rate of the UBX-NAV-SVIN message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SVIN_UART1 = 0x20910089; // Output rate of the UBX-NAV-SVIN message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SVIN_UART2 = 0x2091008a; // Output rate of the UBX-NAV-SVIN message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_SVIN_USB = 0x2091008b; // Output rate of the UBX-NAV-SVIN message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEBDS_I2C = 0x20910051; // Output rate of the UBX-NAV-TIMEBDS message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEBDS_SPI = 0x20910055; // Output rate of the UBX-NAV-TIMEBDS message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEBDS_UART1 = 0x20910052;// Output rate of the UBX-NAV-TIMEBDS message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEBDS_UART2 = 0x20910053;// Output rate of the UBX-NAV-TIMEBDS message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEBDS_USB = 0x20910054; // Output rate of the UBX-NAV-TIMEBDS message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGAL_I2C = 0x20910056; // Output rate of the UBX-NAV-TIMEGAL message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGAL_SPI = 0x2091005a; // Output rate of the UBX-NAV-TIMEGAL message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGAL_UART1 = 0x20910057;// Output rate of the UBX-NAV-TIMEGAL message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGAL_UART2 = 0x20910058;// Output rate of the UBX-NAV-TIMEGAL message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGAL_USB = 0x20910059; // Output rate of the UBX-NAV-TIMEGAL message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGLO_I2C = 0x2091004c; // Output rate of the UBX-NAV-TIMEGLO message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGLO_SPI = 0x20910050; // Output rate of the UBX-NAV-TIMEGLO message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGLO_UART1 = 0x2091004d;// Output rate of the UBX-NAV-TIMEGLO message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGLO_UART2 = 0x2091004e;// Output rate of the UBX-NAV-TIMEGLO message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGLO_USB = 0x2091004f; // Output rate of the UBX-NAV-TIMEGLO message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGPS_I2C = 0x20910047; // Output rate of the UBX-NAV-TIMEGPS message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGPS_SPI = 0x2091004b; // Output rate of the UBX-NAV-TIMEGPS message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGPS_UART1 = 0x20910048;// Output rate of the UBX-NAV-TIMEGPS message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGPS_UART2 = 0x20910049;// Output rate of the UBX-NAV-TIMEGPS message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEGPS_USB = 0x2091004a; // Output rate of the UBX-NAV-TIMEGPS message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMELS_I2C = 0x20910060; // Output rate of the UBX-NAV-TIMELS message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMELS_SPI = 0x20910064; // Output rate of the UBX-NAV-TIMELS message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMELS_UART1 = 0x20910061; // Output rate of the UBX-NAV-TIMELS message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMELS_UART2 = 0x20910062; // Output rate of the UBX-NAV-TIMELS message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMELS_USB = 0x20910063; // Output rate of the UBX-NAV-TIMELS message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEQZSS_I2C = 0x20910386; // Output rate of the UBX-NAV-TIMEQZSSmessage on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEQZSS_SPI = 0x2091038a; // Output rate of the UBX-NAV-TIMEQZSSmessage on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEQZSS_UART1 = 0x20910387;// Output rate of the UBX-NAV-TIMEQZSSmessage on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEQZSS_UART2 = 0x20910388;// Output rate of the UBX-NAV-TIMEQZSSmessage on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEQZSS_USB = 0x20910389; // Output rate of the UBX-NAV-TIMEQZSSmessage on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEUTC_I2C = 0x2091005b; // Output rate of the UBX-NAV-TIMEUTC message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEUTC_SPI = 0x2091005f; // Output rate of the UBX-NAV-TIMEUTC message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEUTC_UART1 = 0x2091005c;// Output rate of the UBX-NAV-TIMEUTC message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEUTC_UART2 = 0x2091005d;// Output rate of the UBX-NAV-TIMEUTC message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_TIMEUTC_USB = 0x2091005e; // Output rate of the UBX-NAV-TIMEUTC message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_VELECEF_I2C = 0x2091003d; // Output rate of the UBX-NAV-VELECEF message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_VELECEF_SPI = 0x20910041; // Output rate of the UBX-NAV-VELECEF message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_VELECEF_UART1 = 0x2091003e;// Output rate of the UBX-NAV-VELECEF message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_VELECEF_UART2 = 0x2091003f;// Output rate of the UBX-NAV-VELECEF message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_VELECEF_USB = 0x20910040; // Output rate of the UBX-NAV-VELECEF message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_VELNED_I2C = 0x20910042; // Output rate of the UBX-NAV-VELNED message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_VELNED_SPI = 0x20910046; // Output rate of the UBX-NAV-VELNED message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_VELNED_UART1 = 0x20910043; // Output rate of the UBX-NAV-VELNED message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_VELNED_UART2 = 0x20910044; // Output rate of the UBX-NAV-VELNED message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_NAV_VELNED_USB = 0x20910045; // Output rate of the UBX-NAV-VELNED message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_MEASX_I2C = 0x20910204; // Output rate of the UBX-RXM-MEASX message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_MEASX_SPI = 0x20910208; // Output rate of the UBX-RXM-MEASX message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_MEASX_UART1 = 0x20910205; // Output rate of the UBX-RXM-MEASX message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_MEASX_UART2 = 0x20910206; // Output rate of the UBX-RXM-MEASX message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_MEASX_USB = 0x20910207; // Output rate of the UBX-RXM-MEASX message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_RAWX_I2C = 0x209102a4; // Output rate of the UBX-RXM-RAWX message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_RAWX_SPI = 0x209102a8; // Output rate of the UBX-RXM-RAWX message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_RAWX_UART1 = 0x209102a5; // Output rate of the UBX-RXM-RAWX message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_RAWX_UART2 = 0x209102a6; // Output rate of the UBX-RXM-RAWX message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_RAWX_USB = 0x209102a7; // Output rate of the UBX-RXM-RAWX message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_RLM_I2C = 0x2091025e; // Output rate of the UBX-RXM-RLM message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_RLM_SPI = 0x20910262; // Output rate of the UBX-RXM-RLM message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_RLM_UART1 = 0x2091025f; // Output rate of the UBX-RXM-RLM message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_RLM_UART2 = 0x20910260; // Output rate of the UBX-RXM-RLM message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_RLM_USB = 0x20910261; // Output rate of the UBX-RXM-RLM message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_RTCM_I2C = 0x20910268; // Output rate of the UBX-RXM-RTCM message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_RTCM_SPI = 0x2091026c; // Output rate of the UBX-RXM-RTCM message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_RTCM_UART1 = 0x20910269; // Output rate of the UBX-RXM-RTCM message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_RTCM_UART2 = 0x2091026a; // Output rate of the UBX-RXM-RTCM message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_RTCM_USB = 0x2091026b; // Output rate of the UBX-RXM-RTCM message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_SFRBX_I2C = 0x20910231; // Output rate of the UBX-RXM-SFRBX message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_SFRBX_SPI = 0x20910235; // Output rate of the UBX-RXM-SFRBX message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_SFRBX_UART1 = 0x20910232; // Output rate of the UBX-RXM-SFRBX message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_SFRBX_UART2 = 0x20910233; // Output rate of the UBX-RXM-SFRBX message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_RXM_SFRBX_USB = 0x20910234; // Output rate of the UBX-RXM-SFRBX message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_TIM_TM2_I2C = 0x20910178; // Output rate of the UBX-TIM-TM2 message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_TIM_TM2_SPI = 0x2091017c; // Output rate of the UBX-TIM-TM2 message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_TIM_TM2_UART1 = 0x20910179; // Output rate of the UBX-TIM-TM2 message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_TIM_TM2_UART2 = 0x2091017a; // Output rate of the UBX-TIM-TM2 message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_TIM_TM2_USB = 0x2091017b; // Output rate of the UBX-TIM-TM2 message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_TIM_TP_I2C = 0x2091017d; // Output rate of the UBX-TIM-TP message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_TIM_TP_SPI = 0x20910181; // Output rate of the UBX-TIM-TP message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_TIM_TP_UART1 = 0x2091017e; // Output rate of the UBX-TIM-TP message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_TIM_TP_UART2 = 0x2091017f; // Output rate of the UBX-TIM-TP message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_TIM_TP_USB = 0x20910180; // Output rate of the UBX-TIM-TP message on port USB
const uint32_t UBLOX_CFG_MSGOUT_UBX_TIM_VRFY_I2C = 0x20910092; // Output rate of the UBX-TIM-VRFY message on port I2C
const uint32_t UBLOX_CFG_MSGOUT_UBX_TIM_VRFY_SPI = 0x20910096; // Output rate of the UBX-TIM-VRFY message on port SPI
const uint32_t UBLOX_CFG_MSGOUT_UBX_TIM_VRFY_UART1 = 0x20910093; // Output rate of the UBX-TIM-VRFY message on port UART1
const uint32_t UBLOX_CFG_MSGOUT_UBX_TIM_VRFY_UART2 = 0x20910094; // Output rate of the UBX-TIM-VRFY message on port UART2
const uint32_t UBLOX_CFG_MSGOUT_UBX_TIM_VRFY_USB = 0x20910095; // Output rate of the UBX-TIM-VRFY message on port USB
//CFG-NAVHPG: High precision navigation configuration
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_NAVHPG_DGNSSMODE = 0x20140011; // Differential corrections mode
//CFG-NAVSPG: Standard precision navigation configuration
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_NAVSPG_FIXMODE = 0x20110011; // Position fix mode
const uint32_t UBLOX_CFG_NAVSPG_INIFIX3D = 0x10110013; // Initial fix must be a 3D fix
const uint32_t UBLOX_CFG_NAVSPG_WKNROLLOVER = 0x30110017; // GPS week rollover number
const uint32_t UBLOX_CFG_NAVSPG_UTCSTANDARD = 0x2011001c; // UTC standard to be used
const uint32_t UBLOX_CFG_NAVSPG_DYNMODEL = 0x20110021; // Dynamic platform model
const uint32_t UBLOX_CFG_NAVSPG_ACKAIDING = 0x10110025; // Acknowledge assistance input messages
const uint32_t UBLOX_CFG_NAVSPG_USE_USRDAT = 0x10110061; // Use user geodetic datum parameters
const uint32_t UBLOX_CFG_NAVSPG_USRDAT_MAJA = 0x50110062; // Geodetic datum semi-major axis
const uint32_t UBLOX_CFG_NAVSPG_USRDAT_FLAT = 0x50110063; // Geodetic datum 1.0 flattening
const uint32_t UBLOX_CFG_NAVSPG_USRDAT_DX = 0x40110064; // Geodetic datum X axis shift at the origin
const uint32_t UBLOX_CFG_NAVSPG_USRDAT_DY = 0x40110065; // Geodetic datum Y axis shift at the origin
const uint32_t UBLOX_CFG_NAVSPG_USRDAT_DZ = 0x40110066; // Geodetic datum Z axis shift at the origin
const uint32_t UBLOX_CFG_NAVSPG_USRDAT_ROTX = 0x40110067; // arcsec Geodetic datum rotation about the X axis
const uint32_t UBLOX_CFG_NAVSPG_USRDAT_ROTY = 0x40110068; // arcsec Geodetic datum rotation about the Y axis
const uint32_t UBLOX_CFG_NAVSPG_USRDAT_ROTZ = 0x40110069; // arcsec Geodetic datum rotation about the Z axis
const uint32_t UBLOX_CFG_NAVSPG_USRDAT_SCALE = 0x4011006a; // ppm Geodetic datum scale factor
const uint32_t UBLOX_CFG_NAVSPG_INFIL_MINSVS = 0x201100a1; // Minimum number of satellites for navigation
const uint32_t UBLOX_CFG_NAVSPG_INFIL_MAXSVS = 0x201100a2; // Maximum number of satellites for navigation
const uint32_t UBLOX_CFG_NAVSPG_INFIL_MINCNO = 0x201100a3; // Minimum satellite signal level for navigation
const uint32_t UBLOX_CFG_NAVSPG_INFIL_MINELEV = 0x201100a4; // Minimum elevation for a GNSS satellite to be used in navigation
const uint32_t UBLOX_CFG_NAVSPG_INFIL_NCNOTHRS = 0x201100aa; // Number of satellites required to have C/N0 above const uint32_t UBLOX_CFG_NAVSPG-INFIL_CNOTHRS for a fix to be attempted
const uint32_t UBLOX_CFG_NAVSPG_INFIL_CNOTHRS = 0x201100ab; // C/N0 threshold for deciding whether to attempt a fix
const uint32_t UBLOX_CFG_NAVSPG_OUTFIL_PDOP = 0x301100b1; // Output filter position DOP mask (threshold)
const uint32_t UBLOX_CFG_NAVSPG_OUTFIL_TDOP = 0x301100b2; // Output filter time DOP mask (threshold)
const uint32_t UBLOX_CFG_NAVSPG_OUTFIL_PACC = 0x301100b3; // Output filter position accuracy mask (threshold)
const uint32_t UBLOX_CFG_NAVSPG_OUTFIL_TACC = 0x301100b4; // Output filter time accuracy mask (threshold)
const uint32_t UBLOX_CFG_NAVSPG_OUTFIL_FACC = 0x301100b5; // Output filter frequency accuracy mask (threshold)
const uint32_t UBLOX_CFG_NAVSPG_CONSTR_ALT = 0x401100c1; // Fixed altitude (mean sea level) for 2D fix mode
const uint32_t UBLOX_CFG_NAVSPG_CONSTR_ALTVAR = 0x401100c2; // Fixed altitude variance for 2D mode
const uint32_t UBLOX_CFG_NAVSPG_CONSTR_DGNSSTO = 0x201100c4; // DGNSS timeout
//CFG-NMEA: NMEA protocol configuration
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_NMEA_PROTVER = 0x20930001; // NMEA protocol version
const uint32_t UBLOX_CFG_NMEA_MAXSVS = 0x20930002; // Maximum number of SVs to report per Talker ID
const uint32_t UBLOX_CFG_NMEA_COMPAT = 0x10930003; // Enable compatibility mode
const uint32_t UBLOX_CFG_NMEA_CONSIDER = 0x10930004; // Enable considering mode
const uint32_t UBLOX_CFG_NMEA_LIMIT82 = 0x10930005; // Enable strict limit to 82 characters maximum NMEA message length
const uint32_t UBLOX_CFG_NMEA_HIGHPREC = 0x10930006; // Enable high precision mode
const uint32_t UBLOX_CFG_NMEA_SVNUMBERING = 0x20930007; // Display configuration for SVs that do not have value defined in NMEA
const uint32_t UBLOX_CFG_NMEA_FILT_GPS = 0x10930011; // Disable reporting of GPS satellites
const uint32_t UBLOX_CFG_NMEA_FILT_SBAS = 0x10930012; // Disable reporting of SBAS satellites
const uint32_t UBLOX_CFG_NMEA_FILT_GAL = 0x10930013; // Disable reporting of Galileo satellites
const uint32_t UBLOX_CFG_NMEA_FILT_QZSS = 0x10930015; // Disable reporting of QZSS satellites
const uint32_t UBLOX_CFG_NMEA_FILT_GLO = 0x10930016; // Disable reporting of GLONASS satellites
const uint32_t UBLOX_CFG_NMEA_FILT_BDS = 0x10930017; // Disable reporting of BeiDou satellites
const uint32_t UBLOX_CFG_NMEA_OUT_INVFIX = 0x10930021; // Enable position output for failed or invalid fixes
const uint32_t UBLOX_CFG_NMEA_OUT_MSKFIX = 0x10930022; // Enable position output for invalid fixes
const uint32_t UBLOX_CFG_NMEA_OUT_INVTIME = 0x10930023; // Enable time output for invalid times
const uint32_t UBLOX_CFG_NMEA_OUT_INVDATE = 0x10930024; // Enable date output for invalid dates
const uint32_t UBLOX_CFG_NMEA_OUT_ONLYGPS = 0x10930025; // Restrict output to GPS satellites only
const uint32_t UBLOX_CFG_NMEA_OUT_FROZENCOG = 0x10930026; // Enable course over ground output even if it is frozen
const uint32_t UBLOX_CFG_NMEA_MAINTALKERID = 0x20930031; // Main Talker ID
const uint32_t UBLOX_CFG_NMEA_GSVTALKERID = 0x20930032; // Talker ID for GSV NMEA messages
const uint32_t UBLOX_CFG_NMEA_BDSTALKERID = 0x30930033; // BeiDou Talker ID
//CFG-ODO: Odometer and low-speed course over ground filter
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_ODO_USE_ODO = 0x10220001; // Use odometer
const uint32_t UBLOX_CFG_ODO_USE_COG = 0x10220002; // Use low-speed course over ground filter
const uint32_t UBLOX_CFG_ODO_OUTLPVEL = 0x10220003; // Output low-pass filtered velocity
const uint32_t UBLOX_CFG_ODO_OUTLPCOG = 0x10220004; // Output low-pass filtered course over ground (heading)
const uint32_t UBLOX_CFG_ODO_PROFILE = 0x20220005; // Odometer profile configuration
const uint32_t UBLOX_CFG_ODO_COGMAXSPEED = 0x20220021; // Upper speed limit for low-speed course over ground filter
const uint32_t UBLOX_CFG_ODO_COGMAXPOSACC = 0x20220022; // Maximum acceptable position accuracy for computing low-speed filtered course over ground
const uint32_t UBLOX_CFG_ODO_VELLPGAIN = 0x20220031; // Velocity low-pass filter level
const uint32_t UBLOX_CFG_ODO_COGLPGAIN = 0x20220032; // Course over ground low-pass filter level (at speed < 8 m/s)
//CFG-QZSS: QZSS system configuration
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_QZSS_USE_SLAS_DGNSS = 0x10370005; // Apply QZSS SLAS DGNSS corrections
const uint32_t UBLOX_CFG_QZSS_USE_SLAS_TESTMODE = 0x10370006; // Use QZSS SLAS data when it is in test mode (SLAS msg 0)
const uint32_t UBLOX_CFG_QZSS_USE_SLAS_RAIM_UNCORR = 0x10370007; // Raim out measurements that are not corrected by QZSS SLAS, if at least 5 measurements are corrected
//CFG-RATE: Navigation and measurement rate configuration
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_RATE_MEAS = 0x30210001; // Nominal time between GNSS measurements
const uint32_t UBLOX_CFG_RATE_NAV = 0x30210002; // Ratio of number of measurements to number of navigation solutions
const uint32_t UBLOX_CFG_RATE_TIMEREF = 0x20210003; // Time system to which measurements are aligned
//CFG-RINV: Remote inventory
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_RINV_DUMP = 0x10c70001; // Dump data at startup
const uint32_t UBLOX_CFG_RINV_BINARY = 0x10c70002; // Data is binary
const uint32_t UBLOX_CFG_RINV_DATA_SIZE = 0x20c70003; // Size of data
const uint32_t UBLOX_CFG_RINV_CHUNK0 = 0x50c70004; // Data bytes 1-8 (LSB)
const uint32_t UBLOX_CFG_RINV_CHUNK1 = 0x50c70005; // Data bytes 9-16
const uint32_t UBLOX_CFG_RINV_CHUNK2 = 0x50c70006; // Data bytes 17-240x44434241.
const uint32_t UBLOX_CFG_RINV_CHUNK3 = 0x50c70007; // Data bytes 25-30 (MSB)
//CFG-RTCM: RTCM protocol configuration
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_RTCM_DF003_OUT = 0x30090001; // RTCM DF003 (Reference station ID) output value
const uint32_t UBLOX_CFG_RTCM_DF003_IN = 0x30090008; // RTCM DF003 (Reference station ID) input value
const uint32_t UBLOX_CFG_RTCM_DF003_IN_FILTER = 0x20090009; // RTCM input filter configuration based on RTCM DF003 (Reference station ID) value
//CFG-SBAS: SBAS configuration
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_SBAS_USE_TESTMODE = 0x10360002; // Use SBAS data when it is in test mode (SBAS msg 0)
const uint32_t UBLOX_CFG_SBAS_USE_RANGING = 0x10360003; // Use SBAS GEOs as a ranging source (for navigation)
const uint32_t UBLOX_CFG_SBAS_USE_DIFFCORR = 0x10360004; // Use SBAS differential corrections
const uint32_t UBLOX_CFG_SBAS_USE_INTEGRITY = 0x10360005; // Use SBAS integrity information
const uint32_t UBLOX_CFG_SBAS_PRNSCANMASK = 0x50360006; // SBAS PRN search configuration
//CFG-SIGNAL: Satellite systems (GNSS) signal configuration
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_SIGNAL_GPS_ENA = 0x1031001f; // GPS enable
const uint32_t UBLOX_CFG_SIGNAL_GPS_L1CA_ENA = 0x10310001; // GPS L1C/A
const uint32_t UBLOX_CFG_SIGNAL_GPS_L2C_ENA = 0x10310003; // GPS L2C (only on u-blox F9 platform products)
const uint32_t UBLOX_CFG_SIGNAL_SBAS_ENA = 0x10310020; // SBAS enable
const uint32_t UBLOX_CFG_SIGNAL_SBAS_L1CA_ENA = 0x10310005; // SBAS L1C/A
const uint32_t UBLOX_CFG_SIGNAL_GAL_ENA = 0x10310021; // Galileo enable
const uint32_t UBLOX_CFG_SIGNAL_GAL_E1_ENA = 0x10310007; // Galileo E1
const uint32_t UBLOX_CFG_SIGNAL_GAL_E5B_ENA = 0x1031000a; // Galileo E5b (only on u-blox F9 platform products)
const uint32_t UBLOX_CFG_SIGNAL_BDS_ENA = 0x10310022; // BeiDou Enable
const uint32_t UBLOX_CFG_SIGNAL_BDS_B1_ENA = 0x1031000d; // BeiDou B1I
const uint32_t UBLOX_CFG_SIGNAL_BDS_B2_ENA = 0x1031000e; // BeiDou B2I (only on u-blox F9 platform products)
const uint32_t UBLOX_CFG_SIGNAL_QZSS_ENA = 0x10310024; // QZSS enable
const uint32_t UBLOX_CFG_SIGNAL_QZSS_L1CA_ENA = 0x10310012; // QZSS L1C/A
const uint32_t UBLOX_CFG_SIGNAL_QZSS_L1S_ENA = 0x10310014; // QZSS L1S
const uint32_t UBLOX_CFG_SIGNAL_QZSS_L2C_ENA = 0x10310015; // QZSS L2C (only on u-blox F9 platform products)
const uint32_t UBLOX_CFG_SIGNAL_GLO_ENA = 0x10310025; // GLONASS enable
const uint32_t UBLOX_CFG_SIGNAL_GLO_L1_ENA = 0x10310018; // GLONASS L1
const uint32_t UBLOX_CFG_SIGNAL_GLO_L2_ENA = 0x1031001a; // GLONASS L2 (only on u-blox F9 platform products)
//CFG-SPI: Configuration of the SPI interface
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_SPI_MAXFF = 0x20640001; // Number of bytes containing 0xFF to receive before switching off reception. Range: 0 (mechanism off) - 63
const uint32_t UBLOX_CFG_SPI_CPOLARITY = 0x10640002; // Clock polarity select: 0: Active Hight Clock, SCLK idles low, 1: Active Low Clock, SCLK idles high
const uint32_t UBLOX_CFG_SPI_CPHASE = 0x10640003; // Clock phase select: 0: Data captured on first edge of SCLK, 1: Data captured on second edge of SCLK
const uint32_t UBLOX_CFG_SPI_EXTENDEDTIMEOUT = 0x10640005; // Flag to disable timeouting the interface after 1.5s
const uint32_t UBLOX_CFG_SPI_ENABLED = 0x10640006; // Flag to indicate if the SPI interface should be enabled
//CFG-SPIINPROT: Input protocol configuration of the SPI interface
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_SPIINPROT_UBX = 0x10790001; // Flag to indicate if UBX should be an input protocol on SPI
const uint32_t UBLOX_CFG_SPIINPROT_NMEA = 0x10790002; // Flag to indicate if NMEA should be an input protocol on SPI
const uint32_t UBLOX_CFG_SPIINPROT_RTCM3X = 0x10790004; // Flag to indicate if RTCM3X should be an input protocol on SPI
//CFG-SPIOUTPROT: Output protocol configuration of the SPI interface
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_SPIOUTPROT_UBX = 0x107a0001; // Flag to indicate if UBX should be an output protocol on SPI
const uint32_t UBLOX_CFG_SPIOUTPROT_NMEA = 0x107a0002; // Flag to indicate if NMEA should be an output protocol on SPI
const uint32_t UBLOX_CFG_SPIOUTPROT_RTCM3X = 0x107a0004; // Flag to indicate if RTCM3X should be an output protocol on SPI
//CFG-TMODE: Time mode configuration
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_TMODE_MODE = 0x20030001; // Receiver mode
const uint32_t UBLOX_CFG_TMODE_POS_TYPE = 0x20030002; // Determines whether the ARP position is given in ECEF or LAT/LON/HEIGHT?
const uint32_t UBLOX_CFG_TMODE_ECEF_X = 0x40030003; // ECEF X coordinate of the ARP position.
const uint32_t UBLOX_CFG_TMODE_ECEF_Y = 0x40030004; // ECEF Y coordinate of the ARP position.
const uint32_t UBLOX_CFG_TMODE_ECEF_Z = 0x40030005; // ECEF Z coordinate of the ARP position.
const uint32_t UBLOX_CFG_TMODE_ECEF_X_HP = 0x20030006; // High-precision ECEF X coordinate of the ARP position.
const uint32_t UBLOX_CFG_TMODE_ECEF_Y_HP = 0x20030007; // High-precision ECEF Y coordinate of the ARP position.
const uint32_t UBLOX_CFG_TMODE_ECEF_Z_HP = 0x20030008; // High-precision ECEF Z coordinate of the ARP position.
const uint32_t UBLOX_CFG_TMODE_LAT = 0x40030009; // Latitude of the ARP position.
const uint32_t UBLOX_CFG_TMODE_LON = 0x4003000a; // Longitude of the ARP position.
const uint32_t UBLOX_CFG_TMODE_HEIGHT = 0x4003000b; // Height of the ARP position.
const uint32_t UBLOX_CFG_TMODE_LAT_HP = 0x2003000c; // High-precision latitude of the ARP position
const uint32_t UBLOX_CFG_TMODE_LON_HP = 0x2003000d; // High-precision longitude of the ARP position.
const uint32_t UBLOX_CFG_TMODE_HEIGHT_HP = 0x2003000e; // High-precision height of the ARP position.
const uint32_t UBLOX_CFG_TMODE_FIXED_POS_ACC = 0x4003000f; // Fixed position 3D accuracy
const uint32_t UBLOX_CFG_TMODE_SVIN_MIN_DUR = 0x40030010; // Survey-in minimum duration
const uint32_t UBLOX_CFG_TMODE_SVIN_ACC_LIMIT = 0x40030011; // Survey-in position accuracy limit
//CFG-TP: Timepulse configuration
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_TP_PULSE_DEF = 0x20050023; // Determines whether the time pulse is interpreted as frequency or period
const uint32_t UBLOX_CFG_TP_PULSE_LENGTH_DEF = 0x20050030; // Determines whether the time pulse length is interpreted as length[us] or pulse ratio[%]
const uint32_t UBLOX_CFG_TP_FREQ_TP1 = 0x40050024; // Time pulse frequency (TP1)
const uint32_t UBLOX_CFG_TP_FREQ_LOCK_TP1 = 0x40050025; // Time pulse frequency when locked to GNSS time (TP1)
const uint32_t UBLOX_CFG_TP_LEN_TP1 = 0x40050004; // Time pulse length (TP1)
const uint32_t UBLOX_CFG_TP_LEN_LOCK_TP1 = 0x40050005; // Time pulse length when locked to GNSS time (TP1)
const uint32_t UBLOX_CFG_TP_DUTY_TP1 = 0x5005002a; // Time pulse duty cycle (TP1)
const uint32_t UBLOX_CFG_TP_DUTY_LOCK_TP1 = 0x5005002b; // Time pulse duty cycle when locked to GNSS time (TP1)
const uint32_t UBLOX_CFG_TP_USER_DELAY_TP1 = 0x40050006; // User-configurable time pulse delay (TP1)
const uint32_t UBLOX_CFG_TP_TP1_ENA = 0x10050007; // Enable the first timepulse
const uint32_t UBLOX_CFG_TP_SYNC_GNSS_TP1 = 0x10050008; // Sync time pulse to GNSS time or local clock (TP1)
const uint32_t UBLOX_CFG_TP_USE_LOCKED_TP1 = 0x10050009; // Use locked parameters when possible (TP1)
const uint32_t UBLOX_CFG_TP_ALIGN_TO_TOW_TP1 = 0x1005000a; // Align time pulse to top of second (TP1)
const uint32_t UBLOX_CFG_TP_POL_TP1 = 0x1005000b; // Set time pulse polarity (TP1)
const uint32_t UBLOX_CFG_TP_TIMEGRID_TP1 = 0x2005000c; // Time grid to use (TP1)
//CFG-TXREADY: TX ready configuration
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_TXREADY_ENABLED = 0x10a20001; // Flag to indicate if TX ready pin mechanism should be enabled
const uint32_t UBLOX_CFG_TXREADY_POLARITY = 0x10a20002; // The polarity of the TX ready pin: false:high- active, true:low-active
const uint32_t UBLOX_CFG_TXREADY_PIN = 0x20a20003; // Pin number to use for the TX ready functionality
const uint32_t UBLOX_CFG_TXREADY_THRESHOLD = 0x30a20004; // Amount of data that should be ready on the interface before triggering the TX ready pin
const uint32_t UBLOX_CFG_TXREADY_INTERFACE = 0x20a20005; // Interface where the TX ready feature should be linked to
//CFG-UART1: Configuration of the UART1 interface
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_UART1_BAUDRATE = 0x40520001; // The baud rate that should be configured on the UART1
const uint32_t UBLOX_CFG_UART1_STOPBITS = 0x20520002; // Number of stopbits that should be used on UART1
const uint32_t UBLOX_CFG_UART1_DATABITS = 0x20520003; // Number of databits that should be used on UART1
const uint32_t UBLOX_CFG_UART1_PARITY = 0x20520004; // Parity mode that should be used on UART1
const uint32_t UBLOX_CFG_UART1_ENABLED = 0x10520005; // Flag to indicate if the UART1 should be enabled
//CFG-UART1INPROT: Input protocol configuration of the UART1 interface
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_UART1INPROT_UBX = 0x10730001; // Flag to indicate if UBX should be an input protocol on UART1
const uint32_t UBLOX_CFG_UART1INPROT_NMEA = 0x10730002; // Flag to indicate if NMEA should be an input protocol on UART1
const uint32_t UBLOX_CFG_UART1INPROT_RTCM3X = 0x10730004; // Flag to indicate if RTCM3X should be an input protocol on UART1
//CFG-UART1OUTPROT: Output protocol configuration of the UART1 interface
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_UART1OUTPROT_UBX = 0x10740001; // Flag to indicate if UBX should be an output protocol on UART1
const uint32_t UBLOX_CFG_UART1OUTPROT_NMEA = 0x10740002; // Flag to indicate if NMEA should be an output protocol on UART1
const uint32_t UBLOX_CFG_UART1OUTPROT_RTCM3X = 0x10740004; // Flag to indicate if RTCM3X should be an output protocol on UART1
//CFG-UART2: Configuration of the UART2 interface
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_UART2_BAUDRATE = 0x40530001; // The baud rate that should be configured on the UART2
const uint32_t UBLOX_CFG_UART2_STOPBITS = 0x20530002; // Number of stopbits that should be used on UART2
const uint32_t UBLOX_CFG_UART2_DATABITS = 0x20530003; // Number of databits that should be used on UART2
const uint32_t UBLOX_CFG_UART2_PARITY = 0x20530004; // Parity mode that should be used on UART2
const uint32_t UBLOX_CFG_UART2_ENABLED = 0x10530005; // Flag to indicate if the UART2 should be enabled
const uint32_t UBLOX_CFG_UART2_REMAP = 0x10530006; // UART2 Remapping
//CFG-UART2INPROT: Input protocol configuration of the UART2 interface
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_UART2INPROT_UBX = 0x10750001; // Flag to indicate if UBX should be an input protocol on UART2
const uint32_t UBLOX_CFG_UART2INPROT_NMEA = 0x10750002; // Flag to indicate if NMEA should be an input protocol on UART2
const uint32_t UBLOX_CFG_UART2INPROT_RTCM3X = 0x10750004; // Flag to indicate if RTCM3X should be an input protocol on UART2
//CFG-UART2OUTPROT: Output protocol configuration of the UART2 interface
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_UART2OUTPROT_UBX = 0x10760001; // Flag to indicate if UBX should be an output protocol on UART2
const uint32_t UBLOX_CFG_UART2OUTPROT_NMEA = 0x10760002; // Flag to indicate if NMEA should be an output protocol on UART2
const uint32_t UBLOX_CFG_UART2OUTPROT_RTCM3X = 0x10760004; // Flag to indicate if RTCM3X should be an output protocol on UART2
//CFG-USB: Configuration of the USB interface
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_USB_ENABLED = 0x10650001; // Flag to indicate if the USB interface should be enabled
const uint32_t UBLOX_CFG_USB_SELFPOW = 0x10650002; // Self-powered device
const uint32_t UBLOX_CFG_USB_VENDOR_ID = 0x3065000a; // Vendor ID
const uint32_t UBLOX_CFG_USB_PRODUCT_ID = 0x3065000b; // Vendor ID
const uint32_t UBLOX_CFG_USB_POWER = 0x3065000c; // Power consumption
const uint32_t UBLOX_CFG_USB_VENDOR_STR0 = 0x5065000d; // Vendor string characters 0-7
const uint32_t UBLOX_CFG_USB_VENDOR_STR1 = 0x5065000e; // Vendor string characters 8-15
const uint32_t UBLOX_CFG_USB_VENDOR_STR2 = 0x5065000f; // Vendor string characters 16-23
const uint32_t UBLOX_CFG_USB_VENDOR_STR3 = 0x50650010; // Vendor string characters 24-31
const uint32_t UBLOX_CFG_USB_PRODUCT_STR0 = 0x50650011; // Product string characters 0-7
const uint32_t UBLOX_CFG_USB_PRODUCT_STR1 = 0x50650012; // Product string characters 8-15
const uint32_t UBLOX_CFG_USB_PRODUCT_STR2 = 0x50650013; // Product string characters 16-23
const uint32_t UBLOX_CFG_USB_PRODUCT_STR3 = 0x50650014; // Product string characters 24-31
const uint32_t UBLOX_CFG_USB_SERIAL_NO_STR0 = 0x50650015; // Serial number string characters 0-7
const uint32_t UBLOX_CFG_USB_SERIAL_NO_STR1 = 0x50650016; // Serial number string characters 8-15
const uint32_t UBLOX_CFG_USB_SERIAL_NO_STR2 = 0x50650017; // Serial number string characters 16-23
const uint32_t UBLOX_CFG_USB_SERIAL_NO_STR3 = 0x50650018; // Serial number string characters 24-31
//CFG-USBINPROT: Input protocol configuration of the USB interface
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_USBINPROT_UBX = 0x10770001; // Flag to indicate if UBX should be an input protocol on USB
const uint32_t UBLOX_CFG_USBINPROT_NMEA = 0x10770002; // Flag to indicate if NMEA should be an input protocol on USB
const uint32_t UBLOX_CFG_USBINPROT_RTCM3X = 0x10770004; // Flag to indicate if RTCM3X should be an input protocol on USB
//CFG-USBOUTPROT: Output protocol configuration of the USB interface
//-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
const uint32_t UBLOX_CFG_USBOUTPROT_UBX = 0x10780001; // Flag to indicate if UBX should be an output protocol on USB
const uint32_t UBLOX_CFG_USBOUTPROT_NMEA = 0x10780002; // Flag to indicate if NMEA should be an output protocol on USB
const uint32_t UBLOX_CFG_USBOUTPROT_RTCM3X = 0x10780004; // Flag to indicate if RTCM3X should be an output protocol on USB
#endif

1809
lib/axp192/axp20x.cpp Normal file

File diff suppressed because it is too large Load Diff

852
lib/axp192/axp20x.h Normal file
View File

@ -0,0 +1,852 @@
/////////////////////////////////////////////////////////////////
/*
MIT License
Copyright (c) 2019 lewis he
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
axp20x.h - Arduino library for X-Power AXP202 chip.
Created by Lewis he on April 1, 2019.
github:https://github.com/lewisxhe/AXP202X_Libraries
*/
/////////////////////////////////////////////////////////////////
#pragma once
#include <Arduino.h>
#include <Wire.h>
// #define AXP_DEBUG_PORT Serial
#ifdef AXP_DEBUG_PORT
#define AXP_DEBUG(fmt, ...) AXP_DEBUG_PORT.printf_P((PGM_P)PSTR(fmt), ##__VA_ARGS__)
#else
#define AXP_DEBUG(...)
#endif
#ifndef RISING
#define RISING 0x01
#endif
#ifndef FALLING
#define FALLING 0x02
#endif
#ifdef _BV
#undef _BV
#endif
#define _BV(b) (1ULL << (b))
//! Error Code
#define AXP_PASS (0)
#define AXP_FAIL (-1)
#define AXP_INVALID (-2)
#define AXP_NOT_INIT (-3)
#define AXP_NOT_SUPPORT (-4)
#define AXP_ARG_INVALID (-5)
//! Chip Address
#define AXP202_SLAVE_ADDRESS (0x35)
#define AXP192_SLAVE_ADDRESS (0x34)
#define AXP173_SLAVE_ADDRESS (0x34)
//! Chip ID
#define AXP202_CHIP_ID 0x41
#define AXP192_CHIP_ID 0x03
#define AXP173_CHIP_ID 0xAD //!Axp173 does not have a chip ID, given a custom ID
//! Logic states
#define AXP202_ON 1
#define AXP202_OFF 0
//! REG MAP
#define AXP202_STATUS (0x00)
#define AXP202_MODE_CHGSTATUS (0x01)
#define AXP202_OTG_STATUS (0x02)
#define AXP202_IC_TYPE (0x03)
#define AXP202_DATA_BUFFER1 (0x04)
#define AXP202_DATA_BUFFER2 (0x05)
#define AXP202_DATA_BUFFER3 (0x06)
#define AXP202_DATA_BUFFER4 (0x07)
#define AXP202_DATA_BUFFER5 (0x08)
#define AXP202_DATA_BUFFER6 (0x09)
#define AXP202_DATA_BUFFER7 (0x0A)
#define AXP202_DATA_BUFFER8 (0x0B)
#define AXP202_DATA_BUFFER9 (0x0C)
#define AXP202_DATA_BUFFERA (0x0D)
#define AXP202_DATA_BUFFERB (0x0E)
#define AXP202_DATA_BUFFERC (0x0F)
#define AXP202_LDO234_DC23_CTL (0x12)
#define AXP202_DC2OUT_VOL (0x23)
#define AXP202_LDO3_DC2_DVM (0x25)
#define AXP202_DC3OUT_VOL (0x27)
#define AXP202_LDO24OUT_VOL (0x28)
#define AXP202_LDO3OUT_VOL (0x29)
#define AXP202_IPS_SET (0x30)
#define AXP202_VOFF_SET (0x31)
#define AXP202_OFF_CTL (0x32)
#define AXP202_CHARGE1 (0x33)
#define AXP202_CHARGE2 (0x34)
#define AXP202_BACKUP_CHG (0x35)
#define AXP202_POK_SET (0x36)
#define AXP202_DCDC_FREQSET (0x37)
#define AXP202_VLTF_CHGSET (0x38)
#define AXP202_VHTF_CHGSET (0x39)
#define AXP202_APS_WARNING1 (0x3A)
#define AXP202_APS_WARNING2 (0x3B)
#define AXP202_TLTF_DISCHGSET (0x3C)
#define AXP202_THTF_DISCHGSET (0x3D)
#define AXP202_DCDC_MODESET (0x80)
#define AXP202_ADC_EN1 (0x82)
#define AXP202_ADC_EN2 (0x83)
#define AXP202_ADC_SPEED (0x84)
#define AXP202_ADC_INPUTRANGE (0x85)
#define AXP202_ADC_IRQ_RETFSET (0x86)
#define AXP202_ADC_IRQ_FETFSET (0x87)
#define AXP202_TIMER_CTL (0x8A)
#define AXP202_VBUS_DET_SRP (0x8B)
#define AXP202_HOTOVER_CTL (0x8F)
#define AXP202_GPIO0_CTL (0x90)
#define AXP202_GPIO0_VOL (0x91)
#define AXP202_GPIO1_CTL (0x92)
#define AXP202_GPIO2_CTL (0x93)
#define AXP202_GPIO012_SIGNAL (0x94)
#define AXP202_GPIO3_CTL (0x95)
#define AXP202_INTEN1 (0x40)
#define AXP202_INTEN2 (0x41)
#define AXP202_INTEN3 (0x42)
#define AXP202_INTEN4 (0x43)
#define AXP202_INTEN5 (0x44)
#define AXP202_INTSTS1 (0x48)
#define AXP202_INTSTS2 (0x49)
#define AXP202_INTSTS3 (0x4A)
#define AXP202_INTSTS4 (0x4B)
#define AXP202_INTSTS5 (0x4C)
//Irq control register
#define AXP192_INTEN1 (0x40)
#define AXP192_INTEN2 (0x41)
#define AXP192_INTEN3 (0x42)
#define AXP192_INTEN4 (0x43)
#define AXP192_INTEN5 (0x4A)
//Irq status register
#define AXP192_INTSTS1 (0x44)
#define AXP192_INTSTS2 (0x45)
#define AXP192_INTSTS3 (0x46)
#define AXP192_INTSTS4 (0x47)
#define AXP192_INTSTS5 (0x4D)
#define AXP192_DC1_VLOTAGE (0x26)
#define AXP192_LDO23OUT_VOL (0x28)
#define AXP192_GPIO0_CTL (0x90)
#define AXP192_GPIO0_VOL (0x91)
#define AXP192_GPIO1_CTL (0X92)
#define AXP192_GPIO2_CTL (0x93)
#define AXP192_GPIO012_SIGNAL (0x94)
#define AXP192_GPIO34_CTL (0x95)
/* axp 192/202 adc data register */
#define AXP202_BAT_AVERVOL_H8 (0x78)
#define AXP202_BAT_AVERVOL_L4 (0x79)
#define AXP202_BAT_AVERCHGCUR_H8 (0x7A)
#define AXP202_BAT_AVERCHGCUR_L4 (0x7B)
#define AXP202_BAT_AVERCHGCUR_L5 (0x7B)
#define AXP202_ACIN_VOL_H8 (0x56)
#define AXP202_ACIN_VOL_L4 (0x57)
#define AXP202_ACIN_CUR_H8 (0x58)
#define AXP202_ACIN_CUR_L4 (0x59)
#define AXP202_VBUS_VOL_H8 (0x5A)
#define AXP202_VBUS_VOL_L4 (0x5B)
#define AXP202_VBUS_CUR_H8 (0x5C)
#define AXP202_VBUS_CUR_L4 (0x5D)
#define AXP202_INTERNAL_TEMP_H8 (0x5E)
#define AXP202_INTERNAL_TEMP_L4 (0x5F)
#define AXP202_TS_IN_H8 (0x62)
#define AXP202_TS_IN_L4 (0x63)
#define AXP202_GPIO0_VOL_ADC_H8 (0x64)
#define AXP202_GPIO0_VOL_ADC_L4 (0x65)
#define AXP202_GPIO1_VOL_ADC_H8 (0x66)
#define AXP202_GPIO1_VOL_ADC_L4 (0x67)
#define AXP202_BAT_AVERDISCHGCUR_H8 (0x7C)
#define AXP202_BAT_AVERDISCHGCUR_L5 (0x7D)
#define AXP202_APS_AVERVOL_H8 (0x7E)
#define AXP202_APS_AVERVOL_L4 (0x7F)
#define AXP202_INT_BAT_CHGCUR_H8 (0xA0)
#define AXP202_INT_BAT_CHGCUR_L4 (0xA1)
#define AXP202_EXT_BAT_CHGCUR_H8 (0xA2)
#define AXP202_EXT_BAT_CHGCUR_L4 (0xA3)
#define AXP202_INT_BAT_DISCHGCUR_H8 (0xA4)
#define AXP202_INT_BAT_DISCHGCUR_L4 (0xA5)
#define AXP202_EXT_BAT_DISCHGCUR_H8 (0xA6)
#define AXP202_EXT_BAT_DISCHGCUR_L4 (0xA7)
#define AXP202_BAT_CHGCOULOMB3 (0xB0)
#define AXP202_BAT_CHGCOULOMB2 (0xB1)
#define AXP202_BAT_CHGCOULOMB1 (0xB2)
#define AXP202_BAT_CHGCOULOMB0 (0xB3)
#define AXP202_BAT_DISCHGCOULOMB3 (0xB4)
#define AXP202_BAT_DISCHGCOULOMB2 (0xB5)
#define AXP202_BAT_DISCHGCOULOMB1 (0xB6)
#define AXP202_BAT_DISCHGCOULOMB0 (0xB7)
#define AXP202_COULOMB_CTL (0xB8)
#define AXP202_BAT_POWERH8 (0x70)
#define AXP202_BAT_POWERM8 (0x71)
#define AXP202_BAT_POWERL8 (0x72)
#define AXP202_VREF_TEM_CTRL (0xF3)
#define AXP202_BATT_PERCENTAGE (0xB9)
/* bit definitions for AXP events, irq event */
/* AXP202 */
#define AXP202_IRQ_USBLO (1)
#define AXP202_IRQ_USBRE (2)
#define AXP202_IRQ_USBIN (3)
#define AXP202_IRQ_USBOV (4)
#define AXP202_IRQ_ACRE (5)
#define AXP202_IRQ_ACIN (6)
#define AXP202_IRQ_ACOV (7)
#define AXP202_IRQ_TEMLO (8)
#define AXP202_IRQ_TEMOV (9)
#define AXP202_IRQ_CHAOV (10)
#define AXP202_IRQ_CHAST (11)
#define AXP202_IRQ_BATATOU (12)
#define AXP202_IRQ_BATATIN (13)
#define AXP202_IRQ_BATRE (14)
#define AXP202_IRQ_BATIN (15)
#define AXP202_IRQ_POKLO (16)
#define AXP202_IRQ_POKSH (17)
#define AXP202_IRQ_LDO3LO (18)
#define AXP202_IRQ_DCDC3LO (19)
#define AXP202_IRQ_DCDC2LO (20)
#define AXP202_IRQ_CHACURLO (22)
#define AXP202_IRQ_ICTEMOV (23)
#define AXP202_IRQ_EXTLOWARN2 (24)
#define AXP202_IRQ_EXTLOWARN1 (25)
#define AXP202_IRQ_SESSION_END (26)
#define AXP202_IRQ_SESS_AB_VALID (27)
#define AXP202_IRQ_VBUS_UN_VALID (28)
#define AXP202_IRQ_VBUS_VALID (29)
#define AXP202_IRQ_PDOWN_BY_NOE (30)
#define AXP202_IRQ_PUP_BY_NOE (31)
#define AXP202_IRQ_GPIO0TG (32)
#define AXP202_IRQ_GPIO1TG (33)
#define AXP202_IRQ_GPIO2TG (34)
#define AXP202_IRQ_GPIO3TG (35)
#define AXP202_IRQ_PEKFE (37)
#define AXP202_IRQ_PEKRE (38)
#define AXP202_IRQ_TIMER (39)
//Signal Capture
#define AXP202_BATT_VOLTAGE_STEP (1.1F)
#define AXP202_BATT_DISCHARGE_CUR_STEP (0.5F)
#define AXP202_BATT_CHARGE_CUR_STEP (0.5F)
#define AXP202_ACIN_VOLTAGE_STEP (1.7F)
#define AXP202_ACIN_CUR_STEP (0.625F)
#define AXP202_VBUS_VOLTAGE_STEP (1.7F)
#define AXP202_VBUS_CUR_STEP (0.375F)
#define AXP202_INTERNAL_TEMP_STEP (0.1F)
#define AXP202_APS_VOLTAGE_STEP (1.4F)
#define AXP202_TS_PIN_OUT_STEP (0.8F)
#define AXP202_GPIO0_STEP (0.5F)
#define AXP202_GPIO1_STEP (0.5F)
// AXP192 only
#define AXP202_GPIO2_STEP (0.5F)
#define AXP202_GPIO3_STEP (0.5F)
// AXP173
#define AXP173_EXTEN_DC2_CTL (0x10)
#define AXP173_CTL_DC2_BIT (0)
#define AXP173_CTL_EXTEN_BIT (2)
#define AXP173_DC1_VLOTAGE (0x26)
#define AXP173_LDO4_VLOTAGE (0x27)
#define FORCED_OPEN_DCDC3(x) (x |= (AXP202_ON << AXP202_DCDC3))
#define BIT_MASK(x) (1 << x)
#define IS_OPEN(reg, channel) (bool)(reg & BIT_MASK(channel))
enum {
AXP202_EXTEN = 0,
AXP202_DCDC3 = 1,
AXP202_LDO2 = 2,
AXP202_LDO4 = 3,
AXP202_DCDC2 = 4,
AXP202_LDO3 = 6,
AXP202_OUTPUT_MAX,
};
enum {
AXP192_DCDC1 = 0,
AXP192_DCDC3 = 1,
AXP192_LDO2 = 2,
AXP192_LDO3 = 3,
AXP192_DCDC2 = 4,
AXP192_EXTEN = 6,
AXP192_OUTPUT_MAX,
};
enum {
AXP173_DCDC1 = 0,
AXP173_LDO4 = 1,
AXP173_LDO2 = 2,
AXP173_LDO3 = 3,
AXP173_DCDC2 = 4,
AXP173_EXTEN = 6,
AXP173_OUTPUT_MAX,
};
typedef enum {
AXP202_STARTUP_TIME_128MS,
AXP202_STARTUP_TIME_3S,
AXP202_STARTUP_TIME_1S,
AXP202_STARTUP_TIME_2S,
} axp202_startup_time_t;
typedef enum {
AXP192_STARTUP_TIME_128MS,
AXP192_STARTUP_TIME_512MS,
AXP192_STARTUP_TIME_1S,
AXP192_STARTUP_TIME_2S,
} axp192_startup_time_t;
typedef enum {
AXP_LONGPRESS_TIME_1S,
AXP_LONGPRESS_TIME_1S5,
AXP_LONGPRESS_TIME_2S,
AXP_LONGPRESS_TIME_2S5,
} axp_loonPress_time_t;
typedef enum {
AXP_POWER_OFF_TIME_4S,
AXP_POWER_OFF_TIME_65,
AXP_POWER_OFF_TIME_8S,
AXP_POWER_OFF_TIME_16S,
} axp_poweroff_time_t;
//REG 33H: Charging control 1 Charging target-voltage setting
typedef enum {
AXP202_TARGET_VOL_4_1V,
AXP202_TARGET_VOL_4_15V,
AXP202_TARGET_VOL_4_2V,
AXP202_TARGET_VOL_4_36V
} axp_chargeing_vol_t;
//REG 82H: ADC Enable 1 register Parameter
typedef enum {
AXP202_BATT_VOL_ADC1 = 1 << 7,
AXP202_BATT_CUR_ADC1 = 1 << 6,
AXP202_ACIN_VOL_ADC1 = 1 << 5,
AXP202_ACIN_CUR_ADC1 = 1 << 4,
AXP202_VBUS_VOL_ADC1 = 1 << 3,
AXP202_VBUS_CUR_ADC1 = 1 << 2,
AXP202_APS_VOL_ADC1 = 1 << 1,
AXP202_TS_PIN_ADC1 = 1 << 0
} axp_adc1_func_t;
// REG 83H: ADC Enable 2 register Parameter
typedef enum {
AXP202_TEMP_MONITORING_ADC2 = 1 << 7,
AXP202_GPIO1_FUNC_ADC2 = 1 << 3,
AXP202_GPIO0_FUNC_ADC2 = 1 << 2
} axp_adc2_func_t;
typedef enum {
AXP202_LDO3_MODE_LDO,
AXP202_LDO3_MODE_DCIN
} axp202_ldo3_mode_t;
typedef enum {
//! IRQ1 REG 40H
AXP202_VBUS_VHOLD_LOW_IRQ = _BV(1), //VBUS is available, but lower than V HOLD, IRQ enable
AXP202_VBUS_REMOVED_IRQ = _BV(2), //VBUS removed, IRQ enable
AXP202_VBUS_CONNECT_IRQ = _BV(3), //VBUS connected, IRQ enable
AXP202_VBUS_OVER_VOL_IRQ = _BV(4), //VBUS over-voltage, IRQ enable
AXP202_ACIN_REMOVED_IRQ = _BV(5), //ACIN removed, IRQ enable
AXP202_ACIN_CONNECT_IRQ = _BV(6), //ACIN connected, IRQ enable
AXP202_ACIN_OVER_VOL_IRQ = _BV(7), //ACIN over-voltage, IRQ enable
//! IRQ2 REG 41H
AXP202_BATT_LOW_TEMP_IRQ = _BV(8), //Battery low-temperature, IRQ enable
AXP202_BATT_OVER_TEMP_IRQ = _BV(9), //Battery over-temperature, IRQ enable
AXP202_CHARGING_FINISHED_IRQ = _BV(10), //Charge finished, IRQ enable
AXP202_CHARGING_IRQ = _BV(11), //Be charging, IRQ enable
AXP202_BATT_EXIT_ACTIVATE_IRQ = _BV(12), //Exit battery activate mode, IRQ enable
AXP202_BATT_ACTIVATE_IRQ = _BV(13), //Battery activate mode, IRQ enable
AXP202_BATT_REMOVED_IRQ = _BV(14), //Battery removed, IRQ enable
AXP202_BATT_CONNECT_IRQ = _BV(15), //Battery connected, IRQ enable
//! IRQ3 REG 42H
AXP202_PEK_LONGPRESS_IRQ = _BV(16), //PEK long press, IRQ enable
AXP202_PEK_SHORTPRESS_IRQ = _BV(17), //PEK short press, IRQ enable
AXP202_LDO3_LOW_VOL_IRQ = _BV(18), //LDO3output voltage is lower than the set value, IRQ enable
AXP202_DC3_LOW_VOL_IRQ = _BV(19), //DC-DC3output voltage is lower than the set value, IRQ enable
AXP202_DC2_LOW_VOL_IRQ = _BV(20), //DC-DC2 output voltage is lower than the set value, IRQ enable
//**Reserved and unchangeable BIT 5
AXP202_CHARGE_LOW_CUR_IRQ = _BV(22), //Charge current is lower than the set current, IRQ enable
AXP202_CHIP_TEMP_HIGH_IRQ = _BV(23), //AXP202 internal over-temperature, IRQ enable
//! IRQ4 REG 43H
AXP202_APS_LOW_VOL_LEVEL2_IRQ = _BV(24), //APS low-voltage, IRQ enableLEVEL2
APX202_APS_LOW_VOL_LEVEL1_IRQ = _BV(25), //APS low-voltage, IRQ enableLEVEL1
AXP202_VBUS_SESSION_END_IRQ = _BV(26), //VBUS Session End IRQ enable
AXP202_VBUS_SESSION_AB_IRQ = _BV(27), //VBUS Session A/B IRQ enable
AXP202_VBUS_INVALID_IRQ = _BV(28), //VBUS invalid, IRQ enable
AXP202_VBUS_VAILD_IRQ = _BV(29), //VBUS valid, IRQ enable
AXP202_NOE_OFF_IRQ = _BV(30), //N_OE shutdown, IRQ enable
AXP202_NOE_ON_IRQ = _BV(31), //N_OE startup, IRQ enable
//! IRQ5 REG 44H
AXP202_GPIO0_EDGE_TRIGGER_IRQ = _BV(32), //GPIO0 input edge trigger, IRQ enable
AXP202_GPIO1_EDGE_TRIGGER_IRQ = _BV(33), //GPIO1input edge trigger or ADC input, IRQ enable
AXP202_GPIO2_EDGE_TRIGGER_IRQ = _BV(34), //GPIO2input edge trigger, IRQ enable
AXP202_GPIO3_EDGE_TRIGGER_IRQ = _BV(35), //GPIO3 input edge trigger, IRQ enable
//**Reserved and unchangeable BIT 4
AXP202_PEK_FALLING_EDGE_IRQ = _BV(37), //PEK press falling edge, IRQ enable
AXP202_PEK_RISING_EDGE_IRQ = _BV(38), //PEK press rising edge, IRQ enable
AXP202_TIMER_TIMEOUT_IRQ = _BV(39), //Timer timeout, IRQ enable
AXP202_ALL_IRQ = (0xFFFFFFFFFFULL)
} axp_irq_t;
typedef enum {
AXP202_LDO4_1250MV,
AXP202_LDO4_1300MV,
AXP202_LDO4_1400MV,
AXP202_LDO4_1500MV,
AXP202_LDO4_1600MV,
AXP202_LDO4_1700MV,
AXP202_LDO4_1800MV,
AXP202_LDO4_1900MV,
AXP202_LDO4_2000MV,
AXP202_LDO4_2500MV,
AXP202_LDO4_2700MV,
AXP202_LDO4_2800MV,
AXP202_LDO4_3000MV,
AXP202_LDO4_3100MV,
AXP202_LDO4_3200MV,
AXP202_LDO4_3300MV,
AXP202_LDO4_MAX,
} axp_ldo4_table_t;
typedef enum {
AXP202_LDO5_1800MV,
AXP202_LDO5_2500MV,
AXP202_LDO5_2800MV,
AXP202_LDO5_3000MV,
AXP202_LDO5_3100MV,
AXP202_LDO5_3300MV,
AXP202_LDO5_3400MV,
AXP202_LDO5_3500MV,
} axp_ldo5_table_t;
typedef enum {
AXP20X_LED_OFF,
AXP20X_LED_BLINK_1HZ,
AXP20X_LED_BLINK_4HZ,
AXP20X_LED_LOW_LEVEL,
} axp_chgled_mode_t;
typedef enum {
AXP_ADC_SAMPLING_RATE_25HZ = 0,
AXP_ADC_SAMPLING_RATE_50HZ = 1,
AXP_ADC_SAMPLING_RATE_100HZ = 2,
AXP_ADC_SAMPLING_RATE_200HZ = 3,
} axp_adc_sampling_rate_t;
typedef enum {
AXP_TS_PIN_CURRENT_20UA = 0,
AXP_TS_PIN_CURRENT_40UA = 1,
AXP_TS_PIN_CURRENT_60UA = 2,
AXP_TS_PIN_CURRENT_80UA = 3,
} axp_ts_pin_current_t;
typedef enum {
AXP_TS_PIN_FUNCTION_BATT = 0,
AXP_TS_PIN_FUNCTION_ADC = 1,
} axp_ts_pin_function_t;
typedef enum {
AXP_TS_PIN_MODE_DISABLE = 0,
AXP_TS_PIN_MODE_CHARGING = 1,
AXP_TS_PIN_MODE_SAMPLING = 2,
AXP_TS_PIN_MODE_ENABLE = 3,
} axp_ts_pin_mode_t;
//! Only AXP192 and AXP202 have gpio function
typedef enum {
AXP_GPIO_0,
AXP_GPIO_1,
AXP_GPIO_2,
AXP_GPIO_3,
AXP_GPIO_4,
} axp_gpio_t;
typedef enum {
AXP_IO_OUTPUT_LOW_MODE,
AXP_IO_OUTPUT_HIGH_MODE,
AXP_IO_INPUT_MODE,
AXP_IO_LDO_MODE,
AXP_IO_ADC_MODE,
AXP_IO_FLOATING_MODE,
AXP_IO_OPEN_DRAIN_OUTPUT_MODE,
AXP_IO_PWM_OUTPUT_MODE,
AXP_IO_EXTERN_CHARGING_CTRL_MODE,
} axp_gpio_mode_t;
typedef enum {
AXP_IRQ_NONE,
AXP_IRQ_RISING,
AXP_IRQ_FALLING,
AXP_IRQ_DOUBLE_EDGE,
} axp_gpio_irq_t;
typedef enum {
AXP192_GPIO_1V8,
AXP192_GPIO_1V9,
AXP192_GPIO_2V0,
AXP192_GPIO_2V1,
AXP192_GPIO_2V2,
AXP192_GPIO_2V3,
AXP192_GPIO_2V4,
AXP192_GPIO_2V5,
AXP192_GPIO_2V6,
AXP192_GPIO_2V7,
AXP192_GPIO_2V8,
AXP192_GPIO_2V9,
AXP192_GPIO_3V0,
AXP192_GPIO_3V1,
AXP192_GPIO_3V2,
AXP192_GPIO_3V3,
} axp192_gpio_voltage_t;
typedef enum {
AXP1XX_CHARGE_CUR_100MA,
AXP1XX_CHARGE_CUR_190MA,
AXP1XX_CHARGE_CUR_280MA,
AXP1XX_CHARGE_CUR_360MA,
AXP1XX_CHARGE_CUR_450MA,
AXP1XX_CHARGE_CUR_550MA,
AXP1XX_CHARGE_CUR_630MA,
AXP1XX_CHARGE_CUR_700MA,
AXP1XX_CHARGE_CUR_780MA,
AXP1XX_CHARGE_CUR_880MA,
AXP1XX_CHARGE_CUR_960MA,
AXP1XX_CHARGE_CUR_1000MA,
AXP1XX_CHARGE_CUR_1080MA,
AXP1XX_CHARGE_CUR_1160MA,
AXP1XX_CHARGE_CUR_1240MA,
AXP1XX_CHARGE_CUR_1320MA,
} axp1xx_charge_current_t;
typedef uint8_t (*axp_com_fptr_t)(uint8_t dev_addr, uint8_t reg_addr, uint8_t *data, uint8_t len);
/**
* A common baseclass for any component that can provide a battery charge level
*/
class HasBatteryLevel {
public:
/**
* Battery state of charge, from 0 to 100 or -1 for unknown
*/
virtual int getBattPercentage() { return -1; }
/**
* The raw voltage of the battery or NAN if unknown
*/
virtual float getBattVoltage() { return NAN; }
/**
* return true if there is a battery installed in this unit
*/
virtual bool isBatteryConnect() { return false; }
virtual bool isVBUSPlug() { return false; }
virtual bool isChargeing() { return false; }
};
class AXP20X_Class : public HasBatteryLevel
{
public:
int begin(TwoWire &port = Wire, uint8_t addr = AXP202_SLAVE_ADDRESS, bool isAxp173 = false);
int begin(axp_com_fptr_t read_cb, axp_com_fptr_t write_cb, uint8_t addr = AXP202_SLAVE_ADDRESS, bool isAxp173 = false);
// Power Output Control
int setPowerOutPut(uint8_t ch, bool en);
bool isBatteryConnect();
bool isChargeing();
bool isLDO2Enable();
bool isLDO3Enable();
bool isLDO4Enable();
bool isDCDC3Enable();
bool isDCDC2Enable();
bool isChargeingEnable();
bool isVBUSPlug();
bool isExtenEnable();
//Only axp192 chip
bool isDCDC1Enable();
//IRQ Status
bool isAcinOverVoltageIRQ();
bool isAcinPlugInIRQ();
bool isAcinRemoveIRQ();
bool isVbusOverVoltageIRQ();
bool isVbusPlugInIRQ();
bool isVbusRemoveIRQ();
bool isVbusLowVHOLDIRQ();
bool isBattPlugInIRQ();
bool isBattRemoveIRQ();
bool isBattEnterActivateIRQ();
bool isBattExitActivateIRQ();
bool isChargingIRQ();
bool isChargingDoneIRQ();
bool isBattTempLowIRQ();
bool isBattTempHighIRQ();
bool isPEKShortPressIRQ();
bool isPEKLongtPressIRQ();
bool isTimerTimeoutIRQ();
//! Group4 ADC data
float getAcinVoltage();
float getAcinCurrent();
float getVbusVoltage();
float getVbusCurrent();
float getTemp();
float getTSTemp();
float getGPIO0Voltage();
float getGPIO1Voltage();
float getBattInpower();
float getBattVoltage();
float getBattChargeCurrent();
float getBattDischargeCurrent();
float getSysIPSOUTVoltage();
uint32_t getBattChargeCoulomb();
uint32_t getBattDischargeCoulomb();
float getSettingChargeCurrent();
int setChargingTargetVoltage(axp_chargeing_vol_t param);
int enableChargeing(bool en);
int adc1Enable(uint16_t params, bool en);
int adc2Enable(uint16_t params, bool en);
int setTScurrent(axp_ts_pin_current_t current);
int setTSfunction(axp_ts_pin_function_t func);
int setTSmode(axp_ts_pin_mode_t mode);
int setTimer(uint8_t minutes);
int offTimer();
int clearTimerStatus();
/**
* param: axp202_startup_time_t or axp192_startup_time_t
*/
int setStartupTime(uint8_t param);
/**
* param: axp_loonPress_time_t
*/
int setlongPressTime(uint8_t param);
/**
* @param param: axp_poweroff_time_t
*/
int setShutdownTime(uint8_t param);
int setTimeOutShutdown(bool en);
int shutdown();
/**
* params: axp_irq_t
*/
int enableIRQ(uint64_t params, bool en);
int readIRQ();
void clearIRQ();
int setDCDC1Voltage(uint16_t mv); //! Only AXP192 support and AXP173
// return mv
uint16_t getDCDC1Voltage(); //! Only AXP192 support and AXP173
// -----------------
/*
!! Chip resource table
| CHIP | AXP173 | AXP192 | AXP202 |
| -------- | ---------------- | ---------------- | ---------------- |
| DC1 | 0v7~3v5 /1200mA | 0v7~3v5 /1200mA | X |
| DC2 | 0v7~2v275/1600mA | 0v7~2v275/1600mA | 0v7~2v275/1600mA |
| DC3 | X | 0v7~3v5 /700mA | 0v7~3v5 /1200mA |
| LDO1 | 3v3 /30mA | 3v3 /30mA | 3v3 /30mA |
| LDO2 | 1v8~3v3 /200mA | 1v8~3v3 /200mA | 1v8~3v3 /200mA |
| LDO3 | 1v8~3v3 /200mA | 1v8~3v3 /200mA | 0v7~3v3 /200mA |
| LDO4 | 0v7~3v5 /500mA | X | 1v8~3v3 /200mA |
| LDO5/IO0 | X | 1v8~3v3 /50mA | 1v8~3v3 /50mA |
*/
int setDCDC2Voltage(uint16_t mv);
uint16_t getDCDC2Voltage();
int setDCDC3Voltage(uint16_t mv);
uint16_t getDCDC3Voltage();
int setLDO2Voltage(uint16_t mv);
uint16_t getLDO2Voltage();
int setLDO3Voltage(uint16_t mv);
uint16_t getLDO3Voltage();
int setLDO4Voltage(axp_ldo4_table_t param); //! Only axp202 support
int setLDO4Voltage(uint16_t mv); //! Only axp173 support
// return mv
uint16_t getLDO4Voltage(); //! Only axp173/axp202 support
/**
* @param mode: axp_chgled_mode_t
*/
int setChgLEDMode(axp_chgled_mode_t mode);
int setChgLEDModeCharging();
/**
* @param mode: axp202_ldo3_mode_t
*/
int setLDO3Mode(uint8_t mode); //! Only AXP202 support
int getBattPercentage();
int debugCharging();
int debugStatus();
int limitingOff();
int setAdcSamplingRate(axp_adc_sampling_rate_t rate);
uint8_t getAdcSamplingRate();
float getCoulombData();
uint8_t getCoulombRegister();
int setCoulombRegister(uint8_t val);
int EnableCoulombcounter(void);
int DisableCoulombcounter(void);
int StopCoulombcounter(void);
int ClearCoulombcounter(void);
int setGPIOMode(axp_gpio_t gpio, axp_gpio_mode_t mode);
int setGPIOIrq(axp_gpio_t gpio, axp_gpio_irq_t irq);
int setLDO5Voltage(axp_ldo5_table_t vol);
int gpioWrite(axp_gpio_t gpio, uint8_t vol);
int gpioRead(axp_gpio_t gpio);
// When the chip is axp192 / 173, the allowed values are 0 ~ 15, corresponding to the axp1xx_charge_current_t enumeration
// When the chip is axp202 allows maximum charging current of 1800mA, minimum 300mA
int getChargeControlCur();
int setChargeControlCur(uint16_t mA);
private:
uint16_t _getRegistH8L5(uint8_t regh8, uint8_t regl5)
{
uint8_t hv, lv;
_readByte(regh8, 1, &hv);
_readByte(regl5, 1, &lv);
return (hv << 5) | (lv & 0x1F);
}
uint16_t _getRegistResult(uint8_t regh8, uint8_t regl4)
{
uint8_t hv, lv;
_readByte(regh8, 1, &hv);
_readByte(regl4, 1, &lv);
return (hv << 4) | (lv & 0x0F);
}
int _readByte(uint8_t reg, uint8_t nbytes, uint8_t *data)
{
if (_read_cb != nullptr) {
return _read_cb(_address, reg, data, nbytes);
}
if (nbytes == 0 || !data)
return -1;
_i2cPort->beginTransmission(_address);
_i2cPort->write(reg);
_i2cPort->endTransmission();
_i2cPort->requestFrom(_address, nbytes);
uint8_t index = 0;
while (_i2cPort->available())
data[index++] = _i2cPort->read();
return 0;
}
int _writeByte(uint8_t reg, uint8_t nbytes, uint8_t *data)
{
if (_write_cb != nullptr) {
return _write_cb(_address, reg, data, nbytes);
}
if (nbytes == 0 || !data)
return -1;
_i2cPort->beginTransmission(_address);
_i2cPort->write(reg);
for (uint8_t i = 0; i < nbytes; i++) {
_i2cPort->write(data[i]);
}
_i2cPort->endTransmission();
return 0;
}
int _setGpioInterrupt(uint8_t *val, int mode, bool en);
int _axp_probe();
int _axp_irq_mask(axp_gpio_irq_t irq);
int _axp192_gpio_set(axp_gpio_t gpio, axp_gpio_mode_t mode);
int _axp192_gpio_0_select( axp_gpio_mode_t mode);
int _axp192_gpio_1_select( axp_gpio_mode_t mode);
int _axp192_gpio_3_select( axp_gpio_mode_t mode);
int _axp192_gpio_4_select( axp_gpio_mode_t mode);
int _axp202_gpio_set(axp_gpio_t gpio, axp_gpio_mode_t mode);
int _axp202_gpio_0_select( axp_gpio_mode_t mode);
int _axp202_gpio_1_select( axp_gpio_mode_t mode);
int _axp202_gpio_2_select( axp_gpio_mode_t mode);
int _axp202_gpio_3_select( axp_gpio_mode_t mode);
int _axp202_gpio_irq_set(axp_gpio_t gpio, axp_gpio_irq_t irq);
int _axp202_gpio_write(axp_gpio_t gpio, uint8_t val);
int _axp202_gpio_read(axp_gpio_t gpio);
static const uint8_t startupParams[], longPressParams[], shutdownParams[], targetVolParams[];
static uint8_t _outputReg;
uint8_t _address, _irq[5], _chip_id, _gpio[4];
bool _init = false;
axp_com_fptr_t _read_cb = nullptr;
axp_com_fptr_t _write_cb = nullptr;
TwoWire *_i2cPort;
bool _isAxp173;
};

View File

@ -0,0 +1,241 @@
/**
* @file lvgl_helpers.c
*
*/
/*********************
* INCLUDES
*********************/
#include "sdkconfig.h"
#include "lv_conf.h"
#include "lvgl_helpers.h"
#include "esp_log.h"
#include "lvgl_tft/disp_spi.h"
#include "lvgl_touch/tp_spi.h"
#include "lvgl_spi_conf.h"
#include "lvgl_i2c_conf.h"
#include "driver/i2c.h"
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "src/lv_core/lv_refr.h"
#else
#include "lvgl/src/lv_core/lv_refr.h"
#endif
/*********************
* DEFINES
*********************/
#define TAG "lvgl_helpers"
/**********************
* TYPEDEFS
**********************/
/**********************
* STATIC PROTOTYPES
**********************/
/**********************
* STATIC VARIABLES
**********************/
/**********************
* MACROS
**********************/
/**********************
* GLOBAL FUNCTIONS
**********************/
/* Interface and driver initialization */
void lvgl_driver_init(void)
{
ESP_LOGI(TAG, "Display hor size: %d, ver size: %d", LV_HOR_RES_MAX, LV_VER_RES_MAX);
ESP_LOGI(TAG, "Display buffer size: %d", DISP_BUF_SIZE);
#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X)
ESP_LOGI(TAG, "Initializing SPI master for FT81X");
lvgl_spi_driver_init(TFT_SPI_HOST,
DISP_SPI_MISO, DISP_SPI_MOSI, DISP_SPI_CLK,
SPI_BUS_MAX_TRANSFER_SZ, 1,
DISP_SPI_IO2, DISP_SPI_IO3);
disp_spi_add_device(TFT_SPI_HOST);
disp_driver_init();
#if defined (CONFIG_LV_TOUCH_CONTROLLER_FT81X)
touch_driver_init();
#endif
return;
#endif
#if defined (SHARED_SPI_BUS)
ESP_LOGI(TAG, "Initializing shared SPI master");
lvgl_spi_driver_init(TFT_SPI_HOST,
TP_SPI_MISO, DISP_SPI_MOSI, DISP_SPI_CLK,
SPI_BUS_MAX_TRANSFER_SZ, 1,
-1, -1);
disp_spi_add_device(TFT_SPI_HOST);
tp_spi_add_device(TOUCH_SPI_HOST);
disp_driver_init();
touch_driver_init();
return;
#endif
#if defined (SHARED_I2C_BUS)
ESP_LOGI(TAG, "Initializing shared I2C master");
lvgl_i2c_driver_init(DISP_I2C_PORT,
DISP_I2C_SDA, DISP_I2C_SCL,
DISP_I2C_SPEED_HZ);
disp_driver_init();
touch_driver_init();
return;
#endif
/* Display controller initialization */
#if defined CONFIG_LV_TFT_DISPLAY_PROTOCOL_SPI
ESP_LOGI(TAG, "Initializing SPI master for display");
lvgl_spi_driver_init(TFT_SPI_HOST,
DISP_SPI_MISO, DISP_SPI_MOSI, DISP_SPI_CLK,
SPI_BUS_MAX_TRANSFER_SZ, 1,
DISP_SPI_IO2, DISP_SPI_IO3);
disp_spi_add_device(TFT_SPI_HOST);
disp_driver_init();
#elif defined (CONFIG_LV_TFT_DISPLAY_PROTOCOL_I2C)
ESP_LOGI(TAG, "Initializing I2C master for display");
/* Init the i2c master on the display driver code */
lvgl_i2c_driver_init(DISP_I2C_PORT,
DISP_I2C_SDA, DISP_I2C_SCL,
DISP_I2C_SPEED_HZ);
disp_driver_init();
#else
#error "No protocol defined for display controller"
#endif
/* Touch controller initialization */
#if CONFIG_LV_TOUCH_CONTROLLER != TOUCH_CONTROLLER_NONE
#if defined (CONFIG_LV_TOUCH_DRIVER_PROTOCOL_SPI)
ESP_LOGI(TAG, "Initializing SPI master for touch");
lvgl_spi_driver_init(TOUCH_SPI_HOST,
TP_SPI_MISO, TP_SPI_MOSI, TP_SPI_CLK,
0 /* Defaults to 4094 */, 2,
-1, -1);
tp_spi_add_device(TOUCH_SPI_HOST);
touch_driver_init();
#elif defined (CONFIG_LV_TOUCH_DRIVER_PROTOCOL_I2C)
ESP_LOGI(TAG, "Initializing I2C master for touch");
lvgl_i2c_driver_init(TOUCH_I2C_PORT,
TOUCH_I2C_SDA, TOUCH_I2C_SCL,
TOUCH_I2C_SPEED_HZ);
touch_driver_init();
#elif defined (CONFIG_LV_TOUCH_DRIVER_ADC)
touch_driver_init();
#elif defined (CONFIG_LV_TOUCH_DRIVER_DISPLAY)
touch_driver_init();
#else
#error "No protocol defined for touch controller"
#endif
#else
#endif
}
/* Config the i2c master
*
* This should init the i2c master to be used on display and touch controllers.
* So we should be able to know if the display and touch controllers shares the
* same i2c master.
*/
bool lvgl_i2c_driver_init(int port, int sda_pin, int scl_pin, int speed_hz)
{
esp_err_t err;
ESP_LOGI(TAG, "Initializing I2C master port %d...", port);
ESP_LOGI(TAG, "SDA pin: %d, SCL pin: %d, Speed: %d (Hz)",
sda_pin, scl_pin, speed_hz);
i2c_config_t conf = {
.mode = I2C_MODE_MASTER,
.sda_io_num = sda_pin,
.sda_pullup_en = GPIO_PULLUP_ENABLE,
.scl_io_num = scl_pin,
.scl_pullup_en = GPIO_PULLUP_ENABLE,
.master.clk_speed = speed_hz,
};
ESP_LOGI(TAG, "Setting I2C master configuration...");
err = i2c_param_config(port, &conf);
assert(ESP_OK == err);
ESP_LOGI(TAG, "Installing I2C master driver...");
err = i2c_driver_install(port,
I2C_MODE_MASTER,
0, 0 /*I2C_MASTER_RX_BUF_DISABLE, I2C_MASTER_TX_BUF_DISABLE */,
0 /* intr_alloc_flags */);
assert(ESP_OK == err);
return ESP_OK != err;
}
/* Initialize spi bus master */
bool lvgl_spi_driver_init(int host,
int miso_pin, int mosi_pin, int sclk_pin,
int max_transfer_sz,
int dma_channel,
int quadwp_pin, int quadhd_pin)
{
#if defined (CONFIG_IDF_TARGET_ESP32)
assert((SPI_HOST <= host) && (VSPI_HOST >= host));
const char *spi_names[] = {
"SPI_HOST", "HSPI_HOST", "VSPI_HOST"
};
#elif defined (CONFIG_IDF_TARGET_ESP32S2)
assert((SPI_HOST <= host) && (HSPI_HOST >= host));
const char *spi_names[] = {
"SPI_HOST", "", ""
};
#endif
ESP_LOGI(TAG, "Configuring SPI host %s (%d)", spi_names[host], host);
ESP_LOGI(TAG, "MISO pin: %d, MOSI pin: %d, SCLK pin: %d, IO2/WP pin: %d, IO3/HD pin: %d",
miso_pin, mosi_pin, sclk_pin, quadwp_pin, quadhd_pin);
ESP_LOGI(TAG, "Max transfer size: %d (bytes)", max_transfer_sz);
spi_bus_config_t buscfg = {
.miso_io_num = miso_pin,
.mosi_io_num = mosi_pin,
.sclk_io_num = sclk_pin,
.quadwp_io_num = quadwp_pin,
.quadhd_io_num = quadhd_pin,
.max_transfer_sz = max_transfer_sz
};
ESP_LOGI(TAG, "Initializing SPI bus...");
esp_err_t ret = spi_bus_initialize(host, &buscfg, dma_channel);
assert(ret == ESP_OK);
return ESP_OK != ret;
}

View File

@ -0,0 +1,85 @@
/**
* @file lvgl_helpers.h
*/
#ifndef LVGL_HELPERS_H
#define LVGL_HELPERS_H
#ifdef __cplusplus
extern "C" {
#endif
/*********************
* INCLUDES
*********************/
#include <stdbool.h>
#include "lvgl_spi_conf.h"
#include "lvgl_tft/disp_driver.h"
#include "lvgl_touch/touch_driver.h"
/*********************
* DEFINES
*********************/
#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7789)
#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40)
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7735S
#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40)
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_HX8357
#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40)
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SH1107
#define DISP_BUF_SIZE (CONFIG_LV_DISPLAY_WIDTH*CONFIG_LV_DISPLAY_HEIGHT)
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9481
#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40)
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9486
#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40)
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9488
#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40)
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9341
#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 64)
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SSD1306
#define DISP_BUF_SIZE (CONFIG_LV_DISPLAY_WIDTH*CONFIG_LV_DISPLAY_HEIGHT)
#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X)
#define DISP_BUF_LINES 40
#define DISP_BUF_SIZE (LV_HOR_RES_MAX * DISP_BUF_LINES)
#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_IL3820)
#define DISP_BUF_SIZE (CONFIG_LV_DISPLAY_HEIGHT * IL3820_COLUMNS)
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_RA8875
#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40)
#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_GC9A01)
#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40)
#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_JD79653A)
#define DISP_BUF_SIZE ((CONFIG_LV_DISPLAY_HEIGHT * CONFIG_LV_DISPLAY_WIDTH) / 8) // 5KB
#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D)
#define DISP_BUF_SIZE ((CONFIG_LV_DISPLAY_HEIGHT * CONFIG_LV_DISPLAY_WIDTH) / 8) // 2888 bytes
#else
#error "No display controller selected"
#endif
/**********************
* TYPEDEFS
**********************/
/**********************
* GLOBAL PROTOTYPES
**********************/
/* Initialize detected SPI and I2C bus and devices */
void lvgl_driver_init(void);
/* Initialize SPI master */
bool lvgl_spi_driver_init(int host, int miso_pin, int mosi_pin, int sclk_pin,
int max_transfer_sz, int dma_channel, int quadwp_pin, int quadhd_pin);
/* Initialize I2C master */
bool lvgl_i2c_driver_init(int port, int sda_pin, int scl_pin, int speed);
/**********************
* MACROS
**********************/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* LVGL_HELPERS_H */

View File

@ -0,0 +1,116 @@
/**
* @file lvgl_i2c_config.h
*/
#ifndef LVGL_I2C_CONF_H
#define LVGL_I2C_CONF_H
#ifdef __cplusplus
extern "C" {
#endif
/*********************
* INCLUDES
*********************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
/*********************
* DEFINES
*********************/
/* TODO: Define the I2C bus clock based on the selected display or touch
* controllers. */
/* Do both display and touch controllers uses I2C? */
#if defined (CONFIG_LV_TOUCH_DRIVER_PROTOCOL_I2C) && \
defined (CONFIG_LV_TFT_DISPLAY_PROTOCOL_I2C)
#if defined (CONFIG_LV_DISPLAY_I2C_PORT_0) && \
defined (CONFIG_LV_TOUCH_I2C_PORT_0)
#define SHARED_I2C_PORT
#define DISP_I2C_PORT I2C_NUM_0
#endif
#if defined (CONFIG_LV_DISPLAY_I2C_PORT_1) && \
defined (CONFIG_LV_TOUCH_I2C_PORT_1)
#define SHARED_I2C_PORT
#define DISP_I2C_PORT I2C_NUM_1
#endif
#if !defined (SHARED_I2C_PORT)
#endif
#endif
#if defined (SHARED_I2C_PORT)
/* If the port is shared the display and touch controllers must use the same
* SCL and SDA pins, otherwise let the user know with an error. */
#if (CONFIG_LV_DISP_PIN_SDA != CONFIG_LV_TOUCH_I2C_SDA) || \
(CONFIG_LV_DISP_PIN_SCL != CONFIG_LV_TOUCH_I2C_SCL)
#error "To share I2C port you need to choose the same SDA and SCL pins on both display and touch configurations"
#endif
#define DISP_I2C_SDA CONFIG_LV_DISP_PIN_SDA
#define DISP_I2C_SCL CONFIG_LV_DISP_PIN_SCL
#define DISP_I2C_ORIENTATION TFT_ORIENTATION_LANDSCAPE
/* Setting the I2C speed to the slowest one */
#if DISP_I2C_SPEED_HZ < TOUCH_I2C_SPEED_HZ
#define DISP_I2C_SPEED_HZ 400000 /* DISP_I2C_SPEED_HZ */
#else
#define DISP_I2C_SPEED_HZ 400000 /* DISP_I2C_SPEED_HZ */
#endif
#else
/* lets check if the touch controller uses I2C... */
#if defined (CONFIG_LV_TOUCH_DRIVER_PROTOCOL_I2C)
#if defined (CONFIG_LV_TOUCH_I2C_PORT_0)
#define TOUCH_I2C_PORT I2C_NUM_0
#else
#define TOUCH_I2C_PORT I2C_NUM_1
#endif
#define TOUCH_I2C_SDA CONFIG_LV_TOUCH_I2C_SDA
#define TOUCH_I2C_SCL CONFIG_LV_TOUCH_I2C_SCL
#define TOUCH_I2C_SPEED_HZ 400000
#endif
/* lets check if the display controller uses I2C... */
#if defined (CONFIG_LV_TFT_DISPLAY_PROTOCOL_I2C)
#if defined (CONFIG_LV_DISPLAY_I2C_PORT_0)
#define DISP_I2C_PORT I2C_NUM_0
#else
#define DISP_I2C_PORT I2C_NUM_1
#endif
#define DISP_I2C_SDA CONFIG_LV_DISP_PIN_SDA
#define DISP_I2C_SCL CONFIG_LV_DISP_PIN_SCL
#define DISP_I2C_ORIENTATION TFT_ORIENTATION_LANDSCAPE
#define DISP_I2C_SPEED_HZ 400000
#endif
#endif
/**********************
* TYPEDEFS
**********************/
/**********************
* GLOBAL PROTOTYPES
**********************/
/**********************
* MACROS
**********************/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /*LVGL_I2C_CONF_H*/

View File

@ -0,0 +1,198 @@
/**
* @file lvgl_spi_conf.h
*
*/
#ifndef LVGL_SPI_CONF_H
#define LVGL_SPI_CONF_H
#ifdef __cplusplus
extern "C" {
#endif
/*********************
* INCLUDES
*********************/
/*********************
* DEFINES
*********************/
// DISPLAY PINS
#define DISP_SPI_MOSI CONFIG_LV_DISP_SPI_MOSI
#if defined (CONFIG_LV_DISPLAY_USE_SPI_MISO)
#define DISP_SPI_MISO CONFIG_LV_DISP_SPI_MISO
#define DISP_SPI_INPUT_DELAY_NS CONFIG_LV_DISP_SPI_INPUT_DELAY_NS
#else
#define DISP_SPI_MISO (-1)
#define DISP_SPI_INPUT_DELAY_NS (0)
#endif
#if defined(CONFIG_LV_DISP_SPI_IO2)
#define DISP_SPI_IO2 CONFIG_LV_DISP_SPI_IO2
#else
#define DISP_SPI_IO2 (-1)
#endif
#if defined(CONFIG_LV_DISP_SPI_IO3)
#define DISP_SPI_IO3 CONFIG_LV_DISP_SPI_IO3
#else
#define DISP_SPI_IO3 (-1)
#endif
#define DISP_SPI_CLK CONFIG_LV_DISP_SPI_CLK
#if defined (CONFIG_LV_DISPLAY_USE_SPI_CS)
#define DISP_SPI_CS CONFIG_LV_DISP_SPI_CS
#else
#define DISP_SPI_CS (-1)
#endif
/* Define TOUCHPAD PINS when selecting a touch controller */
#if !defined (CONFIG_LV_TOUCH_CONTROLLER_NONE)
/* Handle FT81X special case */
#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X) && \
defined (CONFIG_LV_TOUCH_CONTROLLER_FT81X)
#define TP_SPI_MOSI CONFIG_LV_DISP_SPI_MOSI
#define TP_SPI_MISO CONFIG_LV_DISP_SPI_MISO
#define TP_SPI_CLK CONFIG_LV_DISP_SPI_CLK
#define TP_SPI_CS CONFIG_LV_DISP_SPI_CS
#else
#define TP_SPI_MOSI CONFIG_LV_TOUCH_SPI_MOSI
#define TP_SPI_MISO CONFIG_LV_TOUCH_SPI_MISO
#define TP_SPI_CLK CONFIG_LV_TOUCH_SPI_CLK
#define TP_SPI_CS CONFIG_LV_TOUCH_SPI_CS
#endif
#endif
#define ENABLE_TOUCH_INPUT CONFIG_LV_ENABLE_TOUCH
#if defined (CONFIG_LV_TFT_DISPLAY_SPI_HSPI)
#define TFT_SPI_HOST HSPI_HOST
#elif defined (CONFIG_LV_TFT_DISPLAY_SPI_VSPI)
#define TFT_SPI_HOST VSPI_HOST
#elif defined (CONFIG_LV_TFT_DISPLAY_SPI_FSPI)
#define TFT_SPI_HOST FSPI_HOST
#endif
#if defined (CONFIG_LV_TFT_DISPLAY_SPI_HALF_DUPLEX)
#define DISP_SPI_HALF_DUPLEX
#else
#define DISP_SPI_FULL_DUPLEX
#endif
#if defined (CONFIG_LV_TFT_DISPLAY_SPI_TRANS_MODE_DIO)
#define DISP_SPI_TRANS_MODE_DIO
#elif defined (CONFIG_LV_TFT_DISPLAY_SPI_TRANS_MODE_QIO)
#define DISP_SPI_TRANS_MODE_QIO
#else
#define DISP_SPI_TRANS_MODE_SIO
#endif
#if defined (CONFIG_LV_TOUCH_CONTROLLER_SPI_HSPI)
#define TOUCH_SPI_HOST HSPI_HOST
#elif defined (CONFIG_LV_TOUCH_CONTROLLER_SPI_VSPI)
#define TOUCH_SPI_HOST VSPI_HOST
#elif defined (CONFIG_LV_TOUCH_CONTROLLER_SPI_FSPI)
#define TOUCH_SPI_HOST FSPI_HOST
#endif
/* Handle the FT81X Special case */
#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X)
#if defined (CONFIG_LV_TOUCH_CONTROLLER_FT81X)
#define SHARED_SPI_BUS
#else
/* Empty */
#endif
#else
// Detect the use of a shared SPI Bus and verify the user specified the same SPI bus for both touch and tft
#if defined (CONFIG_LV_TOUCH_DRIVER_PROTOCOL_SPI) && TP_SPI_MOSI == DISP_SPI_MOSI && TP_SPI_CLK == DISP_SPI_CLK
#if TFT_SPI_HOST != TOUCH_SPI_HOST
#error You must specify the same SPI host (HSPI, VSPI or FSPI) for both display and touch driver
#endif
#define SHARED_SPI_BUS
#endif
#endif
/**********************
* TYPEDEFS
**********************/
#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9481) || \
defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9488)
#define SPI_BUS_MAX_TRANSFER_SZ (DISP_BUF_SIZE * 3)
#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9341) || \
defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7789) || \
defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7735S) || \
defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_HX8357) || \
defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_SH1107) || \
defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X) || \
defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_IL3820) || \
defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_JD79653A)
#define SPI_BUS_MAX_TRANSFER_SZ (DISP_BUF_SIZE * 2)
#else
#define SPI_BUS_MAX_TRANSFER_SZ (DISP_BUF_SIZE * 2)
#endif
#if defined (CONFIG_LV_TFT_USE_CUSTOM_SPI_CLK_DIVIDER)
#define SPI_TFT_CLOCK_SPEED_HZ ((80 * 1000 * 1000) / CONFIG_LV_TFT_CUSTOM_SPI_CLK_DIVIDER)
#else
#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7789)
#define SPI_TFT_CLOCK_SPEED_HZ (20*1000*1000)
#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7735S)
#define SPI_TFT_CLOCK_SPEED_HZ (40*1000*1000)
#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_HX8357)
#define SPI_TFT_CLOCK_SPEED_HZ (26*1000*1000)
#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_SH1107)
#define SPI_TFT_CLOCK_SPEED_HZ (8*1000*1000)
#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9481)
#define SPI_TFT_CLOCK_SPEED_HZ (16*1000*1000)
#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9486)
#define SPI_TFT_CLOCK_SPEED_HZ (20*1000*1000)
#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9488)
#define SPI_TFT_CLOCK_SPEED_HZ (40*1000*1000)
#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9341)
#define SPI_TFT_CLOCK_SPEED_HZ (40*1000*1000)
#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X)
#define SPI_TFT_CLOCK_SPEED_HZ (32*1000*1000)
#else
#define SPI_TFT_CLOCK_SPEED_HZ (40*1000*1000)
#endif
#endif
#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7789)
#define SPI_TFT_SPI_MODE (2)
#else
#define SPI_TFT_SPI_MODE (0)
#endif
/* Touch driver */
#if (CONFIG_LV_TOUCH_CONTROLLER == TOUCH_CONTROLLER_STMPE610)
#define SPI_TOUCH_CLOCK_SPEED_HZ (1*1000*1000)
#define SPI_TOUCH_SPI_MODE (1)
#else
#define SPI_TOUCH_CLOCK_SPEED_HZ (2*1000*1000)
#define SPI_TOUCH_SPI_MODE (0)
#endif
/**********************
* GLOBAL PROTOTYPES
**********************/
/**********************
* MACROS
**********************/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /*LVGL_SPI_CONF_H*/

View File

@ -0,0 +1,53 @@
if(ESP_PLATFORM)
set(SOURCES "disp_driver.c")
# Include only the source file of the selected
# display controller.
if(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9341)
list(APPEND SOURCES "ili9341.c")
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9481)
list(APPEND SOURCES "ili9481.c")
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9486)
list(APPEND SOURCES "ili9486.c")
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9488)
list(APPEND SOURCES "ili9488.c")
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7789)
list(APPEND SOURCES "st7789.c")
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7735S)
list(APPEND SOURCES "st7735s.c")
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_HX8357)
list(APPEND SOURCES "hx8357.c")
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_SH1107)
list(APPEND SOURCES "sh1107.c")
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_SSD1306)
list(APPEND SOURCES "ssd1306.c")
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X)
list(APPEND SOURCES "EVE_commands.c")
list(APPEND SOURCES "FT81x.c")
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_IL3820)
list(APPEND SOURCES "il3820.c")
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_JD79653A)
list(APPEND SOURCES "jd79653a.c")
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D)
list(APPEND SOURCES "uc8151d.c")
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_RA8875)
list(APPEND SOURCES "ra8875.c")
elseif(CONFIG_LV_TFT_DISPLAY_CONTROLLER_GC9A01)
list(APPEND SOURCES "GC9A01.c")
else()
message("DISPLAY CONTROLLER NOT DEFINED")
endif()
if(CONFIG_LV_TFT_DISPLAY_PROTOCOL_SPI)
list(APPEND SOURCES "disp_spi.c")
endif()
# Print the included source files
message("SOURCES contents: " "${SOURCES}")
idf_component_register(SRCS ${SOURCES}
INCLUDE_DIRS .
REQUIRES lvgl)
endif()

View File

@ -0,0 +1,842 @@
/*
@file EVE.h
@brief Contains FT80x/FT81x/BT81x API definitions
@version 4.1 LvGL edition
@date 2020-04-15
@author Rudolph Riedel, David Jade
@section LICENSE
MIT License
Copyright (c) 2016-2020 Rudolph Riedel and David Jade
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute,
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@section History
4.1 LvGL edition
- This version is a heavily modified version of the MIT licensed FT81x code from https://github.com/RudolphRiedel/FT800-FT813
This version is based on a fork by David Jade that added native SPI DMA support and stripped out non-ESP32 code.
It has also been trimmed down to suit LvGL's needs. Extra features can be enabled by defining FT81X_FULL
*/
#if defined (ESP_PLATFORM)
#include <stddef.h>
#include <stdint.h>
#endif
#include "EVE_config.h"
#ifndef EVE_H_
#define EVE_H_
#define DL_CLEAR 0x26000000UL /* requires OR'd arguments */
#define DL_CLEAR_RGB 0x02000000UL /* requires OR'd arguments */
#define DL_COLOR_RGB 0x04000000UL /* requires OR'd arguments */
#define DL_POINT_SIZE 0x0D000000UL /* requires OR'd arguments */
#define DL_END 0x21000000UL
#define DL_BEGIN 0x1F000000UL /* requires OR'd arguments */
#define DL_DISPLAY 0x00000000UL
#define CLR_COL 0x4
#define CLR_STN 0x2
#define CLR_TAG 0x1
/* SPI SIO/DIO/QIO tranfer widths */
#define SPI_WIDTH_SIO 0x0
#define SPI_WIDTH_DIO 0x1
#define SPI_WIDTH_QIO 0x2
/* Host commands */
#define EVE_ACTIVE 0x00 /* place FT8xx in active state */
#define EVE_STANDBY 0x41 /* place FT8xx in Standby (clk running) */
#define EVE_SLEEP 0x42 /* place FT8xx in Sleep (clk off) */
#define EVE_PWRDOWN 0x50 /* place FT8xx in Power Down (core off) */
#define EVE_CLKEXT 0x44 /* select external clock source */
#define EVE_CLKINT 0x48 /* select internal clock source */
#define EVE_CORERST 0x68 /* reset core - all registers default and processors reset */
#define EVE_CLK48M 0x62 /* select 48MHz PLL output */
#define EVE_CLK36M 0x61 /* select 36MHz PLL output */
/* defines used for graphics commands */
#define EVE_NEVER 0UL
#define EVE_LESS 1UL
#define EVE_LEQUAL 2UL
#define EVE_GREATER 3UL
#define EVE_GEQUAL 4UL
#define EVE_EQUAL 5UL
#define EVE_NOTEQUAL 6UL
#define EVE_ALWAYS 7UL
/* Bitmap formats */
#define EVE_ARGB1555 0UL
#define EVE_L1 1UL
#define EVE_L4 2UL
#define EVE_L8 3UL
#define EVE_RGB332 4UL
#define EVE_ARGB2 5UL
#define EVE_ARGB4 6UL
#define EVE_RGB565 7UL
#define EVE_PALETTED 8UL
#define EVE_TEXT8X8 9UL
#define EVE_TEXTVGA 10UL
#define EVE_BARGRAPH 11UL
/* Bitmap filter types */
#define EVE_NEAREST 0UL
#define EVE_BILINEAR 1UL
/* Bitmap wrap types */
#define EVE_BORDER 0UL
#define EVE_REPEAT 1UL
/* Stencil defines */
#define EVE_KEEP 1UL
#define EVE_REPLACE 2UL
#define EVE_INCR 3UL
#define EVE_DECR 4UL
#define EVE_INVERT 5UL
/* Graphics display list swap defines */
#define EVE_DLSWAP_DONE 0UL
#define EVE_DLSWAP_LINE 1UL
#define EVE_DLSWAP_FRAME 2UL
/* Interrupt bits */
#define EVE_INT_SWAP 0x01
#define EVE_INT_TOUCH 0x02
#define EVE_INT_TAG 0x04
#define EVE_INT_SOUND 0x08
#define EVE_INT_PLAYBACK 0x10
#define EVE_INT_CMDEMPTY 0x20
#define EVE_INT_CMDFLAG 0x40
#define EVE_INT_CONVCOMPLETE 0x80
/* Touch mode */
#define EVE_TMODE_OFF 0
#define EVE_TMODE_ONESHOT 1
#define EVE_TMODE_FRAME 2
#define EVE_TMODE_CONTINUOUS 3
/* Alpha blending */
#define EVE_ZERO 0UL
#define EVE_ONE 1UL
#define EVE_SRC_ALPHA 2UL
#define EVE_DST_ALPHA 3UL
#define EVE_ONE_MINUS_SRC_ALPHA 4UL
#define EVE_ONE_MINUS_DST_ALPHA 5UL
/* Graphics primitives */
#define EVE_BITMAPS 1UL
#define EVE_POINTS 2UL
#define EVE_LINES 3UL
#define EVE_LINE_STRIP 4UL
#define EVE_EDGE_STRIP_R 5UL
#define EVE_EDGE_STRIP_L 6UL
#define EVE_EDGE_STRIP_A 7UL
#define EVE_EDGE_STRIP_B 8UL
#define EVE_RECTS 9UL
/* Widget command */
#define EVE_OPT_MONO 1
#define EVE_OPT_NODL 2
#define EVE_OPT_FLAT 256
#define EVE_OPT_CENTERX 512
#define EVE_OPT_CENTERY 1024
#define EVE_OPT_CENTER (EVE_OPT_CENTERX | EVE_OPT_CENTERY)
#define EVE_OPT_NOBACK 4096
#define EVE_OPT_NOTICKS 8192
#define EVE_OPT_NOHM 16384
#define EVE_OPT_NOPOINTER 16384
#define EVE_OPT_NOSECS 32768
#define EVE_OPT_NOHANDS 49152
#define EVE_OPT_RIGHTX 2048
#define EVE_OPT_SIGNED 256
/* Defines related to inbuilt font */
#define EVE_NUMCHAR_PERFONT (128L) /* number of font characters per bitmap handle */
#define EVE_FONT_TABLE_SIZE (148L) /* size of the font table - utilized for loopup by the graphics engine */
#define EVE_FONT_TABLE_POINTER (0xFFFFCUL) /* pointer to the inbuilt font tables starting from bitmap handle 16 */
/* Audio sample type defines */
#define EVE_LINEAR_SAMPLES 0UL /* 8bit signed samples */
#define EVE_ULAW_SAMPLES 1UL /* 8bit ulaw samples */
#define EVE_ADPCM_SAMPLES 2UL /* 4bit ima adpcm samples */
/* Synthesized sound */
#define EVE_SILENCE 0x00
#define EVE_SQUAREWAVE 0x01
#define EVE_SINEWAVE 0x02
#define EVE_SAWTOOTH 0x03
#define EVE_TRIANGLE 0x04
#define EVE_BEEPING 0x05
#define EVE_ALARM 0x06
#define EVE_WARBLE 0x07
#define EVE_CAROUSEL 0x08
#define EVE_PIPS(n) (0x0F + (n))
#define EVE_HARP 0x40
#define EVE_XYLOPHONE 0x41
#define EVE_TUBA 0x42
#define EVE_GLOCKENSPIEL 0x43
#define EVE_ORGAN 0x44
#define EVE_TRUMPET 0x45
#define EVE_PIANO 0x46
#define EVE_CHIMES 0x47
#define EVE_MUSICBOX 0x48
#define EVE_BELL 0x49
#define EVE_CLICK 0x50
#define EVE_SWITCH 0x51
#define EVE_COWBELL 0x52
#define EVE_NOTCH 0x53
#define EVE_HIHAT 0x54
#define EVE_KICKDRUM 0x55
#define EVE_POP 0x56
#define EVE_CLACK 0x57
#define EVE_CHACK 0x58
#define EVE_MUTE 0x60
#define EVE_UNMUTE 0x61
/* Synthesized sound frequencies, midi note */
#define EVE_MIDI_A0 21
#define EVE_MIDI_A_0 22
#define EVE_MIDI_B0 23
#define EVE_MIDI_C1 24
#define EVE_MIDI_C_1 25
#define EVE_MIDI_D1 26
#define EVE_MIDI_D_1 27
#define EVE_MIDI_E1 28
#define EVE_MIDI_F1 29
#define EVE_MIDI_F_1 30
#define EVE_MIDI_G1 31
#define EVE_MIDI_G_1 32
#define EVE_MIDI_A1 33
#define EVE_MIDI_A_1 34
#define EVE_MIDI_B1 35
#define EVE_MIDI_C2 36
#define EVE_MIDI_C_2 37
#define EVE_MIDI_D2 38
#define EVE_MIDI_D_2 39
#define EVE_MIDI_E2 40
#define EVE_MIDI_F2 41
#define EVE_MIDI_F_2 42
#define EVE_MIDI_G2 43
#define EVE_MIDI_G_2 44
#define EVE_MIDI_A2 45
#define EVE_MIDI_A_2 46
#define EVE_MIDI_B2 47
#define EVE_MIDI_C3 48
#define EVE_MIDI_C_3 49
#define EVE_MIDI_D3 50
#define EVE_MIDI_D_3 51
#define EVE_MIDI_E3 52
#define EVE_MIDI_F3 53
#define EVE_MIDI_F_3 54
#define EVE_MIDI_G3 55
#define EVE_MIDI_G_3 56
#define EVE_MIDI_A3 57
#define EVE_MIDI_A_3 58
#define EVE_MIDI_B3 59
#define EVE_MIDI_C4 60
#define EVE_MIDI_C_4 61
#define EVE_MIDI_D4 62
#define EVE_MIDI_D_4 63
#define EVE_MIDI_E4 64
#define EVE_MIDI_F4 65
#define EVE_MIDI_F_4 66
#define EVE_MIDI_G4 67
#define EVE_MIDI_G_4 68
#define EVE_MIDI_A4 69
#define EVE_MIDI_A_4 70
#define EVE_MIDI_B4 71
#define EVE_MIDI_C5 72
#define EVE_MIDI_C_5 73
#define EVE_MIDI_D5 74
#define EVE_MIDI_D_5 75
#define EVE_MIDI_E5 76
#define EVE_MIDI_F5 77
#define EVE_MIDI_F_5 78
#define EVE_MIDI_G5 79
#define EVE_MIDI_G_5 80
#define EVE_MIDI_A5 81
#define EVE_MIDI_A_5 82
#define EVE_MIDI_B5 83
#define EVE_MIDI_C6 84
#define EVE_MIDI_C_6 85
#define EVE_MIDI_D6 86
#define EVE_MIDI_D_6 87
#define EVE_MIDI_E6 88
#define EVE_MIDI_F6 89
#define EVE_MIDI_F_6 90
#define EVE_MIDI_G6 91
#define EVE_MIDI_G_6 92
#define EVE_MIDI_A6 93
#define EVE_MIDI_A_6 94
#define EVE_MIDI_B6 95
#define EVE_MIDI_C7 96
#define EVE_MIDI_C_7 97
#define EVE_MIDI_D7 98
#define EVE_MIDI_D_7 99
#define EVE_MIDI_E7 100
#define EVE_MIDI_F7 101
#define EVE_MIDI_F_7 102
#define EVE_MIDI_G7 103
#define EVE_MIDI_G_7 104
#define EVE_MIDI_A7 105
#define EVE_MIDI_A_7 106
#define EVE_MIDI_B7 107
#define EVE_MIDI_C8 108
/* GPIO bits */
#define EVE_GPIO0 0
#define EVE_GPIO1 1 /* default gpio pin for audio shutdown, 1 - enable, 0 - disable */
#define EVE_GPIO7 7 /* default gpio pin for display enable, 1 - enable, 0 - disable */
/* Display rotation */
#define EVE_DISPLAY_0 0 /* 0 degrees rotation */
#define EVE_DISPLAY_180 1 /* 180 degrees rotation */
/* commands common to EVE/EVE2/EVE3 */
#define CMD_APPEND 0xFFFFFF1E
#define CMD_BGCOLOR 0xFFFFFF09
#define CMD_BUTTON 0xFFFFFF0D
#define CMD_CALIBRATE 0xFFFFFF15
#define CMD_CLOCK 0xFFFFFF14
#define CMD_COLDSTART 0xFFFFFF32
#define CMD_DIAL 0xFFFFFF2D
#define CMD_DLSTART 0xFFFFFF00
#define CMD_FGCOLOR 0xFFFFFF0A
#define CMD_GAUGE 0xFFFFFF13
#define CMD_GETMATRIX 0xFFFFFF33
#define CMD_GETPROPS 0xFFFFFF25
#define CMD_GETPTR 0xFFFFFF23
#define CMD_GRADCOLOR 0xFFFFFF34
#define CMD_GRADIENT 0xFFFFFF0B
#define CMD_INFLATE 0xFFFFFF22
#define CMD_INTERRUPT 0xFFFFFF02
#define CMD_KEYS 0xFFFFFF0E
#define CMD_LOADIDENTITY 0xFFFFFF26
#define CMD_LOADIMAGE 0xFFFFFF24
#define CMD_LOGO 0xFFFFFF31
#define CMD_MEMCPY 0xFFFFFF1D
#define CMD_MEMCRC 0xFFFFFF18
#define CMD_MEMSET 0xFFFFFF1B
#define CMD_MEMWRITE 0xFFFFFF1A
#define CMD_MEMZERO 0xFFFFFF1C
#define CMD_NUMBER 0xFFFFFF2E
#define CMD_PROGRESS 0xFFFFFF0F
#define CMD_REGREAD 0xFFFFFF19
#define CMD_ROTATE 0xFFFFFF29
#define CMD_SCALE 0xFFFFFF28
#define CMD_SCREENSAVER 0xFFFFFF2F
#define CMD_SCROLLBAR 0xFFFFFF11
#define CMD_SETFONT 0xFFFFFF2B
#define CMD_SETMATRIX 0xFFFFFF2A
#define CMD_SKETCH 0xFFFFFF30
#define CMD_SLIDER 0xFFFFFF10
#define CMD_SNAPSHOT 0xFFFFFF1F
#define CMD_SPINNER 0xFFFFFF16
#define CMD_STOP 0xFFFFFF17
#define CMD_SWAP 0xFFFFFF01
#define CMD_TEXT 0xFFFFFF0C
#define CMD_TOGGLE 0xFFFFFF12
#define CMD_TRACK 0xFFFFFF2C
#define CMD_TRANSLATE 0xFFFFFF27
/* the following are undocumented commands that therefore should not be used */
#if 0
#define CMD_CRC 0xFFFFFF03
#define CMD_HAMMERAUX 0xFFFFFF04
#define CMD_MARCH 0xFFFFFF05
#define CMD_IDCT 0xFFFFFF06
#define CMD_EXECUTE 0xFFFFFF07
#define CMD_GETPOINT 0xFFFFFF08
#define CMD_TOUCH_TRANSFORM 0xFFFFFF20
#endif
/* FT8xx graphics engine specific macros useful for static display list generation */
#define ALPHA_FUNC(func,ref) ((9UL<<24)|(((func)&7UL)<<8)|(((ref)&255UL)<<0))
#define BEGIN(prim) ((31UL<<24)|(((prim)&15UL)<<0))
#define BITMAP_HANDLE(handle) ((5UL<<24)|(((handle)&31UL)<<0))
#define BITMAP_LAYOUT(format,linestride,height) ((7UL<<24)|(((format)&31UL)<<19)|(((linestride)&1023UL)<<9)|(((height)&511UL)<<0))
#define BITMAP_SIZE(filter,wrapx,wrapy,width,height) ((8UL<<24)|(((filter)&1UL)<<20)|(((wrapx)&1UL)<<19)|(((wrapy)&1UL)<<18)|(((width)&511UL)<<9)|(((height)&511UL)<<0))
#define BITMAP_TRANSFORM_A(a) ((21UL<<24)|(((a)&131071UL)<<0))
#define BITMAP_TRANSFORM_B(b) ((22UL<<24)|(((b)&131071UL)<<0))
#define BITMAP_TRANSFORM_C(c) ((23UL<<24)|(((c)&16777215UL)<<0))
#define BITMAP_TRANSFORM_D(d) ((24UL<<24)|(((d)&131071UL)<<0))
#define BITMAP_TRANSFORM_E(e) ((25UL<<24)|(((e)&131071UL)<<0))
#define BITMAP_TRANSFORM_F(f) ((26UL<<24)|(((f)&16777215UL)<<0))
#define BLEND_FUNC(src,dst) ((11UL<<24)|(((src)&7UL)<<3)|(((dst)&7UL)<<0))
#define CALL(dest) ((29UL<<24)|(((dest)&65535UL)<<0))
#define CELL(cell) ((6UL<<24)|(((cell)&127UL)<<0))
#define CLEAR(c,s,t) ((38UL<<24)|(((c)&1UL)<<2)|(((s)&1UL)<<1)|(((t)&1UL)<<0))
#define CLEAR_COLOR_A(alpha) ((15UL<<24)|(((alpha)&255UL)<<0))
#define CLEAR_COLOR_RGB(red,green,blue) ((2UL<<24)|(((red)&255UL)<<16)|(((green)&255UL)<<8)|(((blue)&255UL)<<0))
#define CLEAR_STENCIL(s) ((17UL<<24)|(((s)&255UL)<<0))
#define CLEAR_TAG(s) ((18UL<<24)|(((s)&255UL)<<0))
#define COLOR_A(alpha) ((16UL<<24)|(((alpha)&255UL)<<0))
#define COLOR_MASK(r,g,b,a) ((32UL<<24)|(((r)&1UL)<<3)|(((g)&1UL)<<2)|(((b)&1UL)<<1)|(((a)&1UL)<<0))
#define COLOR_RGB(red,green,blue) ((4UL<<24)|(((red)&255UL)<<16)|(((green)&255UL)<<8)|(((blue)&255UL)<<0))
/* #define DISPLAY() ((0UL<<24)) */
#define END() ((33UL<<24))
#define JUMP(dest) ((30UL<<24)|(((dest)&65535UL)<<0))
#define LINE_WIDTH(width) ((14UL<<24)|(((width)&4095UL)<<0))
#define MACRO(m) ((37UL<<24)|(((m)&1UL)<<0))
#define POINT_SIZE(size) ((13UL<<24)|(((size)&8191UL)<<0))
#define RESTORE_CONTEXT() ((35UL<<24))
#define RETURN() ((36UL<<24))
#define SAVE_CONTEXT() ((34UL<<24))
#define STENCIL_FUNC(func,ref,mask) ((10UL<<24)|(((func)&7UL)<<16)|(((ref)&255UL)<<8)|(((mask)&255UL)<<0))
#define STENCIL_MASK(mask) ((19UL<<24)|(((mask)&255UL)<<0))
#define STENCIL_OP(sfail,spass) ((12UL<<24)|(((sfail)&7UL)<<3)|(((spass)&7UL)<<0))
#define TAG(s) ((3UL<<24)|(((s)&255UL)<<0))
#define TAG_MASK(mask) ((20UL<<24)|(((mask)&1UL)<<0))
#define VERTEX2F(x,y) ((1UL<<30)|(((x)&32767UL)<<15)|(((y)&32767UL)<<0))
#define VERTEX2II(x,y,handle,cell) ((2UL<<30)|(((x)&511UL)<<21)|(((y)&511UL)<<12)|(((handle)&31UL)<<7)|(((cell)&127UL)<<0))
/* ----------------- BT81x exclusive definitions -----------------*/
#if defined (BT81X_ENABLE)
#define EVE_GLFORMAT 31UL /* used with BITMAP_LAYOUT to indicate bitmap-format is specified by BITMAP_EXT_FORMAT */
#define DL_BITMAP_EXT_FORMAT 0x2E000000 /* requires OR'd arguments */
/* extended Bitmap formats */
#define EVE_COMPRESSED_RGBA_ASTC_4x4_KHR 37808UL
#define EVE_COMPRESSED_RGBA_ASTC_5x4_KHR 37809UL
#define EVE_COMPRESSED_RGBA_ASTC_5x5_KHR 37810UL
#define EVE_COMPRESSED_RGBA_ASTC_6x5_KHR 37811UL
#define EVE_COMPRESSED_RGBA_ASTC_6x6_KHR 37812UL
#define EVE_COMPRESSED_RGBA_ASTC_8x5_KHR 37813UL
#define EVE_COMPRESSED_RGBA_ASTC_8x6_KHR 37814UL
#define EVE_COMPRESSED_RGBA_ASTC_8x8_KHR 37815UL
#define EVE_COMPRESSED_RGBA_ASTC_10x5_KHR 37816UL
#define EVE_COMPRESSED_RGBA_ASTC_10x6_KHR 37817UL
#define EVE_COMPRESSED_RGBA_ASTC_10x8_KHR 37818UL
#define EVE_COMPRESSED_RGBA_ASTC_10x10_KHR 37819UL
#define EVE_COMPRESSED_RGBA_ASTC_12x10_KHR 37820UL
#define EVE_COMPRESSED_RGBA_ASTC_12x12_KHR 37821UL
#define EVE_RAM_ERR_REPORT 0x309800UL /* max 128 bytes null terminated string */
#define EVE_RAM_FLASH 0x800000UL
#define EVE_RAM_FLASH_POSTBLOB 0x801000UL
#define EVE_OPT_FLASH 64UL
#define EVE_OPT_FORMAT 4096UL
#define EVE_OPT_FILL 8192UL
/* additional commands for BT81x */
#define CMD_BITMAP_TRANSFORM 0xFFFFFF21
#define CMD_SYNC 0xFFFFFF42 /* does not need a dedicated function, just use EVE_cmd_dl(CMD_SYNC) */
#define CMD_FLASHERASE 0xFFFFFF44 /* does not need a dedicated function, just use EVE_cmd_dl(CMD_FLASHERASE) */
#define CMD_FLASHWRITE 0xFFFFFF45
#define CMD_FLASHREAD 0xFFFFFF46
#define CMD_FLASHUPDATE 0xFFFFFF47
#define CMD_FLASHDETACH 0xFFFFFF48 /* does not need a dedicated function, just use EVE_cmd_dl(CMD_FLASHDETACH) */
#define CMD_FLASHATTACH 0xFFFFFF49 /* does not need a dedicated function, just use EVE_cmd_dl(CMD_FLASHATTACH) */
#define CMD_FLASHFAST 0xFFFFFF4A
#define CMD_FLASHSPIDESEL 0xFFFFFF4B /* does not need a dedicated function, just use EVE_cmd_dl(CMD_FLASHSPIDESEL) */
#define CMD_FLASHSPITX 0xFFFFFF4C
#define CMD_FLASHSPIRX 0xFFFFFF4D
#define CMD_FLASHSOURCE 0xFFFFFF4E
#define CMD_CLEARCACHE 0xFFFFFF4F /* does not need a dedicated function, just use EVE_cmd_dl(CMD_CLEARCACHE) */
#define CMD_INFLATE2 0xFFFFFF50
#define CMD_ROTATEAROUND 0xFFFFFF51
#define CMD_RESETFONTS 0xFFFFFF52 /* does not need a dedicated function, just use EVE_cmd_dl(CMD_RESETFONTS) */
#define CMD_ANIMSTART 0xFFFFFF53
#define CMD_ANIMSTOP 0xFFFFFF54
#define CMD_ANIMXY 0xFFFFFF55
#define CMD_ANIMDRAW 0xFFFFFF56
#define CMD_GRADIENTA 0xFFFFFF57
#define CMD_FILLWIDTH 0xFFFFFF58
#define CMD_APPENDF 0xFFFFFF59
#define CMD_ANIMFRAME 0xFFFFFF5A
#define CMD_VIDEOSTARTF 0xFFFFFF5F /* does not need a dedicated function, just use EVE_cmd_dl(CMD_VIDEOSTARTF) */
#if 0
/* some undocumented commands for BT81x */
#define CMD_NOP 0xFFFFFF5B
#define CMD_SHA1 0xFFFFFF5C
#define CMD_HMAC 0xFFFFFF5D
#define CMD_LAST_ 0xFFFFFF5E
#endif
/* additional registers for BT81x */
#define REG_ADAPTIVE_FRAMERATE 0x30257cUL
#define REG_PLAYBACK_PAUSE 0x3025ecUL
#define REG_FLASH_STATUS 0x3025f0UL
#define REG_FLASH_SIZE 0x309024UL
#define REG_PLAY_CONTROL 0x30914eUL
#define REG_COPRO_PATCH_DTR 0x309162UL
/* BT81x graphics engine specific macros */
#define BITMAP_EXT_FORMAT(format) ((46UL<<24)|(((format)&65535UL)<<0))
#define BITMAP_SWIZZLE(r,g,b,a) ((47UL<<24)|(((r)&7UL)<<9)|(((g)&7UL)<<6)|(((b)&7UL)<<3)|(((a)&7UL)<<0))
#define BITMAP_SOURCE2(flash_or_ram, addr) ((1UL<<24)|((flash_or_ram) << 23)|(((addr)&8388607UL)<<0))
#define INT_FRR() ((48UL<<24))
#undef BITMAP_TRANSFORM_A
#undef BITMAP_TRANSFORM_B
#undef BITMAP_TRANSFORM_D
#undef BITMAP_TRANSFORM_E
#define BITMAP_TRANSFORM_A_EXT(p,v) ((21UL<<24)|(((p)&1UL)<<17)|(((v)&131071UL)<<0))
#define BITMAP_TRANSFORM_B_EXT(p,v) ((22UL<<24)|(((p)&1UL)<<17)|(((v)&131071UL)<<0))
#define BITMAP_TRANSFORM_D_EXT(p,v) ((24UL<<24)|(((p)&1UL)<<17)|(((v)&131071UL)<<0))
#define BITMAP_TRANSFORM_E_EXT(p,v) ((25UL<<24)|(((p)&1UL)<<17)|(((v)&131071UL)<<0))
#define BITMAP_TRANSFORM_A(a) BITMAP_TRANSFORM_A_EXT(0,a)
#define BITMAP_TRANSFORM_B(b) BITMAP_TRANSFORM_B_EXT(0,b)
#define BITMAP_TRANSFORM_D(d) BITMAP_TRANSFORM_D_EXT(0,d)
#define BITMAP_TRANSFORM_E(e) BITMAP_TRANSFORM_E_EXT(0,e)
#endif
/* ----------------- FT81x / BT81x exclusive definitions -----------------*/
#if defined (FT81X_ENABLE)
/* Host commands */
#define EVE_CLKSEL 0x61 /* configure system clock */
#define EVE_RST_PULSE 0x68 /* reset core - all registers default and processors reset */
#define EVE_PINDRIVE 0x70 /* setup drive strength for various pins */
#define EVE_PIN_PD_STATE 0x71 /* setup how pins behave during power down */
/* Memory definitions */
#define EVE_RAM_G 0x000000UL
#define EVE_ROM_CHIPID 0x0C0000UL
#define EVE_ROM_FONT 0x1E0000UL
#define EVE_ROM_FONT_ADDR 0x2FFFFCUL
#define EVE_RAM_DL 0x300000UL
#define EVE_RAM_REG 0x302000UL
#define EVE_RAM_CMD 0x308000UL
/* Memory buffer sizes */
#define EVE_RAM_G_SIZE 1024*1024L
#define EVE_CMDFIFO_SIZE 4*1024L
#define EVE_RAM_DL_SIZE 8*1024L
/* various additional defines for FT81x */
#define EVE_ADC_DIFFERENTIAL 1UL
#define EVE_ADC_SINGLE_ENDED 0UL
#define EVE_INT_G8 18UL
#define EVE_INT_L8C 12UL
#define EVE_INT_VGA 13UL
#define EVE_OPT_MEDIAFIFO 16UL
#define EVE_OPT_FULLSCREEN 8UL
#define EVE_OPT_NOTEAR 4UL
#define EVE_OPT_SOUND 32UL
#define EVE_PALETTED565 14UL
#define EVE_PALETTED4444 15UL
#define EVE_PALETTED8 16UL
#define EVE_L2 17UL
/* additional commands for FT81x */
#define CMD_MEDIAFIFO 0xFFFFFF39
#define CMD_PLAYVIDEO 0xFFFFFF3A
#define CMD_ROMFONT 0xFFFFFF3F
#define CMD_SETBASE 0xFFFFFF38
#define CMD_SETBITMAP 0xFFFFFF43
#define CMD_SETFONT2 0xFFFFFF3B
#define CMD_SETROTATE 0xFFFFFF36
#define CMD_SETSCRATCH 0xFFFFFF3C
#define CMD_SNAPSHOT2 0xFFFFFF37
#define CMD_VIDEOFRAME 0xFFFFFF41
#define CMD_VIDEOSTART 0xFFFFFF40
/* the following are undocumented commands that therefore should not be used */
#if 0
#define CMD_CSKETCH 0xFFFFFF35
#define CMD_INT_RAMSHARED 0xFFFFFF3D
#define CMD_INT_SWLOADIMAGE 0xFFFFFF3E
#endif
/* Register definitions */
#define REG_ANA_COMP 0x302184UL /* only listed in datasheet */
#define REG_BIST_EN 0x302174UL /* only listed in datasheet */
#define REG_CLOCK 0x302008UL
#define REG_CMDB_SPACE 0x302574UL
#define REG_CMDB_WRITE 0x302578UL
#define REG_CMD_DL 0x302100UL
#define REG_CMD_READ 0x3020f8UL
#define REG_CMD_WRITE 0x3020fcUL
#define REG_CPURESET 0x302020UL
#define REG_CSPREAD 0x302068UL
#define REG_CTOUCH_EXTENDED 0x302108UL
#define REG_CTOUCH_TOUCH0_XY 0x302124UL /* only listed in datasheet */
#define REG_CTOUCH_TOUCH4_X 0x30216cUL
#define REG_CTOUCH_TOUCH4_Y 0x302120UL
#define REG_CTOUCH_TOUCH1_XY 0x30211cUL
#define REG_CTOUCH_TOUCH2_XY 0x30218cUL
#define REG_CTOUCH_TOUCH3_XY 0x302190UL
#define REG_TOUCH_CONFIG 0x302168UL
#define REG_DATESTAMP 0x302564UL /* only listed in datasheet */
#define REG_DITHER 0x302060UL
#define REG_DLSWAP 0x302054UL
#define REG_FRAMES 0x302004UL
#define REG_FREQUENCY 0x30200cUL
#define REG_GPIO 0x302094UL
#define REG_GPIOX 0x30209cUL
#define REG_GPIOX_DIR 0x302098UL
#define REG_GPIO_DIR 0x302090UL
#define REG_HCYCLE 0x30202cUL
#define REG_HOFFSET 0x302030UL
#define REG_HSIZE 0x302034UL
#define REG_HSYNC0 0x302038UL
#define REG_HSYNC1 0x30203cUL
#define REG_ID 0x302000UL
#define REG_INT_EN 0x3020acUL
#define REG_INT_FLAGS 0x3020a8UL
#define REG_INT_MASK 0x3020b0UL
#define REG_MACRO_0 0x3020d8UL
#define REG_MACRO_1 0x3020dcUL
#define REG_MEDIAFIFO_READ 0x309014UL /* only listed in programmers guide */
#define REG_MEDIAFIFO_WRITE 0x309018UL /* only listed in programmers guide */
#define REG_OUTBITS 0x30205cUL
#define REG_PCLK 0x302070UL
#define REG_PCLK_POL 0x30206cUL
#define REG_PLAY 0x30208cUL
#define REG_PLAYBACK_FORMAT 0x3020c4UL
#define REG_PLAYBACK_FREQ 0x3020c0UL
#define REG_PLAYBACK_LENGTH 0x3020b8UL
#define REG_PLAYBACK_LOOP 0x3020c8UL
#define REG_PLAYBACK_PLAY 0x3020ccUL
#define REG_PLAYBACK_READPTR 0x3020bcUL
#define REG_PLAYBACK_START 0x3020b4UL
#define REG_PWM_DUTY 0x3020d4UL
#define REG_PWM_HZ 0x3020d0UL
#define REG_RENDERMODE 0x302010UL /* only listed in datasheet */
#define REG_ROTATE 0x302058UL
#define REG_SNAPFORMAT 0x30201cUL /* only listed in datasheet */
#define REG_SNAPSHOT 0x302018UL /* only listed in datasheet */
#define REG_SNAPY 0x302014UL /* only listed in datasheet */
#define REG_SOUND 0x302088UL
#define REG_SPI_WIDTH 0x302188UL /* listed with false offset in programmers guide V1.1 */
#define REG_SWIZZLE 0x302064UL
#define REG_TAG 0x30207cUL
#define REG_TAG_X 0x302074UL
#define REG_TAG_Y 0x302078UL
#define REG_TAP_CRC 0x302024UL /* only listed in datasheet */
#define REG_TAP_MASK 0x302028UL /* only listed in datasheet */
#define REG_TOUCH_ADC_MODE 0x302108UL
#define REG_TOUCH_CHARGE 0x30210cUL
#define REG_TOUCH_DIRECT_XY 0x30218cUL
#define REG_TOUCH_DIRECT_Z1Z2 0x302190UL
#define REG_TOUCH_MODE 0x302104UL
#define REG_TOUCH_OVERSAMPLE 0x302114UL
#define REG_TOUCH_RAW_XY 0x30211cUL
#define REG_TOUCH_RZ 0x302120UL
#define REG_TOUCH_RZTHRESH 0x302118UL
#define REG_TOUCH_SCREEN_XY 0x302124UL
#define REG_TOUCH_SETTLE 0x302110UL
#define REG_TOUCH_TAG 0x30212cUL
#define REG_TOUCH_TAG1 0x302134UL /* only listed in datasheet */
#define REG_TOUCH_TAG1_XY 0x302130UL /* only listed in datasheet */
#define REG_TOUCH_TAG2 0x30213cUL /* only listed in datasheet */
#define REG_TOUCH_TAG2_XY 0x302138UL /* only listed in datasheet */
#define REG_TOUCH_TAG3 0x302144UL /* only listed in datasheet */
#define REG_TOUCH_TAG3_XY 0x302140UL /* only listed in datasheet */
#define REG_TOUCH_TAG4 0x30214cUL /* only listed in datasheet */
#define REG_TOUCH_TAG4_XY 0x302148UL /* only listed in datasheet */
#define REG_TOUCH_TAG_XY 0x302128UL
#define REG_TOUCH_TRANSFORM_A 0x302150UL
#define REG_TOUCH_TRANSFORM_B 0x302154UL
#define REG_TOUCH_TRANSFORM_C 0x302158UL
#define REG_TOUCH_TRANSFORM_D 0x30215cUL
#define REG_TOUCH_TRANSFORM_E 0x302160UL
#define REG_TOUCH_TRANSFORM_F 0x302164UL
#define REG_TRACKER 0x309000UL /* only listed in programmers guide */
#define REG_TRACKER_1 0x309004UL /* only listed in programmers guide */
#define REG_TRACKER_2 0x309008UL /* only listed in programmers guide */
#define REG_TRACKER_3 0x30900cUL /* only listed in programmers guide */
#define REG_TRACKER_4 0x309010UL /* only listed in programmers guide */
#define REG_TRIM 0x302180UL
#define REG_VCYCLE 0x302040UL
#define REG_VOFFSET 0x302044UL
#define REG_VOL_PB 0x302080UL
#define REG_VOL_SOUND 0x302084UL
#define REG_VSIZE 0x302048UL
#define REG_VSYNC0 0x30204cUL
#define REG_VSYNC1 0x302050UL
#if 0
#define REG_BUSYBITS 0x3020e8UL /* only listed as "reserved" in datasheet */
#define REG_CRC 0x302178UL /* only listed as "reserved" in datasheet */
#define REG_SPI_EARLY_TX 0x30217cUL /* only listed as "reserved" in datasheet */
#define REG_ROMSUB_SEL 0x3020f0UL /* only listed as "reserved" in datasheet */
#define REG_TOUCH_FAULT 0x302170UL /* only listed as "reserved" in datasheet */
#endif
/* FT81x graphics engine specific macros useful for static display list generation */
/* beware, these are different to FTDIs implementation as these take the original values as parameters and not only the upper bits */
#define BITMAP_LAYOUT_H(linestride,height) ((40UL<<24)|((((linestride&0xC00)>>10)&3UL)<<2)|((((height&0x600)>>9)&3UL)<<0))
#define BITMAP_SIZE_H(width,height) ((41UL<<24)|((((width&0x600)>>9)&3UL)<<2)|((((height&0x600)>>9)&3UL)<<0))
#define BITMAP_SOURCE(addr) ((1UL<<24)|(((addr)&4194303UL)<<0))
//#define NOP() ((45UL<<24))
#define PALETTE_SOURCE(addr) ((42UL<<24)|(((addr)&4194303UL)<<0))
#define SCISSOR_SIZE(width,height) ((28UL<<24)|(((width)&4095UL)<<12)|(((height)&4095UL)<<0))
#define SCISSOR_XY(x,y) ((27UL<<24)|(((x)&2047UL)<<11)|(((y)&2047UL)<<0))
#define VERTEX_FORMAT(frac) ((39UL<<24)|(((frac)&7UL)<<0))
#define VERTEX_TRANSLATE_X(x) ((43UL<<24)|(((x)&131071UL)<<0))
#define VERTEX_TRANSLATE_Y(y) ((44UL<<24)|(((y)&131071UL)<<0))
/* ----------------- FT80x exclusive definitions -----------------*/
#else
/* Memory definitions */
#define EVE_RAM_G 0x000000UL
#define EVE_ROM_CHIPID 0x0C0000UL
#define EVE_ROM_FONT 0x0BB23CUL
#define EVE_ROM_FONT_ADDR 0x0FFFFCUL
#define EVE_RAM_DL 0x100000UL
#define EVE_RAM_PAL 0x102000UL
#define EVE_RAM_CMD 0x108000UL
#define EVE_RAM_SCREENSHOT 0x1C2000UL
/* Memory buffer sizes */
#define EVE_RAM_G_SIZE 256*1024L
#define EVE_CMDFIFO_SIZE 4*1024L
#define EVE_RAM_DL_SIZE 8*1024L
#define EVE_RAM_PAL_SIZE 1*1024L
/* Register definitions */
#define REG_ID 0x102400UL
#define REG_FRAMES 0x102404UL
#define REG_CLOCK 0x102408UL
#define REG_FREQUENCY 0x10240CUL
#define REG_SCREENSHOT_EN 0x102410UL
#define REG_SCREENSHOT_Y 0x102414UL
#define REG_SCREENSHOT_START 0x102418UL
#define REG_CPURESET 0x10241CUL
#define REG_TAP_CRC 0x102420UL
#define REG_TAP_MASK 0x102424UL
#define REG_HCYCLE 0x102428UL
#define REG_HOFFSET 0x10242CUL
#define REG_HSIZE 0x102430UL
#define REG_HSYNC0 0x102434UL
#define REG_HSYNC1 0x102438UL
#define REG_VCYCLE 0x10243CUL
#define REG_VOFFSET 0x102440UL
#define REG_VSIZE 0x102444UL
#define REG_VSYNC0 0x102448UL
#define REG_VSYNC1 0x10244CUL
#define REG_DLSWAP 0x102450UL
#define REG_ROTATE 0x102454UL
#define REG_OUTBITS 0x102458UL
#define REG_DITHER 0x10245CUL
#define REG_SWIZZLE 0x102460UL
#define REG_CSPREAD 0x102464UL
#define REG_PCLK_POL 0x102468UL
#define REG_PCLK 0x10246CUL
#define REG_TAG_X 0x102470UL
#define REG_TAG_Y 0x102474UL
#define REG_TAG 0x102478UL
#define REG_VOL_PB 0x10247CUL
#define REG_VOL_SOUND 0x102480UL
#define REG_SOUND 0x102484UL
#define REG_PLAY 0x102488UL
#define REG_GPIO_DIR 0x10248CUL
#define REG_GPIO 0x102490UL
#define REG_INT_FLAGS 0x102498UL
#define REG_INT_EN 0x10249CUL
#define REG_INT_MASK 0x1024A0UL
#define REG_PLAYBACK_START 0x1024A4UL
#define REG_PLAYBACK_LENGTH 0x1024A8UL
#define REG_PLAYBACK_READPTR 0x1024ACUL
#define REG_PLAYBACK_FREQ 0x1024B0UL
#define REG_PLAYBACK_FORMAT 0x1024B4UL
#define REG_PLAYBACK_LOOP 0x1024B8UL
#define REG_PLAYBACK_PLAY 0x1024BCUL
#define REG_PWM_HZ 0x1024C0UL
#define REG_PWM_DUTY 0x1024C4UL
#define REG_MACRO_0 0x1024C8UL
#define REG_MACRO_1 0x1024CCUL
#define REG_SCREENSHOT_BUSY 0x1024D8UL
#define REG_CMD_READ 0x1024E4UL
#define REG_CMD_WRITE 0x1024E8UL
#define REG_CMD_DL 0x1024ECUL
#define REG_TOUCH_MODE 0x1024F0UL
#define REG_TOUCH_ADC_MODE 0x1024F4UL
#define REG_TOUCH_CHARGE 0x1024F8UL
#define REG_TOUCH_SETTLE 0x1024FCUL
#define REG_TOUCH_OVERSAMPLE 0x102500UL
#define REG_TOUCH_RZTHRESH 0x102504UL
#define REG_TOUCH_RAW_XY 0x102508UL
#define REG_TOUCH_RZ 0x10250CUL
#define REG_TOUCH_SCREEN_XY 0x102510UL
#define REG_TOUCH_TAG_XY 0x102514UL
#define REG_TOUCH_TAG 0x102518UL
#define REG_TOUCH_TRANSFORM_A 0x10251CUL
#define REG_TOUCH_TRANSFORM_B 0x102520UL
#define REG_TOUCH_TRANSFORM_C 0x102524UL
#define REG_TOUCH_TRANSFORM_D 0x102528UL
#define REG_TOUCH_TRANSFORM_E 0x10252CUL
#define REG_TOUCH_TRANSFORM_F 0x102530UL
#define REG_SCREENSHOT_READ 0x102554UL
#define REG_TRIM 0x10256CUL
#define REG_TOUCH_DIRECT_XY 0x102574UL
#define REG_TOUCH_DIRECT_Z1Z2 0x102578UL
#define REG_TRACKER 0x109000UL
/* FT80x graphics engine specific macros useful for static display list generation */
#define BITMAP_SOURCE(addr) ((1UL<<24)|(((addr)&1048575UL)<<0))
#define SCISSOR_SIZE(width,height) ((28UL<<24)|(((width)&1023UL)<<10)|(((height)&1023UL)<<0))
#define SCISSOR_XY(x,y) ((27UL<<24)|(((x)&511UL)<<9)|(((y)&511UL)<<0))
#endif
#endif /* EVE_H_ */

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,204 @@
/*
@file EVE_commands.h
@brief contains FT8xx / BT8xx function prototypes
@version 4.1 LvGL edition
@date 2020-04-13
@author Rudolph Riedel, David Jade
@section LICENSE
MIT License
Copyright (c) 2016-2020 Rudolph Riedel and David Jade
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute,
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@section History
4.1 LvGL edition
- This version is a heavily modified version of the MIT licensed FT81x code from https://github.com/RudolphRiedel/FT800-FT813
This version is based on a fork by David Jade that added native SPI DMA support and stripped out non-ESP32 code.
It has also been trimmed down to suit LvGL's needs. Extra features can be enabled by defining FT81X_FULL
*/
#include "EVE.h"
#ifndef EVE_COMMANDS_H_
#define EVE_COMMANDS_H_
#define BLOCK_TRANSFER_SIZE 3840 // block transfer size when write data to CMD buffer
void DELAY_MS(uint16_t ms);
void EVE_pdn_set(void);
void EVE_pdn_clear(void);
void spi_acquire();
void spi_release();
void EVE_cmdWrite(uint8_t command, uint8_t parameter);
uint8_t EVE_memRead8(uint32_t ftAddress);
uint16_t EVE_memRead16(uint32_t ftAddress);
uint32_t EVE_memRead32(uint32_t ftAddress);
void EVE_memWrite8(uint32_t ftAddress, uint8_t ftData8);
void EVE_memWrite16(uint32_t ftAddress, uint16_t ftData16);
void EVE_memWrite32(uint32_t ftAddress, uint32_t ftData32);
void EVE_memWrite_buffer(uint32_t ftAddress, const uint8_t *data, uint32_t len, bool LvGL_Flush);
uint8_t EVE_busy(void);
void EVE_get_cmdoffset(void);
/* commands to operate on memory: */
void EVE_cmd_memzero(uint32_t ptr, uint32_t num);
void EVE_cmd_memset(uint32_t ptr, uint8_t value, uint32_t num);
void EVE_cmd_memwrite(uint32_t dest, uint32_t num, const uint8_t *data);
void EVE_cmd_memcpy(uint32_t dest, uint32_t src, uint32_t num);
#if FT81X_FULL
void block_transfer(const uint8_t *data, uint32_t len);
/* commands for loading image data into FT8xx memory: */
void EVE_cmd_inflate(uint32_t ptr, const uint8_t *data, uint16_t len);
void EVE_cmd_loadimage(uint32_t ptr, uint32_t options, const uint8_t *data, uint16_t len);
#if defined (FT81X_ENABLE)
void EVE_cmd_mediafifo(uint32_t ptr, uint32_t size);
#endif
#endif // FT81X_FULL
void EVE_cmd_start(void);
void EVE_cmd_execute(void);
void EVE_start_cmd_burst(void);
void EVE_end_cmd_burst(void);
void EVE_cmd_dl(uint32_t command);
#if FT81X_FULL
/* EVE3 commands */
#if defined (BT81X_ENABLE)
void EVE_cmd_flashwrite(uint32_t ptr, uint32_t num, const uint8_t *data);
void EVE_cmd_flashread(uint32_t dest, uint32_t src, uint32_t num);
void EVE_cmd_flashupdate(uint32_t dest, uint32_t src, uint32_t num);
void EVE_cmd_flasherase(void);
void EVE_cmd_flashattach(void);
void EVE_cmd_flashdetach(void);
void EVE_cmd_flashspidesel(void);
uint32_t EVE_cmd_flashfast(void);
void EVE_cmd_flashspitx(uint32_t num, const uint8_t *data);
void EVE_cmd_flashspirx(uint32_t dest, uint32_t num);
void EVE_cmd_flashsource(uint32_t ptr);
void EVE_cmd_inflate2(uint32_t ptr, uint32_t options, const uint8_t *data, uint16_t len);
void EVE_cmd_rotatearound(int32_t x0, int32_t y0, int32_t angle, int32_t scale);
void EVE_cmd_animstart(int32_t ch, uint32_t aoptr, uint32_t loop);
void EVE_cmd_animstop(int32_t ch);
void EVE_cmd_animxy(int32_t ch, int16_t x0, int16_t y0);
void EVE_cmd_animdraw(int32_t ch);
void EVE_cmd_animframe(int16_t x0, int16_t y0, uint32_t aoptr, uint32_t frame);
void EVE_cmd_gradienta(int16_t x0, int16_t y0, uint32_t argb0, int16_t x1, int16_t y1, uint32_t argb1);
void EVE_cmd_fillwidth(uint32_t s);
void EVE_cmd_appendf(uint32_t ptr, uint32_t num);
uint8_t EVE_init_flash(void);
#endif
/* commands to draw graphics objects: */
#if defined (BT81X_ENABLE)
void EVE_cmd_text_var(int16_t x0, int16_t y0, int16_t font, uint16_t options, const char* text, uint8_t numargs, ...);
void EVE_cmd_button_var(int16_t x0, int16_t y0, int16_t w0, int16_t h0, int16_t font, uint16_t options, const char* text, uint8_t num_args, ...);
void EVE_cmd_toggle_var(int16_t x0, int16_t y0, int16_t w0, int16_t font, uint16_t options, uint16_t state, const char* text, uint8_t num_args, ...);
#endif
void EVE_cmd_text(int16_t x0, int16_t y0, int16_t font, uint16_t options, const char* text);
void EVE_cmd_button(int16_t x0, int16_t y0, int16_t w0, int16_t h0, int16_t font, uint16_t options, const char* text);
void EVE_cmd_clock(int16_t x0, int16_t y0, int16_t r0, uint16_t options, uint16_t hours, uint16_t minutes, uint16_t seconds, uint16_t millisecs);
void EVE_color_rgb(uint8_t red, uint8_t green, uint8_t blue);
void EVE_cmd_bgcolor(uint32_t color);
void EVE_cmd_fgcolor(uint32_t color);
void EVE_cmd_gradcolor(uint32_t color);
void EVE_cmd_gauge(int16_t x0, int16_t y0, int16_t r0, uint16_t options, uint16_t major, uint16_t minor, uint16_t val, uint16_t range);
void EVE_cmd_gradient(int16_t x0, int16_t y0, uint32_t rgb0, int16_t x1, int16_t y1, uint32_t rgb1);
void EVE_cmd_keys(int16_t x0, int16_t y0, int16_t w0, int16_t h0, int16_t font, uint16_t options, const char* text);
void EVE_cmd_progress(int16_t x0, int16_t y0, int16_t w0, int16_t h0, uint16_t options, uint16_t val, uint16_t range);
void EVE_cmd_scrollbar(int16_t x0, int16_t y0, int16_t w0, int16_t h0, uint16_t options, uint16_t val, uint16_t size, uint16_t range);
void EVE_cmd_slider(int16_t x1, int16_t y1, int16_t w1, int16_t h1, uint16_t options, uint16_t val, uint16_t range);
void EVE_cmd_dial(int16_t x0, int16_t y0, int16_t r0, uint16_t options, uint16_t val);
void EVE_cmd_toggle(int16_t x0, int16_t y0, int16_t w0, int16_t font, uint16_t options, uint16_t state, const char* text);
void EVE_cmd_number(int16_t x0, int16_t y0, int16_t font, uint16_t options, int32_t number);
#endif // FT81X_FULL
#if defined (FT81X_ENABLE)
#if FT81X_FULL
void EVE_cmd_setbase(uint32_t base);
#endif
void EVE_cmd_setbitmap(uint32_t addr, uint16_t fmt, uint16_t width, uint16_t height);
#endif
#if FT81X_FULL
void EVE_cmd_append(uint32_t ptr, uint32_t num);
/* commands for setting the bitmap transform matrix: */
void EVE_cmd_getmatrix(int32_t a, int32_t b, int32_t c, int32_t d, int32_t e, int32_t f);
void EVE_cmd_translate(int32_t tx, int32_t ty);
void EVE_cmd_scale(int32_t sx, int32_t sy);
void EVE_cmd_rotate(int32_t ang);
/* other commands: */
void EVE_cmd_calibrate(void);
void EVE_cmd_interrupt(uint32_t ms);
void EVE_cmd_setfont(uint32_t font, uint32_t ptr);
#if defined (FT81X_ENABLE)
void EVE_cmd_romfont(uint32_t font, uint32_t romslot);
void EVE_cmd_setfont2(uint32_t font, uint32_t ptr, uint32_t firstchar);
void EVE_cmd_setrotate(uint32_t r);
void EVE_cmd_setscratch(uint32_t handle);
#endif
void EVE_cmd_sketch(int16_t x0, int16_t y0, uint16_t w0, uint16_t h0, uint32_t ptr, uint16_t format);
void EVE_cmd_snapshot(uint32_t ptr);
#if defined (FT81X_ENABLE)
void EVE_cmd_snapshot2(uint32_t fmt, uint32_t ptr, int16_t x0, int16_t y0, int16_t w0, int16_t h0);
#endif
void EVE_cmd_spinner(int16_t x0, int16_t y0, uint16_t style, uint16_t scale);
void EVE_cmd_track(int16_t x0, int16_t y0, int16_t w0, int16_t h0, int16_t tag);
/* commands that return values by writing to the command-fifo */
uint32_t EVE_cmd_memcrc(uint32_t ptr, uint32_t num);
uint32_t EVE_cmd_getptr(void);
uint32_t EVE_cmd_regread(uint32_t ptr);
void EVE_LIB_GetProps(uint32_t *pointer, uint32_t *width, uint32_t *height);
/* meta-commands, sequences of several display-list entries condensed into simpler to use functions at the price of some overhead */
void EVE_cmd_point(int16_t x0, int16_t y0, uint16_t size);
void EVE_cmd_line(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t w0);
void EVE_cmd_rect(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint16_t corner);
void EVE_calibrate_manual(uint16_t height);
#endif // FT81X_FULL
/* startup FT8xx: */
uint8_t EVE_init(void);
#endif /* EVE_COMMANDS_H_ */

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,352 @@
#include <stdio.h>
#include "driver/gpio.h"
#include "FT81x.h"
#include "EVE.h"
#include "EVE_commands.h"
/* some pre-definded colors */
#define RED 0xff0000UL
#define ORANGE 0xffa500UL
#define GREEN 0x00ff00UL
#define BLUE 0x0000ffUL
#define BLUE_1 0x5dade2L
#define YELLOW 0xffff00UL
#define PINK 0xff00ffUL
#define PURPLE 0x800080UL
#define WHITE 0xffffffUL
#define BLACK 0x000000UL
/* memory-map defines */
#define SCREEN_BITMAP_ADDR 0x00000000 // full screen buffer (0x00000000 - 0x000BBE40)
uint8_t tft_active = 0;
void touch_calibrate(void)
{
/* send pre-recorded touch calibration values, depending on the display the code is compiled for */
#if defined (EVE_CFAF240400C1_030SC)
EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x0000ed11);
EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x00001139);
EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xfff76809);
EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0x00000000);
EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x00010690);
EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0xfffadf2e);
#endif
#if defined (EVE_CFAF320240F_035T)
EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x00005614);
EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x0000009e);
EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xfff43422);
EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0x0000001d);
EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0xffffbda4);
EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0x00f8f2ef);
#endif
#if defined (EVE_CFAF480128A0_039TC)
EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x00010485);
EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x0000017f);
EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xfffb0bd3);
EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0x00000073);
EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x0000e293);
EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0x00069904);
#endif
#if defined (EVE_CFAF800480E0_050SC)
EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x000107f9);
EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0xffffff8c);
EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xfff451ae);
EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0x000000d2);
EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x0000feac);
EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0xfffcfaaf);
#endif
#if defined (EVE_PAF90)
EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x00000159);
EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x0001019c);
EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xfff93625);
EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0x00010157);
EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x00000000);
EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0x0000c101);
#endif
#if defined (EVE_RiTFT43)
EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x000062cd);
EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0xfffffe45);
EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xfff45e0a);
EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0x000001a3);
EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x00005b33);
EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0xFFFbb870);
#endif
#if defined (EVE_EVE2_38)
EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x00007bed);
EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x000001b0);
EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xfff60aa5);
EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0x00000095);
EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0xffffdcda);
EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0x00829c08);
#endif
#if defined (EVE_EVE2_35G)
EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x000109E4);
EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x000007A6);
EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xFFEC1EBA);
EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0x0000072C);
EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x0001096A);
EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0xFFF469CF);
#endif
#if defined (EVE_EVE2_43G)
EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x0000a1ff);
EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x00000680);
EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xffe54cc2);
EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0xffffff53);
EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x0000912c);
EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0xfffe628d);
#endif
#if defined (EVE_EVE2_50G)
EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x000109E4);
EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x000007A6);
EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xFFEC1EBA);
EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0x0000072C);
EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x0001096A);
EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0xFFF469CF);
#endif
#if defined (EVE_EVE2_70G)
EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x000105BC);
EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0xFFFFFA8A);
EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0x00004670);
EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0xFFFFFF75);
EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x00010074);
EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0xFFFF14C8);
#endif
#if defined (EVE_NHD_35)
EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x0000f78b);
EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x00000427);
EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xfffcedf8);
EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0xfffffba4);
EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x0000f756);
EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0x0009279e);
#endif
#if defined (EVE_RVT70)
EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x000074df);
EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x000000e6);
EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xfffd5474);
EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0x000001af);
EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x00007e79);
EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0xffe9a63c);
#endif
#if defined (EVE_FT811CB_HY50HD)
EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 66353);
EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 712);
EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 4293876677);
EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 4294966157);
EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 67516);
EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 418276);
#endif
#if defined (EVE_ADAM101)
EVE_memWrite32(REG_TOUCH_TRANSFORM_A, 0x000101E3);
EVE_memWrite32(REG_TOUCH_TRANSFORM_B, 0x00000114);
EVE_memWrite32(REG_TOUCH_TRANSFORM_C, 0xFFF5EEBA);
EVE_memWrite32(REG_TOUCH_TRANSFORM_D, 0xFFFFFF5E);
EVE_memWrite32(REG_TOUCH_TRANSFORM_E, 0x00010226);
EVE_memWrite32(REG_TOUCH_TRANSFORM_F, 0x0000C783);
#endif
/* activate this if you are using a module for the first time or if you need to re-calibrate it */
/* write down the numbers on the screen and either place them in one of the pre-defined blocks above or make a new block */
// Note: requires FT81x_FULL to be defined
#if 0
/* calibrate touch and displays values to screen */
EVE_cmd_dl(CMD_DLSTART);
EVE_cmd_dl(DL_CLEAR_RGB | BLACK);
EVE_cmd_dl(DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG);
EVE_cmd_text((EVE_HSIZE/2), 50, 26, EVE_OPT_CENTER, "Please tap on the dot.");
EVE_cmd_calibrate();
EVE_cmd_dl(DL_DISPLAY);
EVE_cmd_dl(CMD_SWAP);
EVE_cmd_execute();
uint32_t touch_a, touch_b, touch_c, touch_d, touch_e, touch_f;
touch_a = EVE_memRead32(REG_TOUCH_TRANSFORM_A);
touch_b = EVE_memRead32(REG_TOUCH_TRANSFORM_B);
touch_c = EVE_memRead32(REG_TOUCH_TRANSFORM_C);
touch_d = EVE_memRead32(REG_TOUCH_TRANSFORM_D);
touch_e = EVE_memRead32(REG_TOUCH_TRANSFORM_E);
touch_f = EVE_memRead32(REG_TOUCH_TRANSFORM_F);
EVE_cmd_dl(CMD_DLSTART);
EVE_cmd_dl(DL_CLEAR_RGB | BLACK);
EVE_cmd_dl(DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG);
EVE_cmd_dl(TAG(0));
EVE_cmd_text(5, 15, 26, 0, "TOUCH_TRANSFORM_A:");
EVE_cmd_text(5, 30, 26, 0, "TOUCH_TRANSFORM_B:");
EVE_cmd_text(5, 45, 26, 0, "TOUCH_TRANSFORM_C:");
EVE_cmd_text(5, 60, 26, 0, "TOUCH_TRANSFORM_D:");
EVE_cmd_text(5, 75, 26, 0, "TOUCH_TRANSFORM_E:");
EVE_cmd_text(5, 90, 26, 0, "TOUCH_TRANSFORM_F:");
#if defined (FT81X_ENABLE)
EVE_cmd_setbase(16L); /* FT81x only */
EVE_cmd_number(310, 15, 26, EVE_OPT_RIGHTX|8, touch_a);
EVE_cmd_number(310, 30, 26, EVE_OPT_RIGHTX|8, touch_b);
EVE_cmd_number(310, 45, 26, EVE_OPT_RIGHTX|8, touch_c);
EVE_cmd_number(310, 60, 26, EVE_OPT_RIGHTX|8, touch_d);
EVE_cmd_number(310, 75, 26, EVE_OPT_RIGHTX|8, touch_e);
EVE_cmd_number(310, 90, 26, EVE_OPT_RIGHTX|8, touch_f);
#else
EVE_cmd_number(310, 15, 26, EVE_OPT_RIGHTX, touch_a);
EVE_cmd_number(310, 30, 26, EVE_OPT_RIGHTX, touch_b);
EVE_cmd_number(310, 45, 26, EVE_OPT_RIGHTX, touch_c);
EVE_cmd_number(310, 60, 26, EVE_OPT_RIGHTX, touch_d);
EVE_cmd_number(310, 75, 26, EVE_OPT_RIGHTX, touch_e);
EVE_cmd_number(310, 90, 26, EVE_OPT_RIGHTX, touch_f);
#endif
EVE_cmd_dl(DL_DISPLAY); /* instruct the graphics processor to show the list */
EVE_cmd_dl(CMD_SWAP); /* make this list active */
EVE_cmd_execute();
while(1);
#endif
}
// set up a display list for a fullscreen writable bitmap
void TFT_bitmap_display(void)
{
if(tft_active != 0)
{
EVE_start_cmd_burst(); /* start writing to the cmd-fifo as one stream of bytes, only sending the address once */
EVE_cmd_dl(CMD_DLSTART); /* start the display list */
EVE_cmd_dl(DL_CLEAR_RGB | BLACK); /* set the default clear color to black */
EVE_cmd_dl(DL_CLEAR | CLR_COL | CLR_STN | CLR_TAG); /* clear the screen - this and the previous prevent artifacts between lists, Attributes are the color, stencil and tag buffers */
EVE_cmd_dl(TAG(0));
// fullscreen bitmap for memory-mapped direct access
EVE_cmd_dl(TAG(20));
#ifdef FT81X_ARGB4
EVE_cmd_setbitmap(SCREEN_BITMAP_ADDR, EVE_ARGB4, EVE_HSIZE, EVE_VSIZE);
#else
EVE_cmd_setbitmap(SCREEN_BITMAP_ADDR, EVE_RGB565, EVE_HSIZE, EVE_VSIZE);
#endif
EVE_cmd_dl(DL_BEGIN | EVE_BITMAPS);
EVE_cmd_dl(VERTEX2F(0, 0));
EVE_cmd_dl(DL_END);
EVE_cmd_dl(TAG(0));
EVE_cmd_dl(DL_DISPLAY); /* instruct the graphics processor to show the list */
EVE_cmd_dl(CMD_SWAP); /* make this list active */
EVE_end_cmd_burst(); /* stop writing to the cmd-fifo */
EVE_cmd_start(); /* order the command co-processor to start processing its FIFO queue but do not wait for completion */
}
}
void FT81x_init(void)
{
gpio_pad_select_gpio(EVE_PDN);
gpio_set_level(EVE_CS, 1);
gpio_set_direction(EVE_PDN, GPIO_MODE_OUTPUT);
spi_acquire();
if(EVE_init())
{
tft_active = 1;
EVE_memWrite8(REG_PWM_DUTY, 0x30); /* setup backlight, range is from 0 = off to 0x80 = max */
touch_calibrate();
EVE_cmd_memset(SCREEN_BITMAP_ADDR, BLACK, SCREEN_BUFFER_SIZE); // clear screen buffer
EVE_cmd_execute();
TFT_bitmap_display(); // set DL for fullscreen bitmap display
}
spi_release();
}
// write fullscreen bitmap directly
void TFT_WriteScreen(uint8_t* Bitmap)
{
EVE_memWrite_buffer(SCREEN_BITMAP_ADDR, Bitmap, SCREEN_BUFFER_SIZE, false);
}
// write bitmap directly, line-by-line
void TFT_WriteBitmap(uint8_t* Bitmap, uint16_t X, uint16_t Y, uint16_t Width, uint16_t Height)
{
// calc base address
uint32_t addr = SCREEN_BITMAP_ADDR + (Y * BYTES_PER_LINE) + (X * BYTES_PER_PIXEL);
// can we do a fast full width block transfer?
if(X == 0 && Width == EVE_HSIZE)
{
#ifdef FT81X_ARGB4
uint32_t *ptr32 = (uint32_t *)Bitmap;
uint16_t *ptr16 = (uint16_t *)Bitmap;
for (uint16_t i = 0; i < Width*Height; i++)
{
uint32_t c = *ptr32;
*ptr16 = ((c & 0xF0000000)>>16) | ((c & 0x00F00000)>>12) | ((c & 0x0000F000)>>8) | ((c & 0x000000F0)>>4);
ptr16++;
ptr32++;
}
#endif
EVE_memWrite_buffer(addr, Bitmap, (Height * BYTES_PER_LINE), true);
}
else
{
// line by line mode
#ifdef FT81X_ARGB4
uint32_t *ptr32 = (uint32_t *)Bitmap;
uint16_t *ptr16 = (uint16_t *)Bitmap;
#endif
uint32_t bpl = Width * BYTES_PER_PIXEL;
for (uint16_t i = 0; i < Height; i++)
{
#ifdef FT81X_ARGB4
for (uint16_t j = 0; j < Width; j++)
{
uint32_t c = *ptr32;
*ptr16 = ((c & 0xF0000000)>>16) | ((c & 0x00F00000)>>12) | ((c & 0x0000F000)>>8) | ((c & 0x000000F0)>>4);
ptr16++;
ptr32++;
}
#endif
EVE_memWrite_buffer(addr, Bitmap + (i * bpl), bpl, (i == Height - 1));
addr += BYTES_PER_LINE;
}
}
}
// LittlevGL flush callback
void FT81x_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map)
{
TFT_WriteBitmap((uint8_t*)color_map, area->x1, area->y1, lv_area_get_width(area), lv_area_get_height(area));
}

View File

@ -0,0 +1,17 @@
#ifndef FT81X_H_
#define FT81X_H_
#include <stdint.h>
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#include "../lvgl_helpers.h"
void FT81x_init(void);
void FT81x_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map);
#endif /* FT81X_H_ */

View File

@ -0,0 +1,65 @@
/**
* @file lv_templ.h
*
*/
#ifndef GC9A01_H
#define GC9A01_H
#ifdef __cplusplus
extern "C" {
#endif
/*********************
* INCLUDES
*********************/
#include <stdbool.h>
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#include "../lvgl_helpers.h"
/*********************
* DEFINES
*********************/
#define GC9A01_DC CONFIG_LV_DISP_PIN_DC
#define GC9A01_RST CONFIG_LV_DISP_PIN_RST
#define GC9A01_BCKL CONFIG_LV_DISP_PIN_BCKL
#define GC9A01_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL
#if CONFIG_LV_BACKLIGHT_ACTIVE_LVL
#define GC9A01_BCKL_ACTIVE_LVL 1
#else
#define GC9A01_BCKL_ACTIVE_LVL 0
#endif
#define GC9A01_INVERT_COLORS CONFIG_LV_INVERT_COLORS
/**********************
* TYPEDEFS
**********************/
/**********************
* GLOBAL PROTOTYPES
**********************/
void GC9A01_init(void);
void GC9A01_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map);
void GC9A01_enable_backlight(bool backlight);
void GC9A01_sleep_in(void);
void GC9A01_sleep_out(void);
/**********************
* MACROS
**********************/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /*GC9A01_H*/

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,4 @@
# TFT drivers
COMPONENT_SRCDIRS := .
COMPONENT_ADD_INCLUDEDIRS := .

View File

@ -0,0 +1,107 @@
/**
* @file disp_driver.c
*/
#include "disp_driver.h"
#include "disp_spi.h"
void disp_driver_init(void)
{
#if defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9341
ili9341_init();
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9481
ili9481_init();
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9488
ili9488_init();
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7789
st7789_init();
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7735S
st7735s_init();
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_HX8357
hx8357_init();
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9486
ili9486_init();
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SH1107
sh1107_init();
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SSD1306
ssd1306_init();
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X
FT81x_init();
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_IL3820
il3820_init();
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_RA8875
ra8875_init();
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_GC9A01
GC9A01_init();
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_JD79653A
jd79653a_init();
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D
uc8151d_init();
#endif
}
void disp_driver_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map)
{
#if defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9341
ili9341_flush(drv, area, color_map);
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9481
ili9481_flush(drv, area, color_map);
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9488
ili9488_flush(drv, area, color_map);
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7789
st7789_flush(drv, area, color_map);
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7735S
st7735s_flush(drv, area, color_map);
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_HX8357
hx8357_flush(drv, area, color_map);
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9486
ili9486_flush(drv, area, color_map);
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SH1107
sh1107_flush(drv, area, color_map);
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SSD1306
ssd1306_flush(drv, area, color_map);
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X
FT81x_flush(drv, area, color_map);
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_IL3820
il3820_flush(drv, area, color_map);
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_RA8875
ra8875_flush(drv, area, color_map);
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_GC9A01
GC9A01_flush(drv, area, color_map);
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_JD79653A
jd79653a_lv_fb_flush(drv, area, color_map);
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D
uc8151d_lv_fb_flush(drv, area, color_map);
#endif
}
void disp_driver_rounder(lv_disp_drv_t * disp_drv, lv_area_t * area)
{
#if defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SSD1306
ssd1306_rounder(disp_drv, area);
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SH1107
sh1107_rounder(disp_drv, area);
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_IL3820
il3820_rounder(disp_drv, area);
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_JD79653A
jd79653a_lv_rounder_cb(disp_drv, area);
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D
uc8151d_lv_rounder_cb(disp_drv, area);
#endif
}
void disp_driver_set_px(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y,
lv_color_t color, lv_opa_t opa)
{
#if defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SSD1306
ssd1306_set_px_cb(disp_drv, buf, buf_w, x, y, color, opa);
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SH1107
sh1107_set_px_cb(disp_drv, buf, buf_w, x, y, color, opa);
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_IL3820
il3820_set_px_cb(disp_drv, buf, buf_w, x, y, color, opa);
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_JD79653A
jd79653a_lv_set_fb_cb(disp_drv, buf, buf_w, x, y, color, opa);
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D
uc8151d_lv_set_fb_cb(disp_drv, buf, buf_w, x, y, color, opa);
#endif
}

View File

@ -0,0 +1,86 @@
/**
* @file disp_driver.h
*/
#ifndef DISP_DRIVER_H
#define DISP_DRIVER_H
#ifdef __cplusplus
extern "C" {
#endif
/*********************
* INCLUDES
*********************/
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#if defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9341
#include "ili9341.h"
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9481
#include "ili9481.h"
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9488
#include "ili9488.h"
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7789
#include "st7789.h"
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ST7735S
#include "st7735s.h"
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_HX8357
#include "hx8357.h"
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_ILI9486
#include "ili9486.h"
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SH1107
#include "sh1107.h"
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_SSD1306
#include "ssd1306.h"
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X
#include "FT81x.h"
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_IL3820
#include "il3820.h"
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_RA8875
#include "ra8875.h"
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_GC9A01
#include "GC9A01.h"
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_JD79653A
#include "jd79653a.h"
#elif defined CONFIG_LV_TFT_DISPLAY_CONTROLLER_UC8151D
#include "uc8151d.h"
#endif
/*********************
* DEFINES
*********************/
/**********************
* TYPEDEFS
**********************/
/**********************
* GLOBAL PROTOTYPES
**********************/
/* Initialize display */
void disp_driver_init(void);
/* Display flush callback */
void disp_driver_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map);
/* Display rounder callback, used with monochrome dispays */
void disp_driver_rounder(lv_disp_drv_t * disp_drv, lv_area_t * area);
/* Display set_px callback, used with monochrome dispays */
void disp_driver_set_px(lv_disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y,
lv_color_t color, lv_opa_t opa);
/**********************
* MACROS
**********************/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /*DISP_DRIVER_H*/

View File

@ -0,0 +1,320 @@
/**
* @file disp_spi.c
*
*/
/*********************
* INCLUDES
*********************/
#include "esp_system.h"
#include "driver/gpio.h"
#include "driver/spi_master.h"
#include "esp_log.h"
#define TAG "disp_spi"
#include <string.h>
#include <freertos/FreeRTOS.h>
#include <freertos/semphr.h>
#include <freertos/task.h>
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#include "disp_spi.h"
#include "disp_driver.h"
#include "../lvgl_helpers.h"
#include "../lvgl_spi_conf.h"
/******************************************************************************
* Notes about DMA spi_transaction_ext_t structure pooling
*
* An xQueue is used to hold a pool of reusable SPI spi_transaction_ext_t
* structures that get used for all DMA SPI transactions. While an xQueue may
* seem like overkill it is an already built-in RTOS feature that comes at
* little cost. xQueues are also ISR safe if it ever becomes necessary to
* access the pool in the ISR callback.
*
* When a DMA request is sent, a transaction structure is removed from the
* pool, filled out, and passed off to the esp32 SPI driver. Later, when
* servicing pending SPI transaction results, the transaction structure is
* recycled back into the pool for later reuse. This matches the DMA SPI
* transaction life cycle requirements of the esp32 SPI driver.
*
* When polling or synchronously sending SPI requests, and as required by the
* esp32 SPI driver, all pending DMA transactions are first serviced. Then the
* polling SPI request takes place.
*
* When sending an asynchronous DMA SPI request, if the pool is empty, some
* small percentage of pending transactions are first serviced before sending
* any new DMA SPI transactions. Not too many and not too few as this balance
* controls DMA transaction latency.
*
* It is therefore not the design that all pending transactions must be
* serviced and placed back into the pool with DMA SPI requests - that
* will happen eventually. The pool just needs to contain enough to float some
* number of in-flight SPI requests to speed up the overall DMA SPI data rate
* and reduce transaction latency. If however a display driver uses some
* polling SPI requests or calls disp_wait_for_pending_transactions() directly,
* the pool will reach the full state more often and speed up DMA queuing.
*
*****************************************************************************/
/*********************
* DEFINES
*********************/
#define SPI_TRANSACTION_POOL_SIZE 50 /* maximum number of DMA transactions simultaneously in-flight */
/* DMA Transactions to reserve before queueing additional DMA transactions. A 1/10th seems to be a good balance. Too many (or all) and it will increase latency. */
#define SPI_TRANSACTION_POOL_RESERVE_PERCENTAGE 10
#if SPI_TRANSACTION_POOL_SIZE >= SPI_TRANSACTION_POOL_RESERVE_PERCENTAGE
#define SPI_TRANSACTION_POOL_RESERVE (SPI_TRANSACTION_POOL_SIZE / SPI_TRANSACTION_POOL_RESERVE_PERCENTAGE)
#else
#define SPI_TRANSACTION_POOL_RESERVE 1 /* defines minimum size */
#endif
/**********************
* TYPEDEFS
**********************/
/**********************
* STATIC PROTOTYPES
**********************/
static void IRAM_ATTR spi_ready (spi_transaction_t *trans);
/**********************
* STATIC VARIABLES
**********************/
static spi_host_device_t spi_host;
static spi_device_handle_t spi;
static QueueHandle_t TransactionPool = NULL;
static transaction_cb_t chained_post_cb;
/**********************
* MACROS
**********************/
/**********************
* GLOBAL FUNCTIONS
**********************/
void disp_spi_add_device_config(spi_host_device_t host, spi_device_interface_config_t *devcfg)
{
spi_host=host;
chained_post_cb=devcfg->post_cb;
devcfg->post_cb=spi_ready;
esp_err_t ret=spi_bus_add_device(host, devcfg, &spi);
assert(ret==ESP_OK);
}
void disp_spi_add_device(spi_host_device_t host)
{
disp_spi_add_device_with_speed(host, SPI_TFT_CLOCK_SPEED_HZ);
}
void disp_spi_add_device_with_speed(spi_host_device_t host, int clock_speed_hz)
{
ESP_LOGI(TAG, "Adding SPI device");
ESP_LOGI(TAG, "Clock speed: %dHz, mode: %d, CS pin: %d",
clock_speed_hz, SPI_TFT_SPI_MODE, DISP_SPI_CS);
spi_device_interface_config_t devcfg={
.clock_speed_hz = clock_speed_hz,
.mode = SPI_TFT_SPI_MODE,
.spics_io_num=DISP_SPI_CS, // CS pin
.input_delay_ns=DISP_SPI_INPUT_DELAY_NS,
.queue_size=SPI_TRANSACTION_POOL_SIZE,
.pre_cb=NULL,
.post_cb=NULL,
#if defined(DISP_SPI_HALF_DUPLEX)
.flags = SPI_DEVICE_NO_DUMMY | SPI_DEVICE_HALFDUPLEX, /* dummy bits should be explicitly handled via DISP_SPI_VARIABLE_DUMMY as needed */
#else
#if defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_FT81X)
.flags = 0,
#elif defined (CONFIG_LV_TFT_DISPLAY_CONTROLLER_RA8875)
.flags = SPI_DEVICE_NO_DUMMY,
#endif
#endif
};
disp_spi_add_device_config(host, &devcfg);
/* create the transaction pool and fill it with ptrs to spi_transaction_ext_t to reuse */
if(TransactionPool == NULL) {
TransactionPool = xQueueCreate(SPI_TRANSACTION_POOL_SIZE, sizeof(spi_transaction_ext_t*));
assert(TransactionPool != NULL);
for (size_t i = 0; i < SPI_TRANSACTION_POOL_SIZE; i++)
{
spi_transaction_ext_t* pTransaction = (spi_transaction_ext_t*)heap_caps_malloc(sizeof(spi_transaction_ext_t), MALLOC_CAP_DMA);
assert(pTransaction != NULL);
memset(pTransaction, 0, sizeof(spi_transaction_ext_t));
xQueueSend(TransactionPool, &pTransaction, portMAX_DELAY);
}
}
}
void disp_spi_change_device_speed(int clock_speed_hz)
{
if (clock_speed_hz <= 0) {
clock_speed_hz = SPI_TFT_CLOCK_SPEED_HZ;
}
ESP_LOGI(TAG, "Changing SPI device clock speed: %d", clock_speed_hz);
disp_spi_remove_device();
disp_spi_add_device_with_speed(spi_host, clock_speed_hz);
}
void disp_spi_remove_device()
{
/* Wait for previous pending transaction results */
disp_wait_for_pending_transactions();
esp_err_t ret=spi_bus_remove_device(spi);
assert(ret==ESP_OK);
}
void disp_spi_transaction(const uint8_t *data, size_t length,
disp_spi_send_flag_t flags, uint8_t *out,
uint64_t addr, uint8_t dummy_bits)
{
if (0 == length) {
return;
}
spi_transaction_ext_t t = {0};
/* transaction length is in bits */
t.base.length = length * 8;
if (length <= 4 && data != NULL) {
t.base.flags = SPI_TRANS_USE_TXDATA;
memcpy(t.base.tx_data, data, length);
} else {
t.base.tx_buffer = data;
}
if (flags & DISP_SPI_RECEIVE) {
assert(out != NULL && (flags & (DISP_SPI_SEND_POLLING | DISP_SPI_SEND_SYNCHRONOUS)));
t.base.rx_buffer = out;
#if defined(DISP_SPI_HALF_DUPLEX)
t.base.rxlength = t.base.length;
t.base.length = 0; /* no MOSI phase in half-duplex reads */
#else
t.base.rxlength = 0; /* in full-duplex mode, zero means same as tx length */
#endif
}
if (flags & DISP_SPI_ADDRESS_8) {
t.address_bits = 8;
} else if (flags & DISP_SPI_ADDRESS_16) {
t.address_bits = 16;
} else if (flags & DISP_SPI_ADDRESS_24) {
t.address_bits = 24;
} else if (flags & DISP_SPI_ADDRESS_32) {
t.address_bits = 32;
}
if (t.address_bits) {
t.base.addr = addr;
t.base.flags |= SPI_TRANS_VARIABLE_ADDR;
}
#if defined(DISP_SPI_HALF_DUPLEX)
if (flags & DISP_SPI_MODE_DIO) {
t.base.flags |= SPI_TRANS_MODE_DIO;
} else if (flags & DISP_SPI_MODE_QIO) {
t.base.flags |= SPI_TRANS_MODE_QIO;
}
if (flags & DISP_SPI_MODE_DIOQIO_ADDR) {
t.base.flags |= SPI_TRANS_MODE_DIOQIO_ADDR;
}
if ((flags & DISP_SPI_VARIABLE_DUMMY) && dummy_bits) {
t.dummy_bits = dummy_bits;
t.base.flags |= SPI_TRANS_VARIABLE_DUMMY;
}
#endif
/* Save flags for pre/post transaction processing */
t.base.user = (void *) flags;
/* Poll/Complete/Queue transaction */
if (flags & DISP_SPI_SEND_POLLING) {
disp_wait_for_pending_transactions(); /* before polling, all previous pending transactions need to be serviced */
spi_device_polling_transmit(spi, (spi_transaction_t *) &t);
} else if (flags & DISP_SPI_SEND_SYNCHRONOUS) {
disp_wait_for_pending_transactions(); /* before synchronous queueing, all previous pending transactions need to be serviced */
spi_device_transmit(spi, (spi_transaction_t *) &t);
} else {
/* if necessary, ensure we can queue new transactions by servicing some previous transactions */
if(uxQueueMessagesWaiting(TransactionPool) == 0) {
spi_transaction_t *presult;
while(uxQueueMessagesWaiting(TransactionPool) < SPI_TRANSACTION_POOL_RESERVE) {
if (spi_device_get_trans_result(spi, &presult, 1) == ESP_OK) {
xQueueSend(TransactionPool, &presult, portMAX_DELAY); /* back to the pool to be reused */
}
}
}
spi_transaction_ext_t *pTransaction = NULL;
xQueueReceive(TransactionPool, &pTransaction, portMAX_DELAY);
memcpy(pTransaction, &t, sizeof(t));
if (spi_device_queue_trans(spi, (spi_transaction_t *) pTransaction, portMAX_DELAY) != ESP_OK) {
xQueueSend(TransactionPool, &pTransaction, portMAX_DELAY); /* send failed transaction back to the pool to be reused */
}
}
}
void disp_wait_for_pending_transactions(void)
{
spi_transaction_t *presult;
while(uxQueueMessagesWaiting(TransactionPool) < SPI_TRANSACTION_POOL_SIZE) { /* service until the transaction reuse pool is full again */
if (spi_device_get_trans_result(spi, &presult, 1) == ESP_OK) {
xQueueSend(TransactionPool, &presult, portMAX_DELAY);
}
}
}
void disp_spi_acquire(void)
{
esp_err_t ret = spi_device_acquire_bus(spi, portMAX_DELAY);
assert(ret == ESP_OK);
}
void disp_spi_release(void)
{
spi_device_release_bus(spi);
}
/**********************
* STATIC FUNCTIONS
**********************/
static void IRAM_ATTR spi_ready(spi_transaction_t *trans)
{
disp_spi_send_flag_t flags = (disp_spi_send_flag_t) trans->user;
if (flags & DISP_SPI_SIGNAL_FLUSH) {
lv_disp_t * disp = NULL;
#if (LVGL_VERSION_MAJOR >= 7)
disp = _lv_refr_get_disp_refreshing();
#else /* Before v7 */
disp = lv_refr_get_disp_refreshing();
#endif
lv_disp_flush_ready(&disp->driver);
}
if (chained_post_cb) {
chained_post_cb(trans);
}
}

View File

@ -0,0 +1,81 @@
/**
* @file disp_spi.h
*
*/
#ifndef DISP_SPI_H
#define DISP_SPI_H
#ifdef __cplusplus
extern "C" {
#endif
/*********************
* INCLUDES
*********************/
#include <stdint.h>
#include <stdbool.h>
#include <driver/spi_master.h>
/*********************
* DEFINES
*********************/
/**********************
* TYPEDEFS
**********************/
typedef enum _disp_spi_send_flag_t {
DISP_SPI_SEND_QUEUED = 0x00000000,
DISP_SPI_SEND_POLLING = 0x00000001,
DISP_SPI_SEND_SYNCHRONOUS = 0x00000002,
DISP_SPI_SIGNAL_FLUSH = 0x00000004,
DISP_SPI_RECEIVE = 0x00000008,
DISP_SPI_CMD_8 = 0x00000010, /* Reserved */
DISP_SPI_CMD_16 = 0x00000020, /* Reserved */
DISP_SPI_ADDRESS_8 = 0x00000040,
DISP_SPI_ADDRESS_16 = 0x00000080,
DISP_SPI_ADDRESS_24 = 0x00000100,
DISP_SPI_ADDRESS_32 = 0x00000200,
DISP_SPI_MODE_DIO = 0x00000400,
DISP_SPI_MODE_QIO = 0x00000800,
DISP_SPI_MODE_DIOQIO_ADDR = 0x00001000,
DISP_SPI_VARIABLE_DUMMY = 0x00002000,
} disp_spi_send_flag_t;
/**********************
* GLOBAL PROTOTYPES
**********************/
void disp_spi_add_device(spi_host_device_t host);
void disp_spi_add_device_config(spi_host_device_t host, spi_device_interface_config_t *devcfg);
void disp_spi_add_device_with_speed(spi_host_device_t host, int clock_speed_hz);
void disp_spi_change_device_speed(int clock_speed_hz);
void disp_spi_remove_device();
/* Important!
All buffers should also be 32-bit aligned and DMA capable to prevent extra allocations and copying.
When DMA reading (even in polling mode) the ESP32 always read in 4-byte chunks even if less is requested.
Extra space will be zero filled. Always ensure the out buffer is large enough to hold at least 4 bytes!
*/
void disp_spi_transaction(const uint8_t *data, size_t length,
disp_spi_send_flag_t flags, uint8_t *out, uint64_t addr, uint8_t dummy_bits);
void disp_wait_for_pending_transactions(void);
void disp_spi_acquire(void);
void disp_spi_release(void);
static inline void disp_spi_send_data(uint8_t *data, size_t length) {
disp_spi_transaction(data, length, DISP_SPI_SEND_POLLING, NULL, 0, 0);
}
static inline void disp_spi_send_colors(uint8_t *data, size_t length) {
disp_spi_transaction(data, length,
DISP_SPI_SEND_QUEUED | DISP_SPI_SIGNAL_FLUSH,
NULL, 0, 0);
}
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /*DISP_SPI_H*/

View File

@ -0,0 +1,151 @@
/**
* @file HX8357.h
*
* Roughly based on the Adafruit_HX8357_Library
*
* This library should work with:
* Adafruit 3.5" TFT 320x480 + Touchscreen Breakout
* http://www.adafruit.com/products/2050
*
* Adafruit TFT FeatherWing - 3.5" 480x320 Touchscreen for Feathers
* https://www.adafruit.com/product/3651
*
*/
#ifndef HX8357_H
#define HX8357_H
#ifdef __cplusplus
extern "C" {
#endif
/*********************
* INCLUDES
*********************/
#include <stdbool.h>
#include <stdint.h>
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#include "../lvgl_helpers.h"
/*********************
* DEFINES
*********************/
#define HX8357_DC CONFIG_LV_DISP_PIN_DC
#define HX8357_RST CONFIG_LV_DISP_PIN_RST
#define HX8357_BCKL CONFIG_LV_DISP_PIN_BCKL
#define HX8357_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL
#if CONFIG_LV_BACKLIGHT_ACTIVE_LVL
#define HX8357_BCKL_ACTIVE_LVL 1
#else
#define HX8357_BCKL_ACTIVE_LVL 0
#endif
// if text/images are backwards, try setting this to 1
#define HX8357_INVERT_DISPLAY CONFIG_LV_INVERT_DISPLAY
/*******************
* HX8357B/D REGS
*********************/
#define HX8357D 0xD ///< Our internal const for D type
#define HX8357B 0xB ///< Our internal const for B type
#define HX8357_TFTWIDTH 320 ///< 320 pixels wide
#define HX8357_TFTHEIGHT 480 ///< 480 pixels tall
#define HX8357_NOP 0x00 ///< No op
#define HX8357_SWRESET 0x01 ///< software reset
#define HX8357_RDDID 0x04 ///< Read ID
#define HX8357_RDDST 0x09 ///< (unknown)
#define HX8357_RDPOWMODE 0x0A ///< Read power mode Read power mode
#define HX8357_RDMADCTL 0x0B ///< Read MADCTL
#define HX8357_RDCOLMOD 0x0C ///< Column entry mode
#define HX8357_RDDIM 0x0D ///< Read display image mode
#define HX8357_RDDSDR 0x0F ///< Read dosplay signal mode
#define HX8357_SLPIN 0x10 ///< Enter sleep mode
#define HX8357_SLPOUT 0x11 ///< Exit sleep mode
#define HX8357B_PTLON 0x12 ///< Partial mode on
#define HX8357B_NORON 0x13 ///< Normal mode
#define HX8357_INVOFF 0x20 ///< Turn off invert
#define HX8357_INVON 0x21 ///< Turn on invert
#define HX8357_DISPOFF 0x28 ///< Display on
#define HX8357_DISPON 0x29 ///< Display off
#define HX8357_CASET 0x2A ///< Column addr set
#define HX8357_PASET 0x2B ///< Page addr set
#define HX8357_RAMWR 0x2C ///< Write VRAM
#define HX8357_RAMRD 0x2E ///< Read VRAm
#define HX8357B_PTLAR 0x30 ///< (unknown)
#define HX8357_TEON 0x35 ///< Tear enable on
#define HX8357_TEARLINE 0x44 ///< (unknown)
#define HX8357_MADCTL 0x36 ///< Memory access control
#define HX8357_COLMOD 0x3A ///< Color mode
#define HX8357_SETOSC 0xB0 ///< Set oscillator
#define HX8357_SETPWR1 0xB1 ///< Set power control
#define HX8357B_SETDISPLAY 0xB2 ///< Set display mode
#define HX8357_SETRGB 0xB3 ///< Set RGB interface
#define HX8357D_SETCOM 0xB6 ///< Set VCOM voltage
#define HX8357B_SETDISPMODE 0xB4 ///< Set display mode
#define HX8357D_SETCYC 0xB4 ///< Set display cycle reg
#define HX8357B_SETOTP 0xB7 ///< Set OTP memory
#define HX8357D_SETC 0xB9 ///< Enable extension command
#define HX8357B_SET_PANEL_DRIVING 0xC0 ///< Set panel drive mode
#define HX8357D_SETSTBA 0xC0 ///< Set source option
#define HX8357B_SETDGC 0xC1 ///< Set DGC settings
#define HX8357B_SETID 0xC3 ///< Set ID
#define HX8357B_SETDDB 0xC4 ///< Set DDB
#define HX8357B_SETDISPLAYFRAME 0xC5 ///< Set display frame
#define HX8357B_GAMMASET 0xC8 ///< Set Gamma correction
#define HX8357B_SETCABC 0xC9 ///< Set CABC
#define HX8357_SETPANEL 0xCC ///< Set Panel
#define HX8357B_SETPOWER 0xD0 ///< Set power control
#define HX8357B_SETVCOM 0xD1 ///< Set VCOM
#define HX8357B_SETPWRNORMAL 0xD2 ///< Set power normal
#define HX8357B_RDID1 0xDA ///< Read ID #1
#define HX8357B_RDID2 0xDB ///< Read ID #2
#define HX8357B_RDID3 0xDC ///< Read ID #3
#define HX8357B_RDID4 0xDD ///< Read ID #4
#define HX8357D_SETGAMMA 0xE0 ///< Set Gamma
#define HX8357B_SETGAMMA 0xC8 ///< Set Gamma
#define HX8357B_SETPANELRELATED 0xE9 ///< Set panel related
/**********************
* TYPEDEFS
**********************/
/**********************
* GLOBAL PROTOTYPES
**********************/
void hx8357_init(void);
void hx8357_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map);
void hx8357_enable_backlight(bool backlight);
void hx8357_set_rotation(uint8_t r);
/**********************
* MACROS
**********************/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /*HX8357_H*/

View File

@ -0,0 +1,113 @@
/**
* @file il3820.h
*
*/
#ifndef IL3820_H
#define IL3820_H
#ifdef __cplusplus
extern "C"
{
#endif
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#include "sdkconfig.h"
/* Values for Waveshare 2.9inch e-Paper Module, this values shouldn't be
* swapped to change display orientation */
#define EPD_PANEL_WIDTH CONFIG_LV_DISPLAY_WIDTH /* 128 */
#define EPD_PANEL_HEIGHT CONFIG_LV_DISPLAY_HEIGHT /* 296 */
/* 128 = panel width */
#define IL3820_COLUMNS (EPD_PANEL_WIDTH / 8)
#define IL3820_DC_PIN CONFIG_LV_DISP_PIN_DC
#define IL3820_RST_PIN CONFIG_LV_DISP_PIN_RST
#define IL3820_BUSY_PIN CONFIG_LV_DISP_PIN_BUSY
#define IL3820_BUSY_LEVEL 1
/* IL3820 commands */
#define IL3820_CMD_GDO_CTRL 0x01
#define IL3820_CMD_GDV_CTRL 0x03
#define IL3820_CMD_SDV_CTRL 0x04
#define IL3820_CMD_SOFTSTART 0x0c
#define IL3820_CMD_GSCAN_START 0x0f
#define IL3820_CMD_SLEEP_MODE 0x10
#define IL3820_CMD_ENTRY_MODE 0x11
#define IL3820_CMD_SW_RESET 0x12
#define IL3820_CMD_TSENS_CTRL 0x1a
#define IL3820_CMD_MASTER_ACTIVATION 0x20
#define IL3820_CMD_UPDATE_CTRL1 0x21
#define IL3820_CMD_UPDATE_CTRL2 0x22
#define IL3820_CMD_WRITE_RAM 0x24
#define IL3820_CMD_WRITE_RED_RAM 0x26
#define IL3820_CMD_VCOM_SENSE 0x28
#define IL3820_CMD_VCOM_SENSE_DURATON 0x29
#define IL3820_CMD_PRGM_VCOM_OTP 0x2a
#define IL3820_CMD_VCOM_VOLTAGE 0x2c
#define IL3820_CMD_PRGM_WS_OTP 0x30
#define IL3820_CMD_UPDATE_LUT 0x32
#define IL3820_CMD_PRGM_OTP_SELECTION 0x36
#define IL3820_CMD_OTP_SELECTION_CTRL 0x37
#define IL3820_CMD_DUMMY_LINE 0x3a
#define IL3820_CMD_GATE_LINE_WIDTH 0x3b
#define IL3820_CMD_BWF_CTRL 0x3c
#define IL3820_CMD_RAM_XPOS_CTRL 0x44
#define IL3820_CMD_RAM_YPOS_CTRL 0x45
#define IL3820_CMD_RAM_XPOS_CNTR 0x4e
#define IL3820_CMD_RAM_YPOS_CNTR 0x4f
#define IL3820_CMD_TERMINATE_FRAME_RW 0xff
/* Data entry sequence modes */
#define IL3820_DATA_ENTRY_MASK 0x07
#define IL3820_DATA_ENTRY_XDYDX 0x00
#define IL3820_DATA_ENTRY_XIYDX 0x01
#define IL3820_DATA_ENTRY_XDYIX 0x02
#define IL3820_DATA_ENTRY_XIYIX 0x03
#define IL3820_DATA_ENTRY_XDYDY 0x04
#define IL3820_DATA_ENTRY_XIYDY 0x05
#define IL3820_DATA_ENTRY_XDYIY 0x06
#define IL3820_DATA_ENTRY_XIYIY 0x07
/* Options for display update */
#define IL3820_CTRL1_INITIAL_UPDATE_LL 0x00
#define IL3820_CTRL1_INITIAL_UPDATE_LH 0x01
#define IL3820_CTRL1_INITIAL_UPDATE_HL 0x02
#define IL3820_CTRL1_INITIAL_UPDATE_HH 0x03
/* Options for display update sequence */
#define IL3820_CTRL2_ENABLE_CLK 0x80
#define IL3820_CTRL2_ENABLE_ANALOG 0x40
#define IL3820_CTRL2_TO_INITIAL 0x08
#define IL3820_CTRL2_TO_PATTERN 0x04
#define IL3820_CTRL2_DISABLE_ANALOG 0x02
#define IL3820_CTRL2_DISABLE_CLK 0x01
#define IL3820_SLEEP_MODE_DSM 0x01
#define IL3820_SLEEP_MODE_PON 0x00
/* time constants in ms */
#define IL3820_RESET_DELAY 20
#define IL3820_BUSY_DELAY 1
// normal wait time max 200ms
#define IL3820_WAIT 20
void il3820_init(void);
void il3820_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map);
void il3820_fullflush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map);
void il3820_rounder(struct _disp_drv_t * disp_drv, lv_area_t *area);
void il3820_set_px_cb(struct _disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y, lv_color_t color, lv_opa_t opa);
void il3820_sleep_in(void);
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* __IL3820_REGS_H__ */

View File

@ -0,0 +1,65 @@
/**
* @file lv_templ.h
*
*/
#ifndef ILI9341_H
#define ILI9341_H
#ifdef __cplusplus
extern "C" {
#endif
/*********************
* INCLUDES
*********************/
#include <stdbool.h>
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#include "../lvgl_helpers.h"
/*********************
* DEFINES
*********************/
#define ILI9341_DC CONFIG_LV_DISP_PIN_DC
#define ILI9341_RST CONFIG_LV_DISP_PIN_RST
#define ILI9341_BCKL CONFIG_LV_DISP_PIN_BCKL
#define ILI9341_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL
#if CONFIG_LV_BACKLIGHT_ACTIVE_LVL
#define ILI9341_BCKL_ACTIVE_LVL 1
#else
#define ILI9341_BCKL_ACTIVE_LVL 0
#endif
#define ILI9341_INVERT_COLORS CONFIG_LV_INVERT_COLORS
/**********************
* TYPEDEFS
**********************/
/**********************
* GLOBAL PROTOTYPES
**********************/
void ili9341_init(void);
void ili9341_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map);
void ili9341_enable_backlight(bool backlight);
void ili9341_sleep_in(void);
void ili9341_sleep_out(void);
/**********************
* MACROS
**********************/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /*ILI9341_H*/

View File

@ -0,0 +1,130 @@
/**
* @file ili9481.h
*/
#ifndef ILI9481_H
#define ILI9481_H
#ifdef __cplusplus
extern "C" {
#endif
/*********************
* INCLUDES
*********************/
#include <stdbool.h>
#include <stdint.h>
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#include "../lvgl_helpers.h"
/*********************
* DEFINES
*********************/
#define ILI9481_DC CONFIG_LV_DISP_PIN_DC
#define ILI9481_RST CONFIG_LV_DISP_PIN_RST
#define ILI9481_BCKL CONFIG_LV_DISP_PIN_BCKL
#define ILI9481_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL
#define ILI9481_INVERT_COLORS CONFIG_LV_INVERT_COLORS
#define ILI9481_DISPLAY_ORIENTATION CONFIG_LV_DISPLAY_ORIENTATION
#if CONFIG_LV_BACKLIGHT_ACTIVE_LVL
#define ILI9481_BCKL_ACTIVE_LVL 1
#else
#define ILI9481_BCKL_ACTIVE_LVL 0
#endif
/*******************
* ILI9481 REGS
*********************/
/* MIPI DCS Type1 */
#define ILI9481_CMD_NOP 0x00
#define ILI9481_CMD_SOFTWARE_RESET 0x01
#define ILI9481_CMD_READ_DISP_POWER_MODE 0x0A
#define ILI9481_CMD_READ_DISP_MADCTRL 0x0B // bits 7:3 only
#define ILI9481_CMD_READ_DISP_PIXEL_FORMAT 0x0C
#define ILI9481_CMD_READ_DISP_IMAGE_MODE 0x0D
#define ILI9481_CMD_READ_DISP_SIGNAL_MODE 0x0E
#define ILI9481_CMD_READ_DISP_SELF_DIAGNOSTIC 0x0F // bits 7:6 only
#define ILI9481_CMD_ENTER_SLEEP_MODE 0x10
#define ILI9481_CMD_SLEEP_OUT 0x11
#define ILI9481_CMD_PARTIAL_MODE_ON 0x12
#define ILI9481_CMD_NORMAL_DISP_MODE_ON 0x13
#define ILI9481_CMD_DISP_INVERSION_OFF 0x20
#define ILI9481_CMD_DISP_INVERSION_ON 0x21
#define ILI9481_CMD_DISPLAY_OFF 0x28
#define ILI9481_CMD_DISPLAY_ON 0x29
#define ILI9481_CMD_COLUMN_ADDRESS_SET 0x2A
#define ILI9481_CMD_PAGE_ADDRESS_SET 0x2B
#define ILI9481_CMD_MEMORY_WRITE 0x2C
#define ILI9481_CMD_MEMORY_READ 0x2E
#define ILI9481_CMD_PARTIAL_AREA 0x30
#define ILI9481_CMD_VERT_SCROLL_DEFINITION 0x33
#define ILI9481_CMD_TEARING_EFFECT_LINE_OFF 0x34
#define ILI9481_CMD_TEARING_EFFECT_LINE_ON 0x35
#define ILI9481_CMD_MEMORY_ACCESS_CONTROL 0x36 // bits 7:3,1:0 only
#define ILI9481_CMD_VERT_SCROLL_START_ADDRESS 0x37
#define ILI9481_CMD_IDLE_MODE_OFF 0x38
#define ILI9481_CMD_IDLE_MODE_ON 0x39
#define ILI9481_CMD_COLMOD_PIXEL_FORMAT_SET 0x3A
#define ILI9481_CMD_WRITE_MEMORY_CONTINUE 0x3C
#define ILI9481_CMD_READ_MEMORY_CONTINUE 0x3E
#define ILI9481_CMD_SET_TEAR_SCANLINE 0x44
#define ILI9481_CMD_GET_SCANLINE 0x45
#define ILI9481_DDB_START 0xA1
#define ILI9481_DDB_CONTINUE 0xA8
/* other */
#define ILI9481_CMD_ACCESS_PROTECT 0xB0
#define ILI9481_CMD_LOW_POWER_CONTROL 0xB1
#define ILI9481_CMD_FRAME_MEMORY_ACCESS 0xB3
#define ILI9481_CMD_DISPLAY_MODE 0xB4
#define ILI9481_CMD_DEVICE_CODE 0xBF
#define ILI9481_CMD_PANEL_DRIVE 0xC0
#define ILI9481_CMD_DISP_TIMING_NORMAL 0xC1
#define ILI9481_CMD_DISP_TIMING_PARTIAL 0xC2
#define ILI9481_CMD_DISP_TIMING_IDLE 0xC3
#define ILI9481_CMD_FRAME_RATE 0xC5
#define ILI9481_CMD_INTERFACE_CONTROL 0xC6
#define ILI9481_CMD_GAMMA_SETTING 0xC8
#define ILI9481_CMD_POWER_SETTING 0xD0
#define ILI9481_CMD_VCOM_CONTROL 0xD1
#define ILI9481_CMD_POWER_CONTROL_NORMAL 0xD2
#define ILI9481_CMD_POWER_CONTROL_IDEL 0xD3
#define ILI9481_CMD_POWER_CONTROL_PARTIAL 0xD4
#define ILI9481_CMD_NVMEM_WRITE 0xE0
#define ILI9481_CMD_NVMEM_PROTECTION_KEY 0xE1
#define ILI9481_CMD_NVMEM_STATUS_READ 0xE2
#define ILI9481_CMD_NVMEM_PROTECTION 0xE3
/**********************
* TYPEDEFS
**********************/
/**********************
* GLOBAL PROTOTYPES
**********************/
void ili9481_init(void);
void ili9481_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map);
void ili9481_enable_backlight(bool backlight);
/**********************
* MACROS
**********************/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /*ILI9481_H*/

View File

@ -0,0 +1,61 @@
/**
* @file ili9486.h
*
*/
#ifndef ILI9486_H
#define ILI9486_H
#ifdef __cplusplus
extern "C" {
#endif
/*********************
* INCLUDES
*********************/
#include <stdbool.h>
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#include "../lvgl_helpers.h"
/*********************
* DEFINES
*********************/
#define ILI9486_DC CONFIG_LV_DISP_PIN_DC
#define ILI9486_RST CONFIG_LV_DISP_PIN_RST
#define ILI9486_BCKL CONFIG_LV_DISP_PIN_BCKL
#define ILI9486_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL
#if CONFIG_LV_BACKLIGHT_ACTIVE_LVL
#define ILI9486_BCKL_ACTIVE_LVL 1
#else
#define ILI9486_BCKL_ACTIVE_LVL 0
#endif
/**********************
* TYPEDEFS
**********************/
/**********************
* GLOBAL PROTOTYPES
**********************/
void ili9486_init(void);
void ili9486_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map);
void ili9486_enable_backlight(bool backlight);
/**********************
* MACROS
**********************/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* ILI9486_H*/

View File

@ -0,0 +1,167 @@
/**
* @file ili9488.h
*/
#ifndef ILI9844_H
#define ILI9844_H
#ifdef __cplusplus
extern "C" {
#endif
/*********************
* INCLUDES
*********************/
#include <stdbool.h>
#include <stdint.h>
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#include "../lvgl_helpers.h"
/*********************
* DEFINES
*********************/
#define ILI9488_DC CONFIG_LV_DISP_PIN_DC
#define ILI9488_RST CONFIG_LV_DISP_PIN_RST
#define ILI9488_BCKL CONFIG_LV_DISP_PIN_BCKL
#define ILI9488_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL
#if CONFIG_LV_BACKLIGHT_ACTIVE_LVL
#define ILI9488_BCKL_ACTIVE_LVL 1
#else
#define ILI9488_BCKL_ACTIVE_LVL 0
#endif
/*******************
* ILI9488 REGS
*********************/
/* Level 1 Commands (from the display Datasheet) */
#define ILI9488_CMD_NOP 0x00
#define ILI9488_CMD_SOFTWARE_RESET 0x01
#define ILI9488_CMD_READ_DISP_ID 0x04
#define ILI9488_CMD_READ_ERROR_DSI 0x05
#define ILI9488_CMD_READ_DISP_STATUS 0x09
#define ILI9488_CMD_READ_DISP_POWER_MODE 0x0A
#define ILI9488_CMD_READ_DISP_MADCTRL 0x0B
#define ILI9488_CMD_READ_DISP_PIXEL_FORMAT 0x0C
#define ILI9488_CMD_READ_DISP_IMAGE_MODE 0x0D
#define ILI9488_CMD_READ_DISP_SIGNAL_MODE 0x0E
#define ILI9488_CMD_READ_DISP_SELF_DIAGNOSTIC 0x0F
#define ILI9488_CMD_ENTER_SLEEP_MODE 0x10
#define ILI9488_CMD_SLEEP_OUT 0x11
#define ILI9488_CMD_PARTIAL_MODE_ON 0x12
#define ILI9488_CMD_NORMAL_DISP_MODE_ON 0x13
#define ILI9488_CMD_DISP_INVERSION_OFF 0x20
#define ILI9488_CMD_DISP_INVERSION_ON 0x21
#define ILI9488_CMD_PIXEL_OFF 0x22
#define ILI9488_CMD_PIXEL_ON 0x23
#define ILI9488_CMD_DISPLAY_OFF 0x28
#define ILI9488_CMD_DISPLAY_ON 0x29
#define ILI9488_CMD_COLUMN_ADDRESS_SET 0x2A
#define ILI9488_CMD_PAGE_ADDRESS_SET 0x2B
#define ILI9488_CMD_MEMORY_WRITE 0x2C
#define ILI9488_CMD_MEMORY_READ 0x2E
#define ILI9488_CMD_PARTIAL_AREA 0x30
#define ILI9488_CMD_VERT_SCROLL_DEFINITION 0x33
#define ILI9488_CMD_TEARING_EFFECT_LINE_OFF 0x34
#define ILI9488_CMD_TEARING_EFFECT_LINE_ON 0x35
#define ILI9488_CMD_MEMORY_ACCESS_CONTROL 0x36
#define ILI9488_CMD_VERT_SCROLL_START_ADDRESS 0x37
#define ILI9488_CMD_IDLE_MODE_OFF 0x38
#define ILI9488_CMD_IDLE_MODE_ON 0x39
#define ILI9488_CMD_COLMOD_PIXEL_FORMAT_SET 0x3A
#define ILI9488_CMD_WRITE_MEMORY_CONTINUE 0x3C
#define ILI9488_CMD_READ_MEMORY_CONTINUE 0x3E
#define ILI9488_CMD_SET_TEAR_SCANLINE 0x44
#define ILI9488_CMD_GET_SCANLINE 0x45
#define ILI9488_CMD_WRITE_DISPLAY_BRIGHTNESS 0x51
#define ILI9488_CMD_READ_DISPLAY_BRIGHTNESS 0x52
#define ILI9488_CMD_WRITE_CTRL_DISPLAY 0x53
#define ILI9488_CMD_READ_CTRL_DISPLAY 0x54
#define ILI9488_CMD_WRITE_CONTENT_ADAPT_BRIGHTNESS 0x55
#define ILI9488_CMD_READ_CONTENT_ADAPT_BRIGHTNESS 0x56
#define ILI9488_CMD_WRITE_MIN_CAB_LEVEL 0x5E
#define ILI9488_CMD_READ_MIN_CAB_LEVEL 0x5F
#define ILI9488_CMD_READ_ABC_SELF_DIAG_RES 0x68
#define ILI9488_CMD_READ_ID1 0xDA
#define ILI9488_CMD_READ_ID2 0xDB
#define ILI9488_CMD_READ_ID3 0xDC
/* Level 2 Commands (from the display Datasheet) */
#define ILI9488_CMD_INTERFACE_MODE_CONTROL 0xB0
#define ILI9488_CMD_FRAME_RATE_CONTROL_NORMAL 0xB1
#define ILI9488_CMD_FRAME_RATE_CONTROL_IDLE_8COLOR 0xB2
#define ILI9488_CMD_FRAME_RATE_CONTROL_PARTIAL 0xB3
#define ILI9488_CMD_DISPLAY_INVERSION_CONTROL 0xB4
#define ILI9488_CMD_BLANKING_PORCH_CONTROL 0xB5
#define ILI9488_CMD_DISPLAY_FUNCTION_CONTROL 0xB6
#define ILI9488_CMD_ENTRY_MODE_SET 0xB7
#define ILI9488_CMD_BACKLIGHT_CONTROL_1 0xB9
#define ILI9488_CMD_BACKLIGHT_CONTROL_2 0xBA
#define ILI9488_CMD_HS_LANES_CONTROL 0xBE
#define ILI9488_CMD_POWER_CONTROL_1 0xC0
#define ILI9488_CMD_POWER_CONTROL_2 0xC1
#define ILI9488_CMD_POWER_CONTROL_NORMAL_3 0xC2
#define ILI9488_CMD_POWER_CONTROL_IDEL_4 0xC3
#define ILI9488_CMD_POWER_CONTROL_PARTIAL_5 0xC4
#define ILI9488_CMD_VCOM_CONTROL_1 0xC5
#define ILI9488_CMD_CABC_CONTROL_1 0xC6
#define ILI9488_CMD_CABC_CONTROL_2 0xC8
#define ILI9488_CMD_CABC_CONTROL_3 0xC9
#define ILI9488_CMD_CABC_CONTROL_4 0xCA
#define ILI9488_CMD_CABC_CONTROL_5 0xCB
#define ILI9488_CMD_CABC_CONTROL_6 0xCC
#define ILI9488_CMD_CABC_CONTROL_7 0xCD
#define ILI9488_CMD_CABC_CONTROL_8 0xCE
#define ILI9488_CMD_CABC_CONTROL_9 0xCF
#define ILI9488_CMD_NVMEM_WRITE 0xD0
#define ILI9488_CMD_NVMEM_PROTECTION_KEY 0xD1
#define ILI9488_CMD_NVMEM_STATUS_READ 0xD2
#define ILI9488_CMD_READ_ID4 0xD3
#define ILI9488_CMD_ADJUST_CONTROL_1 0xD7
#define ILI9488_CMD_READ_ID_VERSION 0xD8
#define ILI9488_CMD_POSITIVE_GAMMA_CORRECTION 0xE0
#define ILI9488_CMD_NEGATIVE_GAMMA_CORRECTION 0xE1
#define ILI9488_CMD_DIGITAL_GAMMA_CONTROL_1 0xE2
#define ILI9488_CMD_DIGITAL_GAMMA_CONTROL_2 0xE3
#define ILI9488_CMD_SET_IMAGE_FUNCTION 0xE9
#define ILI9488_CMD_ADJUST_CONTROL_2 0xF2
#define ILI9488_CMD_ADJUST_CONTROL_3 0xF7
#define ILI9488_CMD_ADJUST_CONTROL_4 0xF8
#define ILI9488_CMD_ADJUST_CONTROL_5 0xF9
#define ILI9488_CMD_SPI_READ_SETTINGS 0xFB
#define ILI9488_CMD_ADJUST_CONTROL_6 0xFC
#define ILI9488_CMD_ADJUST_CONTROL_7 0xFF
/**********************
* TYPEDEFS
**********************/
typedef struct {
uint8_t red;
uint8_t green;
uint8_t blue;
} lv_color_custom_t;
/**********************
* GLOBAL PROTOTYPES
**********************/
void ili9488_init(void);
void ili9488_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map);
void ili9488_enable_backlight(bool backlight);
/**********************
* MACROS
**********************/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /*ILI9488_H*/

View File

@ -0,0 +1,36 @@
/**
* @file il3820.h
*
*/
#ifndef JD79653A_H
#define JD79653A_H
#ifdef __cplusplus
extern "C"
{
#endif
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
void jd79653a_init();
void jd79653a_deep_sleep();
void jd79653a_lv_set_fb_cb(struct _disp_drv_t * disp_drv, uint8_t* buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y,
lv_color_t color, lv_opa_t opa);
void jd79653a_lv_rounder_cb(struct _disp_drv_t * disp_drv, lv_area_t *area);
void jd79653a_lv_fb_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map);
void jd79653a_fb_set_full_color(uint8_t color);
void jd79653a_fb_full_update(uint8_t *data, size_t len);
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif // JD79653A_H

View File

@ -0,0 +1,118 @@
/**
* @file ra8875.h
*
*/
#ifndef RA8875_H
#define RA8875_H
#ifdef __cplusplus
extern "C" {
#endif
/*********************
* INCLUDES
*********************/
#include <stdbool.h>
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
/*********************
* DEFINES
*********************/
#define RA8875_RST CONFIG_LV_DISP_PIN_RST
// System & Configuration Registers
#define RA8875_REG_PWRR (0x01) // Power and Display Control Register (PWRR)
#define RA8875_REG_MRWC (0x02) // Memory Read/Write Command (MRWC)
#define RA8875_REG_PCSR (0x04) // Pixel Clock Setting Register (PCSR)
#define RA8875_REG_SYSR (0x10) // System Configuration Register (SYSR)
#define RA8875_REG_HDWR (0x14) // LCD Horizontal Display Width Register (HDWR)
#define RA8875_REG_HNDFTR (0x15) // Horizontal Non-Display Period Fine Tuning Option Register (HNDFTR)
#define RA8875_REG_HNDR (0x16) // LCD Horizontal Non-Display Period Register (HNDR)
#define RA8875_REG_HSTR (0x17) // HSYNC Start Position Register (HSTR)
#define RA8875_REG_HPWR (0x18) // HSYNC Pulse Width Register (HPWR)
#define RA8875_REG_VDHR0 (0x19) // LCD Vertical Display Height Register (VDHR0)
#define RA8875_REG_VDHR1 (0x1A) // LCD Vertical Display Height Register (VDHR1)
#define RA8875_REG_VNDR0 (0x1B) // LCD Vertical Non-Display Period Register (VNDR0)
#define RA8875_REG_VNDR1 (0x1C) // LCD Vertical Non-Display Period Register (VNDR1)
#define RA8875_REG_VSTR0 (0x1D) // VSYNC Start Position Register (VSTR0)
#define RA8875_REG_VSTR1 (0x1E) // VSYNC Start Position Register (VSTR1)
#define RA8875_REG_VPWR (0x1F) // VSYNC Pulse Width Register (VPWR)
// LCD Display Control Registers
#define RA8875_REG_DPCR (0x20) // Display Configuration Register (DPCR)
// Active Window & Scroll Window Setting Registers
#define RA8875_REG_HSAW0 (0x30) // Horizontal Start Point 0 of Active Window (HSAW0)
#define RA8875_REG_HSAW1 (0x31) // Horizontal Start Point 1 of Active Window (HSAW1)
#define RA8875_REG_VSAW0 (0x32) // Vertical Start Point 0 of Active Window (VSAW0)
#define RA8875_REG_VSAW1 (0x33) // Vertical Start Point 1 of Active Window (VSAW1)
#define RA8875_REG_HEAW0 (0x34) // Horizontal End Point 0 of Active Window (HEAW0)
#define RA8875_REG_HEAW1 (0x35) // Horizontal End Point 1 of Active Window (HEAW1)
#define RA8875_REG_VEAW0 (0x36) // Vertical End Point 0 of Active Window (VEAW0)
#define RA8875_REG_VEAW1 (0x37) // Vertical End Point 1 of Active Window (VEAW1)
// Cursor Setting Registers
#define RA8875_REG_MWCR0 (0x40) // Memory Write Control Register 0 (MWCR0)
#define RA8875_REG_MWCR1 (0x41) // Memory Write Control Register 1 (MWCR1)
#define RA8875_REG_CURH0 (0x46) // Memory Write Cursor Horizontal Position Register 0 (CURH0)
#define RA8875_REG_CURH1 (0x47) // Memory Write Cursor Horizontal Position Register 1 (CURH1)
#define RA8875_REG_CURV0 (0x48) // Memory Write Cursor Vertical Position Register 0 (CURV0)
#define RA8875_REG_CURV1 (0x49) // Memory Write Cursor Vertical Position Register 1 (CURV1)
// Block Transfer Engine(BTE) Control Registers
#define RA8875_REG_LTPR0 (0x52) // Layer Transparency Register 0 (LTPR0)
#define RA8875_REG_LTPR1 (0x53) // Layer Transparency Register 1 (LTPR1)
// Touch Panel Control Registers
#define RA8875_REG_TPCR0 (0x70) // Touch Panel Control Register 0 (TPCR0)
#define RA8875_REG_TPCR1 (0x71) // Touch Panel Control Register 1 (TPCR1)
#define RA8875_REG_TPXH (0x72) // Touch Panel X High Byte Data Register (TPXH)
#define RA8875_REG_TPYH (0x73) // Touch Panel Y High Byte Data Register (TPYH)
#define RA8875_REG_TPXYL (0x74) // Touch Panel X/Y Low Byte Data Register (TPXYL)
// PLL Setting Registers
#define RA8875_REG_PLLC1 (0x88) // PLL Control Register 1 (PLLC1)
#define RA8875_REG_PLLC2 (0x89) // PLL Control Register 2 (PLLC2)
// Memory Clear Register
#define RA8875_REG_MCLR (0x8E) // Memory Clear Control Register (MCLR)
// Interrupt Control Registers
#define RA8875_REG_INTC1 (0xF0) // Interrupt Control Register1 (INTC1)
#define RA8875_REG_INTC2 (0xF1) // Interrupt Control Register1 (INTC2)
/**********************
* TYPEDEFS
**********************/
/**********************
* GLOBAL PROTOTYPES
**********************/
void ra8875_init(void);
void ra8875_enable_backlight(bool backlight);
void ra8875_enable_display(bool enable);
void ra8875_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map);
void ra8875_sleep_in(void);
void ra8875_sleep_out(void);
uint8_t ra8875_read_cmd(uint8_t cmd);
void ra8875_write_cmd(uint8_t cmd, uint8_t data);
/**********************
* MACROS
**********************/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /*RA8875_H*/

View File

@ -0,0 +1,55 @@
/**
* @file lv_templ.h
*
*/
#ifndef SH1107_H
#define SH1107_H
#ifdef __cplusplus
extern "C" {
#endif
/*********************
* INCLUDES
*********************/
#include <stdbool.h>
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#include "../lvgl_helpers.h"
/*********************
* DEFINES
*********************/
#define SH1107_DC CONFIG_LV_DISP_PIN_DC
#define SH1107_RST CONFIG_LV_DISP_PIN_RST
/**********************
* TYPEDEFS
**********************/
/**********************
* GLOBAL PROTOTYPES
**********************/
void sh1107_init(void);
void sh1107_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map);
void sh1107_rounder(struct _disp_drv_t * disp_drv, lv_area_t *area);
void sh1107_set_px_cb(struct _disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y,
lv_color_t color, lv_opa_t opa);
void sh1107_sleep_in(void);
void sh1107_sleep_out(void);
/**********************
* MACROS
**********************/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /*SH1107_H*/

View File

@ -0,0 +1,57 @@
/**
* @file lv_templ.h
*
*/
#ifndef SSD1306_H
#define SSD1306_H
#ifdef __cplusplus
extern "C" {
#endif
/*********************
* INCLUDES
*********************/
#include <stdbool.h>
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#include "../lvgl_helpers.h"
/*********************
* DEFINES
*********************/
#define SSD1306_SDA CONFIG_LV_DISP_PIN_SDA
#define SSD1306_SCL CONFIG_LV_DISP_PIN_SCL
#define SSD1306_DISPLAY_ORIENTATION TFT_ORIENTATION_LANDSCAPE
/**********************
* TYPEDEFS
**********************/
/**********************
* GLOBAL PROTOTYPES
**********************/
void ssd1306_init(void);
void ssd1306_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map);
void ssd1306_rounder(struct _disp_drv_t * disp_drv, lv_area_t *area);
void ssd1306_set_px_cb(struct _disp_drv_t * disp_drv, uint8_t * buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y,
lv_color_t color, lv_opa_t opa);
void ssd1306_sleep_in(void);
void ssd1306_sleep_out(void);
/**********************
* MACROS
**********************/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /*SSD1306_H*/

View File

@ -0,0 +1,149 @@
/**
* @file lv_templ.h
*
*/
#ifndef ST7735S_H
#define ST7735S_H
#ifdef __cplusplus
extern "C" {
#endif
/*********************
* INCLUDES
*********************/
#include <stdbool.h>
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
/*********************
* DEFINES
*********************/
// #define DISP_BUF_SIZE (CONFIG_LV_DISPLAY_WIDTH*CONFIG_LV_DISPLAY_HEIGHT)
#define DISP_BUF_SIZE (LV_HOR_RES_MAX * 40)
#define ST7735S_DC CONFIG_LV_DISP_PIN_DC
#define ST7735S_RST CONFIG_LV_DISP_PIN_RST
#define AXP192_SDA CONFIG_LV_AXP192_PIN_SDA
#define AXP192_SCL CONFIG_LV_AXP192_PIN_SCL
#define ST7735S_INVERT_COLORS CONFIG_LV_INVERT_COLORS
// Defines are taken from
// https://raw.githubusercontent.com/m5stack/M5StickC/master/src/utility/ST7735_Defines.h
// and are modified to fit to the M5StickC device, and are taken from
// https://github.com/adafruit/Adafruit-ST7735-Library
//
#define ST7735_GREENTAB160x80 // For 160 x 80 display (BGR, inverted, 26 / 1 offset)
#define COLSTART 26
#define ROWSTART 1
// Delay between some initialisation commands
#define TFT_INIT_DELAY 0x80
#define TFT_NOP 0x00
#define TFT_SWRST 0x01
#define TFT_CASET 0x2A
#define TFT_PASET 0x2B
#define TFT_RAMWR 0x2C
#define TFT_RAMRD 0x2E
#define TFT_IDXRD 0x00
#define TFT_MADCTL 0x36
#define TFT_MAD_MY 0x80
#define TFT_MAD_MX 0x40
#define TFT_MAD_MV 0x20
#define TFT_MAD_ML 0x10
#define TFT_MAD_BGR 0x08
#define TFT_MAD_MH 0x04
#define TFT_MAD_RGB 0x00
#define TFT_INVOFF 0x20
#define TFT_INVON 0x21
// ST7735 specific commands used in init
#define ST7735_NOP 0x00
#define ST7735_SWRESET 0x01
#define ST7735_RDDID 0x04
#define ST7735_RDDST 0x09
#define ST7735_SLPIN 0x10
#define ST7735_SLPOUT 0x11
#define ST7735_PTLON 0x12
#define ST7735_NORON 0x13
#define ST7735_INVOFF 0x20
#define ST7735_INVON 0x21
#define ST7735_DISPOFF 0x28
#define ST7735_DISPON 0x29
#define ST7735_CASET 0x2A
#define ST7735_RASET 0x2B
#define ST7735_RAMWR 0x2C
#define ST7735_RAMRD 0x2E
#define ST7735_PTLAR 0x30
#define ST7735_VSCRDEF 0x33
#define ST7735_COLMOD 0x3A
#define ST7735_MADCTL 0x36
#define ST7735_VSCRSADD 0x37
#define ST7735_FRMCTR1 0xB1
#define ST7735_FRMCTR2 0xB2
#define ST7735_FRMCTR3 0xB3
#define ST7735_INVCTR 0xB4
#define ST7735_DISSET5 0xB6
#define ST7735_PWCTR1 0xC0
#define ST7735_PWCTR2 0xC1
#define ST7735_PWCTR3 0xC2
#define ST7735_PWCTR4 0xC3
#define ST7735_PWCTR5 0xC4
#define ST7735_VMCTR1 0xC5
#define ST7735_RDID1 0xDA
#define ST7735_RDID2 0xDB
#define ST7735_RDID3 0xDC
#define ST7735_RDID4 0xDD
#define ST7735_PWCTR6 0xFC
#define ST7735_GMCTRP1 0xE0
#define ST7735_GMCTRN1 0xE1
#define ST77XX_MADCTL_MY 0x80
#define ST77XX_MADCTL_MX 0x40
#define ST77XX_MADCTL_MV 0x20
#define ST77XX_MADCTL_ML 0x10
#define ST77XX_MADCTL_RGB 0x00
#define ST77XX_MADCTL_BGR 0x08
/**********************
* TYPEDEFS
**********************/
/**********************
* GLOBAL PROTOTYPES
**********************/
void st7735s_init(void);
void st7735s_flush(lv_disp_drv_t * drv, const lv_area_t * area, lv_color_t * color_map);
void st7735s_enable_backlight(bool backlight);
void st7735s_sleep_in(void);
void st7735s_sleep_out(void);
/**********************
* MACROS
**********************/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /*ST7735S_H*/

View File

@ -0,0 +1,120 @@
/**
* @file st7789.h
*
* Mostly taken from lbthomsen/esp-idf-littlevgl github.
*/
#ifndef ST7789_H
#define ST7789_H
#ifdef __cplusplus
extern "C"
{
#endif
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#include "../lvgl_helpers.h"
#include "sdkconfig.h"
#define ST7789_DC CONFIG_LV_DISP_PIN_DC
#define ST7789_RST CONFIG_LV_DISP_PIN_RST
#define ST7789_BCKL CONFIG_LV_DISP_PIN_BCKL
#define ST7789_ENABLE_BACKLIGHT_CONTROL CONFIG_LV_ENABLE_BACKLIGHT_CONTROL
#if CONFIG_LV_BACKLIGHT_ACTIVE_LVL
#define ST7789_BCKL_ACTIVE_LVL 1
#else
#define ST7789_BCKL_ACTIVE_LVL 0
#endif
/* ST7789 commands */
#define ST7789_NOP 0x00
#define ST7789_SWRESET 0x01
#define ST7789_RDDID 0x04
#define ST7789_RDDST 0x09
#define ST7789_RDDPM 0x0A // Read display power mode
#define ST7789_RDD_MADCTL 0x0B // Read display MADCTL
#define ST7789_RDD_COLMOD 0x0C // Read display pixel format
#define ST7789_RDDIM 0x0D // Read display image mode
#define ST7789_RDDSM 0x0E // Read display signal mode
#define ST7789_RDDSR 0x0F // Read display self-diagnostic result (ST7789V)
#define ST7789_SLPIN 0x10
#define ST7789_SLPOUT 0x11
#define ST7789_PTLON 0x12
#define ST7789_NORON 0x13
#define ST7789_INVOFF 0x20
#define ST7789_INVON 0x21
#define ST7789_GAMSET 0x26 // Gamma set
#define ST7789_DISPOFF 0x28
#define ST7789_DISPON 0x29
#define ST7789_CASET 0x2A
#define ST7789_RASET 0x2B
#define ST7789_RAMWR 0x2C
#define ST7789_RGBSET 0x2D // Color setting for 4096, 64K and 262K colors
#define ST7789_RAMRD 0x2E
#define ST7789_PTLAR 0x30
#define ST7789_VSCRDEF 0x33 // Vertical scrolling definition (ST7789V)
#define ST7789_TEOFF 0x34 // Tearing effect line off
#define ST7789_TEON 0x35 // Tearing effect line on
#define ST7789_MADCTL 0x36 // Memory data access control
#define ST7789_IDMOFF 0x38 // Idle mode off
#define ST7789_IDMON 0x39 // Idle mode on
#define ST7789_RAMWRC 0x3C // Memory write continue (ST7789V)
#define ST7789_RAMRDC 0x3E // Memory read continue (ST7789V)
#define ST7789_COLMOD 0x3A
#define ST7789_RAMCTRL 0xB0 // RAM control
#define ST7789_RGBCTRL 0xB1 // RGB control
#define ST7789_PORCTRL 0xB2 // Porch control
#define ST7789_FRCTRL1 0xB3 // Frame rate control
#define ST7789_PARCTRL 0xB5 // Partial mode control
#define ST7789_GCTRL 0xB7 // Gate control
#define ST7789_GTADJ 0xB8 // Gate on timing adjustment
#define ST7789_DGMEN 0xBA // Digital gamma enable
#define ST7789_VCOMS 0xBB // VCOMS setting
#define ST7789_LCMCTRL 0xC0 // LCM control
#define ST7789_IDSET 0xC1 // ID setting
#define ST7789_VDVVRHEN 0xC2 // VDV and VRH command enable
#define ST7789_VRHS 0xC3 // VRH set
#define ST7789_VDVSET 0xC4 // VDV setting
#define ST7789_VCMOFSET 0xC5 // VCOMS offset set
#define ST7789_FRCTR2 0xC6 // FR Control 2
#define ST7789_CABCCTRL 0xC7 // CABC control
#define ST7789_REGSEL1 0xC8 // Register value section 1
#define ST7789_REGSEL2 0xCA // Register value section 2
#define ST7789_PWMFRSEL 0xCC // PWM frequency selection
#define ST7789_PWCTRL1 0xD0 // Power control 1
#define ST7789_VAPVANEN 0xD2 // Enable VAP/VAN signal output
#define ST7789_CMD2EN 0xDF // Command 2 enable
#define ST7789_PVGAMCTRL 0xE0 // Positive voltage gamma control
#define ST7789_NVGAMCTRL 0xE1 // Negative voltage gamma control
#define ST7789_DGMLUTR 0xE2 // Digital gamma look-up table for red
#define ST7789_DGMLUTB 0xE3 // Digital gamma look-up table for blue
#define ST7789_GATECTRL 0xE4 // Gate control
#define ST7789_SPI2EN 0xE7 // SPI2 enable
#define ST7789_PWCTRL2 0xE8 // Power control 2
#define ST7789_EQCTRL 0xE9 // Equalize time control
#define ST7789_PROMCTRL 0xEC // Program control
#define ST7789_PROMEN 0xFA // Program mode enable
#define ST7789_NVMSET 0xFC // NVM setting
#define ST7789_PROMACT 0xFE // Program action
void st7789_init(void);
void st7789_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map);
void st7789_enable_backlight(bool backlight);
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* ST7789_H */

View File

@ -0,0 +1,39 @@
/**
@file uc8151d.h
@brief GoodDisplay GDEW0154M09 e-paper display w/ FitiPower JD79653A
@version 1.0
@date 2020-08-28
@author Jackson Ming Hu <huming2207@gmail.com>
@section LICENSE
MIT License
Copyright (c) 2020 Jackson Ming Hu
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),
to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute,
sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
#ifndef LVGL_DEMO_UC8151D_H
#define LVGL_DEMO_UC8151D_H
#include <lvgl.h>
void uc8151d_init();
void uc8151d_lv_set_fb_cb(struct _disp_drv_t *disp_drv, uint8_t *buf, lv_coord_t buf_w, lv_coord_t x, lv_coord_t y,
lv_color_t color, lv_opa_t opa);
void uc8151d_lv_rounder_cb(struct _disp_drv_t *disp_drv, lv_area_t *area);
void uc8151d_lv_fb_flush(lv_disp_drv_t *drv, const lv_area_t *area, lv_color_t *color_map);
#endif //LVGL_DEMO_UC8151D_H

View File

@ -0,0 +1,52 @@
/**
* @file touch_driver.h
*/
#ifndef TOUCH_DRIVER_H
#define TOUCH_DRIVER_H
#ifdef __cplusplus
extern "C" {
#endif
/*********************
* INCLUDES
*********************/
#include <stdint.h>
#include <stdbool.h>
#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#if defined (CONFIG_LV_TOUCH_CONTROLLER_XPT2046)
#include "xpt2046.h"
#elif defined (CONFIG_LV_TOUCH_CONTROLLER_FT6X06)
#include "ft6x36.h"
#elif defined (CONFIG_LV_TOUCH_CONTROLLER_STMPE610)
#include "stmpe610.h"
#elif defined (CONFIG_LV_TOUCH_CONTROLLER_ADCRAW)
#include "adcraw.h"
#elif defined (CONFIG_LV_TOUCH_CONTROLLER_FT81X)
#include "FT81x.h"
#elif defined (CONFIG_LV_TOUCH_CONTROLLER_RA8875)
#include "ra8875_touch.h"
#endif
/*********************
* DEFINES
*********************/
/**********************
* GLOBAL PROTOTYPES
**********************/
void touch_driver_init(void);
bool touch_driver_read(lv_indev_drv_t *drv, lv_indev_data_t *data);
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /* TOUCH_DRIVER_H */

View File

@ -0,0 +1,36 @@
/*
* Copyright © 2020 Wolfgang Christl
* Permission is hereby granted, free of charge, to any person obtaining a copy of this
* software and associated documentation files (the Software), to deal in the Software
* without restriction, including without limitation the rights to use, copy, modify, merge,
* publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
* to whom the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or
* substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED AS IS, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
* INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
* FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
#ifndef __TS_H
#define __TS_H
#ifdef __cplusplus
extern "C" {
#endif
#include <stdint.h>
esp_err_t i2c_master_init(void);
#ifdef __cplusplus
}
#endif
#endif /* __TS_H */

View File

@ -0,0 +1,45 @@
/**
* @file tp_spi.h
*
*/
#ifndef TP_SPI_H
#define TP_SPI_H
#ifdef __cplusplus
extern "C" {
#endif
/*********************
* INCLUDES
*********************/
#include <stdint.h>
#include <driver/spi_master.h>
/*********************
* DEFINES
*********************/
/**********************
* TYPEDEFS
**********************/
/**********************
* GLOBAL PROTOTYPES
**********************/
void tp_spi_add_device(spi_host_device_t host);
void tp_spi_add_device_config(spi_host_device_t host, spi_device_interface_config_t *config);
void tp_spi_xchg(uint8_t* data_send, uint8_t* data_recv, uint8_t byte_count);
void tp_spi_write_reg(uint8_t* data, uint8_t byte_count);
void tp_spi_read_reg(uint8_t reg, uint8_t* data, uint8_t byte_count);
/**********************
* MACROS
**********************/
#ifdef __cplusplus
} /* extern "C" */
#endif
#endif /*TP_SPI_H*/

89
maps/bin/astc_conv.py Normal file
View File

@ -0,0 +1,89 @@
# uncompyle6 version 3.7.4
# Python bytecode 3.7 (3394)
# Decompiled from: Python 3.7.5 (tags/v3.7.5:5c02a39a0b, Oct 15 2019, 00:11:34) [MSC v.1916 64 bit (AMD64)]
# Embedded file name: astc_conv.py
from PIL import Image, ImageChops
import array, tempfile, os, struct
def astc_dims(fmt):
if isinstance(fmt, int):
return astc_dims({37808:'COMPRESSED_RGBA_ASTC_4x4_KHR',
37809:'COMPRESSED_RGBA_ASTC_5x4_KHR',
37810:'COMPRESSED_RGBA_ASTC_5x5_KHR',
37811:'COMPRESSED_RGBA_ASTC_6x5_KHR',
37812:'COMPRESSED_RGBA_ASTC_6x6_KHR',
37813:'COMPRESSED_RGBA_ASTC_8x5_KHR',
37814:'COMPRESSED_RGBA_ASTC_8x6_KHR',
37815:'COMPRESSED_RGBA_ASTC_8x8_KHR',
37816:'COMPRESSED_RGBA_ASTC_10x5_KHR',
37817:'COMPRESSED_RGBA_ASTC_10x6_KHR',
37818:'COMPRESSED_RGBA_ASTC_10x8_KHR',
37819:'COMPRESSED_RGBA_ASTC_10x10_KHR',
37820:'COMPRESSED_RGBA_ASTC_12x10_KHR',
37821:'COMPRESSED_RGBA_ASTC_12x12_KHR'}[fmt])
dims = str(fmt).split('_')[3]
return [int(c) for c in dims.split('x')]
def tile(f):
_, w, h, _, iw, _, ih, _, _, _ = struct.unpack('<IBBBHBHBHB', f.read(16))
bw, bh = (iw + (w - 1)) // w, (ih + (h - 1)) // h
d = f.read()
return (bw, bh, tile2(d, bw, bh))
def tile2(d, bw, bh):
assert len(d) == 16 * bw * bh
fe = [d[i:i + 16] for i in range(0, len(d), 16)]
assert len(fe) == bw * bh
r = []
for j in range(0, bh - 1, 2):
for i in range(0, bw, 2):
if i < bw - 1:
r += [
fe[(bw * j + i)],
fe[(bw * (j + 1) + i)],
fe[(bw * (j + 1) + (i + 1))],
fe[(bw * j + (i + 1))]]
else:
r += [
fe[(bw * j + i)],
fe[(bw * (j + 1) + i)]]
if bh & 1:
r += fe[bw * (bh - 1):]
assert len(r) == bh * bw
return (b'').join(r)
def pad(im, mult):
w = (im.size[0] + (mult - 1)) // mult * mult
n = Image.new('RGBA', (w, im.size[1]))
n.paste(im, (0, 0))
return n
def round_up(n, d):
return d * ((n + d - 1) // d)
def convert(im, fmt='COMPRESSED_RGBA_ASTC_4x4_KHR', effort='thorough', astc_encode='astcenc', astc_opt=''):
w, h = astc_dims(fmt)
ni = Image.new('RGBA', (round_up(im.size[0], w), round_up(im.size[1], h)))
ni.paste(im, (0, 0))
png = tempfile.NamedTemporaryFile(delete=False)
#ni.transpose(Image.FLIP_TOP_BOTTOM).save(png, 'png')
ni.save(png, 'png')
png.close()
astc = tempfile.NamedTemporaryFile(suffix='.astc',delete=False)
os.system('"%s" -cl %s %s %dx%d -%s -silent %s' % (astc_encode, png.name, astc.name, w, h, effort, astc_opt))
bw, bh, d0 = tile(open(astc.name, 'rb'))
astc.close()
if os.path.exists(astc.name):
os.unlink(astc.name)
if os.path.exists(png.name):
os.unlink(png.name)
stride = 16 * bw
dd = array.array('B', d0)
return (
stride, ni.size, dd)

1
maps/bin/build_image.bat Normal file
View File

@ -0,0 +1 @@
C:\Applications\Python37\python build_image.py maps.bin zulu24.bin picasso.bin

79
maps/bin/build_image.py Normal file
View File

@ -0,0 +1,79 @@
import json
import msgpack
import struct
import sys
import os.path
import io
from os import path
def pad(o, m):
if m>0 :
barray = bytearray(m)
for i in range(0,m):
barray[i] = 0xFF
o.write(barray)
return
def alignFile(o, position, aligment):
m = position % aligment
if m>0 :
m = aligment-m
barray = bytearray(m)
for i in range(0,m):
barray[i] = 0xFF
o.write(barray)
return m
def main():
output = sys.argv[1]
maps = []
maps_meta = []
position = 0
with io.open(output, 'wb') as o:
for i, arg in enumerate(sys.argv):
if i>1:
maps.append(arg)
for map in maps:
with open(map, mode='rb') as file:
mapContent = file.read()
with open(map+'.json') as f:
mapMeta = json.load(f)
mapMeta["base_address"] = position
o.write(mapContent)
position += len(mapContent)
position += alignFile(o,position,4096)
maps_meta.append(mapMeta)
with io.open(output+'.json', 'w') as f:
f.write(json.dumps(maps_meta,indent=6))
with io.open(output+'.dat', 'wb') as f:
cnt = len(maps_meta)
f.write(struct.pack('<b',cnt))
i = 0
pos = 1+cnt*60
for map in maps_meta:
f.seek(pos)
baseAddress = map['base_address']
f.write(struct.pack('<b',len(map['tile_matrix'])))
for zl in map['tile_matrix']:
b = zl['bounds']
ps = zl['pixel_size']
ts = zl['tile_size']
f.write(struct.pack('<H4f4f',int(zl['id']),b[0],b[1],b[2],b[3],ps[0],ps[1],ts[0],ts[1]))
f.write(struct.pack('<H',len(zl['images'])))
for image in zl['images']:
s = image['size']
b = image['bounds']
f.write(struct.pack('<2I6H2f4f',image['address']+baseAddress,image['image_size'],s[0],s[1],image['image_stride'],image['image_fmt'],image['x'],image['y'],b[2]-b[0],b[1]-b[3],b[0],b[1],b[2],b[3]))
endPos = f.seek(0,io.SEEK_CUR)
f.seek(1+i*60)
b = map['bounds']
f.write(struct.pack('<32s4fIII',bytes(map['name'], 'utf-8'),b[0],b[1],b[2],b[3],map['base_address'],pos,endPos-pos))
pos = endPos
i+=1
main()

2
maps/bin/build_map.bat Normal file
View File

@ -0,0 +1,2 @@
C:\Applications\Python37\python build_map.py ../zulu24/zulu24/ zulu24.bin
C:\Applications\Python37\python build_map.py ../picasso/tiles/ picasso.bin

121
maps/bin/build_map.py Normal file
View File

@ -0,0 +1,121 @@
import json
import sys
import os.path
import io
import astc_conv
from os import path
from PIL import Image
def pad(o, m):
if m>0 :
barray = bytearray(m)
for i in range(0,m):
barray[i] = 0xFF
o.write(barray)
return
def alignFile(o, position, aligment):
m = position % aligment
if m>0 :
m = aligment-m
barray = bytearray(m)
for i in range(0,m):
barray[i] = 0xFF
o.write(barray)
return m
def loadImage(filenameBase,x,y):
filename = filenameBase+str(x)+'/'+str(y)+'.png'
if path.exists(filename):
im=Image.open(filename)
return im
return None
def main():
folder = sys.argv[1]
output = sys.argv[2]
print('Processing '+folder)
tmeta = {}
position = 0
with open(folder+'/metadata.json') as f:
meta = json.load(f)
tmeta['name'] = meta['name']
tmeta['bounds'] = [meta['extent'][0],meta['extent'][3],meta['extent'][2],meta['extent'][1]]
tmeta['tile_matrix'] = []
with io.open(output, 'wb') as o:
for zl in meta['tile_matrix']:
zitem = {}
zitem['id'] = zl['id']
zitem['bounds'] = [zl['origin'][0],zl['origin'][1],zl['extent'][2],zl['extent'][1]]
zitem['images'] = []
zitem['pixel_size'] = zl['pixel_size']
zitem['tile_size'] = [zl['pixel_size'][0]*zl['tile_size'][0],zl['pixel_size'][1]*zl['tile_size'][1]]
xc = zl['origin'][0]
yc = zl['origin'][1]
xp = zl['pixel_size'][0]
yp = zl['pixel_size'][1]
fmt = 37808
hasImages = False
if zl['matrix_size'][0]*zl['matrix_size'][1] >=8:
fmt = 37812
for x in range(zl['matrix_size'][0]):
for y in range(zl['matrix_size'][1]):
filenameBase = folder+'/'+zl['id']+'/'
filename = filenameBase+str(x)+'/'+str(y)+'.png'
if path.exists(filename):
im=Image.open(filename)
expand = 1
nim = Image.new('RGBA',(im.size[0]+expand*2,im.size[1]+expand*2))
nim.putalpha(0)
nim.paste(im,(expand,expand))
pim = loadImage(filenameBase,x,y-1)
if pim!=None:
nim.paste(pim.crop((0,pim.size[1]-expand,pim.size[0],pim.size[1])),(expand,0))
pim = loadImage(filenameBase,x,y+1)
if pim!=None:
nim.paste(pim.crop((0,0,pim.size[0],expand)),(expand,nim.size[1]-expand))
pim = loadImage(filenameBase,x-1,y)
if pim!=None:
nim.paste(pim.crop((pim.size[0]-expand,0,pim.size[0],pim.size[1])),(0,expand))
pim = loadImage(filenameBase,x+1,y)
if pim!=None:
nim.paste(pim.crop((0,0,expand,pim.size[1])),(nim.size[0]-expand,expand))
rsize = im.size
im = nim
stride,asize,astc = astc_conv.convert(im,fmt)
if len(astc)>0:
hasImages = True
fileinfo = {}
fileinfo['size'] = im.size
fileinfo['bounds'] = [xc+x*rsize[0]*xp-xp*expand,yc+y*rsize[1]*yp-yp*expand,xc+(x+1)*rsize[0]*xp+xp*expand,yc+(y+1)*rsize[1]*yp+yp*expand]
fileinfo['x'] = x
fileinfo['y'] = y
fileinfo['address'] = position
fileinfo['image_stride'] = stride
fileinfo['image_size'] = len(astc)
fileinfo['image_fmt'] = fmt
o.write(astc)
with open(filename+'.bin','wb') as f:
f.write(astc)
position += len(astc)
pad(o,64)
position += 64
position += alignFile(o,position,64)
zitem['images'].append(fileinfo)
if hasImages==True:
tmeta['tile_matrix'].append(zitem)
alignFile(o,position,4096)
with io.open(output+'.json', 'w', encoding='utf-8') as f:
f.write(json.dumps(tmeta, indent=4))
main()

36
maps/bin/calc_tiles.py Normal file
View File

@ -0,0 +1,36 @@
import json
import sys
import os.path
import io
from os import path
from PIL import Image
def main():
folder = sys.argv[1]
print('Processing '+folder)
with open(folder+'/metadata.json') as f:
meta = json.load(f)
for zl in meta['tile_matrix']:
xc = zl['origin'][0]
yc = zl['origin'][1]
xp = zl['pixel_size'][0]
yp = zl['pixel_size'][1]
for x in range(zl['matrix_size'][0]):
yc = zl['origin'][1]
for y in range(zl['matrix_size'][1]):
filename = folder+'/'+zl['id']+'/'+str(x)+'/'+str(y)+'.png'
if path.exists(filename):
fileprops = {}
im=Image.open(filename)
fileprops['size'] = im.size
fileprops['bounds'] = [xc,yc,xc+im.size[0]*xp,yc+im.size[1]*yp]
xn = xc + im.size[0]*xp
yc = yc + im.size[1]*yp
with io.open(filename+'.json', 'w', encoding='utf-8') as f:
f.write(json.dumps(fileprops, ensure_ascii=False))
xc = xn
main()

338
maps/bin/map_image_tool.py Normal file
View File

@ -0,0 +1,338 @@
import argparse
import json
import sys
import os.path
import io
from os import path
import serial
import time
import struct
import ntpath
show_r = False
PMC_SCREEN_FLASH_START = 1
PMC_SCREEN_FLASH_START_RESPONSE=2
PMC_SCREEN_FLASH_END =3
PMC_SCREEN_FLASH_WRITE =4
PMC_SCREEN_FLASH_WRITE_COMPRESSED =14
PMC_SCREEN_FLASH_READ =5
PMC_SCREEN_FLASH_READ_RESPONSE =6
PMC_SCREEN_FLASH_META_START =7
PMC_SCREEN_FLASH_META_DATA =8
PMC_SCREEN_FLASH_META_END =9
PMC_SCREEN_FLASH_FILE_START =10
PMC_SCREEN_FLASH_FILE_DATA =11
PMC_SCREEN_FLASH_FILE_END =12
PMC_SCREEN_FLASH_EXIT =99
PMC_SCREEN_FLASH_ACK =100
PMC_SCREEN_FLASH_ERR =101
SERIAL_APP_1=0x85
SERIAL_APP_2=0x3B
SERIAL_APP_3=0xDE
SERIAL_APP_4=0x02
def csum(dd,extra):
result = extra & 0xFF
for b in dd:
result ^= (b & 0xFF)
return result
def readPacket(ser,timeout=2):
global show_r
packet = bytearray([])
readState = 0
size = 0
startTime = time.time()
while True:
if ser.inWaiting()>0:
b = ser.read(1)[0]
if(show_r==True):
print(hex(b), end ="", flush=True)
#print(bytearray([b]).decode('ascii'), end ="", flush=True)
if readState==0:
if b==SERIAL_APP_1:
readState = 1
elif readState==1:
if b==SERIAL_APP_2:
readState = 2
else:
readState = 0
elif readState==2:
if b==SERIAL_APP_3:
readState = 3
else:
readState = 0
elif readState==3:
if b==SERIAL_APP_4:
readState = 4
else:
readState = 0
elif readState==4:
size = b
readState = 5
elif readState==5:
size = size + (b<<8)
if size<8192:
readState = 6
else:
readState = 0
elif readState==6:
if len(packet)<(size-1):
packet.extend([b])
else:
cs = csum(packet,0)
if b==cs:
return packet
else:
print('BAD CS '+hex(cs)+' '+hex(b)+' '+packet.hex())
return bytearray([])
else:
time.sleep(0.001)
if(time.time()-startTime)>=timeout:
print('Timeout')
#show_r = True
return bytearray([])
return bytearray([])
def createSerialPacket(cmd,dd):
result = bytearray([SERIAL_APP_1,SERIAL_APP_2,SERIAL_APP_3,SERIAL_APP_4])
s = len(dd)+2
result.extend([s & 0xFF,(s>>8) & 0xFF,cmd])
result.extend(dd)
result.extend([csum(dd,cmd)])
#print(result.hex())
return result
def writeImage(ser,imagedata,metadata):
print("Writing image...")
ser.write(createSerialPacket(PMC_SCREEN_FLASH_START,bytearray([])))
packet = readPacket(ser)
if len(packet)>0:
if packet[0]==PMC_SCREEN_FLASH_START_RESPONSE:
s = struct.Struct('<BI')
resp = s.unpack(packet)
print("Start flash result "+str(resp[1]))
if resp[1]==0:
print("Writing flash")
cnt = int(len(imagedata)/4096)
sector = bytearray(4096+6)
sector[0] = 00
sector[1] = 0x10
for i in range(cnt):
for j in range(4096):
if(j%2==0):
sector[j+6] = imagedata[i*4096+j] ^ 0xAA
else:
sector[j+6] = imagedata[i*4096+j] ^ 0x55
address = 4096+i*4096
sector[2] = address & 0xFF
sector[3] = (address >> 8) & 0xFF
sector[4] = (address >> 16) & 0xFF
sector[5] = (address >> 24) & 0xFF
while 1:
print("Sector "+str(cnt)+"/"+str(i)+".", end ="", flush=True)
packet = createSerialPacket(PMC_SCREEN_FLASH_WRITE_COMPRESSED,sector)
spackets = [packet[i:i+1512] for i in range(0, len(packet), 1512)]
#spackets = [packet[i:i+32] for i in range(0, len(packet), 32)]
for p in spackets:
ser.write(p)
ser.flush()
time.sleep(0.0001)
packet = readPacket(ser)
if len(packet)>0:
if packet[0]!=PMC_SCREEN_FLASH_ACK:
print("ERR "+hex(packet[1]))
else:
print("OK")
break
time.sleep(0.02)
ser.write(createSerialPacket(PMC_SCREEN_FLASH_END,bytearray([])))
readPacket(ser)
else:
print("Error")
print("Writing meta...")
ser.write(createSerialPacket(PMC_SCREEN_FLASH_META_START,bytearray([])))
packet = readPacket(ser)
if len(packet)>0:
if packet[0]==PMC_SCREEN_FLASH_ACK:
cnt = len(metadata)
i = 0
while cnt>0:
if cnt>512:
s = 512
else:
s = cnt
cnt -= s
sector = metadata[i:(i+s)]
while 1:
print("Sector "+str(i)+".", end ="", flush=True)
packet = createSerialPacket(PMC_SCREEN_FLASH_META_DATA,sector)
ser.write(packet)
ser.flush()
packet = readPacket(ser)
if len(packet)>0:
if packet[0]!=PMC_SCREEN_FLASH_ACK:
print("ERR")
else:
print("OK")
break
time.sleep(0.01)
i += s
ser.write(createSerialPacket(PMC_SCREEN_FLASH_META_END,bytearray([])))
packet = readPacket(ser)
else:
print("Error")
print("Done.")
return
def writeFile(ser,imagedata,filename):
print("Writing file...")
ser.write(createSerialPacket(PMC_SCREEN_FLASH_FILE_START,bytearray(filename.encode())+ b'\x00'))
packet = readPacket(ser)
if len(packet)>0:
if packet[0]==PMC_SCREEN_FLASH_ACK:
cnt = len(imagedata)
i = 0
while cnt>0:
if cnt>512:
s = 512
else:
s = cnt
cnt -= s
sector = imagedata[i:(i+s)]
while 1:
print("Sector "+str(i)+".", end ="", flush=True)
packet = createSerialPacket(PMC_SCREEN_FLASH_FILE_DATA,sector)
ser.write(packet)
ser.flush()
packet = readPacket(ser)
if len(packet)>0:
if packet[0]!=PMC_SCREEN_FLASH_ACK:
print("ERR")
else:
print("OK")
break
time.sleep(0.01)
i += s
ser.write(createSerialPacket(PMC_SCREEN_FLASH_FILE_END,bytearray([])))
packet = readPacket(ser)
else:
print("Error")
print("Done.")
return
def readImage(ser,size):
print("Reading image...")
result = bytearray([])
ser.write(createSerialPacket(PMC_SCREEN_FLASH_START,bytearray([])))
packet = readPacket(ser)
if len(packet)>0:
if packet[0]==PMC_SCREEN_FLASH_START_RESPONSE:
s = struct.Struct('<BI')
resp = s.unpack(packet)
print("Start flash result "+str(resp[1]))
if resp[1]==0:
print("Reading flash")
cnt = int(size*1024/4096)
sector = bytearray(6)
sector[0] = 00
sector[1] = 0x10
for i in range(cnt):
address = 4096+i*4096
sector[2] = address & 0xFF
sector[3] = (address >> 8) & 0xFF
sector[4] = (address >> 16) & 0xFF
sector[5] = (address >> 24) & 0xFF
while 1:
print("Sector "+str(i)+".", end ="", flush=True)
packet = createSerialPacket(PMC_SCREEN_FLASH_READ,sector)
ser.write(packet)
packet = readPacket(ser)
if len(packet)>0:
if packet[0]!=PMC_SCREEN_FLASH_READ_RESPONSE:
print("ERR")
else:
print("OK")
result.extend(packet[1:])
break
ser.write(createSerialPacket(PMC_SCREEN_FLASH_END,bytearray([])))
else:
print("Error")
print("Done.")
return result
def main():
parser = argparse.ArgumentParser(description='Airsoft Tracker Maps Image Tool')
parser.add_argument('image', help='Image file name')
parser.add_argument('-c','--comm', required=False, help='COM port')
parser.add_argument('-r','--read',action='store_true', help='Read image')
parser.add_argument('-s','--size',type=int, default=16*1024, help='Read size in KB')
parser.add_argument('-w','--wfile',action='store_true', help='Write file')
args = parser.parse_args()
comm = args.comm
if not comm:
print("Looking for COM port")
import serial.tools.list_ports as list_ports
for each_port in reversed(sorted(list_ports.comports())):
if each_port[1].find("Silicon Labs")>=0:
comm = each_port[0]
print("Comm port found "+comm)
break
imagefile = args.image
readSize = args.size
ser = serial.Serial(comm,baudrate=115200)
ser.set_buffer_size(rx_size = 8192, tx_size=256)
print("Connecting", end ="", flush=True)
while True:
if ser.inWaiting()>0:
ser.read(ser.inWaiting())
print(".", end ="", flush=True)
values = bytearray([0x92,0x5A])
ser.write(values)
startTime = time.time()
while (time.time()-startTime)<2:
if ser.inWaiting()>0:
b = ser.read(1)[0]
#print(bytearray([b]).decode('ascii'), end ="", flush=True)
if b==0x07:
print("")
print("Connected")
time.sleep(0.01)
values = bytearray([0x07])
ser.write(values)
ser.baudrate = 921600
time.sleep(1)
if args.read==True:
imagedata = readImage(ser,readSize)
with open(imagefile,"wb") as f:
f.write(imagedata)
else:
if args.wfile==True:
with open(imagefile,"rb") as f:
imagedata = f.read()
writeFile(ser,imagedata,ntpath.basename(imagefile))
else:
with open(imagefile,"rb") as f:
imagedata = f.read()
with open(imagefile+'.dat',"rb") as f:
metadata = f.read()
writeImage(ser,imagedata,metadata)
ser.write(createSerialPacket(PMC_SCREEN_FLASH_EXIT,bytearray([])))
return
else:
time.sleep(0.01)
main()

2948
maps/bin/maps.bin.json Normal file

File diff suppressed because it is too large Load Diff

1832
maps/bin/picasso.bin.json Normal file

File diff suppressed because it is too large Load Diff

1
maps/bin/read_image.bat Normal file
View File

@ -0,0 +1 @@
C:\Applications\Python37\python map_image_tool.py -c COM22 maps_old.bin -r -s 1024

1
maps/bin/write_image.bat Normal file
View File

@ -0,0 +1 @@
C:\Applications\Python37\python map_image_tool.py maps.bin

View File

@ -0,0 +1,2 @@
C:\Applications\Python37\python map_image_tool.py ../zulu24/p_zulu24.json -w
C:\Applications\Python37\python map_image_tool.py ../picasso/p_picasso.json -w

1112
maps/bin/zulu24.bin.json Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,13 @@
{
"points": [
{ "type": 0, "color": 16776960, "name": "Office", "coordinates": [ -74.91830945685942,39.73604280105904 ] },
{ "type": 0, "color": 16776960, "name": "Beach", "coordinates": [ -74.91917130906181,39.73630893810271 ] },
{ "type": 0, "color": 16776960, "name": "Kill Box", "coordinates": [ -74.91902077980406,39.7355752412219 ] },
{ "type": 0, "color": 16776960, "name": "Zero", "coordinates": [ -74.9189932630288,39.73718782439224 ] },
{ "type": 0, "color": 16776960, "name": "Ridge", "coordinates": [ -74.91831533834912,39.73829361377636 ] },
{ "type": 0, "color": 16776960, "name": "Calypso", "coordinates": [ -74.91990159096781,39.73872089766842 ] },
{ "type": 0, "color": 16776960, "name": "Maze", "coordinates": [ -74.91634869800787,39.73697446559213 ] },
{ "type": 0, "color": 16776960, "name": "Congo", "coordinates": [ -74.91602222829101,39.73763561652714 ] },
{ "type": 0, "color": 16776960, "name": "Trenches", "coordinates": [ -74.91581248157634,39.73862186136292 ] }
]
}

BIN
maps/picasso/picasso.tif Normal file

Binary file not shown.

View File

@ -0,0 +1,32 @@
<PAMDataset>
<PAMRasterBand band="1">
<Metadata>
<MDI key="STATISTICS_APPROXIMATE">YES</MDI>
<MDI key="STATISTICS_MAXIMUM">255</MDI>
<MDI key="STATISTICS_MEAN">37.088994056078</MDI>
<MDI key="STATISTICS_MINIMUM">0</MDI>
<MDI key="STATISTICS_STDDEV">23.597758036199</MDI>
<MDI key="STATISTICS_VALID_PERCENT">100</MDI>
</Metadata>
</PAMRasterBand>
<PAMRasterBand band="2">
<Metadata>
<MDI key="STATISTICS_APPROXIMATE">YES</MDI>
<MDI key="STATISTICS_MAXIMUM">255</MDI>
<MDI key="STATISTICS_MEAN">38.660669983202</MDI>
<MDI key="STATISTICS_MINIMUM">0</MDI>
<MDI key="STATISTICS_STDDEV">22.602363004851</MDI>
<MDI key="STATISTICS_VALID_PERCENT">100</MDI>
</Metadata>
</PAMRasterBand>
<PAMRasterBand band="3">
<Metadata>
<MDI key="STATISTICS_APPROXIMATE">YES</MDI>
<MDI key="STATISTICS_MAXIMUM">255</MDI>
<MDI key="STATISTICS_MEAN">28.796404574234</MDI>
<MDI key="STATISTICS_MINIMUM">0</MDI>
<MDI key="STATISTICS_STDDEV">19.640798405489</MDI>
<MDI key="STATISTICS_VALID_PERCENT">100</MDI>
</Metadata>
</PAMRasterBand>
</PAMDataset>

Binary file not shown.

After

Width:  |  Height:  |  Size: 106 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 108 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

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