diff --git a/MDK-ARM/motor.uvoptx b/MDK-ARM/motor.uvoptx
index 774004a..109417f 100644
--- a/MDK-ARM/motor.uvoptx
+++ b/MDK-ARM/motor.uvoptx
@@ -120,7 +120,8 @@
0
DLGUARM
-
+
+
0
JL2CM3
@@ -179,6 +180,16 @@
1
board,0x0A
+
+ 4
+ 1
+ 0x000020CF,0x0A
+
+
+ 5
+ 1
+ 0x0063,0x0A
+
@@ -230,6 +241,12 @@
+
+
+ System Viewer\TIM6
+ 35905
+
+
1
1
@@ -493,7 +510,7 @@
- User/lib
+ User/system
0
0
0
@@ -505,8 +522,8 @@
0
0
0
- ..\User\lib\src\aes.c
- aes.c
+ ..\User\system\btn.c
+ btn.c
0
0
@@ -517,8 +534,8 @@
0
0
0
- ..\User\lib\src\clist.c
- clist.c
+ ..\User\system\delay.c
+ delay.c
0
0
@@ -529,139 +546,139 @@
0
0
0
- ..\User\lib\src\cmac.c
- cmac.c
- 0
- 0
-
-
- 7
- 21
- 1
- 0
- 0
- 0
- ..\User\lib\src\cmd.c
- cmd.c
- 0
- 0
-
-
- 7
- 22
- 1
- 0
- 0
- 0
- ..\User\lib\src\data_analysis.c
- data_analysis.c
- 0
- 0
-
-
- 7
- 23
- 1
- 0
- 0
- 0
- ..\User\lib\src\debug.c
- debug.c
- 0
- 0
-
-
- 7
- 24
- 1
- 0
- 0
- 0
- ..\User\lib\src\filter.c
- filter.c
- 0
- 0
-
-
- 7
- 25
- 1
- 0
- 0
- 0
- ..\User\lib\src\lib.c
- lib.c
- 0
- 0
-
-
- 7
- 26
- 1
- 0
- 0
- 0
- ..\User\lib\src\malloc.c
- malloc.c
- 0
- 0
-
-
- 7
- 27
- 1
- 0
- 0
- 0
- ..\User\lib\src\mlist.c
- mlist.c
- 0
- 0
-
-
- 7
- 28
- 1
- 0
- 0
- 0
- ..\User\lib\src\pbuf.c
- pbuf.c
- 0
- 0
-
-
- 7
- 29
- 1
- 0
- 0
- 0
- ..\User\lib\src\sqqueue.c
- sqqueue.c
- 0
- 0
-
-
- 7
- 30
- 1
- 0
- 0
- 0
- ..\User\lib\flow\flow_core.c
- flow_core.c
+ ..\User\system\sys.c
+ sys.c
0
0
- User/system
- 1
+ User/lib
+ 0
0
0
0
+
+ 8
+ 21
+ 1
+ 0
+ 0
+ 0
+ ..\User\system\lib\src\aes.c
+ aes.c
+ 0
+ 0
+
+
+ 8
+ 22
+ 1
+ 0
+ 0
+ 0
+ ..\User\system\lib\src\clist.c
+ clist.c
+ 0
+ 0
+
+
+ 8
+ 23
+ 1
+ 0
+ 0
+ 0
+ ..\User\system\lib\src\cmac.c
+ cmac.c
+ 0
+ 0
+
+
+ 8
+ 24
+ 1
+ 0
+ 0
+ 0
+ ..\User\system\lib\src\cmd.c
+ cmd.c
+ 0
+ 0
+
+
+ 8
+ 25
+ 1
+ 0
+ 0
+ 0
+ ..\User\system\lib\src\data_analysis.c
+ data_analysis.c
+ 0
+ 0
+
+
+ 8
+ 26
+ 1
+ 0
+ 0
+ 0
+ ..\User\system\lib\src\debug.c
+ debug.c
+ 0
+ 0
+
+
+ 8
+ 27
+ 1
+ 0
+ 0
+ 0
+ ..\User\system\lib\src\filter.c
+ filter.c
+ 0
+ 0
+
+
+ 8
+ 28
+ 1
+ 0
+ 0
+ 0
+ ..\User\system\lib\src\lib.c
+ lib.c
+ 0
+ 0
+
+
+ 8
+ 29
+ 1
+ 0
+ 0
+ 0
+ ..\User\system\lib\src\malloc.c
+ malloc.c
+ 0
+ 0
+
+
+ 8
+ 30
+ 1
+ 0
+ 0
+ 0
+ ..\User\system\lib\src\mlist.c
+ mlist.c
+ 0
+ 0
+
8
31
@@ -669,8 +686,8 @@
0
0
0
- ..\User\system\src\btn.c
- btn.c
+ ..\User\system\lib\src\pbuf.c
+ pbuf.c
0
0
@@ -681,8 +698,8 @@
0
0
0
- ..\User\system\src\delay.c
- delay.c
+ ..\User\system\lib\src\sqqueue.c
+ sqqueue.c
0
0
@@ -693,8 +710,8 @@
0
0
0
- ..\User\system\src\sys.c
- sys.c
+ ..\User\system\lib\src\storage.c
+ storage.c
0
0
@@ -705,8 +722,8 @@
0
0
0
- ..\User\system\bsp\adcs.c
- adcs.c
+ ..\User\system\lib\src\wl_flash.c
+ wl_flash.c
0
0
@@ -717,14 +734,46 @@
0
0
0
+ ..\User\system\lib\flow\flow_core.c
+ flow_core.c
+ 0
+ 0
+
+
+
+
+ User/system/bsp
+ 0
+ 0
+ 0
+ 0
+
+ 9
+ 36
+ 1
+ 0
+ 0
+ 0
+ ..\User\system\bsp\adcs.c
+ adcs.c
+ 0
+ 0
+
+
+ 9
+ 37
+ 1
+ 0
+ 0
+ 0
..\User\system\bsp\bsp.c
bsp.c
0
0
- 8
- 36
+ 9
+ 38
1
0
0
@@ -735,77 +784,17 @@
0
- 8
- 37
- 1
- 0
- 0
- 0
- ..\User\system\bsp\i2cs.c
- i2cs.c
- 0
- 0
-
-
- 8
- 38
- 1
- 0
- 0
- 0
- ..\User\system\bsp\iwdgs.c
- iwdgs.c
- 0
- 0
-
-
- 8
+ 9
39
1
0
0
0
- ..\User\system\bsp\pwms.c
- pwms.c
- 0
- 0
-
-
- 8
- 40
- 1
- 0
- 0
- 0
- ..\User\system\bsp\spis.c
- spis.c
- 0
- 0
-
-
- 8
- 41
- 1
- 0
- 0
- 0
..\User\system\bsp\tims.c
tims.c
0
0
-
- 8
- 42
- 1
- 0
- 0
- 0
- ..\User\system\bsp\uarts.c
- uarts.c
- 0
- 0
-
diff --git a/MDK-ARM/motor.uvprojx b/MDK-ARM/motor.uvprojx
index b01c7e4..837689c 100644
--- a/MDK-ARM/motor.uvprojx
+++ b/MDK-ARM/motor.uvprojx
@@ -54,7 +54,7 @@
0
1
1
- 1
+ 0
1
0
@@ -339,7 +339,7 @@
STM32,USE_FULL_LL_DRIVER,HSE_VALUE=8000000,HSE_STARTUP_TIMEOUT=100,LSE_STARTUP_TIMEOUT=5000,LSE_VALUE=32768,EXTERNAL_CLOCK_VALUE=12288000,HSI_VALUE=16000000,LSI_VALUE=32000,VDD_VALUE=3300,PREFETCH_ENABLE=1,INSTRUCTION_CACHE_ENABLE=1,DATA_CACHE_ENABLE=1,STM32F407xx
- ../Inc;../Drivers/STM32F4xx_HAL_Driver/Inc;../Drivers/CMSIS/Device/ST/STM32F4xx/Include;../Drivers/CMSIS/Include;../User;../User/application;../User/board;../User/system/inc;../User/system/bsp;../User/lib/inc;../User/lib/flow;../User/lib/control/inc
+ ../Inc;../Drivers/STM32F4xx_HAL_Driver/Inc;../Drivers/CMSIS/Device/ST/STM32F4xx/Include;../Drivers/CMSIS/Include;../User;../User/application;../User/board;../User/system;../User/system/bsp;../User/system/lib/inc;../User/system/lib/flow;../User/system/lib/control/inc
@@ -801,94 +801,109 @@
-
- User/lib
-
-
- aes.c
- 1
- ..\User\lib\src\aes.c
-
-
- clist.c
- 1
- ..\User\lib\src\clist.c
-
-
- cmac.c
- 1
- ..\User\lib\src\cmac.c
-
-
- cmd.c
- 1
- ..\User\lib\src\cmd.c
-
-
- data_analysis.c
- 1
- ..\User\lib\src\data_analysis.c
-
-
- debug.c
- 1
- ..\User\lib\src\debug.c
-
-
- filter.c
- 1
- ..\User\lib\src\filter.c
-
-
- lib.c
- 1
- ..\User\lib\src\lib.c
-
-
- malloc.c
- 1
- ..\User\lib\src\malloc.c
-
-
- mlist.c
- 1
- ..\User\lib\src\mlist.c
-
-
- pbuf.c
- 1
- ..\User\lib\src\pbuf.c
-
-
- sqqueue.c
- 1
- ..\User\lib\src\sqqueue.c
-
-
- flow_core.c
- 1
- ..\User\lib\flow\flow_core.c
-
-
-
User/system
btn.c
1
- ..\User\system\src\btn.c
+ ..\User\system\btn.c
delay.c
1
- ..\User\system\src\delay.c
+ ..\User\system\delay.c
sys.c
1
- ..\User\system\src\sys.c
+ ..\User\system\sys.c
+
+
+
+ User/lib
+
+
+ aes.c
+ 1
+ ..\User\system\lib\src\aes.c
+
+
+ clist.c
+ 1
+ ..\User\system\lib\src\clist.c
+
+
+ cmac.c
+ 1
+ ..\User\system\lib\src\cmac.c
+
+
+ cmd.c
+ 1
+ ..\User\system\lib\src\cmd.c
+
+
+ data_analysis.c
+ 1
+ ..\User\system\lib\src\data_analysis.c
+
+
+ debug.c
+ 1
+ ..\User\system\lib\src\debug.c
+
+
+ filter.c
+ 1
+ ..\User\system\lib\src\filter.c
+
+
+ lib.c
+ 1
+ ..\User\system\lib\src\lib.c
+
+
+ malloc.c
+ 1
+ ..\User\system\lib\src\malloc.c
+
+
+ mlist.c
+ 1
+ ..\User\system\lib\src\mlist.c
+
+
+ pbuf.c
+ 1
+ ..\User\system\lib\src\pbuf.c
+
+
+ sqqueue.c
+ 1
+ ..\User\system\lib\src\sqqueue.c
+
+
+ storage.c
+ 1
+ ..\User\system\lib\src\storage.c
+
+
+ wl_flash.c
+ 1
+ ..\User\system\lib\src\wl_flash.c
+
+
+ flow_core.c
+ 1
+ ..\User\system\lib\flow\flow_core.c
+
+
+
+
+ User/system/bsp
+
adcs.c
1
@@ -904,240 +919,11 @@
1
..\User\system\bsp\gpios.c
-
- i2cs.c
- 1
- ..\User\system\bsp\i2cs.c
-
-
- 2
- 0
- 0
- 0
- 0
- 0
- 0
- 2
- 2
- 2
- 11
-
-
- 1
-
-
-
- 2
- 0
- 2
- 2
- 2
- 2
- 2
- 2
- 2
- 2
- 0
- 2
- 2
- 2
- 2
- 2
- 0
- 0
- 2
- 2
- 2
- 2
- 2
-
-
-
-
-
-
-
-
-
-
-
- iwdgs.c
- 1
- ..\User\system\bsp\iwdgs.c
-
-
- pwms.c
- 1
- ..\User\system\bsp\pwms.c
-
-
- 2
- 0
- 0
- 0
- 0
- 0
- 0
- 2
- 2
- 2
- 11
-
-
- 1
-
-
-
- 2
- 0
- 2
- 2
- 2
- 2
- 2
- 2
- 2
- 2
- 0
- 2
- 2
- 2
- 2
- 2
- 0
- 0
- 2
- 2
- 2
- 2
- 2
-
-
-
-
-
-
-
-
-
-
-
- spis.c
- 1
- ..\User\system\bsp\spis.c
-
-
- 2
- 0
- 0
- 0
- 0
- 0
- 0
- 2
- 2
- 2
- 11
-
-
- 1
-
-
-
- 2
- 0
- 2
- 2
- 2
- 2
- 2
- 2
- 2
- 2
- 0
- 2
- 2
- 2
- 2
- 2
- 0
- 0
- 2
- 2
- 2
- 2
- 2
-
-
-
-
-
-
-
-
-
-
tims.c
1
..\User\system\bsp\tims.c
-
- uarts.c
- 1
- ..\User\system\bsp\uarts.c
-
-
- 2
- 0
- 0
- 0
- 0
- 0
- 0
- 2
- 2
- 2
- 11
-
-
- 1
-
-
-
- 2
- 0
- 2
- 2
- 2
- 2
- 2
- 2
- 2
- 2
- 0
- 2
- 2
- 2
- 2
- 2
- 0
- 0
- 2
- 2
- 2
- 2
- 2
-
-
-
-
-
-
-
-
-
-
diff --git a/MDK-ARM/motor/motor.hex b/MDK-ARM/motor/motor.hex
index 3c68083..6d5116b 100644
--- a/MDK-ARM/motor/motor.hex
+++ b/MDK-ARM/motor/motor.hex
@@ -1,13 +1,13 @@
:020000040800F2
-:10000000F01C0020A1010008990C00085D02000806
-:10001000950C000817020008D90E00080000000027
-:100020000000000000000000000000009F0C00081D
-:100030005B020008000000009D0C0008A10C0008F5
+:10000000F0E50020A1010008AD0C00087D02000809
+:10001000A90C000851020008ED0E000800000000C5
+:10002000000000000000000000000000B30C000809
+:100030007B02000800000000B10C0008B50C0008AD
:10004000BB010008BB010008BB010008BB010008A0
:10005000BB010008BB010008BB010008BB01000890
:10006000BB010008BB010008BB010008BB01000880
:10007000BB010008BB010008BB010008BB01000870
-:10008000BB010008BB0100080D020008BB0100080D
+:10008000BB010008BB01000847020008BB010008D3
:10009000BB010008BB010008BB010008BB01000850
:1000A000BB010008BB010008BB010008BB01000840
:1000B000BB010008BB010008BB010008BB01000830
@@ -16,396 +16,407 @@
:1000E000BB010008BB010008BB010008BB01000800
:1000F000BB010008BB010008BB010008BB010008F0
:10010000BB010008BB010008BB010008BB010008DF
-:10011000BB010008BB010008F10D0008BB0100088D
-:1001200051020008BB010008BB010008BB01000828
+:10011000BB010008BB010008050E0008BB01000878
+:1001200071020008BB010008BB010008BB01000808
:10013000BB010008BB010008BB010008BB010008AF
:10014000BB010008BB010008BB010008BB0100089F
:10015000BB010008BB010008BB010008BB0100088F
:10016000BB010008BB010008BB010008BB0100087F
:10017000BB010008BB010008BB0100080000000033
:10018000BB010008BB010008DFF810D000F02CF81C
-:1001900000480047C1150008AFF30080F01C0020A4
+:1001900000480047D1150008AFF30080F0E50020CB
:1001A0000648804706480047FEE7FEE7FEE7FEE711
-:1001B000FEE7FEE7FEE7FEE7FEE7FEE7DD0D0008EF
+:1001B000FEE7FEE7FEE7FEE7FEE7FEE7F10D0008DB
:1001C00089010008D2B201E000F8012B491EFBD2E0
:1001D00070470022F6E710B513460A460446194652
:1001E000FFF7F0FF204610BD064C074D06E0E06823
:1001F00040F0010394E8070098471034AC42F6D36E
-:10020000FFF7C6FFE01800081019000810B500201D
-:1002100000F0CAFE10BD00BFFEE7000030B5024688
-:100220000B4600BF7AB90220084C616920EA01043C
-:1002300001EA000544EA0544044DAC6100BF01E059
-:1002400000BF00BFFCE700BF012030BD001002402E
-:1002500010B5002000F07CFE10BD704700BFFEE727
-:100260002DE9F04105460C460026606800B100BF4C
-:10027000134800F04FF80746124800F04BF80743C8
-:10028000114800F047F80743AFB9606860B1D4E99E
-:1002900000010843A1680843E168084369680B4A04
-:1002A00011400843686007E0686808490840216811
-:1002B0000843686000E001263046BDE8F081000098
-:1002C000002001400021014000220140E010FCFF1D
-:1002D000816821F0010181607047000070B504461B
-:1002E0000D460026204600F015F870B9A968286868
-:1002F00008436168064A114008436060A06820F422
-:10030000006069680843A06000E00126304670BDC7
-:10031000FFFEFFFC0146886800F001007047000006
-:1003200070B504460D460026686800B100BF20463F
-:10033000FFF7F0FF00BB686830B1606820F46840E8
-:10034000A9680843606003E0606820F4684060606A
-:10035000286800F07060E968084329690843A168CB
-:10036000074A11400843A0606868E16A21F47001FF
-:100370000143E16200BF00E00126304670BD00008D
-:10038000FDFCFFC070B501F440744FF4407595FA60
-:10039000A5F5B5FA85F5EC4000F12C0505EB8403D5
-:1003A0001C6801F01F061F25B540AC4302F01F0575
-:1003B00001F01F06B5402C431C6070BD70B501F004
-:1003C00000744FF0007595FAA5F5B5FA85F5EC4087
-:1003D00000F10C0505EB84031C6801F0F8754FF083
-:1003E000F87696FAA6F6B6FA86F6F5400726AE40F7
-:1003F000B44301F0F8754FF0F87696FAA6F6B6FA1F
-:1004000086F6F54002FA05F52C431C6070BD426883
-:1004100022F440020A4342607047426822F44002DC
-:100420000A4342607047000008B505490968014366
-:10043000034A1160114609680140009100BF08BDE0
-:1004400030380240F0B502460B46002400211868FF
-:1004500090FAA0F0B0FA80F48AE00125A54018686F
-:1004600000EA050100297DD05868012802D05868AB
-:1004700002281CD19868956891FAA1F6B6FA86F61A
-:1004800077000326BE40B54391FAA1F6B6FA86F688
-:10049000760000FA06F63543956000BFD8685568C7
-:1004A0008D4301FB00F63543556000BF00BF18695E
-:1004B000D56891FAA1F6B6FA86F677000326BE4013
-:1004C000B54391FAA1F6B6FA86F6760000FA06F67A
-:1004D0003543D56000BF5868022831D191FAA1F0A8
-:1004E000B0FA80F0082814D25869156A91FAA1F67A
-:1004F000B6FA86F6B7000F26BE40B54391FAA1F6CC
-:10050000B6FA86F6B60000FA06F63543156200BF65
-:1005100016E05869556A0E0A96FAA6F6B6FA86F6F5
-:10052000B7000F26BE40B5430E0A96FAA6F6B6FAF5
-:1005300086F6B60000FA06F63543556200BF00BFE6
-:100540005868156891FAA1F6B6FA86F67700032680
-:10055000BE40B54391FAA1F6B6FA86F6760000FAE7
-:1005600006F600E003E03543156000BF00BF641CE1
-:100570001868E04000287FF470AFF0BD10B5426904
-:1005800021EA020302EA010443EA0443836110BD45
-:1005900002480068401C0149086070474C00002078
-:1005A0004FF47A71B0FBF1F2521E4FF0E0235A6122
-:1005B00000229A6105221A6100BF70470149086054
-:1005C000704700000000002010B5024613682C4858
-:1005D00082420ED0B2F1804F0BD02A48824208D01E
-:1005E0002948824205D02948824202D028488242C6
-:1005F00004D123F070004C6840EA04032048824292
-:1006000020D0B2F1804F1DD01E4882421AD01E4821
-:10061000824217D01D48824214D01D48824211D018
-:100620001C4882420ED01C4882420BD01B4882429A
-:1006300008D01B48824205D01A48824202D01A488C
-:10064000824204D123F44070CC6840EA0403136072
-:100650008868D06200BF0888906200BF0848824264
-:1006600002D00B48824203D10869106300BF00BF6B
-:1006700000BF506940F00100506100BF002010BD74
-:10068000000001400004004000080040000C004051
-:100690000004014000400140004401400048014086
-:1006A00000180040001C004000200040014608697E
-:1006B00000F00100704708B54FF0E0210969009192
-:1006C00000BF411C01B1401C06E04FF0E021096968
-:1006D00001F4803101B1401E0028F6D108BD0000B0
-:1006E0002DE9F0418EB000200B900C900D9014215C
-:1006F00006A8FFF76EFD002002900390049005907D
-:100700004FF48070874909680143864A1160114699
-:1007100009680140019100BF00BF834800210A46DB
-:10072000824B5B5CC35823F0606313437F4C645C73
-:10073000035100BF00BF7D4B5B5CC35823F0C00377
-:1007400013437A4C645C035100BF00BF774B5B5C82
-:10075000C35823F440331343744C645C035100BF0B
-:100760008215724B5B5CC35823F4907313436F4C38
-:10077000645C035100BF0A466C4B5B5CC35823F4B6
-:1007800000731343694C645C035100BF0215674B4F
-:100790005B5CC35823F480631343644C645C035173
-:1007A00000BFC214614B5B5CC35823F4C0531343B6
-:1007B0005E4C645C035100BF92005C4B5B5CC358B1
-:1007C00023F4C0431343594C645C035100BF00BF82
-:1007D000564A525C0244526922F00402534B5B5C5D
-:1007E00003445A6100BF1221514B1B68C3F302201E
-:1007F000002425460346C3F1070CBCF1040F02D9BF
-:100800004FF0040C01E0C3F1070C674603F1040C40
-:10081000BCF1070F02D24FF0000C01E0A3F1030C72
-:1008200066464FF0010C0CFA07FCACF1010C0CEA27
-:10083000040C0CFA06FC4FF0010808FA06F8A8F1BF
-:10084000010808EA05084CEA080200BF002904DB99
-:100850001007030E3748435407E01007040E3448CE
-:100860000C3001F00F031B1FC45400BF12200028DE
-:1008700009DB00F01F02012191404209920002F1C0
-:10088000E022C2F8001100BF00200B900C904FF442
-:1008900080700D900BA92848FFF720FD00200690DE
-:1008A0004FF48010079000200890022009904FF428
-:1008B00040700A9006A92048FFF732FD00201E492B
-:1008C000896821F4806101431B4A916000BF4FF4A5
-:1008D000803002900020039002A91848FFF7C0FC66
-:1008E000174A4FF400711448FFF74CFD02221449D7
-:1008F0001148FFF763FD4FF400011048FFF787FD33
-:10090000104A910D0C48FFF73DFD02220D490A489F
-:10091000FFF754FD4FF400010848FFF778FD0EB0D3
-:10092000BDE8F081443802400064024058180008D5
-:100930000CED00E000E400E0002001400023014055
-:1009400010002081110050812DE9F8414FF4800002
-:100950002E49096801432D4A11601146096801407A
-:10096000009100BF00BF3821294B1B68C3F3022050
-:10097000002425460346C3F1070CBCF1040F02D93D
-:100980004FF0040C01E0C3F1070C674603F1040CBF
-:10099000BCF1070F02D24FF0000C01E0A3F1030CF1
-:1009A00066464FF0010C0CFA07FCACF1010C0CEAA6
-:1009B000040C0CFA06FC4FF0010808FA06F8A8F13E
-:1009C000010808EA05084CEA080200BF002904DB18
-:1009D0001007030E0F48435407E01007040E0C489D
-:1009E0000C3001F00F031B1FC45400BF3820002837
-:1009F00009DB00F01F02012191404209920002F13F
-:100A0000E022C2F8001100BFBDE8F8813038024092
-:100A10000CED00E000E400E000B587B0182101A86B
-:100A2000FFF7D7FB1020FFF7FFFC4FF48070FFF7B4
-:100A3000FBFC0420FFF7F8FC2020FFF7F5FC8020EA
-:100A4000FFF7F2FC0120FFF7EFFC0220FFF7ECFCC0
-:100A50004020FFF7E9FC0820FFF7E6FC03203A49B5
-:100A6000886100BF4FF6FC700190032002900020C7
-:100A7000059001A93448FFF7E5FC40F6FF700190AE
-:100A8000032002900020059001A93048FFF7DAFC0E
-:100A900043F6FF700190032002900020059001A909
-:100AA0002B48FFF7CFFC4FF6FF7001900320029018
-:100AB0000020059001A92748FFF7C4FC49F6FF7004
-:100AC0000190032002900020059001A92248FFF721
-:100AD000B9FC4FF6FC7001900320029000200590B5
-:100AE00001A91E48FFF7AEFC4FF6FF7001900320EE
-:100AF00002900020059001A91948FFF7A3FC4FF6CA
-:100B0000FF700190032002900020059001A9154874
-:100B1000FFF798FC4FF6FF70019003200290002031
-:100B2000059001A91048FFF78DFC032001900120DA
-:100B300002900220039000200490059001A9024831
-:100B4000FFF780FC07B000BD00100240002002400B
-:100B5000000802400014024000000240001C024055
-:100B60000004024000180240000C02402DE9F04150
-:100B700086B0142101A8FFF72CFB10204149096819
-:100B80000143404A1160114609680140009100BFCD
-:100B900000BF36213C4B1B68C3F30220062400250E
-:100BA0000346C3F1070CBCF1040F02D94FF0040C4B
-:100BB00001E0C3F1070C674603F1040CBCF1070F19
-:100BC00002D24FF0000C01E0A3F1030C66464FF097
-:100BD000010C0CFA07FCACF1010C0CEA040C0CFA49
-:100BE00006FC4FF0010808FA06F8A8F1010808EA27
-:100BF00005084CEA080200BF002904DB1007030EB9
-:100C00002248435407E01007040E1F480C3001F03F
-:100C10000F031B1FC45400BF3620002809DB00F05F
-:100C20001F02012191404209920002F1E022C2F824
-:100C3000001100BF44F29F10ADF8040000200290A4
-:100C40006320039001A91248FFF7BEFC00BF1048C3
-:100C5000006820F080000E49086000BF002049684D
-:100C600021F0700101430A4A516000BF00BF1046E5
-:100C7000806820F080001146886000BF06B0BDE8A3
-:100C8000F0810000403802400CED00E000E400E09C
-:100C90000010004000BFFEE700BFFEE7704770474E
-:100CA0007047000070B505204749096821F0070129
-:100CB0000143454A116000BF00BF00BF42480068C1
-:100CC00000F007000528F8D14FF480403F4909683B
-:100CD00021F4804101433D4A116000BF00BF3C4800
-:100CE000006840F480303A49086000BF00BF00BF90
-:100CF00037480068C0F340400028F8D04FF4800027
-:100D00000421A822002340EA010444EA8214304D61
-:100D10002D1D2D682F4E35402C432D4D2D1D2C6043
-:100D20002C46246824F440341C432C6000BF00BFD0
-:100D3000281F006840F08070291F086000BF00BFB6
-:100D400000BF23480068C0F340600028F8D000BF0F
-:100D500000BF1E484068C0F380300028F8D0002053
-:100D60001B490831096821F0F0010143184A083293
-:100D7000116000BF4FF4A0501146096821F4E05102
-:100D80000143116000BF4FF400401146096821F48F
-:100D900060410143116000BF02201146096821F043
-:100DA00003010143116000BF00BF00BF08480830C5
-:100DB000006800F00C000828F7D10748FFF7F0FBA7
-:100DC0000548FFF7FBFB70BD003C0240007000408F
-:100DD000003802400080BFFF007A030A0348006821
-:100DE00040F47000014908607047000088ED00E0A1
-:100DF00010B53748FFF75AFC012868D100BF00BF83
-:100E000033480069C0F3400060B100BF3048C0689B
-:100E1000C0F3400030B100BF6FF002002C49086100
-:100E200000BF00BF00BF2A480069C0F3800060B166
-:100E300000BF2748C068C0F3800030B100BF6FF02A
-:100E400004002349086100BF00BF00BF20480069BB
-:100E5000C0F3C00060B100BF1D48C068C0F3C0004F
-:100E600030B100BF6FF008001949086100BF00BF32
-:100E700000BF17480069C0F3001060B100BF1448FC
-:100E8000C068C0F3001030B100BF6FF0100010490F
-:100E9000086100BF00BF0E48FFF708FC01280CD115
-:100EA00000BF0B48C06800F0010030B100BF6FF018
-:100EB00001000749086100BF00BF00BFFFF768FBE2
-:100EC00000BF04480068401C0249086000BF10BD14
-:100ED000001000404400002000BFFEE702E008C808
-:100EE000121F08C1002AFAD170477047002001E0A4
-:100EF00001C1121F002AFBD170470000014601F119
-:100F0000100000E0001D02681AB9024A12689042FF
-:100F1000F8D370472400002010B50648046803E0A9
-:100F20002046FFF7EBFF0446034800688442F7D3EE
-:100F300010BD0000200000202400002010B501E0BA
-:100F400000F8011B131EA2F10104A2B2F8D110BDDA
-:100F500070B5054605EBC500124901EB80040CB1E4
-:100F6000012100E00021084640F22911FFF756F95F
-:100F700060680168C1F3C02139B160684FF4006155
-:100F8000816000BF2068FFF7A3F960680168C1F3C2
-:100F9000402129B160684FF40071816000BF00BF3B
-:100FA00070BD00008018002070B5054605EBC50037
-:100FB0000D4901EB80040CB1012100E0002108463D
-:100FC0004FF4A071FFF72AF920680168C1F34011BE
-:100FD00041B16069401C606120686FF020010160D0
-:100FE00000BF00BF70BD0000801800200146002037
-:100FF00001F001020AB1421CD0B201F002020AB1B2
-:10100000421CD0B201F004020AB1421CD0B201F07D
-:1010100008020AB1421CD0B201F010020AB1421C0F
-:10102000D0B201F020020AB1421CD0B201F040025D
-:101030000AB1421CD0B201F080020AB1421CD0B207
-:1010400001F480720AB1421CD0B201F400720AB1FC
-:10105000421CD0B201F480620AB1421CD0B201F449
-:1010600000620AB1421CD0B201F480520AB1421CA3
-:10107000D0B201F400520AB1421CD0B201F4804255
-:101080000AB1421CD0B201F400420AB1421CD0B2F3
-:1010900001F480320AB1421CD0B201F400220AB13C
-:1010A000421CD0B201F480220AB1421CD0B201F439
-:1010B00000320AB1421CD0B2704700002DE9FF4F48
-:1010C00081B006460F469046DDE90F95032E01DA02
-:1010D000012100E0002108461C21FFF79FF80FB115
-:1010E000012100E0002108461D21FFF797F8B8F123
-:1010F000000F01D0012100E0002108461E21FFF76A
-:101100008DF8B9F1000F01DD012100E00021084652
-:101110001F21FFF783F806EBC600744901EB80043A
-:10112000242200212046FFF709FF2760C4F804802D
-:101130000498A0600E98E0602561A4F818902846F5
-:10114000FFF754FFA076A07E00FB09F0A083A08BE0
-:101150004FEA400A5146012000F060FB2062216AFC
-:1011600009B1012100E0002108463221FFF756F8BD
-:10117000A18B49040A0C0021206AFFF7DFFE201D25
-:1011800007C85B4B5B5CC35823F060631343DFF815
-:1011900060C11CF801C040F80C3000BF554AD4E9CA
-:1011A0000101534B5B5CC358DFF84CC103EA0C03ED
-:1011B0001343DFF83CC11CF801C040F80C3000BFFD
-:1011C0004FF0000BD4E900A0A1684FF0000ECDF85D
-:1011D00000E0BBF1000F04D10AF14C0ECDF800E0A5
-:1011E00003E0DFF818E1CDF800E0009AD4E901ABA4
-:1011F000236ADFF8FCE01EF80BE05AF80EE00EF070
-:10120000C00C00BFBCF1400F0ED1DFF8E4A01AF80B
-:1012100001A08244CAF80C20DFF8D4A01AF801A07B
-:101220008244CAF808300DE0DFF8C4A01AF801A023
-:101230008244CAF80820DFF8B8A01AF801A0824456
-:10124000CAF80C3000BFA28BD4E90101284B5B5CCB
-:1012500003445B686FF30F031343DFF894C01CF87B
-:1012600001C08444CCF8043000BFD4E90101204A15
-:10127000525C825842F001021D4B5B5CC25000BFC1
-:1012800002212068826822F002020A43826000BFC5
-:101290004FF440712068826822F440720A438260F1
-:1012A00000BF05F4002028B14FF4000113480838AE
-:1012B000FFF7B3F805F4003028B14FF400010F48F0
-:1012C0000838FFF7AAF80A20FFF7F5F920688168C7
-:1012D00041F00101816000BF2068816841F08041D8
-:1012E000816000BF05B0BDE8F08F000080180020CD
-:1012F000B4180008002D02001F80FCFF08230140E5
-:101300002DE9F04705468846032D01DA012100E06A
-:1013100000210846EE21FEF781FF4FF0000900266C
-:1013200005EBC500104901EB80040CB1012100E080
-:1013300000210846F221FEF771FF206A00EB480702
-:10134000002006E039880E44411C88B2A17E07EBDC
-:101350004107218B8142F5DC208BB6FBF0F01FFAB0
-:1013600080F94846BDE8F087801800200C4B1988AA
-:101370009B1C1A88431A00EE903AF8EEE01A531AB2
-:1013800000EE903AF8EEE00A81EEA01ADFED051AC1
-:10139000F3EE0E0A41EE210AB0EE600A704700003B
-:1013A0002C7AFF1F0000A0420E49098840F6E44253
-:1013B000514340F6FF72B1FBF2F100EE101AB8EEA5
-:1013C000400AF0EE400A00EE100AB8EE400A80EE45
-:1013D000801A9FED050A21EE001ADFED041A81EE56
-:1013E000210A70472A7AFF1F00F07F4500007A44E7
-:1013F00000200B4908600B49086000BF00BF0A4885
-:10140000006840F001000849086000BF00BF0846BE
-:10141000C06840F00100C86000BF00BF7047000016
-:1014200008000020100000200010004010B5034804
-:1014300000F01CF8024800F087F810BD08000020FA
-:10144000100000200EB54FF420204FF4C871002288
-:101450001346CDE900210290024A03490020FFF71C
-:101460002DFE0EBD006402400020014038B5044648
-:1014700000200090206810B112281DD112E000BF9A
-:1014800000F02AF80F4880ED000A00F041F80D48FE
-:1014900080ED010A00BF0C480068606000BF1220A8
-:1014A000206000BF084960680968081A642801D2F2
-:1014B000002038BD00BFE3E700202060009003203B
-:1014C000F7E70000180000204400002001490860F0
-:1014D000704700004800002010B52DED028B9FEDF5
-:1014E0000A0AB0EE408A00210846FFF709FF0749C3
-:1014F00008800888FFF73AFFB0EE408AB0EE480A4D
-:10150000BDEC028B10BD00000000000004000020B4
-:1015100010B52DED028B9FED0A0AB0EE408A012135
-:101520000020FFF7EDFE074948804888FFF73CFFA1
-:10153000B0EE408AB0EE480ABDEC028B10BD000050
-:10154000000000000400002038B504460020009090
-:10155000206810B1252816D10BE000BF012000F053
-:1015600019F800BF0A480068606000BF25202060AD
-:1015700000BF074960680968081A642801D2002082
-:1015800038BD00BFEAE70020206000900320F7E7A5
-:101590004400002010B5044614B1012C0AD104E027
-:1015A00001210648FEF7EAFF05E002210348FEF7A5
-:1015B000E5FF00E000BF00BF10BD000000100240CA
-:1015C00008B54FF48040444909680143424A11601C
-:1015D000114609680140009100BF00BF8003111F40
-:1015E00009680143121F116011460968014000910A
-:1015F00000BF00BF03200246384B19684FF6FF03B7
-:101600001940374B0B4343EA0221344B196000BFAA
-:10161000011F1B68C3F302200F2400250346C3F1FA
-:10162000070CBCF1040F02D94FF0040C01E0C3F128
-:10163000070C674603F1040CBCF1070F02D24FF010
-:10164000000C01E0A3F1030C66464FF0010C0CFA0C
-:1016500007FCACF1010C0CEA040C0CFA06FC4FF090
-:10166000010808FA06F8A8F1010808EA05084CEA9A
-:10167000080200BF002904DB1007030E1948435479
-:1016800007E01007040E15480C3001F00F031B1F74
-:10169000C45400BFFFF706FB134800681349B0FBB2
-:1016A000F1F084B22046FFF711FFFFF7B5F9FFF71D
-:1016B0004BF9FFF75BFAFFF713F8002000F018F87A
-:1016C000012000F015F8FFF7BDFEFFF791FE01E0E5
-:1016D000FFF7ACFEFCE70000443802400CED00E0F0
-:1016E0000000FA0500E400E00000002040420F0086
-:1016F00010B504460C4951F824104A000B4951F822
-:101700002400002100F09EF8094951F824200749DF
-:10171000083951F82400002100F094F80121034811
-:101720000830015510BD00009C180008380000204A
-:10173000AC1800082DE9F04704460F460025A946DD
-:101740002348005D20B922481838016820468847A0
-:101750001FB94FF0FF30BDE8F0871E4850F8240055
-:10176000B7FBF0F61B4850F82400B7FBF0F100FB84
-:10177000117000B1761C184850F82400451E22E074
-:101780001348083850F8240030F8150010B909F152
-:10179000010901E04FF00009B14513D14FF00008F5
-:1017A00009E00B48083850F8240005EB080220F83F
-:1017B000126008F10108B045F3D3064850F8240040
-:1017C0006843C8E76D1E002DDADA4FF0FF30C2E73C
-:1017D00040000020A41800089C18000810B501461D
-:1017E0000023002207E00B4850F8210030F81200D7
-:1017F00000B15B1C521C084850F821009042F2D8FE
-:1018000064205843044C54F82140B0FBF4F0C0B2BB
-:1018100010BD0000380000209C18000870B5044678
-:101820000E4631462046FFF785FF0546681C08B97D
-:10183000002070BD024850F824002844F9E7000059
-:101840003000002030B5034601E003F8011B141EF0
-:10185000A2F10102F9D130BD102840587088A0B81B
-:10186000000000000404040000080000000800005C
-:10187000080000000800020406080A0C0001020328
-:101880000405065F6C697374006C69737420616C85
-:101890006C20636F6D6D616E6400000000020000DB
-:1018A0000002000008000000080000000010000016
-:1018B00000100000102840587088A0B800000000F8
-:1018C00004040400000800000008000008000000F4
-:1018D0000800020406080A0C0001020304050600C1
-:1018E00010190008000000206C000000DC0E000849
-:1018F0007C1900086C000020841C0000EC0E00081D
-:101900007C19000800C0012000100000EC0E000847
-:101910000024F400000000000000000000000000AF
-:1019200000000000000000000000000000000000B7
-:101930000000000000000000F1160008DD1700089C
-:101940008000002000C001208010002080140020B2
-:101950000000000000000000000000000000000087
-:1019600000000000000000000000000083180008D4
-:0C19700089180008C6E533B4190F000800
+:10020000FFF7C6FF341900085419000830B58C18E0
+:1002100010F8012B12F00F0301D110F8013B120965
+:1002200006D110F8012B03E010F8015B01F8015B27
+:100230005B1EF9D101E001F8013B521EFBD1A14246
+:10024000E6D3002030BD10B5002000F0B5FE10BD93
+:1002500000BFFEE770B504460D4600BF2CB901F0A3
+:1002600003FB01E000BF00BFFCE700BF012070BD41
+:1002700010B5002000F076FE10BD704700BFFEE70D
+:100280002DE9F04105460C460026606800B100BF2C
+:10029000134800F049F80746124800F045F80743B4
+:1002A000114800F041F80743AFB9606860B1D4E984
+:1002B00000010843A1680843E168084369680B4AE4
+:1002C00011400843686007E06868084908402168F1
+:1002D0000843686000E001263046BDE8F081000078
+:1002E000002001400021014000220140E010FCFFFD
+:1002F00070B504460D460026204600F015F870B98A
+:10030000A968286808436168064A1140084360608C
+:10031000A06820F4006069680843A06000E001263E
+:10032000304670BDFFFEFFFC0146886800F001000A
+:100330007047000070B504460D460026686800B19D
+:1003400000BF2046FFF7F0FF00BB686830B160686F
+:1003500020F46840A9680843606003E0606820F406
+:1003600068406060286800F07060E96808432969A7
+:100370000843A168074A11400843A0606868E16A21
+:1003800021F470010143E16200BF00E00126304624
+:1003900070BD0000FDFCFFC070B501F440744FF467
+:1003A000407595FAA5F5B5FA85F5EC4000F12C05F8
+:1003B00005EB84031C6801F01F061F25B540AC4304
+:1003C00002F01F0501F01F06B5402C431C6070BDF4
+:1003D00070B501F000744FF0007595FAA5F5B5FA07
+:1003E00085F5EC4000F10C0505EB84031C6801F079
+:1003F000F8754FF0F87696FAA6F6B6FA86F6F54056
+:100400000726AE40B44301F0F8754FF0F87696FA3F
+:10041000A6F6B6FA86F6F54002FA05F52C431C60FE
+:1004200070BD426822F440020A434260704742684D
+:1004300022F440020A4342607047000008B50549B3
+:1004400009680143034A116011460968014000919F
+:1004500000BF08BD30380240F0B502460B4600240C
+:100460000021186890FAA0F0B0FA80F48AE0012523
+:10047000A540186800EA050100297DD058680128C8
+:1004800002D0586802281CD19868956891FAA1F6A4
+:10049000B6FA86F677000326BE40B54391FAA1F678
+:1004A000B6FA86F6760000FA06F63543956000BF88
+:1004B000D86855688D4301FB00F63543556000BF91
+:1004C00000BF1869D56891FAA1F6B6FA86F67700EA
+:1004D0000326BE40B54391FAA1F6B6FA86F6760039
+:1004E00000FA06F63543D56000BF5868022831D1BE
+:1004F00091FAA1F0B0FA80F0082814D25869156A70
+:1005000091FAA1F6B6FA86F6B7000F26BE40B543BB
+:1005100091FAA1F6B6FA86F6B60000FA06F6354369
+:10052000156200BF16E05869556A0E0A96FAA6F6DB
+:10053000B6FA86F6B7000F26BE40B5430E0A96FA05
+:10054000A6F6B6FA86F6B60000FA06F63543556208
+:1005500000BF00BF5868156891FAA1F6B6FA86F692
+:1005600077000326BE40B54391FAA1F6B6FA86F6A7
+:10057000760000FA06F600E003E03543156000BFA0
+:1005800000BF641C1868E04000287FF470AFF0BD25
+:1005900010B5426921EA020302EA010443EA044376
+:1005A000836110BD02480068401C01490860704723
+:1005B000240000204FF47A71B0FBF1F2521E4FF08C
+:1005C000E0235A6100229A6105221A6100BF704738
+:1005D00001490860704700000000002010B5024685
+:1005E00013682C4882420ED0B2F1804F0BD02A48BB
+:1005F000824208D02948824205D02948824202D04E
+:100600002848824204D123F070004C6840EA040379
+:100610002048824220D0B2F1804F1DD01E48824235
+:100620001AD01E48824217D01D48824214D01D485D
+:10063000824211D01C4882420ED01C4882420BD00C
+:100640001B48824208D01B48824205D01A48824289
+:1006500002D01A48824204D123F44070CC6840EAA8
+:10066000040313608868D06200BF0888906200BFEE
+:100670000848824202D00B48824203D108691063C5
+:1006800000BF00BF00BF506940F00100506100BFD3
+:10069000002010BD000001400004004000080040A0
+:1006A000000C0040000401400040014000440140B3
+:1006B0000048014000180040001C0040002000409D
+:1006C0000146086900F00100704708B54FF0E021CD
+:1006D0000969009100BF411C01B1401C06E04FF0C8
+:1006E000E021096901F4803101B1401E0028F6D1F2
+:1006F00008BD00002DE9F0418EB000200B900C9059
+:100700000D90142106A8FFF764FD002002900390CD
+:10071000049005904FF48070874909680143864A28
+:100720001160114609680140019100BF00BF834874
+:1007300000210A46824B5B5CC35823F0606313437D
+:100740007F4C645C035100BF00BF7D4B5B5CC358B2
+:1007500023F0C00313437A4C645C035100BF00BF15
+:10076000774B5B5CC35823F440331343744C645C95
+:10077000035100BF8215724B5B5CC35823F4907326
+:1007800013436F4C645C035100BF0A466C4B5B5CC7
+:10079000C35823F400731343694C645C035100BFD6
+:1007A0000215674B5B5CC35823F480631343644CAE
+:1007B000645C035100BFC214614B5B5CC35823F4FB
+:1007C000C05313435E4C645C035100BF92005C4B0A
+:1007D0005B5CC35823F4C0431343594C645C03511E
+:1007E00000BF00BF564A525C0244526922F0040224
+:1007F000534B5B5C03445A6100BF1221514B1B6891
+:10080000C3F30220002425460346C3F1070CBCF1C4
+:10081000040F02D94FF0040C01E0C3F1070C674646
+:1008200003F1040CBCF1070F02D24FF0000C01E001
+:10083000A3F1030C66464FF0010C0CFA07FCACF177
+:10084000010C0CEA040C0CFA06FC4FF0010808FA43
+:1008500006F8A8F1010808EA05084CEA080200BFFA
+:10086000002904DB1007030E3748435407E0100744
+:10087000040E34480C3001F00F031B1FC45400BF9A
+:100880001220002809DB00F01F02012191404209DB
+:10089000920002F1E022C2F8001100BF00200B908C
+:1008A0000C904FF480700D900BA92848FFF720FDA5
+:1008B000002006904FF4801007900020089002203E
+:1008C00009904FF440700A9006A92048FFF732FDC6
+:1008D00000201E49896821F4806101431B4A916010
+:1008E00000BF4FF4803002900020039002A9184806
+:1008F000FFF7C6FC174A4FF400711448FFF74CFD90
+:10090000022214491148FFF763FD4FF4000110481B
+:10091000FFF787FD104A910D0C48FFF73DFD0222BD
+:100920000D490A48FFF754FD4FF400010848FFF74E
+:1009300078FD0EB0BDE8F08144380240006402400A
+:10094000AC1800080CED00E000E400E000200140DD
+:100950000023014010002081110050812DE9F84151
+:100960004FF480002E49096801432D4A1160114659
+:1009700009680140009100BF00BF3821294B1B6866
+:10098000C3F30220002425460346C3F1070CBCF143
+:10099000040F02D94FF0040C01E0C3F1070C6746C5
+:1009A00003F1040CBCF1070F02D24FF0000C01E080
+:1009B000A3F1030C66464FF0010C0CFA07FCACF1F6
+:1009C000010C0CEA040C0CFA06FC4FF0010808FAC2
+:1009D00006F8A8F1010808EA05084CEA080200BF79
+:1009E000002904DB1007030E0F48435407E01007EB
+:1009F000040E0C480C3001F00F031B1FC45400BF41
+:100A00003820002809DB00F01F0201219140420933
+:100A1000920002F1E022C2F8001100BFBDE8F881A7
+:100A2000303802400CED00E000E400E000B587B093
+:100A3000182101A8FFF7CDFB1020FFF7FFFC4FF4B2
+:100A40008070FFF7FBFC0420FFF7F8FC2020FFF785
+:100A5000F5FC8020FFF7F2FC0120FFF7EFFC0220FD
+:100A6000FFF7ECFC4020FFF7E9FC0820FFF7E6FC6D
+:100A700003203A49886100BF4FF6FC7001900320C3
+:100A800002900020059001A93448FFF7E5FC40F6EC
+:100A9000FF700190032002900020059001A93048CA
+:100AA000FFF7DAFC43F6FF7001900320029000206C
+:100AB000059001A92B48FFF7CFFC4FF6FF7001907E
+:100AC000032002900020059001A92748FFF7C4FCED
+:100AD00049F6FF700190032002900020059001A9C3
+:100AE0002248FFF7B9FC4FF6FC70019003200290FA
+:100AF0000020059001A91E48FFF7AEFC4FF6FF70DD
+:100B00000190032002900020059001A91948FFF7E9
+:100B1000A3FC4FF6FF700190032002900020059087
+:100B200001A91548FFF798FC4FF6FF7001900320CC
+:100B300002900020059001A91048FFF78DFC0320CA
+:100B40000190012002900220039000200490059063
+:100B500001A90248FFF780FC07B000BD0010024069
+:100B60000020024000080240001402400000024041
+:100B7000001C02400004024000180240000C024029
+:100B80002DE9F04186B0142101A8FFF722FB1020C7
+:100B9000414909680143404A116011460968014012
+:100BA000009100BF00BF36213C4B1B68C3F30220FD
+:100BB000062400250346C3F1070CBCF1040F02D93B
+:100BC0004FF0040C01E0C3F1070C674603F1040C7D
+:100BD000BCF1070F02D24FF0000C01E0A3F1030CAF
+:100BE00066464FF0010C0CFA07FCACF1010C0CEA64
+:100BF000040C0CFA06FC4FF0010808FA06F8A8F1FC
+:100C0000010808EA05084CEA080200BF002904DBD5
+:100C10001007030E2248435407E01007040E1F4834
+:100C20000C3001F00F031B1FC45400BF36200028F6
+:100C300009DB00F01F02012191404209920002F1FC
+:100C4000E022C2F8001100BF42F2CF00ADF804006C
+:100C5000002002906320039001A91248FFF7BEFC18
+:100C600000BF1048006820F080000E49086000BFF7
+:100C70000020496821F0700101430A4A516000BF19
+:100C800000BF1046806820F080001146886000BFD9
+:100C900006B0BDE8F0810000403802400CED00E0F5
+:100CA00000E400E00010004000BFFEE700BFFEE7E8
+:100CB000704770477047000070B5052047490968C4
+:100CC00021F007010143454A116000BF00BF00BF8A
+:100CD0004248006800F007000528F8D14FF4804032
+:100CE0003F49096821F4804101433D4A116000BF3A
+:100CF00000BF3C48006840F480303A49086000BFBB
+:100D000000BF00BF37480068C0F340400028F8D05B
+:100D10004FF480000421A822002340EA010444EAA1
+:100D20008214304D2D1D2D682F4E35402C432D4DF6
+:100D30002D1D2C602C46246824F440341C432C6068
+:100D400000BF00BF281F006840F08070291F0860A6
+:100D500000BF00BF00BF23480068C0F34060002808
+:100D6000F8D000BF00BF1E484068C0F380300028A4
+:100D7000F8D000201B490831096821F0F001014337
+:100D8000184A0832116000BF4FF4A050114609689C
+:100D900021F4E0510143116000BF4FF400401146BF
+:100DA000096821F460410143116000BF022011462F
+:100DB000096821F003010143116000BF00BF00BFBB
+:100DC00008480830006800F00C000828F7D10748F0
+:100DD000FFF7F0FB0548FFF7FBFB70BD003C02404E
+:100DE00000700040003802400080BFFF007A030A14
+:100DF0000348006840F47000014908607047000033
+:100E000088ED00E010B53748FFF75AFC012868D19B
+:100E100000BF00BF33480069C0F3400060B100BFAD
+:100E20003048C068C0F3400030B100BF6FF002002E
+:100E30002C49086100BF00BF00BF2A480069C0F309
+:100E4000800060B100BF2748C068C0F3800030B1A7
+:100E500000BF6FF004002349086100BF00BF00BF5E
+:100E600020480069C0F3C00060B100BF1D48C068E1
+:100E7000C0F3C00030B100BF6FF00800194908612D
+:100E800000BF00BF00BF17480069C0F3001060B189
+:100E900000BF1448C068C0F3001030B100BF6FF04D
+:100EA00010001049086100BF00BF0E48FFF708FCA2
+:100EB00001280CD100BF0B48C06800F0010030B120
+:100EC00000BF6FF001000749086100BF00BF00BF0D
+:100ED000FFF768FB00BF04480068401C0249086037
+:100EE00000BF10BD001000405800002000BFFEE70A
+:100EF00002E008C8121F08C1002AFAD170477047E3
+:100F0000002001E001C1121F002AFBD17047000040
+:100F1000014601F1100000E0001D02681AB9024A02
+:100F200012689042F8D370473800002010B5064888
+:100F3000046803E02046FFF7EBFF0446034800681F
+:100F40008442F7D310BD0000340000203800002098
+:100F500010B501E000F8011B131EA2F10104A2B2BA
+:100F6000F8D110BD70B5054605EBC500114901EB80
+:100F700080040CB1012100E00021084640F2291153
+:100F8000FFF768F960680168C1F3C02129B16068A2
+:100F90004FF40061816000BF00BF60680168C1F369
+:100FA000402129B160684FF40071816000BF00BF2B
+:100FB00070BD000080E1002070B5054605EBC5005E
+:100FC0000D4901EB80040CB1012100E0002108462D
+:100FD0004FF49F71FFF73EF920680168C1F340119B
+:100FE00041B16069401C606120686FF020010160C0
+:100FF00000BF00BF70BD000080E10020014600205E
+:1010000001F001020AB1421CD0B201F002020AB1A1
+:10101000421CD0B201F004020AB1421CD0B201F06D
+:1010200008020AB1421CD0B201F010020AB1421CFF
+:10103000D0B201F020020AB1421CD0B201F040024D
+:101040000AB1421CD0B201F080020AB1421CD0B2F7
+:1010500001F480720AB1421CD0B201F400720AB1EC
+:10106000421CD0B201F480620AB1421CD0B201F439
+:1010700000620AB1421CD0B201F480520AB1421C93
+:10108000D0B201F400520AB1421CD0B201F4804245
+:101090000AB1421CD0B201F400420AB1421CD0B2E3
+:1010A00001F480320AB1421CD0B201F400220AB12C
+:1010B000421CD0B201F480220AB1421CD0B201F429
+:1010C00000320AB1421CD0B2704700002DE9FF4F38
+:1010D00081B006460F469046DDE90F95032E01DAF2
+:1010E000012100E0002108461C21FFF7B3F80FB1F1
+:1010F000012100E0002108461D21FFF7ABF8B8F1FF
+:10110000000F01D0012100E0002108461E21FFF759
+:10111000A1F8B9F1000F01DD012100E0002108462E
+:101120001F21FFF797F806EBC600744901EB800416
+:10113000242200212046FFF70BFF2760C4F804801B
+:101140000498A0600E98E0602561A4F818902846E5
+:10115000FFF754FFA076A07E00FB09F0A083A08BD0
+:101160004FEA400A5146012000F060FB2062216AEC
+:1011700009B1012100E0002108463221FFF76AF899
+:10118000A18B49040A0C0021206AFFF7E1FE201D13
+:1011900007C85B4B5B5CC35823F060631343DFF805
+:1011A00060C11CF801C040F80C3000BF554AD4E9BA
+:1011B0000101534B5B5CC358DFF84CC103EA0C03DD
+:1011C0001343DFF83CC11CF801C040F80C3000BFED
+:1011D0004FF0000BD4E900A0A1684FF0000ECDF84D
+:1011E00000E0BBF1000F04D10AF14C0ECDF800E095
+:1011F00003E0DFF818E1CDF800E0009AD4E901AB94
+:10120000236ADFF8FCE01EF80BE05AF80EE00EF05F
+:10121000C00C00BFBCF1400F0ED1DFF8E4A01AF8FB
+:1012200001A08244CAF80C20DFF8D4A01AF801A06B
+:101230008244CAF808300DE0DFF8C4A01AF801A013
+:101240008244CAF80820DFF8B8A01AF801A0824446
+:10125000CAF80C3000BFA28BD4E90101284B5B5CBB
+:1012600003445B686FF30F031343DFF894C01CF86B
+:1012700001C08444CCF8043000BFD4E90101204A05
+:10128000525C825842F001021D4B5B5CC25000BFB1
+:1012900002212068826822F002020A43826000BFB5
+:1012A0004FF440712068826822F440720A438260E1
+:1012B00000BF05F4002028B14FF40001134808389E
+:1012C000FFF7B5F805F4003028B14FF400010F48DE
+:1012D0000838FFF7ACF80A20FFF7F7F920688168B3
+:1012E00041F00101816000BF2068816841F08041C8
+:1012F000816000BF05B0BDE8F08F000080E10020F4
+:1013000008190008002D02001F80FCFF082301407F
+:101310002DE9F04705468846032D01DA012100E05A
+:1013200000210846EE21FEF795FF4FF00009002648
+:1013300005EBC500104901EB80040CB1012100E070
+:1013400000210846F221FEF785FF206A00EB4807DE
+:10135000002006E039880E44411C88B2A17E07EBCC
+:101360004107218B8142F5DC208BB6FBF0F01FFAA0
+:1013700080F94846BDE8F08780E100200C4B1988D1
+:101380009B1C1A88431A00EE903AF8EEE01A531AA2
+:1013900000EE903AF8EEE00A81EEA01ADFED051AB1
+:1013A000F3EE0E0A41EE210AB0EE600A704700002B
+:1013B0002C7AFF1F0000A0420E49098840F6E44243
+:1013C000514340F6FF72B1FBF2F100EE101AB8EE95
+:1013D000400AF0EE400A00EE100AB8EE400A80EE35
+:1013E000801A9FED050A21EE001ADFED041A81EE46
+:1013F000210A70472A7AFF1F00F07F4500007A44D7
+:1014000000200B4908600B49086000BF00BF0A4874
+:10141000006840F001000849086000BF00BF0846AE
+:10142000C06840F00100C86000BF00BF7047000006
+:1014300008000020100000200010004010B50348F4
+:1014400000F01CF8024800F087F810BD08000020EA
+:10145000100000200EB54FF420204FF4C871002278
+:101460001346CDE900210290024A03490020FFF70C
+:101470002DFE0EBD006402400020014038B5044638
+:1014800000200090206810B112281DD112E000BF8A
+:1014900000F02AF80F4880ED000A00F041F80D48EE
+:1014A00080ED010A00BF0C480068606000BF122098
+:1014B000206000BF084960680968081A642801D2E2
+:1014C000002038BD00BFE3E700202060009003202B
+:1014D000F7E70000180000205800002001490860CC
+:1014E000704700002000002010B52DED028B9FED0D
+:1014F0000A0AB0EE408A00210846FFF709FF0749B3
+:1015000008800888FFF73AFFB0EE408AB0EE480A3C
+:10151000BDEC028B10BD00000000000004000020A4
+:1015200010B52DED028B9FED0A0AB0EE408A012125
+:101530000020FFF7EDFE074948804888FFF73CFF91
+:10154000B0EE408AB0EE480ABDEC028B10BD000040
+:10155000000000000400002038B504460020009080
+:10156000206810B1252816D10BE000BF012000F043
+:1015700019F800BF0A480068606000BF252020609D
+:1015800000BF074960680968081A642801D2002072
+:1015900038BD00BFEAE70020206000900320F7E795
+:1015A0005800002010B5044614B1012C0AD104E003
+:1015B00001210648FEF7ECFF05E002210348FEF793
+:1015C000E7FF00E000BF00BF10BD000000100240B8
+:1015D00008B54FF48040444909680143424A11600C
+:1015E000114609680140009100BF00BF8003111F30
+:1015F00009680143121F11601146096801400091FA
+:1016000000BF00BF03200246384B19684FF6FF03A6
+:101610001940374B0B4343EA0221344B196000BF9A
+:10162000011F1B68C3F302200F2400250346C3F1EA
+:10163000070CBCF1040F02D94FF0040C01E0C3F118
+:10164000070C674603F1040CBCF1070F02D24FF000
+:10165000000C01E0A3F1030C66464FF0010C0CFAFC
+:1016600007FCACF1010C0CEA040C0CFA06FC4FF080
+:10167000010808FA06F8A8F1010808EA05084CEA8A
+:10168000080200BF002904DB1007030E1948435469
+:1016900007E01007040E15480C3001F00F031B1F64
+:1016A000C45400BFFFF708FB134800681349B0FBA0
+:1016B000F1F084B22046FFF711FFFFF7B7F9FFF70B
+:1016C0004DF9FFF75DFAFFF715F8002000F018F864
+:1016D000012000F015F8FFF7BDFEFFF791FE01E0D5
+:1016E000FFF7ACFEFCE70000443802400CED00E0E0
+:1016F0000000FA0500E400E00000002040420F0076
+:1017000010B504460C4951F824104A000B4951F811
+:101710002400002100F09EF8094951F824200749CF
+:10172000083951F82400002100F094F80121034801
+:101730000830015510BD0000F01800084C000020D2
+:10174000001900082DE9F04704460F460025A94678
+:101750002348005D20B92248183801682046884790
+:101760001FB94FF0FF30BDE8F0871E4850F8240045
+:10177000B7FBF0F61B4850F82400B7FBF0F100FB74
+:10178000117000B1761C184850F82400451E22E064
+:101790001348083850F8240030F8150010B909F142
+:1017A000010901E04FF00009B14513D14FF00008E5
+:1017B00009E00B48083850F8240005EB080220F82F
+:1017C000126008F10108B045F3D3064850F8240030
+:1017D0006843C8E76D1E002DDADA4FF0FF30C2E72C
+:1017E00054000020F8180008F018000810B5014651
+:1017F0000023002207E00B4850F8210030F81200C7
+:1018000000B15B1C521C084850F821009042F2D8ED
+:1018100064205843044C54F82140B0FBF4F0C0B2AB
+:1018200010BD00004C000020F018000870B5044600
+:101830000E4631462046FFF785FF0546681C08B96D
+:10184000002070BD024850F824002844F9E7000049
+:101850004400002030B5034601E003F8011B141ECC
+:10186000A2F10102F9D130BD00BF00BF00BF00BF2F
+:1018700000BFBFF34F8F00BF00BF00BF0948006823
+:1018800000F4E06008490843001D0649086000BFF5
+:1018900000BF00BFBFF34F8F00BF00BF00BF00BF3E
+:1018A00000BFFDE70CED00E00000FA0510284058ED
+:1018B0007088A0B8000000000404040000080000C4
+:1018C00000080000080000000800020406080A0CD6
+:1018D000000102030405065F6C697374006C697390
+:1018E0007420616C6C20636F6D6D616E640000002C
+:1018F000800C0000000A0000080000000800000042
+:101900000064000000500000102840587088A0B803
+:1019100000000000040404000008000000080000AB
+:10192000080000000800020406080A0C0001020377
+:101930000405060054190008000000207050000043
+:101940000C020008241A0008705000208095000046
+:10195000000F0008043A0024F43E01170008ED17B8
+:10196000000880500020600AFF2080B4002080CD55
+:10197000002001FF01FF01FF01FF01FF01FF01FF47
+:1019800001FF01FF01FF01FF01FF01FF01FF01FF57
+:1019900001FF01FF01FF01FF01FF01FF01FF01FF47
+:1019A00001FF01FF01FF01FF01FF01FF01FF01FF37
+:1019B00001FF01FF01FF01FF01FF01FF01FF01FF27
+:1019C00001FF01FF01FF01FF01FF01FF01FF01FF17
+:1019D00001FF01FF01FF01FF01FF01FF01FF01FF07
+:1019E00001FF01FF01FF01FF01FF01FF01FF01FFF7
+:1019F00001FF01FF01FF01FF01FF01FF01FF01FFE7
+:101A000001FF01FF01FF01FF01FF01FF01FF01FFD6
+:101A100001AD2FD7180008DD180008C6E533B42D36
+:041A20000F12080099
:040000050800018965
:00000001FF
diff --git a/Public/DMF407电机控制专题教程_V1.0.pdf b/Public/DMF407电机控制专题教程_V1.0.pdf
new file mode 100644
index 0000000..b12afc7
Binary files /dev/null and b/Public/DMF407电机控制专题教程_V1.0.pdf differ
diff --git a/Public/TMC2240_datasheet_rev1_20231.pdf b/Public/TMC2240_datasheet_rev1_20231.pdf
new file mode 100644
index 0000000..8477189
Binary files /dev/null and b/Public/TMC2240_datasheet_rev1_20231.pdf differ
diff --git a/Src/stm32f4xx_it.c b/Src/stm32f4xx_it.c
index 7a815ff..a5cef20 100644
--- a/Src/stm32f4xx_it.c
+++ b/Src/stm32f4xx_it.c
@@ -68,8 +68,8 @@
/* Cortex-M4 Processor Interruption and Exception Handlers */
/******************************************************************************/
/**
- * @brief This function handles Non maskable interrupt.
- */
+ * @brief This function handles Non maskable interrupt.
+ */
void NMI_Handler(void)
{
/* USER CODE BEGIN NonMaskableInt_IRQn 0 */
@@ -83,8 +83,8 @@ void NMI_Handler(void)
}
/**
- * @brief This function handles Hard fault interrupt.
- */
+ * @brief This function handles Hard fault interrupt.
+ */
void HardFault_Handler(void)
{
/* USER CODE BEGIN HardFault_IRQn 0 */
@@ -98,8 +98,8 @@ void HardFault_Handler(void)
}
/**
- * @brief This function handles Memory management fault.
- */
+ * @brief This function handles Memory management fault.
+ */
void MemManage_Handler(void)
{
/* USER CODE BEGIN MemoryManagement_IRQn 0 */
@@ -113,8 +113,8 @@ void MemManage_Handler(void)
}
/**
- * @brief This function handles Pre-fetch fault, memory access fault.
- */
+ * @brief This function handles Pre-fetch fault, memory access fault.
+ */
void BusFault_Handler(void)
{
/* USER CODE BEGIN BusFault_IRQn 0 */
@@ -128,8 +128,8 @@ void BusFault_Handler(void)
}
/**
- * @brief This function handles Undefined instruction or illegal state.
- */
+ * @brief This function handles Undefined instruction or illegal state.
+ */
void UsageFault_Handler(void)
{
/* USER CODE BEGIN UsageFault_IRQn 0 */
@@ -143,8 +143,8 @@ void UsageFault_Handler(void)
}
/**
- * @brief This function handles System service call via SWI instruction.
- */
+ * @brief This function handles System service call via SWI instruction.
+ */
void SVC_Handler(void)
{
/* USER CODE BEGIN SVCall_IRQn 0 */
@@ -156,8 +156,8 @@ void SVC_Handler(void)
}
/**
- * @brief This function handles Debug monitor.
- */
+ * @brief This function handles Debug monitor.
+ */
void DebugMon_Handler(void)
{
/* USER CODE BEGIN DebugMonitor_IRQn 0 */
@@ -169,8 +169,8 @@ void DebugMon_Handler(void)
}
/**
- * @brief This function handles Pendable request for system service.
- */
+ * @brief This function handles Pendable request for system service.
+ */
void PendSV_Handler(void)
{
/* USER CODE BEGIN PendSV_IRQn 0 */
@@ -182,8 +182,8 @@ void PendSV_Handler(void)
}
/**
- * @brief This function handles System tick timer.
- */
+ * @brief This function handles System tick timer.
+ */
void SysTick_Handler(void)
{
/* USER CODE BEGIN SysTick_IRQn 0 */
@@ -203,8 +203,8 @@ void SysTick_Handler(void)
/******************************************************************************/
/**
- * @brief This function handles ADC1, ADC2 and ADC3 global interrupts.
- */
+ * @brief This function handles ADC1, ADC2 and ADC3 global interrupts.
+ */
void ADC_IRQHandler(void)
{
/* USER CODE BEGIN ADC_IRQn 0 */
@@ -217,8 +217,8 @@ void ADC_IRQHandler(void)
}
/**
- * @brief This function handles TIM6 global interrupt, DAC1 and DAC2 underrun error interrupts.
- */
+ * @brief This function handles TIM6 global interrupt, DAC1 and DAC2 underrun error interrupts.
+ */
void TIM6_DAC_IRQHandler(void)
{
/* USER CODE BEGIN TIM6_DAC_IRQn 0 */
@@ -236,8 +236,8 @@ void TIM6_DAC_IRQHandler(void)
}
/**
- * @brief This function handles DMA2 stream0 global interrupt.
- */
+ * @brief This function handles DMA2 stream0 global interrupt.
+ */
void DMA2_Stream0_IRQHandler(void)
{
/* USER CODE BEGIN DMA2_Stream0_IRQn 0 */
diff --git a/Src/tim.c b/Src/tim.c
index 52e20ea..2e553f6 100644
--- a/Src/tim.c
+++ b/Src/tim.c
@@ -44,7 +44,7 @@ void MX_TIM6_Init(void)
/* USER CODE BEGIN TIM6_Init 1 */
/* USER CODE END TIM6_Init 1 */
- TIM_InitStruct.Prescaler = 16799;
+ TIM_InitStruct.Prescaler = 8399;
TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_UP;
TIM_InitStruct.Autoreload = 99;
LL_TIM_Init(TIM6, &TIM_InitStruct);
diff --git a/User/lib/control/inc/s_curve.h b/User/lib/control/inc/s_curve.h
deleted file mode 100644
index 4f2a419..0000000
--- a/User/lib/control/inc/s_curve.h
+++ /dev/null
@@ -1,30 +0,0 @@
-#ifndef __S_CURVE_H
-#define __S_CURVE_H
-#include "lib.h"
-
-typedef struct
-{
- // 起始频率
- float32 f0;
- // 加加速段斜率
- float32 faa;
- // 减减速段斜率
- float32 frr;
- // 加加速段时间
- float32 taa;
- // 匀加速段时间
- float32 tua;
- // 减加速段时间
- float32 tra;
- // 匀速段时间
- float32 tuu;
- // 加减速段时间
- float32 tar;
- // 匀减速段时间
- float32 tur;
- // 减减速段时间
- float32 trr;
-} s_curve_t;
-
-void s_curve_table_gen(uint16_t tmin, uint16_t tmax);
-#endif // __S_CURVE_H
diff --git a/User/lib/control/src/s_curve.c b/User/lib/control/src/s_curve.c
deleted file mode 100644
index 9d40b6c..0000000
--- a/User/lib/control/src/s_curve.c
+++ /dev/null
@@ -1,171 +0,0 @@
-#include "s_curve.h"
-
-// s曲线加速度各段参数定义
-// 起始速度
-#define F0 0.0f
-
-// 加加速度与减减速度
-#define FAA 0.0f
-#define FRR 0.0f
-
-// 加速段三个时间
-#define TAA 0.1f
-#define TUA 0.2f
-#define TRA 0.1f
-
-// 匀速段
-#define TUU 5.0f
-
-// 减速段
-#define TAR 0.1f
-#define TUR 0.2f
-#define TRR 0.1f
-
-// 表格长度
-#define S_CURVE_TABLE_LEN 400
-int16_t s_curve_table[S_CURVE_TABLE_LEN] = {0};
-
-static int16_t s_curve_func(s_curve_t *s, float32 t, float32 *freq, float32 *acc)
-{
- // 辅助常数项
- float32 A, B, C, D, E, F;
- // 表达式中间值
- float32 f3, f4, f5;
- // 加速段,匀速段,减速段时间
- float32 Ta, Tu, Tr;
- // 减加速与加减速段斜率
- float32 fra, far;
- // 起始频率与加加速频率,减减速频率
- float32 f0, faa, frr;
- float32 taa, tua, tra, tuu, tar, tur, trr;
-
- // 获取参数
- faa = s->faa;
- frr = s->frr;
-
- taa = s->taa;
- tua = s->tua;
- tra = s->tra;
- tuu = s->tuu;
- tar = s->tar;
- tur = s->tur;
- trr = s->trr;
-
- f0 = s->f0;
-
- fra = faa * taa / tra;
- far = frr * trr / tar;
-
- Ta = taa + tua + tra;
- Tu = tuu;
- Tr = tar + tur + trr;
-
- A = f0;
- B = f0 - 0.5 * faa * taa * taa;
- C = f0 + 0.5 * faa * taa * taa + faa * taa * tua + 0.5 * fra * (taa + tua) * (taa + tua) - fra * Ta * (taa + tua);
-
- // f1 = f0 + 0.5 * faa * taa * taa;
- // f2 = f0 + 0.5 * faa * taa * taa + faa * taa * tua;
- f3 = 0.5 * fra * Ta * Ta + C;
-
- D = f3 - 0.5 * far * (Ta + Tu) * (Ta + Tu);
- f4 = -far * 0.5 * (Ta + Tu + tar) * (Ta + Tu + tar) + far * (Ta + Tu) * (Ta + Tu + tar) + D;
-
- E = f4 + far * tar * (Ta + Tu + tar);
- f5 = -far * tar * (Ta + Tu + Tr - trr) + E;
-
- F = f5 + frr * (Ta + Tu + Tr) * (Ta + Tu + Tr - trr) - 0.5 * frr * (Ta + Tu + Tr - trr) * (Ta + Tu + Tr - trr);
-
- // 如果时间点在全行程规定的时间段内
- if ((t >= 0) && (t <= Ta + Tu + Tr))
- {
- // 加加速段
- if ((t >= 0) && (t <= taa))
- {
- *freq = 0.5 * faa * t * t + A;
- *acc = faa * t;
- }
- // 匀加速段
- else if ((t >= taa) && (t <= taa + tua))
- {
- *freq = faa * taa * t + B;
- *acc = faa * taa;
- }
- // 加减速段
- else if ((t >= taa + tua) && (t <= taa + tua + tra))
- {
- *freq = -0.5 * fra * t * t + fra * Ta * t + C;
- *acc = -fra * t + fra * Ta;
- }
- // 匀速段
- else if ((t >= Ta) && (t <= Ta + tuu))
- {
- *freq = f3;
- *acc = 0;
- }
- // 加减速段
- else if ((t >= Ta + Tu) && (t <= Ta + Tu + tar))
- {
- *freq = -0.5 * far * t * t + far * (Ta + Tu) * t + D;
- *acc = -far * t + far * (Ta + Tu);
- }
- // 匀减速
- else if ((t >= Ta + Tu + tar) && (t <= Ta + Tu + tar + tur))
- {
- *freq = -far * tar * t + E;
- *acc = -far * tar;
- }
- // 减减速
- else if ((t >= Ta + Tu + Tr - trr) && (t <= Ta + Tu + Tr))
- {
- *freq = 0.5 * frr * t * t - frr * (Ta + Tu + Tr) * t + F;
- *acc = frr * t - frr * (Ta + Tu + Tr);
- }
- }
- else
- {
- return -1;
- }
-
- return 0;
-}
-
-// S型曲线初始化
-void s_curve_table_gen(uint16_t tmin, uint16_t tmax)
-{
- uint16_t i, tint;
- float32 ti;
- float32 freq;
- float32 acc;
- float32 fi;
- s_curve_t s;
- osel_memset((uint8_t *)&s, 0, sizeof(s_curve_t));
-
- s.f0 = F0;
- s.taa = TAA;
- s.tua = TUA;
- s.tra = TRA;
- s.tuu = TUU;
- s.tar = TAR;
- s.tur = TUR;
- s.trr = TRR;
-
- // 根据约束条件求出加加速段与减减速段斜率
- s.faa = 2.0 / (s.taa * (s.taa + s.tra + 2 * s.tua));
- s.frr = 2.0 / (s.trr * (s.tar + s.trr + 2 * s.tur));
-
- for (i = 0; i < S_CURVE_TABLE_LEN; i++)
- {
- // 求出每个时间点对应的频率以及加速度
- fi = i * (TAA + TUA + TRA + TUU + TAR + TUR + TRR) / S_CURVE_TABLE_LEN;
- s_curve_func(&s, fi, &freq, &acc);
-
- // 根据最大与最小装载值确定定时器实际值
- ti = tmax - (tmax - tmin) * freq;
- // 转换为整数值
- tint = (uint16_t)ti;
-
- // 存入s曲线表
- s_curve_table[i] = tint;
- }
-}
diff --git a/User/lib/driver/ssd1306_oled.c b/User/lib/driver/ssd1306_oled.c
deleted file mode 100644
index fad35c0..0000000
--- a/User/lib/driver/ssd1306_oled.c
+++ /dev/null
@@ -1,737 +0,0 @@
-/**
- * @file ssd1306_oled.c
- * @author xushenghao
- * @brief SSD1306 OLED display driver
- * @version 0.1
- * @note PB13-SCK PB12-SDA
- */
-#include "ssd1306_oled.h"
-
-#include "ssd1306_oled.h"
-
-/************************************6*8的点阵************************************/
-const uint8_t F6x8[][6] =
- {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // sp
- 0x00, 0x00, 0x00, 0x2f, 0x00, 0x00, // !
- 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, // "
- 0x00, 0x14, 0x7f, 0x14, 0x7f, 0x14, // #
- 0x00, 0x24, 0x2a, 0x7f, 0x2a, 0x12, // $
- 0x00, 0x62, 0x64, 0x08, 0x13, 0x23, // %
- 0x00, 0x36, 0x49, 0x55, 0x22, 0x50, // &
- 0x00, 0x00, 0x05, 0x03, 0x00, 0x00, // '
- 0x00, 0x00, 0x1c, 0x22, 0x41, 0x00, // (
- 0x00, 0x00, 0x41, 0x22, 0x1c, 0x00, // )
- 0x00, 0x14, 0x08, 0x3E, 0x08, 0x14, // *
- 0x00, 0x08, 0x08, 0x3E, 0x08, 0x08, // +
- 0x00, 0x00, 0x00, 0xA0, 0x60, 0x00, // ,
- 0x00, 0x08, 0x08, 0x08, 0x08, 0x08, // -
- 0x00, 0x00, 0x60, 0x60, 0x00, 0x00, // .
- 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, // /
- 0x00, 0x3E, 0x51, 0x49, 0x45, 0x3E, // 0
- 0x00, 0x00, 0x42, 0x7F, 0x40, 0x00, // 1
- 0x00, 0x42, 0x61, 0x51, 0x49, 0x46, // 2
- 0x00, 0x21, 0x41, 0x45, 0x4B, 0x31, // 3
- 0x00, 0x18, 0x14, 0x12, 0x7F, 0x10, // 4
- 0x00, 0x27, 0x45, 0x45, 0x45, 0x39, // 5
- 0x00, 0x3C, 0x4A, 0x49, 0x49, 0x30, // 6
- 0x00, 0x01, 0x71, 0x09, 0x05, 0x03, // 7
- 0x00, 0x36, 0x49, 0x49, 0x49, 0x36, // 8
- 0x00, 0x06, 0x49, 0x49, 0x29, 0x1E, // 9
- 0x00, 0x00, 0x36, 0x36, 0x00, 0x00, // :
- 0x00, 0x00, 0x56, 0x36, 0x00, 0x00, // ;
- 0x00, 0x08, 0x14, 0x22, 0x41, 0x00, // <
- 0x00, 0x14, 0x14, 0x14, 0x14, 0x14, // =
- 0x00, 0x00, 0x41, 0x22, 0x14, 0x08, // >
- 0x00, 0x02, 0x01, 0x51, 0x09, 0x06, // ?
- 0x00, 0x32, 0x49, 0x59, 0x51, 0x3E, // @
- 0x00, 0x7C, 0x12, 0x11, 0x12, 0x7C, // A
- 0x00, 0x7F, 0x49, 0x49, 0x49, 0x36, // B
- 0x00, 0x3E, 0x41, 0x41, 0x41, 0x22, // C
- 0x00, 0x7F, 0x41, 0x41, 0x22, 0x1C, // D
- 0x00, 0x7F, 0x49, 0x49, 0x49, 0x41, // E
- 0x00, 0x7F, 0x09, 0x09, 0x09, 0x01, // F
- 0x00, 0x3E, 0x41, 0x49, 0x49, 0x7A, // G
- 0x00, 0x7F, 0x08, 0x08, 0x08, 0x7F, // H
- 0x00, 0x00, 0x41, 0x7F, 0x41, 0x00, // I
- 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01, // J
- 0x00, 0x7F, 0x08, 0x14, 0x22, 0x41, // K
- 0x00, 0x7F, 0x40, 0x40, 0x40, 0x40, // L
- 0x00, 0x7F, 0x02, 0x0C, 0x02, 0x7F, // M
- 0x00, 0x7F, 0x04, 0x08, 0x10, 0x7F, // N
- 0x00, 0x3E, 0x41, 0x41, 0x41, 0x3E, // O
- 0x00, 0x7F, 0x09, 0x09, 0x09, 0x06, // P
- 0x00, 0x3E, 0x41, 0x51, 0x21, 0x5E, // Q
- 0x00, 0x7F, 0x09, 0x19, 0x29, 0x46, // R
- 0x00, 0x46, 0x49, 0x49, 0x49, 0x31, // S
- 0x00, 0x01, 0x01, 0x7F, 0x01, 0x01, // T
- 0x00, 0x3F, 0x40, 0x40, 0x40, 0x3F, // U
- 0x00, 0x1F, 0x20, 0x40, 0x20, 0x1F, // V
- 0x00, 0x3F, 0x40, 0x38, 0x40, 0x3F, // W
- 0x00, 0x63, 0x14, 0x08, 0x14, 0x63, // X
- 0x00, 0x07, 0x08, 0x70, 0x08, 0x07, // Y
- 0x00, 0x61, 0x51, 0x49, 0x45, 0x43, // Z
- 0x00, 0x00, 0x7F, 0x41, 0x41, 0x00, // [
- 0x00, 0x55, 0x2A, 0x55, 0x2A, 0x55, // 55
- 0x00, 0x00, 0x41, 0x41, 0x7F, 0x00, // ]
- 0x00, 0x04, 0x02, 0x01, 0x02, 0x04, // ^
- 0x00, 0x40, 0x40, 0x40, 0x40, 0x40, // _
- 0x00, 0x00, 0x01, 0x02, 0x04, 0x00, // '
- 0x00, 0x20, 0x54, 0x54, 0x54, 0x78, // a
- 0x00, 0x7F, 0x48, 0x44, 0x44, 0x38, // b
- 0x00, 0x38, 0x44, 0x44, 0x44, 0x20, // c
- 0x00, 0x38, 0x44, 0x44, 0x48, 0x7F, // d
- 0x00, 0x38, 0x54, 0x54, 0x54, 0x18, // e
- 0x00, 0x08, 0x7E, 0x09, 0x01, 0x02, // f
- 0x00, 0x18, 0xA4, 0xA4, 0xA4, 0x7C, // g
- 0x00, 0x7F, 0x08, 0x04, 0x04, 0x78, // h
- 0x00, 0x00, 0x44, 0x7D, 0x40, 0x00, // i
- 0x00, 0x40, 0x80, 0x84, 0x7D, 0x00, // j
- 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00, // k
- 0x00, 0x00, 0x41, 0x7F, 0x40, 0x00, // l
- 0x00, 0x7C, 0x04, 0x18, 0x04, 0x78, // m
- 0x00, 0x7C, 0x08, 0x04, 0x04, 0x78, // n
- 0x00, 0x38, 0x44, 0x44, 0x44, 0x38, // o
- 0x00, 0xFC, 0x24, 0x24, 0x24, 0x18, // p
- 0x00, 0x18, 0x24, 0x24, 0x18, 0xFC, // q
- 0x00, 0x7C, 0x08, 0x04, 0x04, 0x08, // r
- 0x00, 0x48, 0x54, 0x54, 0x54, 0x20, // s
- 0x00, 0x04, 0x3F, 0x44, 0x40, 0x20, // t
- 0x00, 0x3C, 0x40, 0x40, 0x20, 0x7C, // u
- 0x00, 0x1C, 0x20, 0x40, 0x20, 0x1C, // v
- 0x00, 0x3C, 0x40, 0x30, 0x40, 0x3C, // w
- 0x00, 0x44, 0x28, 0x10, 0x28, 0x44, // x
- 0x00, 0x1C, 0xA0, 0xA0, 0xA0, 0x7C, // y
- 0x00, 0x44, 0x64, 0x54, 0x4C, 0x44, // z
- 0x14, 0x14, 0x14, 0x14, 0x14, 0x14, // horiz lines
-};
-/****************************************8*16的点阵************************************/
-const uint8_t F8X16[] =
- {
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // 0
- 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x30, 0x00, 0x00, 0x00, //! 1
- 0x00, 0x10, 0x0C, 0x06, 0x10, 0x0C, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //" 2
- 0x40, 0xC0, 0x78, 0x40, 0xC0, 0x78, 0x40, 0x00, 0x04, 0x3F, 0x04, 0x04, 0x3F, 0x04, 0x04, 0x00, // # 3
- 0x00, 0x70, 0x88, 0xFC, 0x08, 0x30, 0x00, 0x00, 0x00, 0x18, 0x20, 0xFF, 0x21, 0x1E, 0x00, 0x00, //$ 4
- 0xF0, 0x08, 0xF0, 0x00, 0xE0, 0x18, 0x00, 0x00, 0x00, 0x21, 0x1C, 0x03, 0x1E, 0x21, 0x1E, 0x00, //% 5
- 0x00, 0xF0, 0x08, 0x88, 0x70, 0x00, 0x00, 0x00, 0x1E, 0x21, 0x23, 0x24, 0x19, 0x27, 0x21, 0x10, //& 6
- 0x10, 0x16, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //' 7
- 0x00, 0x00, 0x00, 0xE0, 0x18, 0x04, 0x02, 0x00, 0x00, 0x00, 0x00, 0x07, 0x18, 0x20, 0x40, 0x00, //( 8
- 0x00, 0x02, 0x04, 0x18, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x18, 0x07, 0x00, 0x00, 0x00, //) 9
- 0x40, 0x40, 0x80, 0xF0, 0x80, 0x40, 0x40, 0x00, 0x02, 0x02, 0x01, 0x0F, 0x01, 0x02, 0x02, 0x00, //* 10
- 0x00, 0x00, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x1F, 0x01, 0x01, 0x01, 0x00, //+ 11
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xB0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, //, 12
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, //- 13
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, //. 14
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x18, 0x04, 0x00, 0x60, 0x18, 0x06, 0x01, 0x00, 0x00, 0x00, /// 15
- 0x00, 0xE0, 0x10, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x00, 0x0F, 0x10, 0x20, 0x20, 0x10, 0x0F, 0x00, // 0 16
- 0x00, 0x10, 0x10, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, // 1 17
- 0x00, 0x70, 0x08, 0x08, 0x08, 0x88, 0x70, 0x00, 0x00, 0x30, 0x28, 0x24, 0x22, 0x21, 0x30, 0x00, // 2 18
- 0x00, 0x30, 0x08, 0x88, 0x88, 0x48, 0x30, 0x00, 0x00, 0x18, 0x20, 0x20, 0x20, 0x11, 0x0E, 0x00, // 3 19
- 0x00, 0x00, 0xC0, 0x20, 0x10, 0xF8, 0x00, 0x00, 0x00, 0x07, 0x04, 0x24, 0x24, 0x3F, 0x24, 0x00, // 4 20
- 0x00, 0xF8, 0x08, 0x88, 0x88, 0x08, 0x08, 0x00, 0x00, 0x19, 0x21, 0x20, 0x20, 0x11, 0x0E, 0x00, // 5 21
- 0x00, 0xE0, 0x10, 0x88, 0x88, 0x18, 0x00, 0x00, 0x00, 0x0F, 0x11, 0x20, 0x20, 0x11, 0x0E, 0x00, // 6 22
- 0x00, 0x38, 0x08, 0x08, 0xC8, 0x38, 0x08, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, // 7 23
- 0x00, 0x70, 0x88, 0x08, 0x08, 0x88, 0x70, 0x00, 0x00, 0x1C, 0x22, 0x21, 0x21, 0x22, 0x1C, 0x00, // 8 24
- 0x00, 0xE0, 0x10, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x00, 0x00, 0x31, 0x22, 0x22, 0x11, 0x0F, 0x00, // 9 25
- 0x00, 0x00, 0x00, 0xC0, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x00, //: 26
- 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x60, 0x00, 0x00, 0x00, 0x00, //; 27
- 0x00, 0x00, 0x80, 0x40, 0x20, 0x10, 0x08, 0x00, 0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x00, //< 28
- 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x00, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x00, //= 29
- 0x00, 0x08, 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01, 0x00, //> 30
- 0x00, 0x70, 0x48, 0x08, 0x08, 0x08, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x30, 0x36, 0x01, 0x00, 0x00, //? 31
- 0xC0, 0x30, 0xC8, 0x28, 0xE8, 0x10, 0xE0, 0x00, 0x07, 0x18, 0x27, 0x24, 0x23, 0x14, 0x0B, 0x00, //@ 32
- 0x00, 0x00, 0xC0, 0x38, 0xE0, 0x00, 0x00, 0x00, 0x20, 0x3C, 0x23, 0x02, 0x02, 0x27, 0x38, 0x20, // A 33
- 0x08, 0xF8, 0x88, 0x88, 0x88, 0x70, 0x00, 0x00, 0x20, 0x3F, 0x20, 0x20, 0x20, 0x11, 0x0E, 0x00, // B 34
- 0xC0, 0x30, 0x08, 0x08, 0x08, 0x08, 0x38, 0x00, 0x07, 0x18, 0x20, 0x20, 0x20, 0x10, 0x08, 0x00, // C 35
- 0x08, 0xF8, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x20, 0x3F, 0x20, 0x20, 0x20, 0x10, 0x0F, 0x00, // D 36
- 0x08, 0xF8, 0x88, 0x88, 0xE8, 0x08, 0x10, 0x00, 0x20, 0x3F, 0x20, 0x20, 0x23, 0x20, 0x18, 0x00, // E 37
- 0x08, 0xF8, 0x88, 0x88, 0xE8, 0x08, 0x10, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x03, 0x00, 0x00, 0x00, // F 38
- 0xC0, 0x30, 0x08, 0x08, 0x08, 0x38, 0x00, 0x00, 0x07, 0x18, 0x20, 0x20, 0x22, 0x1E, 0x02, 0x00, // G 39
- 0x08, 0xF8, 0x08, 0x00, 0x00, 0x08, 0xF8, 0x08, 0x20, 0x3F, 0x21, 0x01, 0x01, 0x21, 0x3F, 0x20, // H 40
- 0x00, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, // I 41
- 0x00, 0x00, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x00, 0xC0, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, 0x00, // J 42
- 0x08, 0xF8, 0x88, 0xC0, 0x28, 0x18, 0x08, 0x00, 0x20, 0x3F, 0x20, 0x01, 0x26, 0x38, 0x20, 0x00, // K 43
- 0x08, 0xF8, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x3F, 0x20, 0x20, 0x20, 0x20, 0x30, 0x00, // L 44
- 0x08, 0xF8, 0xF8, 0x00, 0xF8, 0xF8, 0x08, 0x00, 0x20, 0x3F, 0x00, 0x3F, 0x00, 0x3F, 0x20, 0x00, // M 45
- 0x08, 0xF8, 0x30, 0xC0, 0x00, 0x08, 0xF8, 0x08, 0x20, 0x3F, 0x20, 0x00, 0x07, 0x18, 0x3F, 0x00, // N 46
- 0xE0, 0x10, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x0F, 0x10, 0x20, 0x20, 0x20, 0x10, 0x0F, 0x00, // O 47
- 0x08, 0xF8, 0x08, 0x08, 0x08, 0x08, 0xF0, 0x00, 0x20, 0x3F, 0x21, 0x01, 0x01, 0x01, 0x00, 0x00, // P 48
- 0xE0, 0x10, 0x08, 0x08, 0x08, 0x10, 0xE0, 0x00, 0x0F, 0x18, 0x24, 0x24, 0x38, 0x50, 0x4F, 0x00, // Q 49
- 0x08, 0xF8, 0x88, 0x88, 0x88, 0x88, 0x70, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x03, 0x0C, 0x30, 0x20, // R 50
- 0x00, 0x70, 0x88, 0x08, 0x08, 0x08, 0x38, 0x00, 0x00, 0x38, 0x20, 0x21, 0x21, 0x22, 0x1C, 0x00, // S 51
- 0x18, 0x08, 0x08, 0xF8, 0x08, 0x08, 0x18, 0x00, 0x00, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x00, 0x00, // T 52
- 0x08, 0xF8, 0x08, 0x00, 0x00, 0x08, 0xF8, 0x08, 0x00, 0x1F, 0x20, 0x20, 0x20, 0x20, 0x1F, 0x00, // U 53
- 0x08, 0x78, 0x88, 0x00, 0x00, 0xC8, 0x38, 0x08, 0x00, 0x00, 0x07, 0x38, 0x0E, 0x01, 0x00, 0x00, // V 54
- 0xF8, 0x08, 0x00, 0xF8, 0x00, 0x08, 0xF8, 0x00, 0x03, 0x3C, 0x07, 0x00, 0x07, 0x3C, 0x03, 0x00, // W 55
- 0x08, 0x18, 0x68, 0x80, 0x80, 0x68, 0x18, 0x08, 0x20, 0x30, 0x2C, 0x03, 0x03, 0x2C, 0x30, 0x20, // X 56
- 0x08, 0x38, 0xC8, 0x00, 0xC8, 0x38, 0x08, 0x00, 0x00, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x00, 0x00, // Y 57
- 0x10, 0x08, 0x08, 0x08, 0xC8, 0x38, 0x08, 0x00, 0x20, 0x38, 0x26, 0x21, 0x20, 0x20, 0x18, 0x00, // Z 58
- 0x00, 0x00, 0x00, 0xFE, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x40, 0x40, 0x40, 0x00, //[ 59
- 0x00, 0x0C, 0x30, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x06, 0x38, 0xC0, 0x00, //\ 60
- 0x00, 0x02, 0x02, 0x02, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x40, 0x7F, 0x00, 0x00, 0x00, //] 61
- 0x00, 0x00, 0x04, 0x02, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //^ 62
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, //_ 63
- 0x00, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //` 64
- 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x19, 0x24, 0x22, 0x22, 0x22, 0x3F, 0x20, // a 65
- 0x08, 0xF8, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x11, 0x20, 0x20, 0x11, 0x0E, 0x00, // b 66
- 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x0E, 0x11, 0x20, 0x20, 0x20, 0x11, 0x00, // c 67
- 0x00, 0x00, 0x00, 0x80, 0x80, 0x88, 0xF8, 0x00, 0x00, 0x0E, 0x11, 0x20, 0x20, 0x10, 0x3F, 0x20, // d 68
- 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x22, 0x22, 0x22, 0x22, 0x13, 0x00, // e 69
- 0x00, 0x80, 0x80, 0xF0, 0x88, 0x88, 0x88, 0x18, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, // f 70
- 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x6B, 0x94, 0x94, 0x94, 0x93, 0x60, 0x00, // g 71
- 0x08, 0xF8, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x20, 0x3F, 0x21, 0x00, 0x00, 0x20, 0x3F, 0x20, // h 72
- 0x00, 0x80, 0x98, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, // i 73
- 0x00, 0x00, 0x00, 0x80, 0x98, 0x98, 0x00, 0x00, 0x00, 0xC0, 0x80, 0x80, 0x80, 0x7F, 0x00, 0x00, // j 74
- 0x08, 0xF8, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x20, 0x3F, 0x24, 0x02, 0x2D, 0x30, 0x20, 0x00, // k 75
- 0x00, 0x08, 0x08, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x3F, 0x20, 0x20, 0x00, 0x00, // l 76
- 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x20, 0x3F, 0x20, 0x00, 0x3F, 0x20, 0x00, 0x3F, // m 77
- 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x20, 0x3F, 0x21, 0x00, 0x00, 0x20, 0x3F, 0x20, // n 78
- 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x1F, 0x20, 0x20, 0x20, 0x20, 0x1F, 0x00, // o 79
- 0x80, 0x80, 0x00, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0xFF, 0xA1, 0x20, 0x20, 0x11, 0x0E, 0x00, // p 80
- 0x00, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x0E, 0x11, 0x20, 0x20, 0xA0, 0xFF, 0x80, // q 81
- 0x80, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x20, 0x20, 0x3F, 0x21, 0x20, 0x00, 0x01, 0x00, // r 82
- 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x33, 0x24, 0x24, 0x24, 0x24, 0x19, 0x00, // s 83
- 0x00, 0x80, 0x80, 0xE0, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x20, 0x20, 0x00, 0x00, // t 84
- 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x80, 0x00, 0x00, 0x1F, 0x20, 0x20, 0x20, 0x10, 0x3F, 0x20, // u 85
- 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 0x00, 0x01, 0x0E, 0x30, 0x08, 0x06, 0x01, 0x00, // v 86
- 0x80, 0x80, 0x00, 0x80, 0x00, 0x80, 0x80, 0x80, 0x0F, 0x30, 0x0C, 0x03, 0x0C, 0x30, 0x0F, 0x00, // w 87
- 0x00, 0x80, 0x80, 0x00, 0x80, 0x80, 0x80, 0x00, 0x00, 0x20, 0x31, 0x2E, 0x0E, 0x31, 0x20, 0x00, // x 88
- 0x80, 0x80, 0x80, 0x00, 0x00, 0x80, 0x80, 0x80, 0x80, 0x81, 0x8E, 0x70, 0x18, 0x06, 0x01, 0x00, // y 89
- 0x00, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x00, 0x00, 0x21, 0x30, 0x2C, 0x22, 0x21, 0x30, 0x00, // z 90
- 0x00, 0x00, 0x00, 0x00, 0x80, 0x7C, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x40, 0x40, //{ 91
- 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, //| 92
- 0x00, 0x02, 0x02, 0x7C, 0x80, 0x00, 0x00, 0x00, 0x00, 0x40, 0x40, 0x3F, 0x00, 0x00, 0x00, 0x00, //} 93
- 0x00, 0x06, 0x01, 0x01, 0x02, 0x02, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //~ 94
-};
-
-static uint8_t _buffer[SSD1306_WIDTH * SSD1306_HEIGHT / 8]; // 定义屏幕缓冲区
-
-static void i2c_start(void)
-{
- SDA_OUT();
- GPIO_SET(SSD1306_SDA_PORT, SSD1306_SDA_PIN);
- GPIO_SET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
- delay_us(4);
- GPIO_RESET(SSD1306_SDA_PORT, SSD1306_SDA_PIN);
- delay_us(4);
- GPIO_RESET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
-}
-
-static void i2c_stop(void)
-{
- SDA_OUT();
- GPIO_RESET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
- GPIO_RESET(SSD1306_SDA_PORT, SSD1306_SDA_PIN);
- delay_us(4);
- GPIO_SET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
- GPIO_SET(SSD1306_SDA_PORT, SSD1306_SDA_PIN);
- delay_us(4);
-}
-
-static BOOL i2c_wait_ack(void)
-{
- uint8_t count = 0;
- SDA_IN();
- GPIO_SET(SSD1306_SDA_PORT, SSD1306_SDA_PIN);
- delay_us(4);
- GPIO_SET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
- delay_us(4);
- while (GPIO_READ(SSD1306_SDA_PORT, SSD1306_SDA_PIN))
- {
- count++;
- if (count > 250)
- {
- i2c_stop();
- return FALSE;
- }
- }
- GPIO_RESET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
- return TRUE;
-}
-
-static void i2c_ack(void)
-{
- GPIO_RESET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
- SDA_OUT();
- GPIO_RESET(SSD1306_SDA_PORT, SSD1306_SDA_PIN);
- delay_us(2);
- GPIO_SET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
- delay_us(2);
- GPIO_RESET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
-}
-
-static void i2c_nack(void)
-{
- GPIO_RESET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
- SDA_OUT();
- GPIO_SET(SSD1306_SDA_PORT, SSD1306_SDA_PIN);
- delay_us(2);
- GPIO_SET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
- delay_us(2);
- GPIO_RESET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
-}
-
-uint8_t i2c_read_byte(BOOL ack)
-{
- uint8_t i = 0, receive = 0;
- SDA_IN();
- for (i = 0; i < 8; i++)
- {
- GPIO_RESET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
- delay_us(2);
- GPIO_SET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
- receive <<= 1;
- if (GPIO_READ(SSD1306_SDA_PORT, SSD1306_SDA_PIN))
- {
- receive++;
- }
- delay_us(1);
- }
-
- if (!ack)
- {
- i2c_nack();
- }
- else
- {
- i2c_ack();
- }
-
- return receive;
-}
-
-void i2c_write_byte(uint8_t data)
-{
- uint8_t i = 0;
- SDA_OUT();
- GPIO_RESET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
- for (i = 0; i < 8; i++)
- {
- // IIC_SDA=(txd&0x80)>>7;
- if ((data & 0x80) >> 7)
- GPIO_SET(SSD1306_SDA_PORT, SSD1306_SDA_PIN);
- else
- GPIO_RESET(SSD1306_SDA_PORT, SSD1306_SDA_PIN);
-
- data <<= 1;
- delay_us(2);
- GPIO_SET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
- delay_us(2);
- GPIO_RESET(SSD1306_SCK_PORT, SSD1306_SCK_PIN);
- delay_us(2);
- }
-}
-
-static void i2c_write_command(uint8_t command)
-{
- uint8_t dd[2];
- dd[0] = SSD1306_CMD_SET_LOW_COLUMN; // Co = 0, D/C# = 0
- dd[1] = command;
- i2c_start();
- i2c_write_byte(SSD1306_I2C_ADDRESS);
- i2c_wait_ack();
-
- i2c_write_byte(dd[0]);
- i2c_wait_ack();
-
- i2c_write_byte(dd[1]);
- i2c_wait_ack();
- i2c_stop();
-}
-
-static void i2c_write_data(uint8_t data)
-{
- uint8_t dd[2];
- dd[0] = SSD1306_CMD_SET_START_LINE; // Co = 0, D/C# = 1
- dd[1] = data;
- i2c_start();
- i2c_write_byte(SSD1306_I2C_ADDRESS);
- i2c_wait_ack();
-
- i2c_write_byte(dd[0]);
- i2c_wait_ack();
-
- i2c_write_byte(dd[1]);
- i2c_wait_ack();
-}
-
-/**
- * @brief 设置SSD1306 OLED显示屏上的显示位置
- *
- * 该函数用于设置SSD1306 OLED显示屏上的显示位置,通过x和y坐标确定显示位置。
- *
- * @param x 要设置的横坐标(0-127)
- * @param y 要设置的纵坐标(0-7,对应SSD1306 OLED的8个页面)
- */
-void set_position(uint8_t x, uint8_t y)
-{
- i2c_write_command(0xb0 + y);
- i2c_write_command(((x & 0xf0) >> 4) | 0x10);
- i2c_write_command((x & 0x0f) | 0x01);
-}
-
-void ssd1306_test(void)
-{
- ssd1306_f8x16_string(0, 0, " TEST");
- ssd1306_f8x16_number(40, 0, -15.26, 2);
- ssd1306_f6x8_string_number(0, 3, " @ADC1:", 'V', 24);
- ssd1306_update_screen();
-}
-
-void ssd1306_init(void)
-{
- i2c_write_command(SSD1306_CMD_DISPLAY_OFF); // display off
- i2c_write_command(SSD1306_CMD_MEMORY_MODE); // Set Memory Addressing Mode
- i2c_write_command(SSD1306_CMD_SET_HIGH_COLUMN); // 00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
- i2c_write_command(SSD1306_CMD_COM_SCAN_DEC); // Set COM Output Scan Direction
- i2c_write_command(SSD1306_CMD_SET_LOW_COLUMN); //---set low column address
- i2c_write_command(SSD1306_CMD_SET_HIGH_COLUMN); //---set high column address
- i2c_write_command(SSD1306_CMD_SET_START_LINE); //--set start line address
- i2c_write_command(SSD1306_CMD_SET_CONTRAST); //--set contrast control register
- i2c_write_command(0xff); // 亮度调节 0x00~0xff
- i2c_write_command(0xa1); //--set segment re-map 0 to 127
- i2c_write_command(SSD1306_CMD_NORMAL_DISPLAY); //--set normal display
- i2c_write_command(SSD1306_CMD_SET_MULTIPLEX); //--set multiplex ratio(1 to 64)
- i2c_write_command(0x3f); //
- i2c_write_command(SSD1306_CMD_DISPLAY_ALL_ON_RESUME); // 0xa4,Output follows RAM content;0xa5,Output ignores RAM content
- i2c_write_command(SSD1306_CMD_SET_DISPLAY_OFFSET); //-set display offset
- i2c_write_command(SSD1306_CMD_SET_LOW_COLUMN); //-not offset
- i2c_write_command(SSD1306_CMD_SET_DISPLAY_CLOCK_DIV); //--set display clock divide ratio/oscillator frequency
- i2c_write_command(0xf0); //--set divide ratio
- i2c_write_command(SSD1306_CMD_SET_PRECHARGE); //--set pre-charge period
- i2c_write_command(SSD1306_CMD_PAGE_ADDR); //
- i2c_write_command(SSD1306_CMD_SET_COM_PINS); //--set com pins hardware configuration
- i2c_write_command(0x12);
- i2c_write_command(SSD1306_CMD_SET_VCOM_DETECT); //--set vcomh
- i2c_write_command(SSD1306_CMD_MEMORY_MODE); // 0x20,0.77xVcc
- i2c_write_command(SSD1306_CMD_CHARGE_PUMP); //--set DC-DC enable
- i2c_write_command(SSD1306_CMD_SET_DC_DC_ENABLE); //
- i2c_write_command(SSD1306_CMD_DISPLAY_ON); //--turn on oled panel
- ssd1306_fill(0);
-
- // ssd1306_test();
-}
-
-void ssd1306_display_on(void)
-{
- i2c_write_command(SSD1306_CMD_CHARGE_PUMP); // 设置电荷泵
- i2c_write_command(SSD1306_CMD_SET_DC_DC_ENABLE); // 开启电荷泵
- i2c_write_command(SSD1306_CMD_DISPLAY_ON); // OLED唤醒
-}
-
-void ssd1306_display_off(void)
-{
- i2c_write_command(SSD1306_CMD_CHARGE_PUMP); // 设置电荷泵
- i2c_write_command(SSD1306_CMD_SET_HIGH_COLUMN); // 关闭电荷泵
- i2c_write_command(SSD1306_CMD_DISPLAY_OFF); // OLED休眠
-}
-
-/**
- * @brief 更新SSD1306 OLED显示屏的内容
- *
- * 此函数将缓冲区中的数据写入SSD1306 OLED显示屏,从而更新显示内容。
- *
- * 首先,通过发送命令设置列地址和页地址,然后将缓冲区中的数据逐行写入显示屏。
- *
- * @note 在调用此函数之前,需要将需要显示的数据写入缓冲区。
- */
-void ssd1306_update_screen(void)
-{
- for (uint8_t i = 0; i < SSD1306_HEIGHT / 8; i++)
- {
- i2c_write_command(0xb0 + i);
- i2c_write_command(0x01);
- i2c_write_command(0x10);
- for (uint8_t j = 0; j < SSD1306_WIDTH; j++)
- {
- i2c_write_data(_buffer[j + i * SSD1306_WIDTH]);
- }
- }
-}
-
-/**
- * @brief 填充整个屏幕为指定颜色
- *
- * 该函数将 SSD1306 OLED 显示屏的每一个像素点都设置为指定的颜色。
- *
- * @param color 颜色值,0x00 表示关闭像素点(黑色),0xFF 表示打开像素点(白色)
- */
-void ssd1306_fill(uint8_t color)
-{
- osel_memset(_buffer, color, ARRAY_LEN(_buffer));
- ssd1306_update_screen();
-}
-
-/**
- * @brief 清空SSD1306显示屏
- *
- * 该函数通过向SSD1306显示屏发送一系列命令来清空显示内容。
- *
- * 首先,通过循环遍历每个页面(SSD1306显示屏有8个页面),
- * 对每个页面执行以下操作:
- * 1. 发送页面地址命令(0xb0 + y),其中y为当前页面索引。
- * 2. 发送列地址低位命令(0x01)。
- * 3. 发送列地址高位命令(0x10),表示从第一列开始。
- * 4. 循环遍历每一列(SSD1306显示屏的宽度),
- * 发送数据0x00以清空该列的内容。
- */
-void ssd1306_clear(void)
-{
- osel_memset(_buffer, 0, ARRAY_LEN(_buffer));
- ssd1306_update_screen();
-}
-
-void ssd1306_clear_buffer(void)
-{
- osel_memset(_buffer, 0, ARRAY_LEN(_buffer));
-}
-
-/**
- * @brief 在指定区域内绘制BMP
- *
- * 在指定坐标区域内绘制一个BMP,使用SSD1306 OLED显示屏
- * ssd1306_draw_bmp(0, 0, SSD1306_WIDTH, 2);
- * @param x0 BMP绘制的起始X坐标
- * @param y0 BMP绘制的起始Y坐标
- * @param x1 BMP绘制的结束X坐标
- * @param y1 BMP绘制的结束Y坐标
- */
-void ssd1306_draw_bmp(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t *bmp)
-{
- uint8_t j = 0;
- uint8_t x, y;
- osel_memset(_buffer, 0, ARRAY_LEN(_buffer));
- if (y1 % 8 == 0)
- y = y1 / 8;
- else
- y = y1 / 8 + 1;
- for (y = y0; y < y1; y++)
- {
- set_position(x0, y);
- for (x = x0; x < x1; x++)
- {
- i2c_write_data(bmp[j++]);
- }
- }
-}
-
-/**
- * @brief 在SSD1306 OLED显示屏上显示字符串
- *
- * 在SSD1306 OLED显示屏上以6x8像素的字体显示给定的字符串。
- *
- * @param x 显示字符串的起始x坐标
- * @param y 显示字符串的起始y坐标
- * @param str 要显示的字符串
- */
-void ssd1306_f6x8_string(uint8_t x, uint8_t y, const uint8_t *ch)
-{
- uint8_t c = 0, i = 0, j = 0;
- while (ch[j] != '\0')
- {
- c = ch[j] - 32;
- if (x > 126)
- {
- x = 0;
- y++;
- }
- for (i = 0; i < 6; i++)
- _buffer[(y * SSD1306_WIDTH) + x + i] = F6x8[c][i];
- x += 6;
- j++;
- }
-}
-
-/**
- * @brief 在SSD1306 OLED屏幕上显示字符串和数字
- *
- * 该函数用于在SSD1306 OLED屏幕上显示字符串和数字。首先显示一个字符串,
- * 然后显示一个浮点数。字符串和数字按照指定的位置和单位显示。
- *
- * @param x 起始位置的x坐标
- * @param y 起始位置的y坐标
- * @param ch 要显示的字符串
- * @param unit 数字的单位,例如'm'表示米
- * @param num 要显示的浮点数
- */
-void ssd1306_f6x8_string_number(uint8_t x, uint8_t y, const uint8_t *ch, uint8_t unit, float32 num)
-{
- uint8_t c = 0, i = 0, j = 0;
- int8_t a, number[7] = {0, 0, 0, -2, 0, 0, 0};
- uint32_t d;
- while (ch[j] != '\0')
- {
- c = ch[j] - 32;
- if (x > 126)
- {
- x = 0;
- y++;
- }
- for (i = 0; i < 6; i++)
- _buffer[(y * SSD1306_WIDTH) + x + i] = F6x8[c][i];
- x += 6;
- j++;
- }
- d = 1000 * num;
- for (a = 0; a < 3; a++)
- {
- number[6 - a] = d % 10;
- d = d / 10;
- }
- for (a = 4; a < 7; a++)
- {
- number[6 - a] = d % 10;
- d = d / 10;
- }
- if (num >= 100)
- {
- a = 0;
- }
- else if (num >= 10)
- {
- a = 1;
- }
- else if (num >= 0)
- {
- a = 2;
- }
- for (; a < 7; a++)
- {
- c = number[a] + 16;
- if (x > 126)
- {
- x = 0;
- y++;
- }
- for (i = 0; i < 6; i++)
- _buffer[(y * SSD1306_WIDTH) + x + i] = F6x8[c][i];
- x += 6;
- j++;
- }
- for (int h = 0; h < 7; h++)
- {
- c = unit - 32;
- for (i = 0; i < 6; i++)
- _buffer[(y * SSD1306_WIDTH) + x + i] = F6x8[c][i];
- }
-}
-
-/**
- * @brief 在SSD1306 OLED显示屏上显示8x16大小的字符串
- *
- * 该函数使用8x16字体在SSD1306 OLED显示屏上显示指定的字符串。字符串的字符位置由x和y参数指定。
- *
- * @param x 显示字符串的起始x坐标
- * @param y 显示字符串的起始y坐标
- * @param str 要显示的字符串
- */
-void ssd1306_f8x16_string(uint8_t x, uint8_t y, const uint8_t *ch)
-{
- uint8_t c = 0, i = 0, j = 0;
- while (ch[j] != '\0')
- {
- c = ch[j] - 32;
- if (x > 120)
- {
- x = 0;
- y++;
- }
- for (i = 0; i < 8; i++)
- _buffer[(y * SSD1306_WIDTH) + x + i] = F8X16[c * 16 + i];
- for (i = 0; i < 8; i++)
- _buffer[((y + 1) * SSD1306_WIDTH) + x + i] = F8X16[c * 16 + i + 8];
- x += 8;
- j++;
- }
-}
-
-/**
- * @brief 在SSD1306 OLED显示屏上以8x16像素字体显示浮点数
- *
- * 在指定的坐标位置 (x, y) 上,使用8x16像素大小的字体显示浮点数 num,并显示指定数量的小数点 dot_num。
- *
- * @param x 显示位置的x坐标
- * @param y 显示位置的y坐标
- * @param num 要显示的浮点数
- * @param dot_num 要显示的小数点数量
- */
-void ssd1306_f8x16_number(uint8_t x, uint8_t y, float32 num, uint8_t dot_num)
-{
- uint8_t ch[9] = {'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'};
- uint8_t c = 0, i = 0, j = 0;
- if (num < 0)
- {
- ch[i++] = '-';
- num = -num;
- }
- if (num > 32000)
- return;
-
- c = 8 - i;
-
- if (num >= 10000)
- {
- ch[i++] = num / 10000 + 48;
- ch[i++] = (int32_t)(num) % 10000 / 1000 + 48;
- ch[i++] = (int32_t)(num) % 1000 / 100 + 48;
- ch[i++] = (int32_t)(num) % 100 / 10 + 48;
- ch[i++] = (int32_t)(num) % 10 + 48;
- }
- else if (num >= 1000)
- {
- ch[i++] = (int32_t)(num) % 10000 / 1000 + 48;
- ch[i++] = (int32_t)(num) % 1000 / 100 + 48;
- ch[i++] = (int32_t)(num) % 100 / 10 + 48;
- ch[i++] = (int32_t)(num) % 10 + 48;
- }
- else if (num >= 100)
- {
- ch[i++] = (int32_t)(num) % 1000 / 100 + 48;
- ch[i++] = (int32_t)(num) % 100 / 10 + 48;
- ch[i++] = (int32_t)(num) % 10 + 48;
- }
- else if (num >= 10)
- {
- ch[i++] = (int32_t)(num) % 100 / 10 + 48;
- ch[i++] = (int32_t)(num) % 10 + 48;
- }
- else if (num >= 0)
- {
- ch[i++] = (int32_t)(num) % 10 + 48;
- }
- if (dot_num > 0 && i < 7)
- {
- ch[i++] = '.';
- num = num - (int32_t)num;
-
- if (dot_num == 1 && i < 8)
- {
- num = num * 10;
- ch[i++] = (int32_t)(num + 0.5) % 10 + 48;
- }
- if (dot_num >= 2 && i < 8)
- {
- num = num * 100;
- ch[i++] = (int32_t)num % 100 / 10 + 48;
- if (i < 8)
- ch[i++] = (int32_t)(num + 0.5) % 10 + 48;
- }
- }
-
- while (ch[j] != '\0')
- {
- c = ch[j] - 32;
- if (x > 120)
- {
- x = 0;
- y++;
- }
- for (i = 0; i < 8; i++)
- _buffer[(y * SSD1306_WIDTH) + x + i] = F8X16[c * 16 + i];
- for (i = 0; i < 8; i++)
- _buffer[((y + 1) * SSD1306_WIDTH) + x + i] = F8X16[c * 16 + i + 8];
- x += 8;
- j++;
- }
-}
diff --git a/User/lib/driver/ssd1306_oled.h b/User/lib/driver/ssd1306_oled.h
deleted file mode 100644
index 013ea30..0000000
--- a/User/lib/driver/ssd1306_oled.h
+++ /dev/null
@@ -1,68 +0,0 @@
-#ifndef __SSD1306_OLED_H
-#define __SSD1306_OLED_H
-
-#include "main.h"
-
-// OLED引脚定义
-#define SSD1306_SDA_PORT OLED_SDA_GPIO_Port
-#define SSD1306_SDA_PIN OLED_SDA_Pin
-#define SSD1306_SCK_PORT OLDE_SCK_GPIO_Port
-#define SSD1306_SCK_PIN OLDE_SCK_Pin
-
-// I2C地址
-#define SSD1306_I2C_ADDRESS 0x78
-// OLED显示参数
-#define SSD1306_WIDTH 128
-#define SSD1306_HEIGHT 64
-
-// OLED命令定义
-#define SSD1306_CMD_DISPLAY_OFF 0xAE
-#define SSD1306_CMD_DISPLAY_ON 0xAF
-#define SSD1306_CMD_SET_CONTRAST 0x81
-#define SSD1306_CMD_DISPLAY_ALL_ON_RESUME 0xA4
-#define SSD1306_CMD_DISPLAY_ALL_ON 0xA5
-#define SSD1306_CMD_NORMAL_DISPLAY 0xA6
-#define SSD1306_CMD_INVERT_DISPLAY 0xA7
-#define SSD1306_CMD_SET_DISPLAY_OFFSET 0xD3
-#define SSD1306_CMD_SET_COM_PINS 0xDA
-#define SSD1306_CMD_SET_VCOM_DETECT 0xDB
-#define SSD1306_CMD_SET_DISPLAY_CLOCK_DIV 0xD5
-#define SSD1306_CMD_SET_PRECHARGE 0xD9
-#define SSD1306_CMD_SET_MULTIPLEX 0xA8
-#define SSD1306_CMD_SET_LOW_COLUMN 0x00
-#define SSD1306_CMD_SET_HIGH_COLUMN 0x10
-#define SSD1306_CMD_SET_START_LINE 0x40
-#define SSD1306_CMD_MEMORY_MODE 0x20
-#define SSD1306_CMD_COLUMN_ADDR 0x21
-#define SSD1306_CMD_PAGE_ADDR 0x22
-#define SSD1306_CMD_COM_SCAN_INC 0xC0
-#define SSD1306_CMD_COM_SCAN_DEC 0xC8
-#define SSD1306_CMD_SEG_REMAP 0xA0
-#define SSD1306_CMD_CHARGE_PUMP 0x8D
-#define SSD1306_CMD_SET_DC_DC_ENABLE 0x14
-
-#define SDA_OUT() \
- { \
- GPIO_SET_OUTPUT(SSD1306_SDA_PORT, SSD1306_SDA_PIN); \
- }
-
-#define SDA_IN() \
- { \
- GPIO_SET_INPUT(SSD1306_SDA_PORT, SSD1306_SDA_PIN); \
- }
-
-// 函数声明
-void ssd1306_init(void);
-void ssd1306_display_on(void);
-void ssd1306_display_off(void);
-void ssd1306_update_screen(void);
-
-void ssd1306_fill(uint8_t color);
-void ssd1306_clear(void);
-void ssd1306_clear_buffer(void);
-void ssd1306_draw_bmp(uint8_t x0, uint8_t y0, uint8_t x1, uint8_t y1, uint8_t *bmp);
-void ssd1306_f6x8_string(uint8_t x, uint8_t y, const uint8_t *ch);
-void ssd1306_f6x8_string_number(uint8_t x, uint8_t y, const uint8_t *ch, uint8_t unit, float32 num);
-void ssd1306_f8x16_string(uint8_t x, uint8_t y, const uint8_t *ch);
-void ssd1306_f8x16_number(uint8_t x, uint8_t y, float32 num, uint8_t dot_num);
-#endif // __SSD1306_OLED_H
diff --git a/User/lib/flow/.vscode/c_cpp_properties.json b/User/system/.vscode/c_cpp_properties.json
similarity index 100%
rename from User/lib/flow/.vscode/c_cpp_properties.json
rename to User/system/.vscode/c_cpp_properties.json
diff --git a/User/lib/flow/.vscode/launch.json b/User/system/.vscode/launch.json
similarity index 74%
rename from User/lib/flow/.vscode/launch.json
rename to User/system/.vscode/launch.json
index da1e2e9..c6a9069 100644
--- a/User/lib/flow/.vscode/launch.json
+++ b/User/system/.vscode/launch.json
@@ -8,8 +8,8 @@
"args": [],
"stopAtEntry": false,
"externalConsole": true,
- "cwd": "e:/work/stm32/epm/User/lib/flow",
- "program": "e:/work/stm32/epm/User/lib/flow/build/Debug/outDebug",
+ "cwd": "e:/work/stm32/study/motor_cs103/User/system/lib/driver",
+ "program": "e:/work/stm32/study/motor_cs103/User/system/lib/driver/build/Debug/outDebug",
"MIMode": "gdb",
"miDebuggerPath": "gdb",
"setupCommands": [
diff --git a/User/lib/flow/.vscode/settings.json b/User/system/.vscode/settings.json
similarity index 86%
rename from User/lib/flow/.vscode/settings.json
rename to User/system/.vscode/settings.json
index 104d25b..fd17536 100644
--- a/User/lib/flow/.vscode/settings.json
+++ b/User/system/.vscode/settings.json
@@ -4,7 +4,7 @@
"C_Cpp_Runner.debuggerPath": "gdb",
"C_Cpp_Runner.cStandard": "",
"C_Cpp_Runner.cppStandard": "",
- "C_Cpp_Runner.msvcBatchPath": "C:/Program Files/Microsoft Visual Studio/2022/Community/VC/Auxiliary/Build/vcvarsall.bat",
+ "C_Cpp_Runner.msvcBatchPath": "C:/Program Files/Microsoft Visual Studio/VR_NR/Community/VC/Auxiliary/Build/vcvarsall.bat",
"C_Cpp_Runner.useMsvc": false,
"C_Cpp_Runner.warnings": [
"-Wall",
@@ -54,5 +54,7 @@
"C_Cpp_Runner.useUndefinedSanitizer": false,
"C_Cpp_Runner.useLeakSanitizer": false,
"C_Cpp_Runner.showCompilationTime": false,
- "C_Cpp_Runner.useLinkTimeOptimization": false
+ "C_Cpp_Runner.useLinkTimeOptimization": false,
+ "C_Cpp_Runner.msvcSecureNoWarnings": false,
+ "C_Cpp.errorSquiggles": "disabled"
}
\ No newline at end of file
diff --git a/User/system/bsp/bsp.c b/User/system/bsp/bsp.c
index 9e4ffee..5f3ec09 100644
--- a/User/system/bsp/bsp.c
+++ b/User/system/bsp/bsp.c
@@ -65,27 +65,27 @@ void pvd_irq_handle(void)
*/
void disable_debug_interface(void)
{
-// // 使能 SYSCFG 时钟
-// LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SYSCFG);
+ // // 使能 SYSCFG 时钟
+ // LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_SYSCFG);
-// // 关闭调试接口
-// LL_DBGMCU_DisableDBGStopMode();
-// LL_DBGMCU_DisableDBGStandbyMode();
-// LL_DBGMCU_DisableDBGSleepMode();
+ // // 关闭调试接口
+ // LL_DBGMCU_DisableDBGStopMode();
+ // LL_DBGMCU_DisableDBGStandbyMode();
+ // LL_DBGMCU_DisableDBGSleepMode();
-// // 关闭 SWD 和 JTAG 接口
-// LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
+ // // 关闭 SWD 和 JTAG 接口
+ // LL_GPIO_InitTypeDef GPIO_InitStruct = {0};
-// // 配置 SWDIO (PA13) 和 SWCLK (PA14) 引脚为普通 GPIO
-// GPIO_InitStruct.Pin = LL_GPIO_PIN_13 | LL_GPIO_PIN_14;
-// GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
-// GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
-// LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+ // // 配置 SWDIO (PA13) 和 SWCLK (PA14) 引脚为普通 GPIO
+ // GPIO_InitStruct.Pin = LL_GPIO_PIN_13 | LL_GPIO_PIN_14;
+ // GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG;
+ // GPIO_InitStruct.Pull = LL_GPIO_PULL_NO;
+ // LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
-// // 如果使用的是 JTAG 接口,还需要配置 JTDI (PA15), JTDO (PB3), 和 NJTRST (PB4) 引脚
-// GPIO_InitStruct.Pin = LL_GPIO_PIN_15;
-// LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
+ // // 如果使用的是 JTAG 接口,还需要配置 JTDI (PA15), JTDO (PB3), 和 NJTRST (PB4) 引脚
+ // GPIO_InitStruct.Pin = LL_GPIO_PIN_15;
+ // LL_GPIO_Init(GPIOA, &GPIO_InitStruct);
-// GPIO_InitStruct.Pin = LL_GPIO_PIN_3 | LL_GPIO_PIN_4;
-// LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+ // GPIO_InitStruct.Pin = LL_GPIO_PIN_3 | LL_GPIO_PIN_4;
+ // LL_GPIO_Init(GPIOB, &GPIO_InitStruct);
}
diff --git a/User/system/bsp/bsp.h b/User/system/bsp/bsp.h
index ed883f2..5fd5f9a 100644
--- a/User/system/bsp/bsp.h
+++ b/User/system/bsp/bsp.h
@@ -11,14 +11,14 @@
*/
#ifndef __BSP_H__
#define __BSP_H__
+#include "dma.h"
#include "gpios.h"
#include "adcs.h"
// #include "dacs.h"
-// #include "dmas.h"
#include "tims.h"
// #include "pwms.h"
-// #include "uarts.h"
+#include "uarts.h"
// #include "eeprom.h"
// #include "spis.h"
// #include "i2cs.h"
@@ -29,4 +29,5 @@ typedef void (*pvd_irq_handle_cb)(void);
extern void pvd_configuration(uint32_t pwr_level, pvd_irq_handle_cb call); ///< Configures the Programmable Voltage Detector (PVD) module
extern void pvd_irq_handle(void); ///< Handles the PVD interrupt
extern void disable_debug_interface(void); ///< Disables the debug interface
-#endif ///< __BSP_H__
+
+#endif ///< __BSP_H__
diff --git a/User/system/bsp/dmas.h b/User/system/bsp/dmas.h
index 6ef1a61..2ce0399 100644
--- a/User/system/bsp/dmas.h
+++ b/User/system/bsp/dmas.h
@@ -1,5 +1,5 @@
-#ifndef __DMAS_H__
-#define __DMAS_H__
+#ifndef __DMA_H__
+#define __DMA_H__
/**
* @brief 清除DMA传输完成标志
@@ -132,4 +132,4 @@
} \
} while (__LINE__ == -1)
-#endif // __DMAS_H__
+#endif // __DMA_H__
diff --git a/User/system/bsp/gpios.c b/User/system/bsp/gpios.c
index 38abf89..cb59b80 100644
--- a/User/system/bsp/gpios.c
+++ b/User/system/bsp/gpios.c
@@ -44,11 +44,11 @@ static uint8_t _read(gpio_t gpio)
/**
* @brief 创建GPIO对象
* @param {GPIO_TypeDef} *port - GPIO寄存器指针
- * @param {uint32_t} pin - 引脚号
+ * @param {uint16_t} pin - 引脚号
* @return {gpio_t *} - 创建的GPIO对象指针
* @note: 用于创建一个GPIO对象,用于操作特定端口和引脚的GPIO功能。
*/
-gpio_t *gpio_create(GPIO_TypeDef *port, uint32_t pin)
+gpio_t *gpio_create(GPIO_TypeDef *port, uint16_t pin)
{
gpio_t *gpio = (gpio_t *)osel_mem_alloc(sizeof(gpio_t));
DBG_ASSERT(gpio != NULL __DBG_LINE);
diff --git a/User/system/bsp/gpios.h b/User/system/bsp/gpios.h
index c7ca144..35b86fc 100644
--- a/User/system/bsp/gpios.h
+++ b/User/system/bsp/gpios.h
@@ -93,7 +93,7 @@
typedef struct GPIO
{
GPIO_TypeDef *port; ///< The GPIO port.
- uint32_t pin; ///< The GPIO pin.
+ uint16_t pin; ///< The GPIO pin.
/**
* @brief Set the GPIO pin to high.
@@ -132,7 +132,7 @@ typedef struct GPIO
* @param pin The GPIO pin.
* @return The created GPIO pin.
*/
-extern gpio_t *gpio_create(GPIO_TypeDef *port, uint32_t pin);
+extern gpio_t *gpio_create(GPIO_TypeDef *port, uint16_t pin);
/**
* @brief Free the memory allocated for a GPIO pin.
diff --git a/User/system/bsp/pwms.c b/User/system/bsp/pwms.c
deleted file mode 100644
index b8a1bea..0000000
--- a/User/system/bsp/pwms.c
+++ /dev/null
@@ -1 +0,0 @@
-#include "pwms.h"
diff --git a/User/system/bsp/pwms.h b/User/system/bsp/pwms.h
index ce04409..5946032 100644
--- a/User/system/bsp/pwms.h
+++ b/User/system/bsp/pwms.h
@@ -39,9 +39,6 @@
LL_TIM_CC_DisableChannel(TIMx, CHx); \
} while (__LINE__ == -1)
-#define PWM_GET_ARR(TIMx) LL_TIM_GetAutoReload(TIMx)
-#define PWM_GET_PSC(TIMx) LL_TIM_GetPrescaler(TIMx)
-
/**
* @brief Sets the PWM frequency
* @param TIMx: TIM instance
@@ -90,30 +87,4 @@ static inline uint32_t PWM_GET_FREQ(TIM_TypeDef *TIMx)
return SystemCoreClock / (LL_TIM_GetPrescaler(TIMx) + 1) / (LL_TIM_GetAutoReload(TIMx) + 1);
}
-/**
- * @brief 获取指定通道的PWM比较值
- *
- * 根据给定的定时器指针和通道编号,获取该通道的PWM比较值。
- *
- * @param TIMx 定时器指针,指向一个TIM_TypeDef结构体
- * @param CHx 通道编号,取值范围为LL_TIM_CHANNEL_CH1到LL_TIM_CHANNEL_CH4
- *
- * @return 返回一个uint16_t类型的值,表示指定通道的PWM比较值。如果通道编号无效,则返回0。
- */
-static inline uint16_t PWM_GET_COMPARE(TIM_TypeDef *TIMx, uint32_t CHx)
-{
- switch (CHx)
- {
- case LL_TIM_CHANNEL_CH1:
- return LL_TIM_OC_GetCompareCH1(TIMx);
- case LL_TIM_CHANNEL_CH2:
- return LL_TIM_OC_GetCompareCH2(TIMx);
- case LL_TIM_CHANNEL_CH3:
- return LL_TIM_OC_GetCompareCH3(TIMx);
- case LL_TIM_CHANNEL_CH4:
- return LL_TIM_OC_GetCompareCH4(TIMx);
- default:
- return 0;
- }
-}
#endif ///< __PWMS_H__
diff --git a/User/system/bsp/tims.h b/User/system/bsp/tims.h
index 71d3c63..3dcfb32 100644
--- a/User/system/bsp/tims.h
+++ b/User/system/bsp/tims.h
@@ -19,6 +19,19 @@ Given Tclk as 84MHz, we need Tout to be 200ms or 200000us. Let's assume PSC is 8
With these calculated values, both ARR and PSC are within the range of 0 to 65535, so we can use this parameter set.
*/
+#define ENABLE_TIM_COUNT(TIMx) \
+ do \
+ { \
+ LL_TIM_EnableCounter(TIMx); \
+ } while (__LINE__ == -1);
+
+#define RESET_TIM_COUNT(TIMx) \
+ do \
+ { \
+ LL_TIM_DisableCounter(TIMx); \
+ LL_TIM_SetCounter(TIMx, 0); \
+ LL_TIM_EnableCounter(TIMx); \
+ } while (__LINE__ == -1);
/**
* @brief Enables the specified TIMx.
* @param TIMx TIM instance.
@@ -112,5 +125,4 @@ With these calculated values, both ARR and PSC are within the range of 0 to 6553
* @return 返回定时器周期时间(单位:毫秒)
*/
#define TIM_CYCLE(TIMx) ((LL_TIM_GetAutoReload(TIMx) + 1) * 0.1)
-
#endif ///< __TIMS_H__
diff --git a/User/system/bsp/uarts.c b/User/system/bsp/uarts.c
index 7868a74..4502714 100644
--- a/User/system/bsp/uarts.c
+++ b/User/system/bsp/uarts.c
@@ -104,7 +104,7 @@ void uart_recv_en(uart_t *uart, BOOL rx_err_en)
LL_DMA_DisableChannel(uart->dma, uart->dma_rx_channel);
// 配置RX DMA
- LL_DMA_SetPeriphAddress(uart->dma, uart->dma_rx_channel, LL_USART_DMA_GetRegAddr(uart->huart));
+ LL_DMA_SetPeriphAddress(uart->dma, uart->dma_rx_channel, LL_USART_DMA_GetRegAddr(uart->huart, LL_USART_DMA_REG_DATA_RECEIVE));
LL_DMA_SetMemoryAddress(uart->dma, uart->dma_rx_channel, (uint32_t)uart->rxbuf);
LL_DMA_SetDataLength(uart->dma, uart->dma_rx_channel, uart->rxsize);
LL_DMA_EnableIT_TC(uart->dma, uart->dma_rx_channel);
@@ -113,7 +113,7 @@ void uart_recv_en(uart_t *uart, BOOL rx_err_en)
LL_USART_EnableIT_IDLE(uart->huart);
// 配置TX DMA
- LL_DMA_SetPeriphAddress(uart->dma, uart->dma_tx_channel, LL_USART_DMA_GetRegAddr(uart->huart));
+ LL_DMA_SetPeriphAddress(uart->dma, uart->dma_tx_channel, LL_USART_DMA_GetRegAddr(uart->huart, LL_USART_DMA_REG_DATA_TRANSMIT));
// 配置内存地址
LL_DMA_SetMemoryAddress(uart->dma, uart->dma_tx_channel, (uint32_t)uart->txbuf);
LL_DMA_EnableIT_TC(uart->dma, uart->dma_tx_channel);
@@ -178,7 +178,7 @@ void uart_free(uart_t *uart)
*/
void uart_set_baudrate(USART_TypeDef *uart, uint32_t baudrate)
{
- LL_USART_SetBaudRate(uart, SystemCoreClock, LL_USART_OVERSAMPLING_16);
+ LL_USART_SetBaudRate(uart, SystemCoreClock, LL_USART_OVERSAMPLING_16, baudrate);
}
/**
diff --git a/User/system/src/btn.c b/User/system/btn.c
similarity index 99%
rename from User/system/src/btn.c
rename to User/system/btn.c
index a07c22d..454845f 100644
--- a/User/system/src/btn.c
+++ b/User/system/btn.c
@@ -8,7 +8,7 @@
* Copyright (c) 2023 by xxx, All Rights Reserved.
*/
-#include "../inc/btn.h"
+#include "btn.h"
#define EVENT_CB(ev) \
if (handle->cb[ev]) \
diff --git a/User/system/inc/btn.h b/User/system/btn.h
similarity index 96%
rename from User/system/inc/btn.h
rename to User/system/btn.h
index a92e576..c78b8bb 100644
--- a/User/system/inc/btn.h
+++ b/User/system/btn.h
@@ -47,8 +47,8 @@ while(1) {
// 根据您的需求修改常量。
#define TICKS_INTERVAL 10 // 按钮扫描间隔,单位ms
-#define DEBOUNCE_TICKS 30 / TICKS_INTERVAL // 按键去抖动时间,单位ms
-#define SHORT_TICKS (30 / TICKS_INTERVAL) // 短按时间阈值,单位ms
+#define DEBOUNCE_TICKS 20 / TICKS_INTERVAL // 按键去抖动时间,单位ms
+#define SHORT_TICKS (100 / TICKS_INTERVAL) // 短按时间阈值,单位ms
#define LONG_TICKS (500 / TICKS_INTERVAL) // 长按时间阈值,单位ms
typedef void (*BtnCallback)(void *);
diff --git a/User/system/src/delay.c b/User/system/delay.c
similarity index 95%
rename from User/system/src/delay.c
rename to User/system/delay.c
index e39df7d..bd6cd96 100644
--- a/User/system/src/delay.c
+++ b/User/system/delay.c
@@ -9,6 +9,7 @@
*/
#include "delay.h"
+
// static uint16_t g_fac_ms = 0; // ms延时倍乘数,在os下,代表每个节拍的ms数
static uint32_t g_fac_us = 0; /* us延时倍乘数 */
@@ -79,6 +80,13 @@ void delay_us(uint32_t nus)
}
}
+void delay_hardware_us(TIM_TypeDef *timer_us, uint32_t us)
+{
+ RESET_TIM_COUNT(timer_us);
+ while (LL_TIM_GetCounter(timer_us) < us)
+ ; // 等待计数器达到指定值
+}
+
/**
* @brief 延时nms
* @param nms: 要延时的ms数 (0< nms <= 65535)
diff --git a/User/system/delay.h b/User/system/delay.h
new file mode 100644
index 0000000..43d19eb
--- /dev/null
+++ b/User/system/delay.h
@@ -0,0 +1,23 @@
+/***
+ * @Author:
+ * @Date: 2023-04-11 18:31:07
+ * @LastEditors: xxx
+ * @LastEditTime: 2023-04-11 18:31:20
+ * @Description:
+ * @email:
+ * @Copyright (c) 2023 by xxx, All Rights Reserved.
+ */
+
+#ifndef __DELAY_H
+#define __DELAY_H
+
+#include "sys.h"
+#include "tims.h"
+
+void delay_init(uint16_t sysclk); /* 初始化延迟函数 */
+void delay_ms(uint16_t nms); /* 延时nms */
+void delay_us(uint32_t nus); /* 延时nus */
+void delay_hardware_us(TIM_TypeDef *timer_us, uint32_t us); /* 硬件延时nus */
+void delay_tick(uint32_t ticks); /* 延时ticks */
+
+#endif
diff --git a/User/lib/driver/dac161p997.c b/User/system/driver/dac161p997.c
similarity index 76%
rename from User/lib/driver/dac161p997.c
rename to User/system/driver/dac161p997.c
index 015b829..e7e8e79 100644
--- a/User/lib/driver/dac161p997.c
+++ b/User/system/driver/dac161p997.c
@@ -1,30 +1,34 @@
#include "dac161p997.h"
#include "delay.h"
-
static dac161p997_t _handle;
+static void _delay_us(uint32_t us)
+{
+ delay_hardware_us(_handle.timer_us, us);
+}
+
static void dac161p997_output_0()
{
_handle.io->set(*_handle.io);
- delay_us(DUTY_CYCLE_25);
+ _delay_us(DUTY_CYCLE_25);
_handle.io->reset(*_handle.io);
- delay_us(DUTY_CYCLE_75);
+ _delay_us(DUTY_CYCLE_75);
}
static void dac161p997_output_1()
{
_handle.io->set(*_handle.io);
- delay_us(DUTY_CYCLE_75);
+ _delay_us(DUTY_CYCLE_75);
_handle.io->reset(*_handle.io);
- delay_us(DUTY_CYCLE_25);
+ _delay_us(DUTY_CYCLE_25);
}
static void dac161p997_output_d()
{
_handle.io->set(*_handle.io);
- delay_us(DUTY_CYCLE_50);
+ _delay_us(DUTY_CYCLE_50);
_handle.io->reset(*_handle.io);
- delay_us(DUTY_CYCLE_50);
+ _delay_us(DUTY_CYCLE_50);
}
/**
@@ -124,17 +128,8 @@ void dac161p997_swif_write_reg(uint16_t data, uint8_t tag)
*/
void dac161p997_output_current(float32 current)
{
- uint8_t adc = (uint16_t)(current * DAC161P997_CURRENT_SLOPE) >> 8;
- static uint8_t last_adc;
- if (adc == last_adc)
- {
- last_adc = adc;
- return;
- }
-
- dac161p997_swif_write_reg(DAC161P997_LCK_REG_UNLOCK, CONFIG_WRITE);
- dac161p997_swif_write_reg(DAC161P997_ERR_LOW_REG + adc, CONFIG_WRITE);
- dac161p997_swif_write_reg(DAC161P997_LCK_REG_LOCK, CONFIG_WRITE);
+ uint16_t adc = (uint16_t)(current * DAC161P997_CURRENT_SLOPE);
+ dac161p997_swif_write_reg(adc, DACCODE_WRITE);
}
/**
@@ -147,15 +142,13 @@ void dac161p997_output_current(float32 current)
* 2. 配置DAC161的错误下限寄存器
* 3. 锁定DAC161的配置寄存器
*/
-void dac161p997_init()
+void dac161p997_init(TIM_TypeDef *timer_us)
{
+ DBG_ASSERT(timer_us != NULL __DBG_LINE);
+ _handle.timer_us = timer_us;
+ ENABLE_TIM_COUNT(_handle.timer_us);
_handle.io = gpio_create(DAC161P997_IO_PORT, DAC161P997_IO_PIN);
- dac161p997_swif_write_reg(DAC161P997_LCK_REG_UNLOCK, CONFIG_WRITE);
- dac161p997_swif_write_reg(DAC161P997_CONFIG2_REG +
- DAC161P997_CONFIG2_REG_LOOP +
- DAC161P997_CONFIG2_REG_CHANNEL +
- DAC161P997_CONFIG2_REG_PARITY +
- DAC161P997_CONFIG2_REG_FRAME,
- CONFIG_WRITE);
- dac161p997_swif_write_reg(DAC161P997_LCK_REG_LOCK, CONFIG_WRITE);
+ dac161p997_swif_write_reg(DAC161P997_LCK_REG + DAC161P997_LCK_REG_UNLOCK, CONFIG_WRITE);
+ dac161p997_swif_write_reg(DAC161P997_CONFIG2_REG, CONFIG_WRITE);
+ dac161p997_swif_write_reg(DAC161P997_LCK_REG + DAC161P997_LCK_REG_LOCK, CONFIG_WRITE);
}
diff --git a/User/lib/driver/dac161p997.h b/User/system/driver/dac161p997.h
similarity index 93%
rename from User/lib/driver/dac161p997.h
rename to User/system/driver/dac161p997.h
index 5c53d0b..9c480c7 100644
--- a/User/lib/driver/dac161p997.h
+++ b/User/system/driver/dac161p997.h
@@ -60,15 +60,16 @@
#define DACCODE_20mA (0xD555)
#define DACCODE_24mA (0xFFFF)
-// cycles
-// #define QUARTER_CYCLES (625)
-// #define HALF_CYCLES (1250)
-// #define THREE_CYCLES (1875)
-// #define FULL_CYCLES (2500)
+typedef enum
+{
+ DAC161P997_IDLE_SYM,
+} dac161p997_e;
typedef struct
{
+ TIM_TypeDef *timer_us;
gpio_t *io;
+ uint8_t count;
} dac161p997_t;
void dac161p997_output_0(void);
@@ -76,6 +77,7 @@ void dac161p997_output_1(void);
void dac161p997_output_d(void);
void dac161p997_output_symbol(uint8_t sym);
void dac161p997_swif_write_reg(uint16_t data, uint8_t tag);
+
extern void dac161p997_output_current(float32 current);
-extern void dac161p997_init(void);
+extern void dac161p997_init(TIM_TypeDef *timer_us);
#endif
diff --git a/User/lib/driver/eeprom_fm24.c b/User/system/driver/eeprom_fm24.c
similarity index 100%
rename from User/lib/driver/eeprom_fm24.c
rename to User/system/driver/eeprom_fm24.c
diff --git a/User/lib/driver/eeprom_fm24.h b/User/system/driver/eeprom_fm24.h
similarity index 100%
rename from User/lib/driver/eeprom_fm24.h
rename to User/system/driver/eeprom_fm24.h
diff --git a/User/lib/driver/eeprom_lc02b.c b/User/system/driver/eeprom_lc02b.c
similarity index 54%
rename from User/lib/driver/eeprom_lc02b.c
rename to User/system/driver/eeprom_lc02b.c
index 6608ce4..de090e6 100644
--- a/User/lib/driver/eeprom_lc02b.c
+++ b/User/system/driver/eeprom_lc02b.c
@@ -11,7 +11,20 @@
#define EEPROM_LC02B_SCL_PORT I2C1_SCL_GPIO_Port
#define EEPROM_LC02B_SCL_PIN I2C1_SCL_Pin
-static i2c_t *eeprom_24lc028bt_i2c;
+static i2c_t *_eeprom_24lc028bt_i2c;
+static TIM_TypeDef *_timer_us;
+
+static void _delay_us(uint32_t us)
+{
+ if (_timer_us != NULL)
+ {
+ delay_hardware_us(_timer_us, us);
+ }
+ else
+ {
+ delay_us(us);
+ }
+}
void eeprom_lc02b_test(void)
{
@@ -24,7 +37,7 @@ void eeprom_lc02b_test(void)
}
eeprom_lc02b_write(test_address, buf, TEST_SIZE);
- LL_mDelay(10);
+ _delay_us(10000);
osel_memset(buf, 0, ARRAY_LEN(buf));
eeprom_lc02b_read(test_address, buf, TEST_SIZE);
@@ -49,13 +62,19 @@ BOOL eeprom_lc02b_status_get(void)
* @return {*}
* @note
*/
-void eeprom_lc02b_init(void)
+void eeprom_lc02b_init(TIM_TypeDef *timer_us)
{
+ if (timer_us != NULL)
+ {
+ _timer_us = timer_us;
+ ENABLE_TIM_COUNT(_timer_us);
+ }
+
i2c_gpio_group_t gpios;
gpios.scl = gpio_create(EEPROM_LC02B_SCL_PORT, EEPROM_LC02B_SCL_PIN);
gpios.sda = gpio_create(EEPROM_LC02B_SDA_PORT, EEPROM_LC02B_SDA_PIN);
- eeprom_24lc028bt_i2c = i2c_create(gpios, 10);
+ _eeprom_24lc028bt_i2c = i2c_create(gpios, 10);
// eeprom_lc02b_test();
}
@@ -80,37 +99,37 @@ void eeprom_lc02b_dinit(void)
void eeprom_lc02b_write(uint32_t write_addr, uint8_t *data, uint16_t length)
{
// 发送开始信号
- eeprom_24lc028bt_i2c->interface.start(eeprom_24lc028bt_i2c);
+ _eeprom_24lc028bt_i2c->interface.start(_eeprom_24lc028bt_i2c);
// 发送写入地址命令
- eeprom_24lc028bt_i2c->interface.write_byte(eeprom_24lc028bt_i2c, W_ADD_COM);
+ _eeprom_24lc028bt_i2c->interface.write_byte(_eeprom_24lc028bt_i2c, W_ADD_COM);
// 等待写入地址命令响应
- eeprom_24lc028bt_i2c->interface.wait_ack(eeprom_24lc028bt_i2c);
+ _eeprom_24lc028bt_i2c->interface.wait_ack(_eeprom_24lc028bt_i2c);
// 发送要写入的地址
- eeprom_24lc028bt_i2c->interface.write_byte(eeprom_24lc028bt_i2c, (uint8_t)write_addr);
- eeprom_24lc028bt_i2c->interface.wait_ack(eeprom_24lc028bt_i2c);
+ _eeprom_24lc028bt_i2c->interface.write_byte(_eeprom_24lc028bt_i2c, (uint8_t)write_addr);
+ _eeprom_24lc028bt_i2c->interface.wait_ack(_eeprom_24lc028bt_i2c);
// 循环写入数据
for (uint16_t i = 0; i < length; i++)
{
// 写入一个字节数据
- eeprom_24lc028bt_i2c->interface.write_byte(eeprom_24lc028bt_i2c, *data++);
+ _eeprom_24lc028bt_i2c->interface.write_byte(_eeprom_24lc028bt_i2c, *data++);
// 等待响应
- eeprom_24lc028bt_i2c->interface.wait_ack(eeprom_24lc028bt_i2c);
+ _eeprom_24lc028bt_i2c->interface.wait_ack(_eeprom_24lc028bt_i2c);
write_addr++;
if (write_addr % PAGE_SIZE == 0)
{
- eeprom_24lc028bt_i2c->interface.stop(eeprom_24lc028bt_i2c);
- LL_mDelay(10); // 延时10ms,等待写入完成
- eeprom_24lc028bt_i2c->interface.start(eeprom_24lc028bt_i2c);
- eeprom_24lc028bt_i2c->interface.write_byte(eeprom_24lc028bt_i2c, W_ADD_COM);
- eeprom_24lc028bt_i2c->interface.wait_ack(eeprom_24lc028bt_i2c);
- eeprom_24lc028bt_i2c->interface.write_byte(eeprom_24lc028bt_i2c, (uint8_t)write_addr);
- eeprom_24lc028bt_i2c->interface.wait_ack(eeprom_24lc028bt_i2c);
+ _eeprom_24lc028bt_i2c->interface.stop(_eeprom_24lc028bt_i2c);
+ _delay_us(10000); // 延时10ms,等待写入完成
+ _eeprom_24lc028bt_i2c->interface.start(_eeprom_24lc028bt_i2c);
+ _eeprom_24lc028bt_i2c->interface.write_byte(_eeprom_24lc028bt_i2c, W_ADD_COM);
+ _eeprom_24lc028bt_i2c->interface.wait_ack(_eeprom_24lc028bt_i2c);
+ _eeprom_24lc028bt_i2c->interface.write_byte(_eeprom_24lc028bt_i2c, (uint8_t)write_addr);
+ _eeprom_24lc028bt_i2c->interface.wait_ack(_eeprom_24lc028bt_i2c);
}
}
// 写入完成,停止I2C总线
- eeprom_24lc028bt_i2c->interface.stop(eeprom_24lc028bt_i2c);
+ _eeprom_24lc028bt_i2c->interface.stop(_eeprom_24lc028bt_i2c);
}
/**
@@ -124,29 +143,29 @@ void eeprom_lc02b_write(uint32_t write_addr, uint8_t *data, uint16_t length)
void eeprom_lc02b_read(uint32_t read_addr, uint8_t *data, uint16_t length)
{
// 发送开始信号
- eeprom_24lc028bt_i2c->interface.start(eeprom_24lc028bt_i2c);
+ _eeprom_24lc028bt_i2c->interface.start(_eeprom_24lc028bt_i2c);
// 发送写入地址命令
- eeprom_24lc028bt_i2c->interface.write_byte(eeprom_24lc028bt_i2c, W_ADD_COM);
+ _eeprom_24lc028bt_i2c->interface.write_byte(_eeprom_24lc028bt_i2c, W_ADD_COM);
// 等待写入地址命令响应
- eeprom_24lc028bt_i2c->interface.wait_ack(eeprom_24lc028bt_i2c);
+ _eeprom_24lc028bt_i2c->interface.wait_ack(_eeprom_24lc028bt_i2c);
// 发送要读取的地址
- eeprom_24lc028bt_i2c->interface.write_byte(eeprom_24lc028bt_i2c, (uint8_t)read_addr);
- eeprom_24lc028bt_i2c->interface.wait_ack(eeprom_24lc028bt_i2c);
+ _eeprom_24lc028bt_i2c->interface.write_byte(_eeprom_24lc028bt_i2c, (uint8_t)read_addr);
+ _eeprom_24lc028bt_i2c->interface.wait_ack(_eeprom_24lc028bt_i2c);
// 发送开始信号
- eeprom_24lc028bt_i2c->interface.start(eeprom_24lc028bt_i2c);
+ _eeprom_24lc028bt_i2c->interface.start(_eeprom_24lc028bt_i2c);
// 发送读取地址命令
- eeprom_24lc028bt_i2c->interface.write_byte(eeprom_24lc028bt_i2c, R_ADD_COM);
+ _eeprom_24lc028bt_i2c->interface.write_byte(_eeprom_24lc028bt_i2c, R_ADD_COM);
// 等待读取地址命令响应
- eeprom_24lc028bt_i2c->interface.wait_ack(eeprom_24lc028bt_i2c);
+ _eeprom_24lc028bt_i2c->interface.wait_ack(_eeprom_24lc028bt_i2c);
// 循环读取数据
for (uint16_t i = 0; i < length - 1; i++)
{
// 读取一个字节数据
- *data++ = eeprom_24lc028bt_i2c->interface.read_byte(eeprom_24lc028bt_i2c, TRUE);
+ *data++ = _eeprom_24lc028bt_i2c->interface.read_byte(_eeprom_24lc028bt_i2c, TRUE);
}
- *data++ = eeprom_24lc028bt_i2c->interface.read_byte(eeprom_24lc028bt_i2c, FALSE);
+ *data++ = _eeprom_24lc028bt_i2c->interface.read_byte(_eeprom_24lc028bt_i2c, FALSE);
// 停止I2C总线
- eeprom_24lc028bt_i2c->interface.stop(eeprom_24lc028bt_i2c);
+ _eeprom_24lc028bt_i2c->interface.stop(_eeprom_24lc028bt_i2c);
}
diff --git a/User/lib/driver/eeprom_lc02b.h b/User/system/driver/eeprom_lc02b.h
similarity index 96%
rename from User/lib/driver/eeprom_lc02b.h
rename to User/system/driver/eeprom_lc02b.h
index d5edf21..d1dc2a5 100644
--- a/User/lib/driver/eeprom_lc02b.h
+++ b/User/system/driver/eeprom_lc02b.h
@@ -15,7 +15,7 @@
/**
* @brief Initializes the LC02B EEPROM module.
*/
-void eeprom_lc02b_init(void);
+void eeprom_lc02b_init(TIM_TypeDef *timer_us);
/**
* @brief Deinitializes the LC02B EEPROM module.
diff --git a/User/lib/driver/eeprom_m95.c b/User/system/driver/eeprom_m95.c
similarity index 100%
rename from User/lib/driver/eeprom_m95.c
rename to User/system/driver/eeprom_m95.c
diff --git a/User/lib/driver/eeprom_m95.h b/User/system/driver/eeprom_m95.h
similarity index 100%
rename from User/lib/driver/eeprom_m95.h
rename to User/system/driver/eeprom_m95.h
diff --git a/User/lib/driver/ntc_3950.c b/User/system/driver/ntc_3950.c
similarity index 100%
rename from User/lib/driver/ntc_3950.c
rename to User/system/driver/ntc_3950.c
diff --git a/User/lib/driver/ntc_3950.h b/User/system/driver/ntc_3950.h
similarity index 100%
rename from User/lib/driver/ntc_3950.h
rename to User/system/driver/ntc_3950.h
diff --git a/User/lib/driver/rtc_rx8010.c b/User/system/driver/rtc_rx8010.c
similarity index 97%
rename from User/lib/driver/rtc_rx8010.c
rename to User/system/driver/rtc_rx8010.c
index 42d418f..ec34508 100644
--- a/User/lib/driver/rtc_rx8010.c
+++ b/User/system/driver/rtc_rx8010.c
@@ -16,6 +16,19 @@
#define RTC_RX8010_SCL_PIN RTC_SCL_Pin
static i2c_t *rtc;
+static TIM_TypeDef *_timer_us;
+
+static void _delay_us(uint32_t us)
+{
+ if (_timer_us != NULL)
+ {
+ delay_hardware_us(_timer_us, us);
+ }
+ else
+ {
+ delay_us(us);
+ }
+}
/* sec, min, hour, week, day, month, year */
// static uint8_t calendar[7] = {0, 0, 0, 1, 29, 2, 98};
@@ -316,7 +329,7 @@ static BOOL rtc_soft_reset(void)
if (ret == 0)
{
- LL_mDelay(2);
+ _delay_us(2000);
}
return ret;
@@ -354,8 +367,14 @@ static BOOL rtc_clock_reginit(void)
* @return {BOOL} TRUE = 成功,FALSE = 失败
* @note
*/
-BOOL rtc_init(void)
+BOOL rtc_init(TIM_TypeDef *timer_us)
{
+ if (timer_us != NULL)
+ {
+ _timer_us = timer_us;
+ ENABLE_TIM_COUNT(_timer_us);
+ }
+
i2c_gpio_group_t gpios;
int ret = 1;
gpios.scl = gpio_create(RTC_RX8010_SCL_PORT, RTC_RX8010_SCL_PIN);
diff --git a/User/lib/driver/rtc_rx8010.h b/User/system/driver/rtc_rx8010.h
similarity index 98%
rename from User/lib/driver/rtc_rx8010.h
rename to User/system/driver/rtc_rx8010.h
index 5fc384a..7a54745 100644
--- a/User/lib/driver/rtc_rx8010.h
+++ b/User/system/driver/rtc_rx8010.h
@@ -57,7 +57,7 @@ typedef struct
* @brief Initializes the RTC module.
* @return TRUE if the initialization is successful, FALSE otherwise.
*/
-extern BOOL rtc_init(void);
+extern BOOL rtc_init(TIM_TypeDef *timer_us);
/**
* @brief Deinitializes the RTC module.
diff --git a/User/lib/driver/sht40.c b/User/system/driver/sht40.c
similarity index 71%
rename from User/lib/driver/sht40.c
rename to User/system/driver/sht40.c
index 20998d5..6235ef8 100644
--- a/User/lib/driver/sht40.c
+++ b/User/system/driver/sht40.c
@@ -1,5 +1,6 @@
#include "sht40.h"
#include "i2cs.h"
+#include "delay.h"
#define SHT40_SDA_PORT I2C1_SDA_GPIO_Port
#define SHT40_SDA_PIN I2C1_SDA_Pin
#define SHT40_SCL_PORT I2C1_SCL_GPIO_Port
@@ -8,9 +9,22 @@
#define SHT40_I2C_ADDRESS 0x44
#define SHT40_MEASURE_CMD 0xFD // 2*8-bit T-data:8-bit CRC:2*8-bit RH-data: 8-bit CRC
-static i2c_t *sht40_i2c;
+static i2c_t *_sht40_i2c;
+static TIM_TypeDef *_timer_us;
static uint8_t crc8(uint8_t *data, uint8_t len);
+static void _delay_us(uint32_t us)
+{
+ if (_timer_us != NULL)
+ {
+ delay_hardware_us(_timer_us, us);
+ }
+ else
+ {
+ delay_us(us);
+ }
+}
+
void sht40_test(void)
{
float32 temperature = 0;
@@ -26,14 +40,21 @@ void sht40_test(void)
*
* 初始化完成后,sht40_i2c 变量将用于后续的 SHT40 传感器通信。
*/
-void sht40_init(void)
+void sht40_init(TIM_TypeDef *timer_us)
{
+ DBG_ASSERT(timer_us != NULL __DBG_LINE);
+ if (timer_us != NULL)
+ {
+ _timer_us = timer_us;
+ ENABLE_TIM_COUNT(_timer_us);
+ }
+
i2c_gpio_group_t gpios;
gpios.scl = gpio_create(SHT40_SCL_PORT, SHT40_SCL_PIN);
gpios.sda = gpio_create(SHT40_SDA_PORT, SHT40_SDA_PIN);
- sht40_i2c = i2c_create(gpios, 10);
- DBG_ASSERT(sht40_i2c != NULL __DBG_LINE);
+ _sht40_i2c = i2c_create(gpios, 10);
+ DBG_ASSERT(_sht40_i2c != NULL __DBG_LINE);
// sht40_test(); // 测试 SHT40
}
@@ -65,32 +86,32 @@ BOOL sht40_read(float32 *temperature, float32 *humidity)
osel_memset(data, 0, ARRAY_LEN(data));
// 发送开始信号
- sht40_i2c->interface.start(sht40_i2c);
+ _sht40_i2c->interface.start(_sht40_i2c);
// 发送写入地址命令
- sht40_i2c->interface.write_byte(sht40_i2c, SHT40_I2C_ADDRESS << 1);
+ _sht40_i2c->interface.write_byte(_sht40_i2c, SHT40_I2C_ADDRESS << 1);
// 等待写入地址命令响应
- if (sht40_i2c->interface.wait_ack(sht40_i2c) == FALSE)
+ if (_sht40_i2c->interface.wait_ack(_sht40_i2c) == FALSE)
{
return FALSE;
}
// 发送测量命令
- sht40_i2c->interface.write_byte(sht40_i2c, SHT40_MEASURE_CMD);
+ _sht40_i2c->interface.write_byte(_sht40_i2c, SHT40_MEASURE_CMD);
// 等待测量命令响应
- if (sht40_i2c->interface.wait_ack(sht40_i2c) == FALSE)
+ if (_sht40_i2c->interface.wait_ack(_sht40_i2c) == FALSE)
{
return FALSE;
}
// 停止I2C总线
- sht40_i2c->interface.stop(sht40_i2c);
+ _sht40_i2c->interface.stop(_sht40_i2c);
- LL_mDelay(10); // 根据 SHT40 数据手册,等待至少 10ms
+ _delay_us(10000); // 根据 SHT40 数据手册,等待至少 10ms
// 发送开始信号
- sht40_i2c->interface.start(sht40_i2c);
+ _sht40_i2c->interface.start(_sht40_i2c);
// 发送写入地址命令
- sht40_i2c->interface.write_byte(sht40_i2c, (SHT40_I2C_ADDRESS << 1) | 1);
+ _sht40_i2c->interface.write_byte(_sht40_i2c, (SHT40_I2C_ADDRESS << 1) | 1);
// 等待写入地址命令响应
- if (sht40_i2c->interface.wait_ack(sht40_i2c) == FALSE)
+ if (_sht40_i2c->interface.wait_ack(_sht40_i2c) == FALSE)
{
return FALSE;
}
@@ -99,16 +120,16 @@ BOOL sht40_read(float32 *temperature, float32 *humidity)
{
if (i == 5)
{
- data[i] = sht40_i2c->interface.read_byte(sht40_i2c, FALSE);
+ data[i] = _sht40_i2c->interface.read_byte(_sht40_i2c, FALSE);
}
else
{
- data[i] = sht40_i2c->interface.read_byte(sht40_i2c, TRUE);
+ data[i] = _sht40_i2c->interface.read_byte(_sht40_i2c, TRUE);
}
}
// 停止I2C总线
- sht40_i2c->interface.stop(sht40_i2c);
+ _sht40_i2c->interface.stop(_sht40_i2c);
*temperature = 0;
*humidity = 0;
diff --git a/User/lib/driver/sht40.h b/User/system/driver/sht40.h
similarity index 81%
rename from User/lib/driver/sht40.h
rename to User/system/driver/sht40.h
index 4a6af98..c06341c 100644
--- a/User/lib/driver/sht40.h
+++ b/User/system/driver/sht40.h
@@ -2,7 +2,7 @@
#define __SHT40_H
#include "main.h"
-void sht40_init(void); ///< 初始化 SHT40 传感器
+void sht40_init(TIM_TypeDef *timer_us); ///< 初始化 SHT40 传感器
void sht40_dinit(void); ///< 反初始化 SHT40 传感器
BOOL sht40_read(float32 *temperature, float32 *humidity); ///< 读取温湿度传感器数据
diff --git a/User/system/inc/delay.h b/User/system/inc/delay.h
deleted file mode 100644
index ac129de..0000000
--- a/User/system/inc/delay.h
+++ /dev/null
@@ -1,21 +0,0 @@
-/***
- * @Author:
- * @Date: 2023-04-11 18:31:07
- * @LastEditors: xxx
- * @LastEditTime: 2023-04-11 18:31:20
- * @Description:
- * @email:
- * @Copyright (c) 2023 by xxx, All Rights Reserved.
- */
-
-#ifndef __DELAY_H
-#define __DELAY_H
-
-#include "sys.h"
-
-void delay_init(uint16_t sysclk); /* 初始化延迟函数 */
-void delay_ms(uint16_t nms); /* 延时nms */
-void delay_us(uint32_t nus); /* 延时nus */
-void delay_tick(uint32_t ticks); /* 延时ticks */
-
-#endif
diff --git a/User/lib/bootload/bootload.c b/User/system/lib/bootload/bootload.c
similarity index 100%
rename from User/lib/bootload/bootload.c
rename to User/system/lib/bootload/bootload.c
diff --git a/User/lib/bootload/bootload.h b/User/system/lib/bootload/bootload.h
similarity index 100%
rename from User/lib/bootload/bootload.h
rename to User/system/lib/bootload/bootload.h
diff --git a/User/lib/bootload/readme.md b/User/system/lib/bootload/readme.md
similarity index 100%
rename from User/lib/bootload/readme.md
rename to User/system/lib/bootload/readme.md
diff --git a/User/lib/bootload/test_ymodem.c b/User/system/lib/bootload/test_ymodem.c
similarity index 100%
rename from User/lib/bootload/test_ymodem.c
rename to User/system/lib/bootload/test_ymodem.c
diff --git a/User/lib/bootload/ymodem.c b/User/system/lib/bootload/ymodem.c
similarity index 100%
rename from User/lib/bootload/ymodem.c
rename to User/system/lib/bootload/ymodem.c
diff --git a/User/lib/bootload/ymodem.h b/User/system/lib/bootload/ymodem.h
similarity index 100%
rename from User/lib/bootload/ymodem.h
rename to User/system/lib/bootload/ymodem.h
diff --git a/User/system/lib/control/custom/pid_c.c b/User/system/lib/control/custom/pid_c.c
new file mode 100644
index 0000000..4354fbc
--- /dev/null
+++ b/User/system/lib/control/custom/pid_c.c
@@ -0,0 +1,38 @@
+#include "pid_c.h"
+
+/**
+ * @brief 设置PID控制器参数
+ * @param {PID_C} *self - PID控制器结构体指针
+ * @param {float32} kp - 比例系数
+ * @param {float32} ki - 积分系数
+ * @param {float32} kd - 微分系数
+ * @param {float32} out_min - 最小输出
+ * @param {float32} out_max - 最大输出
+ * @return {*} - 空
+ */
+static void _set_ctrl_prm(struct PID_C *self, float32 kp, float32 ki, float32 kd, float32 out_min, float32 out_max)
+{
+ self->pri.kp = kp; /*比例系数*/
+ self->pri.ki = ki; /*积分系数*/
+ self->pri.kd = kd; /*微分系数*/
+
+ self->pri.deadband = 0.5; /*死区*/
+ self->pri.maximum = out_max; /*最大输出*/
+ self->pri.minimum = out_min; /*最小输出*/
+ self->pri.last_error = 0; /*上一次误差*/
+ self->pri.prev_error = 0; /*上上次误差*/
+}
+
+static float32 _PID(struct PID_C *self, float32 target, float32 feedback)
+{
+ /**
+ * 实现PID算法
+ */
+ return 0;
+}
+
+void pid_c_constructor(struct PID_C *self)
+{
+ self->set_ctrl_prm = _set_ctrl_prm;
+ self->PID = _PID;
+}
diff --git a/User/system/lib/control/custom/pid_c.h b/User/system/lib/control/custom/pid_c.h
new file mode 100644
index 0000000..ccc7e86
--- /dev/null
+++ b/User/system/lib/control/custom/pid_c.h
@@ -0,0 +1,34 @@
+#ifndef __PID_C_H__
+#define __PID_C_H__
+#include "lib.h"
+
+typedef struct PID_C
+{
+ /* 设置PID三个参数 */
+ void (*set_ctrl_prm)(struct PID_C *self, float32 kp, float32 ki, float32 kd, float32 out_min, float32 out_max);
+ /* 控制接口 */
+ float32 (*PID)(struct PID_C *self, float32 target, float32 feedback);
+
+ // 自定义参数
+ /* 实际值与目标值之间的误差 */
+ float32 err;
+ /* 输出值 */
+ float32 out;
+ /* private */
+ struct
+ {
+ float32 kp; /*比例学习速度*/
+ float32 ki; /*积分学习速度*/
+ float32 kd; /*微分学习速度*/
+ float32 ki_error; /*积分误差*/
+ float32 last_error; /*前一拍偏差*/
+ float32 prev_error; /*前两拍偏差*/
+ float32 deadband; /*死区*/
+ float32 maximum; /*输出值的上限*/
+ float32 minimum; /*输出值的下限*/
+ } pri;
+} pid_c_t;
+
+extern void pid_c_constructor(struct PID_C *self);
+
+#endif // __PID_C_H__
diff --git a/User/system/lib/control/custom/pid_g.c b/User/system/lib/control/custom/pid_g.c
new file mode 100644
index 0000000..615ec17
--- /dev/null
+++ b/User/system/lib/control/custom/pid_g.c
@@ -0,0 +1,285 @@
+#include "pid_g.h"
+#include
+
+/**
+ * @brief 复位PID积分及微分控制数据
+ * @param {PID_G} *self
+ * @return {*}
+ */
+static void _restctrl(struct PID_G *self)
+{
+ self->pri.pre_error = 0;
+ self->pri.sum_iterm = 0;
+}
+
+/**
+ * @brief 更新控制区间
+ * @param {PID_G} *self
+ * @param {float32} out_min
+ * @param {float32} out_max
+ * @return {*}
+ * @note
+ */
+static void _set_range(struct PID_G *self, float32 out_min, float32 out_max)
+{
+ self->pri.out_max = out_max;
+ self->pri.out_min = out_min;
+}
+
+/**
+ * @brief 更新kp
+ * @param {PID_G} *self
+ * @param {float32} kp
+ * @return {*}
+ * @note
+ */
+static void _set_kp(struct PID_G *self, float32 kp)
+{
+ self->pri.kp = kp;
+}
+
+/**
+ * @brief 更新ki
+ * @param {PID_G} *self
+ * @param {float32} ki
+ * @return {*}
+ * @note
+ */
+static void _set_ki(struct PID_G *self, float32 ki)
+{
+ self->pri.ki = ki;
+}
+
+/**
+ * @brief 更新kd
+ * @param {PID_G} *self
+ * @param {float32} kd
+ * @return {*}
+ * @note
+ */
+static void _set_kd(struct PID_G *self, float32 kd)
+{
+ self->pri.kd = kd;
+}
+
+/**
+ * @brief 使能积分控制
+ * @param {PID_G} *self
+ * @param {BOOL} enable
+ * @return {*}
+ * @note
+ */
+static void _set_ki_enable(struct PID_G *self, BOOL enable)
+{
+ self->pri.ki_enable = enable;
+}
+
+/**
+ * @brief 使能微分控制
+ * @param {PID_G} *self
+ * @param {BOOL} enable
+ * @return {*}
+ * @note
+ */
+static void _set_kd_enable(struct PID_G *self, BOOL enable)
+{
+ self->pri.kd_enable = enable;
+}
+
+/**
+ * @brief 初始化控制参数
+ * @return {*}
+ * @note
+ */
+static void _set_ctrl_prm(struct PID_G *self, float32 kp, float32 ki, float32 kd, float32 err_dead, float32 out_min, float32 out_max)
+{
+ g_param_t *pri = &self->pri;
+ osel_memset((uint8_t *)pri, 0, sizeof(pid_g_t));
+ pri->kp = kp;
+ pri->ki = ki;
+ pri->kd = kd;
+ pri->err_dead = err_dead;
+ pri->out_max = out_max;
+ pri->out_min = out_min;
+ pri->detach = FALSE;
+}
+
+static void _update_ctrl_prm(struct PID_G *self, float32 kp, float32 ki, float32 kd, float32 err_dead, float32 out_min, float32 out_max)
+{
+ g_param_t *pri = &self->pri;
+ pri->kp = kp;
+ pri->ki = ki;
+ pri->kd = kd;
+ pri->err_dead = err_dead;
+ pri->out_max = out_max;
+ pri->out_min = out_min;
+ pri->detach = FALSE;
+}
+
+/**
+ * @brief 非0时配置为积分分离+抗积分饱和PID,否则为普通抗积分饱和PID
+ * @param {PID_G} *self
+ * @param {float32} max_err
+ * @param {BOOL} mode
+ * @return {*}
+ */
+static void _set_cfg(struct PID_G *self, float32 max_err, BOOL mode)
+{
+ self->pri.err_limit = max_err;
+ self->pri.detach = mode == FALSE ? FALSE : TRUE;
+}
+
+/**
+ * @brief 设置积分权重
+ * @param {PID_G} *self
+ * @param {float32} max_weight
+ * @return {*}
+ * @note
+ */
+static void _set_weight(struct PID_G *self, float32 max_ratio, BOOL mode)
+{
+ self->pri.ui_ratio = max_ratio;
+ self->pri.weight = mode == FALSE ? FALSE : TRUE;
+}
+
+/**
+ * @brief PID算法函数
+ * @param {PID_G} *self
+ * @param {float32} target 目标位置
+ * @param {float32} feedback 实际位置
+ * @return {*}
+ * @note
+ */
+static float32 _PID(struct PID_G *self, float32 target, float32 feedback)
+{
+ float32 error = 0.0f;
+ float32 insert = 0.0f; ///< 该值为0时积分不介入计算
+ float32 temp_iterm = 0.0f;
+ float32 temp_kd = 0.0f;
+
+ g_param_t *pri = &self->pri;
+
+ pri->ref = target; ///< 目标位置
+ pri->feed_back = feedback; ///< 实际位置
+ pri->error = pri->ref - pri->feed_back; /// 误差
+ error = pri->error;
+ if (fabs(pri->error) <= pri->err_dead) ///< 误差小于死区,不计算
+ {
+ error = 0;
+ }
+
+ /*根据PID配置的模式,获取积分数据,进行积分累加*/
+ if (pri->out >= pri->out_max) ///< 到达输出上限
+ {
+ if (fabs(error) > pri->err_limit && pri->detach) ///< 误差大于积分介入区间,积分不介入计算
+ {
+ insert = 0;
+ }
+ else
+ {
+ insert = 1;
+ if (error < 0)
+ {
+ temp_iterm = pri->ki * error;
+ }
+ }
+ }
+ else if (pri->out <= pri->out_min) ///< 到达输出下限
+ {
+ if (fabs(error) > pri->err_limit && pri->detach) ///< 误差大于积分介入区间,积分不介入计算
+ {
+ insert = 0;
+ }
+ else
+ {
+ insert = 1;
+ if (error > 0)
+ {
+ temp_iterm = pri->ki * error;
+ }
+ }
+ }
+ else
+ {
+ if (fabs(error) > pri->err_limit && pri->detach)
+ {
+ insert = 0;
+ }
+ else
+ {
+ insert = 1;
+ temp_iterm = pri->ki * error;
+ }
+ }
+ if (pri->ki_enable == FALSE)
+ {
+ temp_iterm = 0;
+ insert = 0;
+ }
+
+ /* integral */
+ pri->sum_iterm += temp_iterm;
+
+ if (pri->weight == TRUE)
+ {
+ if (pri->sum_iterm > pri->ui_ratio)
+ {
+ pri->sum_iterm = pri->ui_ratio;
+ }
+ else if (pri->sum_iterm < -pri->ui_ratio)
+ {
+ pri->sum_iterm = -pri->ui_ratio;
+ }
+ }
+ else
+ {
+ if (pri->sum_iterm > pri->out_max)
+ {
+ pri->sum_iterm = pri->out_max;
+ }
+ else if (pri->sum_iterm < pri->out_min)
+ {
+ pri->sum_iterm = pri->out_min;
+ }
+ }
+
+ /* differential */
+ if (pri->kd_enable == TRUE)
+ {
+ temp_kd = pri->kd;
+ }
+ else
+ {
+ temp_kd = 0;
+ }
+
+ pri->out = pri->kp * pri->error + pri->sum_iterm * insert + (pri->error - pri->pre_error) * temp_kd;
+ pri->pre_error = pri->error; ///< 记录这次误差,为下次微分计算做准备
+ pri->pre_feed_back = pri->feed_back;
+
+ /*limt pid output*/
+ pri->out = RANGE(pri->out, pri->out_min, pri->out_max); ///< 限制输出
+ return pri->out;
+}
+
+/**
+ * @brief PID接口
+ * @param {PID_G} *self
+ * @return {*}
+ * @note
+ */
+void pid_g_constructor(struct PID_G *self)
+{
+ self->set_ctrl_prm = _set_ctrl_prm;
+ self->update_ctrl_prm = _update_ctrl_prm;
+ self->set_cfg = _set_cfg;
+ self->set_kp = _set_kp;
+ self->set_ki_enable = _set_ki_enable;
+ self->set_ki = _set_ki;
+ self->set_kd_enable = _set_kd_enable;
+ self->set_kd = _set_kd;
+ self->set_range = _set_range;
+ self->restctrl = _restctrl;
+ self->PID = _PID;
+ self->set_weight = _set_weight;
+}
diff --git a/User/system/lib/control/custom/pid_g.h b/User/system/lib/control/custom/pid_g.h
new file mode 100644
index 0000000..143051d
--- /dev/null
+++ b/User/system/lib/control/custom/pid_g.h
@@ -0,0 +1,65 @@
+#ifndef __PID_G_H__
+#define __PID_G_H__
+#include "lib.h"
+
+typedef struct
+{
+ float32 ref; /*目标*/
+ float32 feed_back; /*实际*/
+ float32 pre_feed_back; /*上一次实际*/
+ float32 kp; /*比例学习速度*/
+ float32 ki; /*积分学习速度*/
+ float32 kd; /*微分学习速度*/
+ float32 ki_error; /*积分误差*/
+ float32 error; /*误差*/
+ float32 pre_error; /*前一拍偏差*/
+ float32 prev_error; /*前两拍偏差*/
+ float32 err_dead; /*死区*/
+ float32 err_limit; /*积分分离上限*/
+ float32 maximum; /*输出值的上限*/
+ float32 minimum; /*输出值的下限*/
+ float32 out; /*输出值*/
+ float32 sum_iterm; /*积分累加*/
+ float32 ui_ratio; /*积分权重*/
+ BOOL ki_enable; /*积分使能*/
+ BOOL kd_enable; /*微分使能*/
+ BOOL detach; /*积分分离标志*/
+ BOOL weight; /*积分权重标志*/
+ float32 out_max; /*输出最大值*/
+ float32 out_min; /*输出最小值*/
+} g_param_t;
+
+typedef struct PID_G
+{
+ /* 设置PID三个参数 */
+ void (*set_ctrl_prm)(struct PID_G *self, float32 kp, float32 ki, float32 kd, float32 err_dead, float32 out_min, float32 out_max);
+ /* 更新PID参数 */
+ void (*update_ctrl_prm)(struct PID_G *self, float32 kp, float32 ki, float32 kd, float32 err_dead, float32 out_min, float32 out_max);
+ /* 控制接口 */
+ float32 (*PID)(struct PID_G *self, float32 target, float32 feedback);
+ /* 更新控制区间 */
+ void (*set_range)(struct PID_G *self, float32 out_min, float32 out_max);
+ /* 设置积分分离 */
+ void (*set_cfg)(struct PID_G *self, float32 max_err, BOOL mode);
+ /* 设置积分权重 */
+ void (*set_weight)(struct PID_G *self, float32 max_ratio, BOOL mode);
+ /* 更新kp */
+ void (*set_kp)(struct PID_G *self, float32 kp);
+ /* 使能ki */
+ void (*set_ki_enable)(struct PID_G *self, BOOL enable);
+ /* 更新ki */
+ void (*set_ki)(struct PID_G *self, float32 ki);
+ /* 使能kd */
+ void (*set_kd_enable)(struct PID_G *self, BOOL enable);
+ /* 更新kd */
+ void (*set_kd)(struct PID_G *self, float32 kd);
+ /* 复位PID积分及微分控制数据 */
+ void (*restctrl)(struct PID_G *self);
+
+ /* private */
+ g_param_t pri;
+
+} pid_g_t;
+
+extern void pid_g_constructor(struct PID_G *self);
+#endif // __PID_G_H__
diff --git a/User/system/lib/control/custom/pid_hd.c b/User/system/lib/control/custom/pid_hd.c
new file mode 100644
index 0000000..0a98366
--- /dev/null
+++ b/User/system/lib/control/custom/pid_hd.c
@@ -0,0 +1,166 @@
+#include "pid_hd.h"
+#include
+#include "sys.h"
+#include "app.h"
+
+#if INCOMPLETE_DIFFEREN_HD == 1 // 积分分离
+/*计算微分项,使用追随误差微分项*/
+static float32 td_derivative(struct PID_HD *self, float32 current_err, float32 pre_err, float32 dt)
+{
+ pid_hd_position_t *pri = &self->pri_u.position;
+ float32 derivative = (current_err - pre_err) / dt; // 计算积分项
+ derivative = pri->td_alpha * derivative + (1 - pri->td_alpha) * pri->td_beta * pri->pre_derivative; // 追随误差微分器平滑输出
+ pri->pre_derivative = derivative; // 更新上一次误差
+ return derivative;
+}
+#endif
+
+/*杭电:设置位置式PID参数*/
+static void _set_ctrl_prm_position(struct PID_HD *self, float32 kp, float32 ki, float32 kd)
+{
+ pid_hd_position_t *pri = &self->pri_u.position;
+ osel_memset((uint8_t *)pri, 0, sizeof(pid_hd_position_t));
+
+ /*观测传进来的Kp、Ki、Kd*/
+
+ pri->kp = kp;
+ pri->ki = ki;
+ pri->kd = kd;
+ pri->ki_limit = 10; // 积分分离界限
+ pri->err_dead = 0.5; // 控制死区范围
+#if INCOMPLETE_DIFFEREN_HD == 1
+ /*不完全微分系数*/
+ pri->td_alpha = 0.5;
+ pri->td_beta = 0.5;
+#endif
+}
+
+/*杭电:设置输出限幅参数*/
+static void _set_out_prm_position(struct PID_HD *self, float32 maximum, float32 minimum)
+{
+ self->pri_u.position.out_max = maximum;
+ self->pri_u.position.out_min = minimum;
+}
+
+/*杭电:位置式PID控制算法*/
+static float32 _pid_position(struct PID_HD *self, float32 err)
+{
+ /*计算控制的运行时间*/
+ // sys_millis_reset();
+ self->pri_u.position.control_time = sys_millis();
+ self->pri_u.position.tmp_time = 0;
+
+ /*测试:4.18*/
+ if (fabs(err) < 0.1)
+ {
+ err = 0;
+ }
+
+ float32 x[3];
+ self->pri_u.position.err = err;
+
+ /*抗积分饱和*/
+#if INTEGRAL_SEPARATION == 1 // 积分分离
+ if (self->pri_u.position.out > self->pri_u.position.out_max)
+ {
+ if (self->pri_u.position.err > self->pri_u.position.ki_limit) // 积分分离
+ {
+ self->pri_u.position.ki_error += 0;
+ }
+ else
+ {
+ if (self->pri_u.position.err < 0) // 若偏差为负值,执行负偏差的累加
+ {
+ self->pri_u.position.ki_error += self->pri_u.position.err;
+ }
+ }
+ }
+ else if (self->pri_u.position.out < self->pri_u.position.out_min)
+ {
+ if (self->pri_u.position.err > self->pri_u.position.ki_limit) // 若偏差为负值,停止积分
+ {
+ self->pri_u.position.ki_error += 0;
+ }
+ else
+ {
+ if (self->pri_u.position.err > 0) // 若偏差为正值,执行正偏差的累加
+ {
+ self->pri_u.position.ki_error += self->pri_u.position.err;
+ }
+ }
+ }
+ else
+ {
+ if (fabs(err) > self->pri_u.position.ki_limit || fabs(err) < 0.5)
+ {
+ self->pri_u.position.ki_error += 0;
+ }
+ else
+ {
+ self->pri_u.position.ki_error += self->pri_u.position.err;
+ }
+ }
+#else /*无积分分离操作*/
+ if (fabs(err) < 0.4)
+ {
+ self->pri_u.position.ki_error += 0;
+ }
+ else
+ {
+ self->pri_u.position.ki_error += self->pri_u.position.err;
+ }
+#endif
+
+ /*输出*/
+ if (fabs(err) < self->pri_u.position.err_dead)
+ {
+ /*输出上一次的值*/
+ // self->pri_u.position.out = self->pri_u.position.pre_out;
+ x[0] = self->pri_u.position.err;
+ x[1] = self->pri_u.position.ki_error;
+ self->pri_u.position.out = self->pri_u.position.kp * x[0] + self->pri_u.position.ki * x[1] + self->pri_u.position.kd * x[2];
+ }
+ else
+ {
+ x[0] = self->pri_u.position.err;
+ x[1] = self->pri_u.position.ki_error;
+
+#if INCOMPLETE_DIFFEREN_HD == 1
+ /*不完全微分项,为了解决普通PID为微分环节容易振荡的问题*/
+ self->pri_u.position.tmp_time = sys_millis();
+ self->pri_u.position.control_time -= self->pri_u.position.tmp_time;
+ self->pri_u.position.control_time /= 1000.0; // 将单位转换为秒
+ x[2] = td_derivative(&_pid.pid_u.hd, err, self->pri_u.position.pre_error, self->pri_u.position.control_time);
+#else
+ // 普通的微分环节
+ x[2] = self->pri_u.position.err - self->pri_u.position.pre_error;
+#endif
+
+ self->pri_u.position.out = self->pri_u.position.kp * x[0] + self->pri_u.position.ki * x[1] + self->pri_u.position.kd * x[2];
+ }
+
+ /*输出限幅*/
+ if (self->pri_u.position.out > self->pri_u.position.out_max)
+ {
+ self->pri_u.position.out = self->pri_u.position.out_max;
+ }
+ if (self->pri_u.position.out < self->pri_u.position.out_min)
+ {
+ self->pri_u.position.out = self->pri_u.position.out_min;
+ }
+
+ // 更新误差历史
+ self->pri_u.position.pre_error = self->pri_u.position.err; /*上一次误差值*/
+ // 更新输出历史
+ self->pri_u.position.pre_out = self->pri_u.position.out; /*上一次输出值*/
+
+ return self->pri_u.position.out;
+}
+
+/*杭电:参数控制器*/
+void pid_hd_constructor(struct PID_HD *self)
+{
+ self->set_ctrl_prm_position = _set_ctrl_prm_position;
+ self->set_out_prm_position = _set_out_prm_position;
+ self->pid_position = _pid_position;
+}
diff --git a/User/system/lib/control/custom/pid_hd.h b/User/system/lib/control/custom/pid_hd.h
new file mode 100644
index 0000000..2fa96f0
--- /dev/null
+++ b/User/system/lib/control/custom/pid_hd.h
@@ -0,0 +1,66 @@
+#ifndef __PID_HD__
+#define __PID_HD__
+#include "lib.h"
+
+#define INTEGRAL_SEPARATION 1 // 积分分离
+#define INCOMPLETE_DIFFEREN_HD 1 // 不完全微分
+
+typedef struct
+{
+ float32 ref;
+ float32 feed_back;
+ float32 pre_feed_back;
+ float32 pre_error;
+ float32 ki_error; /*积分误差*/
+ float32 ki_limit; /*积分分离界限*/
+ float32 ki_alpha; /*变积分的系数*/
+ float32 err;
+ float32 sum_iterm;
+ float32 kp;
+ float32 kp_small; /*在接近稳态时的Kp*/
+ float32 kp_big; /*在大范围时的Kp*/
+ float32 ki;
+ float32 kd;
+ float32 err_limit;
+ BOOL detach;
+ float32 err_dead;
+#if INCOMPLETE_DIFFEREN_HD == 1
+ float32 td_alpha; /*不完全微分系数*/
+ float32 td_beta; /*不完全微分系数beta*/
+ float32 pre_derivative; /*上一次微分值*/
+#endif
+ float32 out;
+ float32 pre_out;
+ float32 out_max;
+ float32 out_min;
+ BOOL sm;
+ float32 sv_range;
+ uint32_t control_time; /*控制算法运行一次花费的时间*/
+ uint32_t tmp_time; /*临时用来记录控制的运行时间*/
+} pid_hd_position_t; // 位置式PID
+
+typedef struct PID_HD
+{
+ /* 设置PID三个参数 */
+ void (*set_ctrl_prm_position)(struct PID_HD *self, float32 kp, float32 ki, float32 kd);
+ /* 设置输出范围 */
+ void (*set_out_prm_position)(struct PID_HD *self, float32 maximum, float32 minimum);
+
+ /* 控制接口 */
+ float32 (*pid_position)(struct PID_HD *self, float32 err);
+
+ // 自定义参数
+ /* 实际值与目标值之间的误差 */
+ float32 err;
+ /* 输出值 */
+ float32 out;
+ /* private */
+ struct
+ {
+ pid_hd_position_t position;
+ } pri_u;
+} pid_hd_t;
+
+extern void pid_hd_constructor(struct PID_HD *self);
+
+#endif // __PID_HD__
diff --git a/User/system/lib/control/custom/pid_x.c b/User/system/lib/control/custom/pid_x.c
new file mode 100644
index 0000000..747049c
--- /dev/null
+++ b/User/system/lib/control/custom/pid_x.c
@@ -0,0 +1,481 @@
+#include "pid_x.h"
+#include "math.h"
+#define LAG_PHASE (6) // 迟滞相位,单位:拍
+
+#ifndef PI
+#define PI 3.14159265358979f
+#endif
+// 注1:自适应模糊pid最重要的就是论域的选择,要和你应该控制的对象相切合
+// 注2:以下各阀值、限幅值、输出值均需要根据具体的使用情况进行更改
+// 注3:因为我的控制对象惯性比较大,所以以下各部分取值较小
+// 论域e:[-5,5] ec:[-0.5,0.5]
+
+// 误差的阀值,小于这个数值的时候,不做PID调整,避免误差较小时频繁调节引起震荡
+#define Emin 0.3f
+#define Emid 1.0f
+#define Emax 5.0f
+// 调整值限幅,防止积分饱和
+#define Umax 1
+#define Umin -1
+
+#define NB 0
+#define NM 1
+#define NS 2
+#define ZO 3
+#define PS 4
+#define PM 5
+#define PB 6
+
+int32_t kp[7][7] = {{PB, PB, PM, PM, PS, ZO, ZO},
+ {PB, PB, PM, PS, PS, ZO, ZO},
+ {PM, PM, PM, PS, ZO, NS, NS},
+ {PM, PM, PS, ZO, NS, NM, NM},
+ {PS, PS, ZO, NS, NS, NM, NM},
+ {PS, ZO, NS, NM, NM, NM, NB},
+ {ZO, ZO, NM, NM, NM, NB, NB}};
+
+int32_t kd[7][7] = {{PS, NS, NB, NB, NB, NM, PS},
+ {PS, NS, NB, NM, NM, NS, ZO},
+ {ZO, NS, NM, NM, NS, NS, ZO},
+ {ZO, NS, NS, NS, NS, NS, ZO},
+ {ZO, ZO, ZO, ZO, ZO, ZO, ZO},
+ {PB, NS, PS, PS, PS, PS, PB},
+ {PB, PM, PM, PM, PS, PS, PB}};
+
+int32_t ki[7][7] = {{NB, NB, NM, NM, NS, ZO, ZO},
+ {NB, NB, NM, NS, NS, ZO, ZO},
+ {NB, NM, NS, NS, ZO, PS, PS},
+ {NM, NM, NS, ZO, PS, PM, PM},
+ {NM, NS, ZO, PS, PS, PM, PB},
+ {ZO, ZO, PS, PS, PM, PB, PB},
+ {ZO, ZO, PS, PM, PM, PB, PB}};
+
+static float32 ec; // 误差变化率
+/**************求隶属度(三角形)***************/
+float32 FTri(float32 x, float32 a, float32 b, float32 c) // FuzzyTriangle
+{
+ if (x <= a)
+ return 0;
+ else if ((a < x) && (x <= b))
+ return (x - a) / (b - a);
+ else if ((b < x) && (x <= c))
+ return (c - x) / (c - b);
+ else if (x > c)
+ return 0;
+ else
+ return 0;
+}
+/*****************求隶属度(梯形左)*******************/
+float32 FTraL(float32 x, float32 a, float32 b) // FuzzyTrapezoidLeft
+{
+ if (x <= a)
+ return 1;
+ else if ((a < x) && (x <= b))
+ return (b - x) / (b - a);
+ else if (x > b)
+ return 0;
+ else
+ return 0;
+}
+/*****************求隶属度(梯形右)*******************/
+float32 FTraR(float32 x, float32 a, float32 b) // FuzzyTrapezoidRight
+{
+ if (x <= a)
+ return 0;
+ if ((a < x) && (x < b))
+ return (x - a) / (b - a);
+ if (x >= b)
+ return 1;
+ else
+ return 1;
+}
+/****************三角形反模糊化处理**********************/
+float32 uFTri(float32 x, float32 a, float32 b, float32 c)
+{
+ float32 y, z;
+ z = (b - a) * x + a;
+ y = c - (c - b) * x;
+ return (y + z) / 2;
+}
+/*******************梯形(左)反模糊化***********************/
+float32 uFTraL(float32 x, float32 a, float32 b)
+{
+ return b - (b - a) * x;
+}
+/*******************梯形(右)反模糊化***********************/
+float32 uFTraR(float32 x, float32 a, float32 b)
+{
+ return (b - a) * x + a;
+}
+/**************************求交集****************************/
+float32 fand(float32 a, float32 b)
+{
+ return (a < b) ? a : b;
+}
+/**************************求并集****************************/
+float32 forr(float32 a, float32 b)
+{
+ return (a < b) ? b : a;
+}
+
+static float32 _PID(struct PID_X *self, float32 target, float32 feedback)
+{
+ float32 pwm_var; // pwm调整量
+ float32 iError; // 当前误差
+ float32 set, input;
+ CLASSICPID *pri = &self->pri;
+ // 计算隶属度表
+ float32 es[7], ecs[7], e;
+ float32 form[7][7];
+ int i = 0, j = 0;
+ int MaxX = 0, MaxY = 0;
+
+ // 记录隶属度最大项及相应推理表的p、i、d值
+ float32 lsd;
+ int temp_p, temp_d, temp_i;
+ float32 detkp, detkd, detki; // 推理后的结果
+
+ // 输入格式的转化及偏差计算
+ set = target;
+ input = feedback;
+ iError = set - input; // 偏差
+
+ e = iError;
+ ec = iError - pri->lasterror;
+
+ // 当温度差的绝对值小于Emax时,对pid的参数进行调整
+ if (fabs(iError) <= Emax)
+ {
+ // 计算iError在es与ecs中各项的隶属度
+ es[NB] = FTraL(e * 5, -3, -1); // e
+ es[NM] = FTri(e * 5, -3, -2, 0);
+ es[NS] = FTri(e * 5, -3, -1, 1);
+ es[ZO] = FTri(e * 5, -2, 0, 2);
+ es[PS] = FTri(e * 5, -1, 1, 3);
+ es[PM] = FTri(e * 5, 0, 2, 3);
+ es[PB] = FTraR(e * 5, 1, 3);
+
+ ecs[NB] = FTraL(ec * 30, -3, -1); // ec
+ ecs[NM] = FTri(ec * 30, -3, -2, 0);
+ ecs[NS] = FTri(ec * 30, -3, -1, 1);
+ ecs[ZO] = FTri(ec * 30, -2, 0, 2);
+ ecs[PS] = FTri(ec * 30, -1, 1, 3);
+ ecs[PM] = FTri(ec * 30, 0, 2, 3);
+ ecs[PB] = FTraR(ec * 30, 1, 3);
+
+ // 计算隶属度表,确定e和ec相关联后表格各项隶属度的值
+ for (i = 0; i < 7; i++)
+ {
+ for (j = 0; j < 7; j++)
+ {
+ form[i][j] = fand(es[i], ecs[j]);
+ }
+ }
+
+ // 取出具有最大隶属度的那一项
+ for (i = 0; i < 7; i++)
+ {
+ for (j = 0; j < 7; j++)
+ {
+ if (form[MaxX][MaxY] < form[i][j])
+ {
+ MaxX = i;
+ MaxY = j;
+ }
+ }
+ }
+ // 进行模糊推理,并去模糊
+ lsd = form[MaxX][MaxY];
+ temp_p = kp[MaxX][MaxY];
+ temp_d = kd[MaxX][MaxY];
+ temp_i = ki[MaxX][MaxY];
+
+ if (temp_p == NB)
+ detkp = uFTraL(lsd, -0.3, -0.1);
+ else if (temp_p == NM)
+ detkp = uFTri(lsd, -0.3, -0.2, 0);
+ else if (temp_p == NS)
+ detkp = uFTri(lsd, -0.3, -0.1, 0.1);
+ else if (temp_p == ZO)
+ detkp = uFTri(lsd, -0.2, 0, 0.2);
+ else if (temp_p == PS)
+ detkp = uFTri(lsd, -0.1, 0.1, 0.3);
+ else if (temp_p == PM)
+ detkp = uFTri(lsd, 0, 0.2, 0.3);
+ else if (temp_p == PB)
+ detkp = uFTraR(lsd, 0.1, 0.3);
+
+ if (temp_d == NB)
+ detkd = uFTraL(lsd, -3, -1);
+ else if (temp_d == NM)
+ detkd = uFTri(lsd, -3, -2, 0);
+ else if (temp_d == NS)
+ detkd = uFTri(lsd, -3, 1, 1);
+ else if (temp_d == ZO)
+ detkd = uFTri(lsd, -2, 0, 2);
+ else if (temp_d == PS)
+ detkd = uFTri(lsd, -1, 1, 3);
+ else if (temp_d == PM)
+ detkd = uFTri(lsd, 0, 2, 3);
+ else if (temp_d == PB)
+ detkd = uFTraR(lsd, 1, 3);
+
+ if (temp_i == NB)
+ detki = uFTraL(lsd, -0.06, -0.02);
+ else if (temp_i == NM)
+ detki = uFTri(lsd, -0.06, -0.04, 0);
+ else if (temp_i == NS)
+ detki = uFTri(lsd, -0.06, -0.02, 0.02);
+ else if (temp_i == ZO)
+ detki = uFTri(lsd, -0.04, 0, 0.04);
+ else if (temp_i == PS)
+ detki = uFTri(lsd, -0.02, 0.02, 0.06);
+ else if (temp_i == PM)
+ detki = uFTri(lsd, 0, 0.04, 0.06);
+ else if (temp_i == PB)
+ detki = uFTraR(lsd, 0.02, 0.06);
+
+ // pid三项系数的修改
+ pri->pKp += detkp;
+ pri->pKi += detki;
+ if (pri->kd_e)
+ {
+ pri->pKd += detkd;
+ }
+ else
+ {
+ pri->pKd = 0; // 取消微分作用
+ }
+
+ // 对Kp,Ki进行限幅
+ if (pri->pKp < 0)
+ {
+ pri->pKp = 0;
+ }
+ if (pri->pKi < 0)
+ {
+ pri->pKi = 0;
+ }
+
+ // 计算新的K1,nKi,nKd
+ pri->nKp = pri->pKp + pri->pKi + pri->pKd;
+ pri->nKi = -(pri->pKp + 2 * pri->pKd);
+ pri->nKd = pri->pKd;
+ }
+
+ if (iError > Emax)
+ {
+ pri->out = pri->max;
+ pwm_var = 0;
+ pri->flag = 1; // 设定标志位,如果误差超过了门限值,则认为当控制量第一次到达给定值时,应该采取下面的 抑制超调 的措施
+ }
+ else if (iError < -Emax)
+ {
+ pri->out = pri->min;
+ pwm_var = 0;
+ }
+ else if (fabsf(iError) <= Emin)
+ {
+ pwm_var = 0;
+ }
+ else
+ {
+ if (iError < Emid && pri->flag == 1) // 第一次超过(设定值-Emid(-0.08)摄氏度),是输出为零,防止超调,也可以输出其他值,不至于太小而引起震荡
+ {
+ pri->out = 0;
+ pri->flag = 0;
+ }
+ else if (-iError > Emid) // 超过(设定+Emid(+0.08)摄氏度)
+ {
+ pwm_var = -1;
+ }
+ else
+ {
+ // 增量计算
+ pwm_var = (pri->nKp * iError // e[k]
+ + pri->nKi * pri->lasterror // e[k-1]
+ + pri->nKd * pri->preverror); // e[k-2]
+ }
+ if (pwm_var >= Umax)
+ pwm_var = Umax; // 调整值限幅,防止积分饱和
+ if (pwm_var <= Umin)
+ pwm_var = Umin; // 调整值限幅,防止积分饱和
+ }
+ pri->preverror = pri->lasterror;
+ pri->lasterror = iError;
+
+ pri->out += pwm_var; // 调整PWM输出
+
+ if (pri->out > pri->max)
+ pri->out = pri->max; // 输出值限幅
+ if (pri->out < pri->min)
+ pri->out = pri->min; // 输出值限幅
+
+ return pri->out;
+}
+
+/*整定开始前的预处理,判断状态及初始化变量*/
+static void tune_pretreatment(struct PID_X *self)
+{
+ CLASSIC_AUTOTUNE *tune = &self->tune;
+ CLASSICPID *vPID = &self->pri;
+
+ tune->tuneTimer = 0;
+ tune->startTime = 0;
+ tune->endTime = 0;
+ tune->outputStep = 100;
+
+ if (*vPID->pSV >= *vPID->pPV)
+ {
+ tune->initialStatus = 1;
+ tune->outputStatus = 0;
+ }
+ else
+ {
+ tune->initialStatus = 0;
+ tune->outputStatus = 1;
+ }
+ tune->tuneEnable = 1;
+ tune->preEnable = 0;
+ tune->zeroAcrossCounter = 0;
+ tune->riseLagCounter = 0;
+ tune->fallLagCounter = 0;
+}
+
+/*计算PID参数值*/
+static void calculation_parameters(struct PID_X *self)
+{
+ CLASSIC_AUTOTUNE *tune = &self->tune;
+ CLASSICPID *vPID = &self->pri;
+ float32 kc = 0.0f;
+ float32 tc = 0.0f;
+ float32 zn[3][3] = {{0.5f, 100000.0f, 0.0f}, {0.45f, 0.8f, 0.0f}, {0.6f, 0.5f, 0.125f}};
+
+ tc = (tune->endTime - tune->startTime) * tune->tunePeriod / 1000.0;
+ kc = (8.0f * tune->outputStep) / (PI * (tune->maxPV - tune->minPV));
+
+ vPID->pKp = zn[tune->controllerType][0] * kc; // 比例系数
+ vPID->pKi = vPID->pKp * tune->tunePeriod / (zn[tune->controllerType][1] * tc); // 积分系数
+ vPID->pKd = vPID->pKp * zn[tune->controllerType][2] * tc / tune->tunePeriod; // 微分系数
+}
+
+/**
+ * @brief 自整定函数
+ * @param {PID_X} *self
+ * @return {*}
+ * @note 成员变量tuneEnable、preEnable和controllerType需要提前赋值。tuneEnable变量值为0时是使用PID控制器,而tuneEnable变量值为1时是开启整定过程,当tuneEnable变量值为2时是指示整定失败。preEnable变量在整定前赋值为1,表示先做预处理。而controllerType则根据所整定的控制器的类型来定,主要用于参数的计算。
+ */
+static uint8_t _auto_tune(struct PID_X *self)
+{
+ CLASSIC_AUTOTUNE *tune = &self->tune;
+ CLASSICPID *vPID = &self->pri;
+ /*整定开始前的预处理,只执行一次*/
+ if (tune->preEnable == 1)
+ {
+ tune_pretreatment(self);
+ }
+
+ uint32_t tuneDuration = 0;
+ tune->tuneTimer++;
+ tuneDuration = (tune->tuneTimer * tune->tunePeriod) / 1000;
+ if (tuneDuration > (10 * 60)) // 整定过程持续超过10分钟,未能形成有效振荡,整定失败
+ {
+ tune->tuneEnable = 2;
+ tune->preEnable = 1;
+ return tune->tuneEnable;
+ }
+
+ if (*vPID->pSV >= *vPID->pPV) // 设定值大于测量值,则开执行单元
+ {
+ tune->riseLagCounter++;
+ tune->fallLagCounter = 0;
+
+ if (tune->riseLagCounter > LAG_PHASE)
+ {
+ *vPID->pMV = vPID->max;
+ if (tune->outputStatus == 0)
+ {
+ tune->outputStatus = 1;
+ tune->zeroAcrossCounter++;
+
+ if (tune->zeroAcrossCounter == 3)
+ {
+ tune->startTime = tune->tuneTimer;
+ }
+ }
+ }
+ }
+ else
+ {
+ tune->riseLagCounter = 0;
+ tune->fallLagCounter++;
+
+ if (tune->fallLagCounter > LAG_PHASE)
+ {
+ *vPID->pMV = vPID->min;
+ if (tune->outputStatus == 1)
+ {
+ tune->outputStatus = 0;
+ tune->zeroAcrossCounter++;
+
+ if (tune->zeroAcrossCounter == 3)
+ {
+ tune->startTime = tune->tuneTimer;
+ }
+ }
+ }
+ }
+
+ if (tune->zeroAcrossCounter == 3) // 已经两次过零,可以记录波形数据
+ {
+ if (tune->initialStatus == 1) // 初始设定值大于测量值,则区域3出现最小值
+ {
+ if (*vPID->pPV < tune->minPV)
+ {
+ tune->minPV = *vPID->pPV;
+ }
+ }
+ else if (tune->initialStatus == 0) // 初始设定值小于测量值,则区域3出现最大值
+ {
+ if (*vPID->pPV > tune->maxPV)
+ {
+ tune->maxPV = *vPID->pPV;
+ }
+ }
+ }
+ else if (tune->zeroAcrossCounter == 4) // 已经三次过零,记录另半波的数据
+ {
+ if (tune->initialStatus == 1) // 初始设定值大于测量值,则区域4出现最大值
+ {
+ if (*vPID->pPV > tune->maxPV)
+ {
+ tune->maxPV = *vPID->pPV;
+ }
+ }
+ else if (tune->initialStatus == 0) // 初始设定值小于测量值,则区域4出现最小值
+ {
+ if (*vPID->pPV < tune->minPV)
+ {
+ tune->minPV = *vPID->pPV;
+ }
+ }
+ }
+ else if (tune->zeroAcrossCounter == 5) // 已经四次过零,振荡已形成可以整定参数
+ {
+ calculation_parameters(self);
+
+ tune->tuneEnable = 0;
+ tune->preEnable = 1;
+ }
+
+ return tune->tuneEnable;
+}
+
+void pid_x_constructor(struct PID_X *self)
+{
+ self->PID = _PID;
+ self->AUTO_TUNE = _auto_tune;
+ self->pri.flag = 0;
+ self->pri.out = 0;
+ self->tune.preEnable = 1;
+}
diff --git a/User/system/lib/control/custom/pid_x.h b/User/system/lib/control/custom/pid_x.h
new file mode 100644
index 0000000..2be7c04
--- /dev/null
+++ b/User/system/lib/control/custom/pid_x.h
@@ -0,0 +1,71 @@
+#ifndef __PID_X_H__
+#define __PID_X_H__
+#include "lib.h"
+
+/*定义PID对象类型*/
+typedef struct CLASSIC
+{
+ float32 *pPV; // 测量值指针
+ float32 *pSV; // 设定值指针
+ float32 *pMV; // 输出值指针
+ BOOL *pMA; // 手自动操作指针
+
+ float32 out; // 输出值
+ float32 setpoint; // 设定值
+ float32 lasterror; // 前一拍偏差
+ float32 preverror; // 前两拍偏差
+ float32 max; // 输出值上限
+ float32 min; // 输出值下限
+
+ uint16_t flag; // 状态标志位
+
+ float32 pKp; // 比例系数
+ float32 pKi; // 积分系数
+ float32 pKd; // 微分系数
+
+ float32 nKp; // 比例系数
+ float32 nKi; // 积分系数
+ float32 nKd; // 微分系数
+
+ BOOL direct; // 正反作用
+ BOOL sm; // 设定值平滑
+ BOOL cas; // 串级设定
+ BOOL pac; // 输出防陡变
+ BOOL kd_e; // 微分使能
+} CLASSICPID;
+
+// 定义整定参数
+typedef struct
+{
+ uint8_t tuneEnable : 2; // 整定与PID控制开关,0:PID控制;1:参数整定;2:整定失败
+ uint8_t preEnable : 2; // 预处理使能,在开始整定前置位
+ uint8_t initialStatus : 1; // 记录开始整定前偏差的初始状态
+ uint8_t outputStatus : 1; // 记录输出的初始状态,0允许上升过零计数;1允许下降过零计数
+ uint8_t controllerType : 2; // 控制器类型:0,P控制器;1,PI控制器;2,PID控制器
+
+ uint8_t zeroAcrossCounter; // 过零点计数器,每次输出改变加1,比实际过零次数多1
+ uint8_t riseLagCounter; // 上升迟滞时间计数器
+ uint8_t fallLagCounter; // 下降迟滞时间计数器
+
+ uint16_t tunePeriod; // 整定采样周期
+ uint32_t tuneTimer; // 整定计时器
+ uint32_t startTime; // 记录波形周期起始时间
+ uint32_t endTime; // 记录波形周期结束时间
+
+ float32 outputStep; // 输出阶跃d
+ float32 maxPV; // 振荡波形中测量值的最大值
+ float32 minPV; // 振荡波形中测量值的最小值
+} CLASSIC_AUTOTUNE;
+
+typedef struct PID_X
+{
+ /* 控制接口 */
+ float32 (*PID)(struct PID_X *self, float32 target, float32 feedback);
+ uint8_t (*AUTO_TUNE)(struct PID_X *self);
+ /* private */
+ CLASSICPID pri;
+ CLASSIC_AUTOTUNE tune;
+} pid_x_t;
+
+extern void pid_x_constructor(struct PID_X *self);
+#endif // __PID_X_H__
diff --git a/User/system/lib/control/custom/pid_zh.c b/User/system/lib/control/custom/pid_zh.c
new file mode 100644
index 0000000..2156d3a
--- /dev/null
+++ b/User/system/lib/control/custom/pid_zh.c
@@ -0,0 +1,467 @@
+#include "pid_zh.h"
+#include "sys.h"
+#include
+
+// 定义输出量比例因子
+#ifdef GPS3000
+#define KUP 0.0f // #define KUP 3.0f
+#define KUI 0.00f
+#define KUD 0.0f // #define KUP 3.0f
+#else
+#define KUP 3.0f
+#define KUI 0.0f
+#define KUD 0.0f
+#endif
+
+// 模糊集合
+#define NL -3
+#define NM -2
+#define NS -1
+#define ZE 0
+#define PS 1
+#define PM 2
+#define PL 3
+
+// 定义偏差E的范围,因为设置了非线性区间,误差在10时才开始进行PID调节,这里E的范围为10
+#define MAXE (10)
+#define MINE (-MAXE)
+// 定义EC的范围,因为变化非常缓慢!,每次的EC都非常小,这里可以根据实际需求来调整,
+#define MAXEC (10)
+#define MINEC (-MAXEC)
+// 定义e,ec的量化因子
+#define KE 3 / MAXE
+#define KEC 3 / MAXEC
+
+static const float32 fuzzyRuleKp[7][7] = {
+ PL, PL, PM, PL, PS, PM, PL,
+ PL, PM, PM, PM, PS, PM, PL,
+ PM, PS, PS, PS, PS, PS, PM,
+ PM, PS, ZE, ZE, ZE, PS, PM,
+ PS, PS, PS, PS, PS, PM, PM,
+ PM, PM, PM, PM, PL, PL, PL,
+ PM, PL, PL, PL, PL, PL, PL};
+
+static const float32 fuzzyRuleKi[7][7] = {
+ PL, PL, PL, PL, PM, PL, PL,
+ PL, PL, PM, PM, PM, PL, PL,
+ PM, PM, PS, PS, PS, PM, PM,
+ PM, PS, ZE, ZE, ZE, PS, PM,
+ PM, PS, PS, PS, PS, PM, PM,
+ PM, PM, PS, PM, PM, PL, PL,
+ PM, PL, PM, PL, PL, PL, PL};
+
+/*
+static const float32 fuzzyRuleKi[7][7] = {
+ NL, NL, NL, NL, NM, NL, NL,
+ NL, NL, NM, NM, NM, NL, NL,
+ NM, NM, NS, NS, NS, NM, NM,
+ NM, NS, ZE, ZE, ZE, NS, NM,
+ NM, NS, NS, NS, NS, NM, NM,
+ NM, NM, NS, NM, NM, NL, NL,
+ NM, NL, NM, NL, NL, NL, NL};
+*/
+
+static const float32 fuzzyRuleKd[7][7] = {
+ PS, PS, ZE, ZE, ZE, PL, PL,
+ PS, PS, PS, PS, ZE, PS, PM,
+ PL, PL, PM, PS, ZE, PS, PM,
+ PL, PM, PM, PS, ZE, PS, PM,
+ PL, PM, PS, PS, ZE, PS, PS,
+ PM, PS, PS, PS, ZE, PS, PS,
+ PS, ZE, ZE, ZE, ZE, PL, PL};
+
+/*
+static const float32 fuzzyRuleKp[7][7] = {
+ PL, PL, PM, PM, PS, ZE, ZE,
+ PL, PL, PM, PS, PS, ZE, NS,
+ PM, PM, PM, PS, ZE, NS, NS,
+ PM, PM, PS, ZE, NS, NM, NM,
+ PS, PS, ZE, NS, NS, NM, NM,
+ PS, ZE, NS, NM, NM, NM, NL,
+ ZE, ZE, NM, NM, NM, NL, NL};
+
+static const float32 fuzzyRuleKi[7][7] = {
+ NL, NL, NM, NM, NS, ZE, ZE,
+ NL, NL, NM, NS, NS, ZE, ZE,
+ NL, NM, NS, NS, ZE, PS, PS,
+ NM, NM, NS, ZE, PS, PM, PM,
+ NM, NS, ZE, PS, PS, NM, PL,
+ ZE, ZE, PS, PS, PM, PL, PL,
+ ZE, ZE, PS, PM, PM, PL, PL};
+
+static const float32 fuzzyRuleKd[7][7] = {
+ PS, NS, NL, NL, NL, NM, PS,
+ PS, NS, NL, NM, NM, NS, ZE,
+ ZE, NS, NM, NM, NS, NS, ZE,
+ ZE, NS, NS, NS, NS, NS, ZE,
+
+ ZE, ZE, ZE, ZE, ZE, ZE, ZE,
+ PL, NS, PS, PS, PS, PS, PL,
+ PL, PM, PM, PM, PS, PS, PL};
+*/
+
+static void fuzzy(float32 e, float32 ec, FUZZY_PID_ZH_t *fuzzy_pid)
+{
+
+ float32 etemp, ectemp;
+ float32 eLefttemp, ecLefttemp; // ec,e,左隶属度
+ float32 eRighttemp, ecRighttemp;
+
+ int eLeftIndex, ecLeftIndex; // 模糊位置标号
+ int eRightIndex, ecRightIndex;
+ e = RANGE(e, MINE, MAXE);
+ ec = RANGE(ec, MINEC, MAXEC);
+ e = e * KE;
+ ec = ec * KEC;
+
+ etemp = e > 3.0f ? 0.0f : (e < -3.0f ? 0.0f : (e >= 0.0f ? (e >= 2.0f ? 2.5f : (e >= 1.0f ? 1.5f : 0.5f)) : (e >= -1.0f ? -0.5f : (e >= -2.0f ? -1.5f : (e >= -3.0f ? -2.5f : 0.0f)))));
+ eLeftIndex = (int)((etemp - 0.5f) + 3); //[-3,2] -> [0,5]
+ eRightIndex = (int)((etemp + 0.5f) + 3);
+ eLefttemp = etemp == 0.0f ? 0.0f : ((etemp + 0.5f) - e);
+ eRighttemp = etemp == 0.0f ? 0.0f : (e - (etemp - 0.5f));
+
+ ectemp = ec > 3.0f ? 0.0f : (ec < -3.0f ? 0.0f : (ec >= 0.0f ? (ec >= 2.0f ? 2.5f : (ec >= 1.0f ? 1.5f : 0.5f)) : (ec >= -1.0f ? -0.5f : (ec >= -2.0f ? -1.5f : (ec >= -3.0f ? -2.5f : 0.0f)))));
+ ecLeftIndex = (int)((ectemp - 0.5f) + 3); //[-3,2] -> [0,5]
+ ecRightIndex = (int)((ectemp + 0.5f) + 3);
+ ecLefttemp = ectemp == 0.0f ? 0.0f : ((ectemp + 0.5f) - ec);
+ ecRighttemp = ectemp == 0.0f ? 0.0f : (ec - (ectemp - 0.5f));
+
+ /*************************************反模糊*************************************/
+
+ fuzzy_pid->kp = (eLefttemp * ecLefttemp * fuzzyRuleKp[eLeftIndex][ecLeftIndex] + eLefttemp * ecRighttemp * fuzzyRuleKp[eLeftIndex][ecRightIndex] + eRighttemp * ecLefttemp * fuzzyRuleKp[eRightIndex][ecLeftIndex] + eRighttemp * ecRighttemp * fuzzyRuleKp[eRightIndex][ecRightIndex]);
+
+ fuzzy_pid->ki = (eLefttemp * ecLefttemp * fuzzyRuleKi[eLeftIndex][ecLeftIndex] + eLefttemp * ecRighttemp * fuzzyRuleKi[eLeftIndex][ecRightIndex] + eRighttemp * ecLefttemp * fuzzyRuleKi[eRightIndex][ecLeftIndex] + eRighttemp * ecRighttemp * fuzzyRuleKi[eRightIndex][ecRightIndex]);
+
+ fuzzy_pid->kd = (eLefttemp * ecLefttemp * fuzzyRuleKd[eLeftIndex][ecLeftIndex] + eLefttemp * ecRighttemp * fuzzyRuleKd[eLeftIndex][ecRightIndex] + eRighttemp * ecLefttemp * fuzzyRuleKd[eRightIndex][ecLeftIndex] + eRighttemp * ecRighttemp * fuzzyRuleKd[eRightIndex][ecRightIndex]);
+ // 对解算出的KP,KI,KD进行量化映射
+ fuzzy_pid->kp = fuzzy_pid->kp * fuzzy_pid->kup;
+ fuzzy_pid->ki = fuzzy_pid->ki * fuzzy_pid->kui;
+ fuzzy_pid->kd = fuzzy_pid->kd * fuzzy_pid->kud;
+}
+
+static void smoothSetpoint(struct PID_FUZZY_ZH *self, float32 target_sv)
+{
+#if FUZZY_SUB_TYPE == PID_SUB_TYPE_POSITION
+ pid_zh_position_t *pri = &self->pri;
+#else
+ pid_common_increment_t *pri = &self->pri;
+#endif
+ float32 stepIn = (pri->sv_range) * 0.1f;
+ float32 kFactor = 0.0f;
+ if (fabs(pri->ref - target_sv) <= stepIn)
+ {
+ pri->ref = target_sv;
+ }
+ else
+ {
+ if (pri->ref - target_sv > 0)
+ {
+ kFactor = -1.0f;
+ }
+ else if (pri->ref - target_sv < 0)
+ {
+ kFactor = 1.0f;
+ }
+ else
+ {
+ kFactor = 0.0f;
+ }
+ pri->ref = pri->ref + kFactor * stepIn;
+ }
+}
+
+/*封装模糊接口*/
+static void compensate(float32 e, float32 ec, FUZZY_PID_ZH_t *fuzzy_d)
+{
+ fuzzy(e, ec, fuzzy_d);
+}
+
+/**
+ * @brief 复位PID积分及微分控制数据
+ * @param {PID_FUZZY_ZH} *self
+ * @return {*}
+ */
+static void _restctrl(struct PID_FUZZY_ZH *self)
+{
+ self->pri.pre_error = 0;
+ self->pri.sum_iterm = 0;
+#if INCOMPLETE_DIFFEREN == 1
+ self->pri.lastdev = 0;
+#endif
+}
+
+/**
+ * @brief 更新最大最小值
+ * @param {PID_FUZZY_ZH} *self
+ * @param {float32} out_min
+ * @param {float32} out_max
+ * @return {*}
+ * @note
+ */
+static void _set_range(struct PID_FUZZY_ZH *self, float32 out_min, float32 out_max)
+{
+ self->pri.out_max = out_max;
+ self->pri.out_min = out_min;
+}
+
+/**
+ * @brief 使能积分控制
+ * @param {PID_FUZZY_ZH} *self
+ * @param {BOOL} enable
+ * @return {*}
+ * @note
+ */
+// static void _set_ki_enable(struct PID_FUZZY_ZH *self, BOOL enable)
+// {
+// self->pri.ki_enable = enable;
+// }
+
+/**
+ * @brief 使能微分控制
+ * @param {PID_FUZZY_ZH} *self
+ * @param {BOOL} enable
+ * @return {*}
+ * @note
+ */
+static void _set_kd_enable(struct PID_FUZZY_ZH *self, BOOL enable)
+{
+ self->pri.kd_enable = enable;
+}
+
+/*
+ * Function:使能平滑控制
+ * parameter:*pid需要配,PID参数结构指针,sv_range控制范围sv的范围
+ * return:无
+ */
+static void _set_smooth_enable(struct PID_FUZZY_ZH *self, BOOL enable, float32 sv_range)
+{
+#if FUZZY_SUB_TYPE == PID_SUB_TYPE_POSITION
+ pid_zh_position_t *pri = &self->pri;
+#else
+ pid_common_increment_t *pri = &self->pri;
+#endif
+ pri->sm = enable;
+ pri->sv_range = sv_range;
+}
+
+// 设置控制参数
+static void _set_ctrl_prm(struct PID_FUZZY_ZH *self, float32 kp, float32 ki, float32 kd, float32 err_dead,
+ float32 out_min, float32 out_max)
+{
+ self->open = TRUE;
+ self->fuzzy.kup = KUP;
+ self->fuzzy.kui = KUI;
+ self->fuzzy.kud = KUD;
+#if FUZZY_SUB_TYPE == PID_SUB_TYPE_POSITION
+ pid_zh_position_t *pri = &self->pri;
+ osel_memset((uint8_t *)pri, 0, sizeof(pid_zh_position_t));
+ pri->kp = kp;
+ pri->ki = ki;
+ pri->kd = kd;
+ pri->err_dead = err_dead;
+ pri->out_max = out_max;
+ pri->out_min = out_min;
+ pri->detach = FALSE;
+ pri->sm = FALSE;
+#else
+ pid_common_increment_t *pri = &self->pri;
+ osel_memset((uint8_t *)pri, 0, sizeof(pid_common_increment_t));
+ pri->kp = kp;
+ pri->ki = ki;
+ pri->kd = kd;
+ pri->err_dead = err_dead;
+ pri->out_max = out_max;
+ pri->out_min = out_min;
+#endif
+
+ if (kd > 0)
+ {
+ pri->kd_enable = TRUE;
+ }
+ else
+ {
+ pri->kd_enable = FALSE;
+ }
+}
+
+static void _update_ctrl_prm(struct PID_FUZZY_ZH *self, float32 kp, float32 ki, float32 kd, float32 err_dead,
+ float32 out_min, float32 out_max)
+{
+#if FUZZY_SUB_TYPE == PID_SUB_TYPE_POSITION
+ pid_zh_position_t *pri = &self->pri;
+ pri->kp = kp;
+ pri->ki = ki;
+ pri->kd = kd;
+ pri->err_dead = err_dead;
+ pri->out_max = out_max;
+ pri->out_min = out_min;
+ pri->detach = FALSE;
+ pri->sm = FALSE;
+#else
+ pid_common_increment_t *pri = &self->pri;
+ pri->kp = kp;
+ pri->ki = ki;
+ pri->kd = kd;
+ pri->err_dead = err_dead;
+ pri->out_max = out_max;
+ pri->out_min = out_min;
+#endif
+
+ if (kd > 0)
+ {
+ pri->kd_enable = TRUE;
+ }
+ else
+ {
+ pri->kd_enable = FALSE;
+ }
+}
+
+/**
+ * @brief 非0时配置为积分分离+抗积分饱和PID,否则为普通抗积分饱和PID
+ * @param {PID_FUZZY_ZH} *self
+ * @param {float32} max_err
+ * @param {BOOL} mode
+ * @return {*}
+ */
+static void _set_cfg(struct PID_FUZZY_ZH *self, float32 max_err, BOOL mode)
+{
+ self->pri.err_limit = max_err;
+ self->pri.detach = mode == FALSE ? FALSE : TRUE;
+}
+
+#if FUZZY_SUB_TYPE == PID_SUB_TYPE_POSITION
+static float32 _PID(struct PID_FUZZY_ZH *self, float32 target, float32 feedback)
+{
+ float32 error = 0;
+ float32 insert = 0;
+ float32 ec = 0;
+ float32 kd = 0;
+#if INCOMPLETE_DIFFEREN == 1
+ float32 thisdev = 0;
+#else
+ // float32 dinput = 0.0f;
+#endif
+ float32 temp_iterm = 0.0f;
+ pid_zh_position_t *pri = &self->pri;
+
+ /*获取期望值与实际值,进行偏差计算*/
+ if (pri->sm == 1)
+ {
+ smoothSetpoint(self, target);
+ }
+ else
+ {
+ pri->ref = target;
+ }
+
+ pri->feed_back = feedback;
+ error = pri->ref - pri->feed_back;
+ if (fabs(error) <= pri->err_dead)
+ error = 0;
+
+ /* fuzzy control caculate */
+ ec = error - pri->pre_error;
+ if (self->open == TRUE)
+ {
+ compensate(error, ec, &self->fuzzy);
+ }
+
+ /*根据PID配置的模式,获取积分数据,进行积分累加*/
+ if (pri->out >= pri->out_max)
+ {
+ if (fabs(error) > pri->err_limit && pri->detach)
+ {
+ insert = 0;
+ }
+ else
+ {
+ insert = 1;
+ if (error < 0)
+ {
+ temp_iterm = (pri->ki + self->fuzzy.ki) * error;
+ }
+ }
+ }
+ else if (pri->out <= pri->out_min)
+ {
+ if (fabs(error) > pri->err_limit && pri->detach)
+ {
+ insert = 0;
+ }
+ else
+ {
+ insert = 1;
+ if (error > 0)
+ {
+ temp_iterm = (pri->ki + self->fuzzy.ki) * error;
+ }
+ }
+ }
+ else
+ {
+ if (fabs(error) > pri->err_limit && pri->detach)
+ {
+ insert = 0;
+ }
+ else
+ {
+ insert = 1;
+ temp_iterm = (pri->ki + self->fuzzy.ki) * error;
+ }
+ }
+ pri->sum_iterm += temp_iterm;
+ /* limt integral */
+ pri->sum_iterm = RANGE(pri->sum_iterm, pri->out_min, pri->out_max);
+ /*
+ if (pri->sum_ref)
+ pri->sum_iterm = RANGE(pri->sum_iterm, pri->sum_ref - 1.0f, pri->sum_ref + 1.0f);
+ else
+ pri->sum_iterm = RANGE(pri->sum_iterm, pri->out_min, pri->out_max);
+ */
+#if INCOMPLETE_DIFFEREN == 1
+ /*不完全微分*/
+ thisdev = (pri->kd + self->fuzzy.kd) * (1.0 - pri->alpha) * (error - pri->pre_error) + pri->alpha * pri->lastdev;
+ /*caculate pid out*/
+ pri->out = (pri->kp + self->fuzzy.kp) * error + pri->sum_iterm * insert + thisdev;
+
+ /*record last dev result*/
+ pri->lastdev = thisdev;
+#else
+
+ if (pri->kd_enable == TRUE)
+ {
+ kd = pri->kd + self->fuzzy.kd;
+ }
+ else
+ {
+ kd = 0;
+ }
+
+ pri->out = (pri->kp + self->fuzzy.kp) * error + pri->sum_iterm * insert + (error - pri->pre_error) * (kd);
+ // pri->out += pri->sum_ref;
+
+#endif
+
+ pri->pre_error = error;
+ /*record last feedback sensor result*/
+ pri->pre_feed_back = pri->feed_back;
+ /*limt pid output*/
+ pri->out = RANGE(pri->out, pri->out_min, pri->out_max);
+ return pri->out;
+}
+#else
+#endif
+
+void pid_zh_constructor(struct PID_FUZZY_ZH *self)
+{
+ self->set_ctrl_prm = _set_ctrl_prm;
+ self->update_ctrl_prm = _update_ctrl_prm;
+ self->set_cfg = _set_cfg;
+ self->set_smooth_enable = _set_smooth_enable;
+ // self->set_ki_enable = _set_ki_enable;
+ self->set_kd_enable = _set_kd_enable;
+ self->set_range = _set_range;
+ self->restctrl = _restctrl;
+ self->PID = _PID;
+}
diff --git a/User/system/lib/control/custom/pid_zh.h b/User/system/lib/control/custom/pid_zh.h
new file mode 100644
index 0000000..06f551a
--- /dev/null
+++ b/User/system/lib/control/custom/pid_zh.h
@@ -0,0 +1,73 @@
+#ifndef __PID_ZH_H__
+#define __PID_ZH_H__
+#include "lib.h"
+#include "pid_auto_tune.h"
+
+#define GPS2000
+
+typedef struct
+{
+ float32 ref;
+ float32 feed_back;
+ float32 pre_feed_back;
+ float32 pre_error;
+ float32 sum_ref;
+ float32 sum_iterm;
+ float32 kp;
+ float32 ki;
+ float32 kd;
+ float32 err_limit;
+ BOOL detach;
+ float32 err_dead;
+#if INCOMPLETE_DIFFEREN == 1
+ float32 alpha;
+ float32 lastdev;
+#endif
+ float32 out;
+ float32 out_max;
+ float32 out_min;
+ float32 sv_range;
+ BOOL sm;
+ BOOL ki_enable;
+ BOOL kd_enable;
+} pid_zh_position_t; // 位置式PID
+
+typedef struct
+{
+ float32 kp;
+ float32 ki;
+ float32 kd;
+
+ float32 kup;
+ float32 kui;
+ float32 kud;
+} FUZZY_PID_ZH_t;
+
+// 模糊PID
+typedef struct PID_FUZZY_ZH
+{
+ /* 设置PID三个参数 */
+ void (*set_ctrl_prm)(struct PID_FUZZY_ZH *self, float32 kp, float32 ki, float32 kd, float32 err_dead,
+ float32 out_min, float32 out_max); // 设置PID参数
+ void (*update_ctrl_prm)(struct PID_FUZZY_ZH *self, float32 kp, float32 ki, float32 kd, float32 err_dead,
+ float32 out_min, float32 out_max); // 更新PID参数
+ void (*set_range)(struct PID_FUZZY_ZH *self, float32 out_min, float32 out_max); // 更新最大最小值
+ void (*set_cfg)(struct PID_FUZZY_ZH *self, float32 max_err, BOOL mode); // 配置PID模式,默认不使用积分分离
+ void (*set_smooth_enable)(struct PID_FUZZY_ZH *self, BOOL enable, float32 sv_range); // 设置平滑范围
+ // void (*set_ki_enable)(struct PID_FUZZY *self, BOOL enable);
+ // 微分开启使能
+ void (*set_kd_enable)(struct PID_FUZZY_ZH *self, BOOL enable);
+ void (*restctrl)(struct PID_FUZZY_ZH *self); // 复位PID积分及微分控制数据
+ /* 控制接口 */
+ float32 (*PID)(struct PID_FUZZY_ZH *self, float32 target, float32 feedback);
+
+ pid_zh_position_t pri;
+
+ BOOL open; // 是否使用模糊PID控制
+
+ FUZZY_PID_ZH_t fuzzy;
+
+} pid_zh_t; // 模糊PID
+
+extern void pid_zh_constructor(struct PID_FUZZY_ZH *self);
+#endif
diff --git a/User/system/lib/control/custom/pid_zh1.c b/User/system/lib/control/custom/pid_zh1.c
new file mode 100644
index 0000000..977f169
--- /dev/null
+++ b/User/system/lib/control/custom/pid_zh1.c
@@ -0,0 +1,619 @@
+
+#include
+#include "pid_zh1.h"
+
+// 定义输出量比例因子
+#define KUP 1.0f
+#define KUI 1.0f
+#define KUD 1.0f
+
+// 模糊集合
+#define NL -3
+#define NM -2
+#define NS -1
+#define ZE 0
+#define PS 1
+#define PM 2
+#define PL 3
+
+// 定义偏差E的范围,因为设置了非线性区间,误差在10时才开始进行PID调节,这里E的范围为10
+#define MAXE (10)
+#define MINE (-MAXE)
+// 定义EC的范围,因为变化非常缓慢!,每次的EC都非常小,这里可以根据实际需求来调整,
+#define MAXEC (10)
+#define MINEC (-MAXEC)
+// 定义e,ec的量化因子
+#define KE 3 / MAXE
+#define KEC 3 / MAXEC
+/*
+static const float fuzzyRuleKp[7][7] = {
+ PL, PL, PM, PL, PS, PM, PL,
+ PL, PM, PM, PM, PS, PM, PL,
+ PM, PS, PS, PS, PS, PS, PM,
+ PM, PS, ZE, ZE, ZE, PS, PM,
+ PS, PS, PS, PS, PS, PM, PM,
+ PM, PM, PM, PM, PL, PL, PL,
+ PM, PL, PL, PL, PL, PL, PL};
+
+static const float fuzzyRuleKi[7][7] = {
+ PL, PL, PL, PL, PM, PL, PL,
+ PL, PL, PM, PM, PM, PL, PL,
+ PM, PM, PS, PS, PS, PM, PM,
+ PM, PS, ZE, ZE, ZE, PS, PM,
+ PM, PS, PS, PS, PS, PM, PM,
+ PM, PM, PS, PM, PM, PL, PL,
+ PM, PL, PM, PL, PL, PL, PL};
+
+static const float fuzzyRuleKd[7][7] = {
+ PS, PS, ZE, ZE, ZE, PL, PL,
+ PS, PS, PS, PS, ZE, PS, PM,
+ PL, PL, PM, PS, ZE, PS, PM,
+ PL, PM, PM, PS, ZE, PS, PM,
+ PL, PM, PS, PS, ZE, PS, PS,
+ PM, PS, PS, PS, ZE, PS, PS,
+ PS, ZE, ZE, ZE, ZE, PL, PL};
+*/
+static const float fuzzyRuleKp[7][7] = {
+ PL, PL, PM, PL, PS, PM, PL,
+ PL, PM, PM, PM, PS, PM, PL,
+ PM, PS, PS, PS, PS, PS, PM,
+ PM, PS, ZE, ZE, ZE, PS, PM,
+ PS, PS, PS, PS, PS, PM, PM,
+ PM, PM, PM, PM, PL, PL, PL,
+ PM, PL, PL, PL, PL, PL, PL};
+
+static const float fuzzyRuleKi[7][7] = {
+ PL, PL, PL, PL, PM, PL, PL,
+ PL, PL, PM, PM, PM, PL, PL,
+ PM, PM, PS, PS, PS, PM, PM,
+ PM, PS, ZE, ZE, ZE, PS, PM,
+ PM, PS, PS, PS, PS, PM, PM,
+ PM, PM, PS, PM, PM, PL, PL,
+ PM, PL, PM, PL, PL, PL, PL};
+
+static const float fuzzyRuleKd[7][7] = {
+ PS, PS, ZE, ZE, ZE, PL, PL,
+ PS, PS, PS, PS, ZE, PS, PM,
+ PL, PL, PM, PS, ZE, PS, PM,
+ PL, PM, PM, PS, ZE, PS, PM,
+ PL, PM, PS, PS, ZE, PS, PS,
+ PM, PS, PS, PS, ZE, PS, PS,
+ PS, ZE, ZE, ZE, ZE, PL, PL};
+
+static void fuzzy(float e, float ec, fuzzy_pid_t *fuzzy_pid)
+{
+
+ float etemp, ectemp;
+ float eLefttemp, ecLefttemp; // 左隶属度
+ float eRighttemp, ecRighttemp; // 右隶属度
+
+ int eLeftIndex, ecLeftIndex; // 模糊位置标号
+ int eRightIndex, ecRightIndex;
+ e = RANGE(e, MINE, MAXE);
+ ec = RANGE(ec, MINEC, MAXEC);
+ e = e * KE;
+ ec = ec * KEC;
+
+ etemp = e > 3.0f ? 0.0f : (e < -3.0f ? 0.0f : (e >= 0.0f ? (e >= 2.0f ? 2.5f : (e >= 1.0f ? 1.5f : 0.5f)) : (e >= -1.0f ? -0.5f : (e >= -2.0f ? -1.5f : (e >= -3.0f ? -2.5f : 0.0f)))));
+ eLeftIndex = (int)((etemp - 0.5f) + 3);
+ eRightIndex = (int)((etemp + 0.5f) + 3);
+ eLefttemp = etemp == 0.0f ? 0.0f : ((etemp + 0.5f) - e);
+ eRighttemp = etemp == 0.0f ? 0.0f : (e - (etemp - 0.5f));
+
+ ectemp = ec > 3.0f ? 0.0f : (ec < -3.0f ? 0.0f : (ec >= 0.0f ? (ec >= 2.0f ? 2.5f : (ec >= 1.0f ? 1.5f : 0.5f)) : (ec >= -1.0f ? -0.5f : (ec >= -2.0f ? -1.5f : (ec >= -3.0f ? -2.5f : 0.0f)))));
+ ecLeftIndex = (int)((ectemp - 0.5f) + 3);
+ ecRightIndex = (int)((ectemp + 0.5f) + 3);
+ ecLefttemp = ectemp == 0.0f ? 0.0f : ((ectemp + 0.5f) - ec);
+ ecRighttemp = ectemp == 0.0f ? 0.0f : (ec - (ectemp - 0.5f));
+
+ /*************************************反模糊*************************************/
+
+ fuzzy_pid->kp = (eLefttemp * ecLefttemp * fuzzyRuleKp[eLeftIndex][ecLeftIndex] + eLefttemp * ecRighttemp * fuzzyRuleKp[eLeftIndex][ecRightIndex] + eRighttemp * ecLefttemp * fuzzyRuleKp[eRightIndex][ecLeftIndex] + eRighttemp * ecRighttemp * fuzzyRuleKp[eRightIndex][ecRightIndex]);
+
+ fuzzy_pid->ki = (eLefttemp * ecLefttemp * fuzzyRuleKi[eLeftIndex][ecLeftIndex] + eLefttemp * ecRighttemp * fuzzyRuleKi[eLeftIndex][ecRightIndex] + eRighttemp * ecLefttemp * fuzzyRuleKi[eRightIndex][ecLeftIndex] + eRighttemp * ecRighttemp * fuzzyRuleKi[eRightIndex][ecRightIndex]);
+
+ fuzzy_pid->kd = (eLefttemp * ecLefttemp * fuzzyRuleKd[eLeftIndex][ecLeftIndex] + eLefttemp * ecRighttemp * fuzzyRuleKd[eLeftIndex][ecRightIndex] + eRighttemp * ecLefttemp * fuzzyRuleKd[eRightIndex][ecLeftIndex] + eRighttemp * ecRighttemp * fuzzyRuleKd[eRightIndex][ecRightIndex]);
+ // 对解算出的KP,KI,KD进行量化映射
+ fuzzy_pid->kp = fuzzy_pid->kp * fuzzy_pid->kup;
+ fuzzy_pid->ki = fuzzy_pid->ki * fuzzy_pid->kui;
+ fuzzy_pid->kd = fuzzy_pid->kd * fuzzy_pid->kud;
+}
+
+static void smooth_init(smart_pid_t *pid, BOOL sm_open, float maxTarget)
+{
+ if (!pid)
+ return;
+
+ pid->sm_open = sm_open;
+ pid->maxTarget = maxTarget;
+}
+
+static void smooth_target(smart_pid_t *pid, float *target)
+{
+
+ if ((!pid) || (!target))
+ return;
+
+ if (!pid->maxTarget)
+ return;
+
+ float sm_step = (pid->maxTarget) * 0.1f;
+ float k = 0.0f;
+
+ if (fabs(pid->target - *target) <= sm_step)
+ {
+ pid->target = *target;
+ }
+ else
+ {
+ if (pid->target - *target > 0)
+ {
+ k = -1.0f;
+ }
+ else if (pid->target - *target < 0)
+ {
+ k = 1.0f;
+ }
+ else
+ {
+ k = 0.0f;
+ }
+ pid->target += k * sm_step;
+ }
+}
+
+static void smart_pid_init(smart_pid_t *pid, float *duty, float *kp, float *ki, float *kd, float *errorDead, float *iDetachCondation, float *maxOut)
+{
+ if ((!pid) || (!duty) || (!kp) || (!ki) || (!kd) || (!iDetachCondation) || (!maxOut))
+ return;
+
+ pid->duty = *duty;
+ pid->kp = *kp;
+ pid->ki = *ki;
+ pid->kd = *kd;
+ pid->errorDead = *errorDead;
+ pid->iDetachCondation = *iDetachCondation;
+ pid->maxOutput = *maxOut;
+}
+
+void cascade_pid_init(cascade_pid_t *pid, smart_pid_t *pid_outer, smart_pid_t *pid_inner)
+{
+
+ smooth_init(&pid->outer, pid_outer->sm_open, pid_outer->maxTarget);
+ smooth_init(&pid->inner, pid_inner->sm_open, pid_inner->maxTarget);
+
+ smart_pid_init(&pid->outer, &pid_outer->duty, &pid_outer->kp, &pid_outer->ki, &pid_outer->kd, &pid_outer->errorDead, &pid_outer->iDetachCondation, &pid_outer->maxOutput);
+ smart_pid_init(&pid->inner, &pid_inner->duty, &pid_inner->kp, &pid_inner->ki, &pid_inner->kd, &pid_inner->errorDead, &pid_inner->iDetachCondation, &pid_inner->maxOutput);
+}
+
+void smart_pid_calc(smart_pid_t *pid, float *target, float *feedback)
+{
+ // 将旧error存起来
+ pid->lastError = pid->error;
+ // 平滑处理目标值
+ if (pid->sm_open == TRUE)
+ smooth_target(pid, target);
+ else
+ pid->target = *target;
+ // 计算新error
+ pid->error = pid->target - *feedback;
+ if (fabs(pid->error) <= pid->errorDead)
+ pid->error = 0.0f;
+ // 计算误差变化
+ pid->dError = pid->error - pid->lastError;
+ // 选用模糊规则
+ if (pid->fuzzy_open == TRUE)
+ {
+ fuzzy(pid->error, pid->dError, &pid->fuzzy_pid);
+ }
+ // 计算微分
+ float dout = pid->dError * (pid->kd + pid->fuzzy_pid.kd);
+ // 计算比例
+ float pout = pid->error * (pid->kp + pid->fuzzy_pid.kp);
+ // 积分分离
+ if (fabs(pid->error) <= pid->iDetachCondation)
+ {
+ pid->integral += pid->error * (pid->ki + pid->fuzzy_pid.ki);
+ pid->iDetach = FALSE;
+ }
+ else
+ {
+ pid->iDetach = TRUE;
+ pid->integral = 0;
+ }
+ // 积分限幅
+ if (pid->integral > pid->maxOutput)
+ pid->integral = pid->maxOutput;
+ else if (pid->integral < -pid->maxOutput)
+ pid->integral = -pid->maxOutput;
+ // 计算输出
+ pid->output = pout + dout + pid->integral * (!pid->iDetach);
+ // 输出限幅
+ if (pid->output > pid->maxOutput)
+ pid->output = pid->maxOutput;
+ else if (pid->output < -pid->maxOutput)
+ pid->output = -pid->maxOutput;
+}
+
+void cascade_pid_calc(struct CascadePID *pid, float *outerRef, float *outerFdb, float *innerFdb)
+{
+ // 外环位置控制
+ smart_pid_calc(&pid->cascade_pid.outer, outerRef, outerFdb);
+ // 内环速度控制
+ smart_pid_calc(&pid->cascade_pid.inner, &pid->cascade_pid.outer.output, innerFdb);
+ // 内环输出就是串级PID的输出
+ // pid->cascade_pid.output = pid->cascade_pid.inner.output;
+ pid->cascade_pid.output = pid->cascade_pid.outer.output;
+}
+
+void pid_zh_constructor1(struct CascadePID *pid)
+{
+ pid->smart_pid_init = smart_pid_init;
+ pid->smart_pid_calc = smart_pid_calc;
+ pid->cascade_pid_init = cascade_pid_init;
+ pid->cascade_pid_calc = cascade_pid_calc;
+}
+
+/*
+典型输入信号
+L[1] -> 1/s
+L[t] -> 1/s^2
+L[1/2t^2] -> 1/s^3
+系统传递函数
+G(s) = k/(TS+1)
+G(s) = k/S^i(TS+1)
+i = 0 0型系统 i = 1 I 型系统 I = 2 II 型系统
+系统开环传递函数: G(s)
+系统闭环传递函数: G闭(s) = G(s) / 1 + G(s)
+系统静差: R(s) = 1/1+G(s)
+终值定理:limf(t) = lim s*G(s)
+ t->无穷 s->0
+o型系统,单位输入:r/s
+ e = lim f(t) = lim s*G(s) = G(s) = k/1+G(s) = k/ 1 + (Ts+1+k)..
+ t->无穷 s->0 s->0 s->0 = s->0
+*系统误差有给定和扰动引起的
+*线性系统符合叠加原理
+*动态性能指标
+超调 、过度过程时间、上升时间 tr 延迟时间 td 峰值指标tp
+误差积分指标大 好小 好?
+典型二阶系统
+G(s) = 1/ s^2 *(2ξwn)s + wn^2
+ξ:阻尼系统
+wn = 1/T:震荡频率
+如果有一个极点和零点很接近,可以忽略该极点。
+主导极点用二阶系统定义的
+开环传递函数 K T
+复变函数
+频率特性
+阻容RC电路 一阶低通滤波器 一阶惰性系统
+Gs = 1/Ts+1
+正弦稳态
+
+控制系统设计依据:
+考虑到被控对象包含 弹簧储能、填料阻尼、EPM气压控制等主导环节,忽略其它非主导惯性、阻尼环节,将被控系统模型归纳为典型二阶阻尼震荡系统:
+被控对象开环传递函数:G(s) = wn^2/ s*( s + 2ξwn)
+未加控制器被控对象闭环传递函数:G(s) = wn^2/ (s^2 + (2ξwn)s + wn^2)
+ ξ :为系统阻尼比。跟阀座填料材、压力正相关(忽略其他非主导阻尼环节)
+ Wn :无阻尼自然震荡角频率。跟弹簧的固有振荡频率正相关(忽略其他非主导惯性环节)
+
+阀杆填料阻尼比: 0 < ξ < 1
+
+系统特征方程s^2 + (2ξwn)s + wn^2 = 0 时,有两个共轭复根,要想系统稳定,根的实部要远离虚轴,且在允许情况下,越远越稳定。
+标准二阶系统是零型系统,存在静差。而且,考虑气体压缩比大,导致系统的惯性环节增大。
+因此需要控制器将系统变为I型系统来消除静差(增加积分环节),而且需要在控制器传递函数的零点增加最小项来克服系统的大惯性(增加微分环节)。因此,设计控制器类型为PID控制器。
+
+※ 难点在于系统的无阻尼自然震荡角频率和阀座阻尼系数无法准确获得,整定算法计算的特性参数不一定合理。
+※ 另一个难点在于EPM本身的控制特性线性度差,会导致控制器的矫正环节达不到理想效果或在部分区间达不到理想效果,因此,
+ 系统会不稳定或在部分区间不稳定。
+※ EMP本身的控制线性度差,通过控制器弥补EPM性能的不足。
+(因为阀杆速度变化快慢,直接由EPM IP开度大小决定,因此考虑增加阀杆速度环控制来弥补EPM本身的不足)
+
+算法核心原理说明 :
+核心算法: PID
+ u(t) = k*(e(t) +∫e(t)dt + de(t)dt)
+ u(n) = k*(e(n) + ∑e(n)/Ti + Td*(e(n) - e(n-1)))
+
+位置控制:PID + PD控制
+ 误差在[-5%,5%] 内 PID 控制,控制静差 < 0.3%
+ 误差在[-100%,5%] 或 [5%,100%] 时,PD控制,防止积分引起的系统不稳定
+
+ 积分分离:当误差<= 5% 时,加入积分
+ 当误差> 5%时,积分分离、积分项清零
+ 积分限幅:
+ 当积分项 >= 100% 积分项 = 100%
+ 当积分项 <= -100% 积分项 = -100%
+
+整定算法: 继电反馈整定
+ 设定目标位置:额定行程 60%
+ 控制初始位置: < 60%
+ 施加最大控制量 ->检测实时位置->过零,计t0、上冲峰值 -> 施加最小控制量 -> 检测实时位置 -> 过零,计t1、下冲峰值— ↓
+ ↑ <—————————————————————————————————————————————————————————————————————————————————————————————————|
+
+ 循环三次,记录系统稳态下波峰、波谷,和震荡周期Tu
+ 计算: Ku = (控制量最大值 - 控制量最小值)/ (位置波峰 - 位置波谷)
+ 查表:Kp = 0.8 * Ku
+ Ti = 0.6 * Tu
+ Td = 0.125 * Tu
+ Ki = Kp / Ti = Kp / (0.6 * Tu)
+ Kd = Kp * Td = Kp * 0.125 * Td
+
+速度控制算法:
+ s1:初始位置AD值
+ s2:单位时间位置移动后AD值
+ v1:当前速度
+ v2: 前速度
+ v: 实时速度
+a:实时加速度
+t: 速度计算周期
+v = (s2 - s1) / t
+a = (v2 - v1) / t
+
+ 整定过程,分别整定上升过程平均速度和下降过程平均速度。
+ 分别以上升和下降速度为PID 内环参考速度,计算速度控制量。
+ 速度偏差 = 当前速度 - 参考速度
+ 加速度 = 速度偏差变化(即位置的二阶导数)
+速度控制量 = Kp*速度偏差 + Ki * ∑速度偏差 + Kd * 加速度
+
+串级控制
+ 外环位置检测,进行速度控制
+ 内环速度检测,进行位置控制
+ 位置偏差 = 位置给定 - 位置反馈
+ 位置偏差变化 = 位置偏差 - 上次位置偏差
+ 速度控制量 = Kp1*位置偏差 + Ki1 * ∑位置偏差 + Kd1 * 位置偏差变化
+ 速度偏差 = 速度控制量 - 速度反馈
+ 速度偏差变化 = 速度偏差 - 上次速度偏差
+ 位置控制量 = Kp2*速度偏差 + Ki2 * ∑速度偏差 + Kd2 * 速度偏差变化
+串级速度整定:???
+
+automatic control theory
+control system
+linear and nonlinear system
+线性连续系统
+离散系统
+modelling
+analysis
+矫正
+分析 时域分析方法 微分方程 传递函数 一阶系统 二阶系统
+频域分析方法 闭环特性 低频特性 高频特性
+根轨迹
+建模 分析 矫正
+离散系统
+非线性控制理论
+L变换 Z变换
+采样控制系统 数字控制系统
+条件稳定系统
+problems
+time consuming
+行列式计算
+相对稳定性
+劳斯准则只能判断系统是否稳定,不能判断稳定程度
+伯德图
+nyquist 图
+相位裕度
+闭环特征方程的根闭,开环增益0到无穷 特征方程根的变化规律
+root locus
+单位负反馈
+G(s) = k/s(s+1)
+复角条件复值条件
+渐近线与实轴交点
+出射角p-n/n-m
+
+lambda
+大纯滞后
+积分对象
+lambda
+纯滞后 tao/t
+斯密斯预估 闭环传递函数 整定方法
+阶跃响应 鲁棒性 积分过程 输入干扰
+执行机构偏离,不确定不准确,调整速度
+PI 为主 D
+两自由度PID 比例积分先行
+鲁棒性 性能不完全微分
+负载扰
+
+makefile 工作原理:
+1、可执行文件生成过程:预处理->编译->链接
+#source object target
+SRC := *.c
+OBJ := *.o
+TARGET := mqtt_test
+
+#compile library include
+CC := cc
+LIB:= -lpthread
+LDFLAG := -L. libmosquitto.so
+CFLAG :=
+CXXFLAG :=
+#link
+$(TARGET):$(OBJ)
+ $(CC) -o $(TARGET) $(BOJ) $(LIB) $(LDFLAG)
+ $(CC) -o $@ $^ $(LIB) $(LDFLAG)
+$(OBJ):$(SRC)
+ $(CC) -c $(SRC)
+#all
+all:$(TARGET)
+ $(CC) -o $(TARGET) $(SRC) $(LIB) $(LDFLAG)
+#clean
+clean:
+ rm -rf *.o $(TARGET)
+*/
+// ————————————————————————————————————
+
+/*
+typedef struct
+{
+ int argc;
+ char **argv;
+ int sock;
+}st_app_param;
+
+const char *g_version = "V1.0.0 24.08.16";
+int child_mian_ini()
+{
+ int i_re;
+ i_re = gw_support_init();
+ if(i_re < 0)
+ {
+ printf("解析支持文件错误.\n");
+ return -1;
+ }
+
+ i_re = gw_config_init();
+ if(i_re < 0)
+ {
+ printf("解析配置文件错误.\n");
+ return -1;
+ }
+
+ i_re = gw_data_init();
+ if(i_re < 0)
+ {
+ printf("数据初始化错误.\n");
+ return -1;
+ }
+
+ i_re = gw_modol_init();
+ if(i_re < 0)
+ {
+ printf("解析模型文件错误.\n");
+ return -1;
+ }
+
+ i_re = gw_stat_init();
+ if(i_re < 0)
+ {
+ printf("数据统计初始化错误.\n");
+ return -1;
+ }
+
+ i_re = gw_process_init();
+ if(i_re < 0)
+ {
+ printf("规约初始化错误.\n");
+ return -1;
+ }
+
+ i_re = gw_manage_init();
+ if(i_re < 0)
+ {
+ printf("界面通讯初始化错误.\n");
+ return -1;
+ }
+
+
+ pthread_create(tid,thread_task1,p_param);
+
+ while(1)
+ {
+ get_sys_time();
+ sleep(1);
+ }
+}
+
+int child_main(int argc,char **argv)
+{
+
+ if((argc == 2)&&(strcasecmp(argv[1],"-version") == 0))
+ {
+ printf("version [%s]",g_version);
+ }
+
+ child_mian_ini();
+
+}
+
+static int run_child_process_thread((void *)param)
+{
+ st_app_param *p_param;
+
+ p_param = param;
+ chlid_main(p_parm->argc,p_param->argv);
+}
+
+static int run_child_process(int argc,char **argv,int sock)
+{
+ int i_re;
+ pthread_t *tid;
+ st_app_param p_param;
+
+ p_param.argc = argc;
+ p_param.argv = argv;
+ p_param.sock = sock;
+
+ pthread_creat(tid,run_child_process_thread,(void *)p_param);
+ i_re = recv(sock,..,0);//阻塞接收
+ send(sock,'q',0);
+}
+
+int main(int argc,char**argv)
+{
+ int i_re,fd,pid;
+ char lock_file[16];
+ socketpair sockpaire[2];
+
+ sprintf(lock_file,"%s.lock",argv[0]);
+
+ fd = open(lock_file,_O_WRONLY|_EXC,0777);
+ if(fd < 0)
+ {
+ printf("应用:[%s]已运行.\n",argv[0]);
+ return 0;
+ }
+
+ sockpaire[0] = -1;
+
+ while(1)
+ {
+ i_re = socketpaire(sockpaire,AN_UNIX,..);
+ if(i_re < 0)
+ {
+ printf("[%d]创建sockpaire失败.\n",getpid());
+ return 0;
+ }
+
+ pid = fork();
+
+ if(pid < 0)
+ {
+ printf("[%d]创建进程失败.\n",getpid());
+ close(sockpaire[0]);
+ sockpaire[0] = -1
+ close(sockpaire[1]);
+ return 0;
+ }
+
+ if(pid == 0)//child process
+ {
+ close(sockpair[0]);
+ return run_child_process(argc,argv,sockpair[1]);
+ }
+
+ printf("[%d]创建子进程成功.\n",getpid());
+ close(sockpair[1]);
+ while(1)//father process
+ {
+ i_re = recv(sockpaire[0],....,0);//阻塞接收
+ if(i_re <= 0)
+ {
+ //连接中断,重连
+ sockpaire[0] = -1;
+ break;
+ }
+ else
+ {
+ //正常退出
+ goto EXIT:
+ }
+ }
+
+EXIT:
+ //退出操作
+ if(sockpaire[0] == -1)
+ {
+ //有子进程,关闭子进程
+ }
+ close(fd);
+ unlink(file_lock);
+ }
+}
+*/
diff --git a/User/system/lib/control/custom/pid_zh1.h b/User/system/lib/control/custom/pid_zh1.h
new file mode 100644
index 0000000..addfbe8
--- /dev/null
+++ b/User/system/lib/control/custom/pid_zh1.h
@@ -0,0 +1,63 @@
+/*
+ * @Author: 张小明 zxm5337@163.com
+ * @Date: 2024-06-25 10:26:36
+ * @LastEditors: DaMingSY zxm5337@163.com
+ * @LastEditTime: 2024-09-03 09:19:23
+ * @FilePath: \controller-v2\User\lib\control\custom\cascade_pid_zh.h
+ * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
+ */
+#ifndef __CASCADE_PID_ZH__
+#define __CASCADE_PID_ZH__
+
+#include "data_type_def.h"
+
+typedef enum
+{
+ TARGET_DIR_ADD,
+ TARGET_DIR_SUB,
+} target_dir_e;
+
+typedef struct
+{
+ float kp;
+ float ki;
+ float kd;
+
+ float kup;
+ float kui;
+ float kud;
+} fuzzy_pid_t;
+
+typedef struct
+{
+ BOOL iDetach, sm_open, fuzzy_open;
+ float feedBack;
+ float target, maxTarget;
+ float duty, kp, ki, kd;
+ float error, dError, lastError, errorDead;
+ float integral, iDetachCondation;
+ float output, maxOutput;
+ fuzzy_pid_t fuzzy_pid;
+} smart_pid_t;
+
+typedef struct
+{
+ smart_pid_t inner;
+ smart_pid_t outer;
+ float output;
+} cascade_pid_t;
+
+typedef struct CascadePID
+{
+ void (*smart_pid_init)(smart_pid_t *pid, float *duty, float *kp, float *ki, float *kd, float *errorDead, float *iDetachCondation, float *maxOut);
+ void (*cascade_pid_init)(cascade_pid_t *pid, smart_pid_t *pid_outer, smart_pid_t *pid_inner);
+ void (*smart_pid_calc)(smart_pid_t *pid, float *target, float *feedback);
+ void (*cascade_pid_calc)(struct CascadePID *pid, float *outerRef, float *outerFdb, float *innerFdb);
+
+ smart_pid_t smart_pid;
+ cascade_pid_t cascade_pid;
+} pid_zh1_t; // PID_t;
+
+extern void pid_zh_constructor1(struct CascadePID *pid);
+
+#endif
diff --git a/User/system/lib/control/custom/独立PID算法开发.md b/User/system/lib/control/custom/独立PID算法开发.md
new file mode 100644
index 0000000..7d32003
--- /dev/null
+++ b/User/system/lib/control/custom/独立PID算法开发.md
@@ -0,0 +1,26 @@
+# 架构
+|文件|路径| 说明
|
+|:--|:--|:--|
+|pid|User\lib\control\src|PID算法模块|
+|execute|User\application\src|执行器|
+|app_flow|User|任务流程控制|
+
+## APP_FLOW任务流程控制
+> adjust_inspection 中在没有检测到调试信号时执行execute_dac,EXECUTE_PLAN定义了需要执行的算法任务计划
+
+## PID算法模块
+文件内容:
+|文件| 说明
|
+|:--|:--|
+|pid.c|构造算法的入口|
+|pid_common.c|普通算法|
+|pid_neural.c|神经网络算法|
+|pid_fuzzy.c|模糊算法|
+
+custom 目录下为各自算法实现
+
+
+## EXECUTE执行器
+> execute_pid_init中定义了初始化参数
+> execute_dac中定义了执行器
+
diff --git a/User/lib/control/inc/pid.h b/User/system/lib/control/inc/pid.h
similarity index 91%
rename from User/lib/control/inc/pid.h
rename to User/system/lib/control/inc/pid.h
index 87b828c..dfe5d1a 100644
--- a/User/lib/control/inc/pid.h
+++ b/User/system/lib/control/inc/pid.h
@@ -1,9 +1,17 @@
#ifndef __PID_H__
#define __PID_H__
#include "lib.h"
+
#include "pid_auto_tune.h"
-#define INCOMPLETE_DIFFEREN 0 // 不完全微分
+#include "pid_c.h"
+#include "pid_g.h"
+#include "pid_x.h"
+#include "pid_zh.h"
+#include "pid_zh1.h"
+#include "pid_hd.h"
+
+#define INCOMPLETE_DIFFEREN 1 // 不完全微分
typedef enum
{
@@ -54,6 +62,7 @@ typedef struct
float32 err_limit;
BOOL detach;
float32 err_dead;
+ // 不完全微分方式在微分环节采用了低通滤波有效地提高了微分项的特性。其中α的取值是一个0~1之间的数。两个极限值,在0时其实就是没有滤波的普通微分环节;而取1时,则没有微分作用。所以α的取值对不完全微分的效果是至关重要的,一般要根据被控对象的特性来确定
float32 alpha;
float32 lastdev;
float32 out;
@@ -219,6 +228,14 @@ typedef struct
pid_common_t common;
pid_neural_t neural;
pid_fuzzy_t fuzzy;
+
+ // 自定义PID
+ pid_c_t cao;
+ pid_g_t gao;
+ pid_x_t xu;
+ pid_zh_t zhang;
+ pid_zh1_t zhang1;
+ pid_hd_t hd;
} pid_u;
pid_auto_tune_t auto_tune;
} pid_t;
diff --git a/User/lib/control/inc/pid_auto_tune.h b/User/system/lib/control/inc/pid_auto_tune.h
similarity index 100%
rename from User/lib/control/inc/pid_auto_tune.h
rename to User/system/lib/control/inc/pid_auto_tune.h
diff --git a/User/lib/control/src/pid.c b/User/system/lib/control/src/pid.c
similarity index 55%
rename from User/lib/control/src/pid.c
rename to User/system/lib/control/src/pid.c
index e2cc21f..8255ea2 100644
--- a/User/lib/control/src/pid.c
+++ b/User/system/lib/control/src/pid.c
@@ -20,6 +20,22 @@ void pid_constructor(pid_t *self)
case PID_TYPE_AUTO_TUNE:
pid_auto_tune_constructor(&self->auto_tune);
break;
+ case PID_TYPE_CUSTOM_CAO:
+ pid_c_constructor(&self->pid_u.cao);
+ break;
+ case PID_TYPE_CUSTOM_GAO:
+ pid_g_constructor(&self->pid_u.gao);
+ break;
+ case PID_TYPE_CUSTOM_XU:
+ pid_x_constructor(&self->pid_u.xu);
+ break;
+ case PID_TYPE_CUSTOM_ZHANG:
+ // pid_zh_constructor(&self->pid_u.zhang);
+ pid_zh_constructor1(&self->pid_u.zhang1);
+ break;
+ case PID_TYPE_CUSTOM_HANGDIAN:
+ pid_hd_constructor(&self->pid_u.hd);
+ break;
default:
break;
}
diff --git a/User/lib/control/src/pid_auto_tune.c b/User/system/lib/control/src/pid_auto_tune.c
similarity index 100%
rename from User/lib/control/src/pid_auto_tune.c
rename to User/system/lib/control/src/pid_auto_tune.c
diff --git a/User/lib/control/src/pid_common.c b/User/system/lib/control/src/pid_common.c
similarity index 100%
rename from User/lib/control/src/pid_common.c
rename to User/system/lib/control/src/pid_common.c
diff --git a/User/lib/control/src/pid_fuzzy.c b/User/system/lib/control/src/pid_fuzzy.c
similarity index 99%
rename from User/lib/control/src/pid_fuzzy.c
rename to User/system/lib/control/src/pid_fuzzy.c
index 2d73187..0c3f770 100644
--- a/User/lib/control/src/pid_fuzzy.c
+++ b/User/system/lib/control/src/pid_fuzzy.c
@@ -13,17 +13,17 @@
#define PL 3
// 定义偏差E的范围,因为设置了非线性区间,误差在10时才开始进行PID调节,这里E的范围为10
-#define MAXE (100)
+#define MAXE (30)
#define MINE (-MAXE)
// 定义EC的范围,因为变化非常缓慢!,每次的EC都非常小,这里可以根据实际需求来调整,
-#define MAXEC (100)
+#define MAXEC (30)
#define MINEC (-MAXEC)
// 定义e,ec的量化因子
#define KE 3 / MAXE
#define KEC 3 / MAXEC
// 定义输出量比例因子
-#define KUP 1.0f // 这里只使用了模糊PID的比例增益
+#define KUP 3.0f // 这里只使用了模糊PID的比例增益
#define KUI 0.0f
#define KUD 0.0f
@@ -442,6 +442,7 @@ static void _set_ctrl_prm(struct PID_FUZZY *self, float32 kp, float32 ki, float3
pri->detach = FALSE;
pri->sm = FALSE;
pri->ki_enable = TRUE;
+ pri->alpha = 0.25;
}
else
{
@@ -456,6 +457,7 @@ static void _set_ctrl_prm(struct PID_FUZZY *self, float32 kp, float32 ki, float3
pri->out_max = out_max;
pri->out_min = out_min;
pri->ki_enable = TRUE;
+ pri->alpha = 0.25;
}
}
diff --git a/User/lib/control/src/pid_neural.c b/User/system/lib/control/src/pid_neural.c
similarity index 100%
rename from User/lib/control/src/pid_neural.c
rename to User/system/lib/control/src/pid_neural.c
diff --git a/User/lib/control/模糊PID控制器设计文档.md b/User/system/lib/control/模糊PID控制器设计文档.md
similarity index 100%
rename from User/lib/control/模糊PID控制器设计文档.md
rename to User/system/lib/control/模糊PID控制器设计文档.md
diff --git a/User/lib/control/自整定.md b/User/system/lib/control/自整定.md
similarity index 100%
rename from User/lib/control/自整定.md
rename to User/system/lib/control/自整定.md
diff --git a/User/lib/examples/Makefile b/User/system/lib/examples/Makefile
similarity index 100%
rename from User/lib/examples/Makefile
rename to User/system/lib/examples/Makefile
diff --git a/User/lib/examples/simple_aes.c b/User/system/lib/examples/simple_aes.c
similarity index 100%
rename from User/lib/examples/simple_aes.c
rename to User/system/lib/examples/simple_aes.c
diff --git a/User/lib/examples/simple_clist.c b/User/system/lib/examples/simple_clist.c
similarity index 100%
rename from User/lib/examples/simple_clist.c
rename to User/system/lib/examples/simple_clist.c
diff --git a/User/lib/examples/simple_cmac.c b/User/system/lib/examples/simple_cmac.c
similarity index 100%
rename from User/lib/examples/simple_cmac.c
rename to User/system/lib/examples/simple_cmac.c
diff --git a/User/lib/examples/simple_cmd.c b/User/system/lib/examples/simple_cmd.c
similarity index 100%
rename from User/lib/examples/simple_cmd.c
rename to User/system/lib/examples/simple_cmd.c
diff --git a/User/lib/examples/simple_data_analysis.c b/User/system/lib/examples/simple_data_analysis.c
similarity index 100%
rename from User/lib/examples/simple_data_analysis.c
rename to User/system/lib/examples/simple_data_analysis.c
diff --git a/User/lib/examples/simple_sqqueue.c b/User/system/lib/examples/simple_sqqueue.c
similarity index 100%
rename from User/lib/examples/simple_sqqueue.c
rename to User/system/lib/examples/simple_sqqueue.c
diff --git a/User/system/lib/flashdb/examples/kvdb_basic_sample.c b/User/system/lib/flashdb/examples/kvdb_basic_sample.c
new file mode 100644
index 0000000..01e1c0f
--- /dev/null
+++ b/User/system/lib/flashdb/examples/kvdb_basic_sample.c
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2020, Armink,
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/**
+ * @file
+ * @brief basic KV samples.
+ *
+ * basic Key-Value Database KV feature samples
+ * get and show currnet boot counts
+ */
+
+#include
+
+#ifdef FDB_USING_KVDB
+
+#define FDB_LOG_TAG "[sample][kvdb][basic]"
+
+void kvdb_basic_sample(fdb_kvdb_t kvdb)
+{
+ struct fdb_blob blob;
+ int boot_count = 0;
+
+ FDB_INFO("==================== kvdb_basic_sample ====================\n");
+
+ { /* GET the KV value */
+ /* get the "boot_count" KV value */
+ fdb_kv_get_blob(kvdb, "boot_count", fdb_blob_make(&blob, &boot_count, sizeof(boot_count)));
+ /* the blob.saved.len is more than 0 when get the value successful */
+ if (blob.saved.len > 0) {
+ FDB_INFO("get the 'boot_count' value is %d\n", boot_count);
+ } else {
+ FDB_INFO("get the 'boot_count' failed\n");
+ }
+ }
+
+ { /* CHANGE the KV value */
+ /* increase the boot count */
+ boot_count ++;
+ /* change the "boot_count" KV's value */
+ fdb_kv_set_blob(kvdb, "boot_count", fdb_blob_make(&blob, &boot_count, sizeof(boot_count)));
+ FDB_INFO("set the 'boot_count' value to %d\n", boot_count);
+ }
+
+ FDB_INFO("===========================================================\n");
+}
+
+#endif /* FDB_USING_KVDB */
diff --git a/User/system/lib/flashdb/examples/kvdb_type_blob_sample.c b/User/system/lib/flashdb/examples/kvdb_type_blob_sample.c
new file mode 100644
index 0000000..f37983c
--- /dev/null
+++ b/User/system/lib/flashdb/examples/kvdb_type_blob_sample.c
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2020, Armink,
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/**
+ * @file
+ * @brief blob KV samples.
+ *
+ * Key-Value Database blob type KV feature samples
+ */
+
+#include
+
+#ifdef FDB_USING_KVDB
+
+#define FDB_LOG_TAG "[sample][kvdb][blob]"
+
+void kvdb_type_blob_sample(fdb_kvdb_t kvdb)
+{
+ struct fdb_blob blob;
+
+ FDB_INFO("==================== kvdb_type_blob_sample ====================\n");
+
+ { /* CREATE new Key-Value */
+ int temp_data = 36;
+
+ /* It will create new KV node when "temp" KV not in database.
+ * fdb_blob_make: It's a blob make function, and it will return the blob when make finish.
+ */
+ fdb_kv_set_blob(kvdb, "temp", fdb_blob_make(&blob, &temp_data, sizeof(temp_data)));
+ FDB_INFO("create the 'temp' blob KV, value is: %d\n", temp_data);
+ }
+
+ { /* GET the KV value */
+ int temp_data = 0;
+
+ /* get the "temp" KV value */
+ fdb_kv_get_blob(kvdb, "temp", fdb_blob_make(&blob, &temp_data, sizeof(temp_data)));
+ /* the blob.saved.len is more than 0 when get the value successful */
+ if (blob.saved.len > 0) {
+ FDB_INFO("get the 'temp' value is: %d\n", temp_data);
+ }
+ }
+
+ { /* CHANGE the KV value */
+ int temp_data = 38;
+
+ /* change the "temp" KV's value to 38 */
+ fdb_kv_set_blob(kvdb, "temp", fdb_blob_make(&blob, &temp_data, sizeof(temp_data)));
+ FDB_INFO("set 'temp' value to %d\n", temp_data);
+ }
+
+ { /* DELETE the KV by name */
+ fdb_kv_del(kvdb, "temp");
+ FDB_INFO("delete the 'temp' finish\n");
+ }
+
+ FDB_INFO("===========================================================\n");
+}
+
+#endif /* FDB_USING_KVDB */
diff --git a/User/system/lib/flashdb/examples/kvdb_type_string_sample.c b/User/system/lib/flashdb/examples/kvdb_type_string_sample.c
new file mode 100644
index 0000000..90e6598
--- /dev/null
+++ b/User/system/lib/flashdb/examples/kvdb_type_string_sample.c
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2020, Armink,
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/**
+ * @file
+ * @brief string KV samples.
+ *
+ * Key-Value Database string type KV feature samples source file.
+ */
+
+#include
+#include
+
+#ifdef FDB_USING_KVDB
+
+#define FDB_LOG_TAG "[sample][kvdb][string]"
+
+void kvdb_type_string_sample(fdb_kvdb_t kvdb)
+{
+ FDB_INFO("==================== kvdb_type_string_sample ====================\n");
+
+ { /* CREATE new Key-Value */
+ char temp_data[10] = "36C";
+
+ /* It will create new KV node when "temp" KV not in database. */
+ fdb_kv_set(kvdb, "temp", temp_data);
+ FDB_INFO("create the 'temp' string KV, value is: %s\n", temp_data);
+ }
+
+ { /* GET the KV value */
+ char *return_value, temp_data[10] = { 0 };
+
+ /* Get the "temp" KV value.
+ * NOTE: The return value saved in fdb_kv_get's buffer. Please copy away as soon as possible.
+ */
+ return_value = fdb_kv_get(kvdb, "temp");
+ /* the return value is NULL when get the value failed */
+ if (return_value != NULL) {
+ strncpy(temp_data, return_value, sizeof(temp_data));
+ FDB_INFO("get the 'temp' value is: %s\n", temp_data);
+ }
+ }
+
+ { /* CHANGE the KV value */
+ char temp_data[10] = "38C";
+
+ /* change the "temp" KV's value to "38.1" */
+ fdb_kv_set(kvdb, "temp", temp_data);
+ FDB_INFO("set 'temp' value to %s\n", temp_data);
+ }
+
+ { /* DELETE the KV by name */
+ fdb_kv_del(kvdb, "temp");
+ FDB_INFO("delete the 'temp' finish\n");
+ }
+
+ FDB_INFO("===========================================================\n");
+}
+
+#endif /* FDB_USING_KVDB */
diff --git a/User/system/lib/flashdb/examples/tsdb_sample.c b/User/system/lib/flashdb/examples/tsdb_sample.c
new file mode 100644
index 0000000..173ceb1
--- /dev/null
+++ b/User/system/lib/flashdb/examples/tsdb_sample.c
@@ -0,0 +1,126 @@
+/*
+ * Copyright (c) 2020, Armink,
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/**
+ * @file
+ * @brief TSDB samples.
+ *
+ * Time series log (like TSDB) feature samples source file.
+ *
+ * TSL is time series log, the TSDB saved many TSLs.
+ */
+
+#include
+#include
+
+#ifdef FDB_USING_TSDB
+
+#define FDB_LOG_TAG "[sample][tsdb]"
+
+#ifdef FDB_USING_TIMESTAMP_64BIT
+#define __PRITS "ld"
+#else
+#define __PRITS "d"
+#endif
+
+struct env_status {
+ int temp;
+ int humi;
+};
+
+static bool query_cb(fdb_tsl_t tsl, void *arg);
+static bool query_by_time_cb(fdb_tsl_t tsl, void *arg);
+static bool set_status_cb(fdb_tsl_t tsl, void *arg);
+
+void tsdb_sample(fdb_tsdb_t tsdb)
+{
+ struct fdb_blob blob;
+
+ FDB_INFO("==================== tsdb_sample ====================\n");
+
+ { /* APPEND new TSL (time series log) */
+ struct env_status status;
+
+ /* append new log to TSDB */
+ status.temp = 36;
+ status.humi = 85;
+ fdb_tsl_append(tsdb, fdb_blob_make(&blob, &status, sizeof(status)));
+ FDB_INFO("append the new status.temp (%d) and status.humi (%d)\n", status.temp, status.humi);
+
+ status.temp = 38;
+ status.humi = 90;
+ fdb_tsl_append(tsdb, fdb_blob_make(&blob, &status, sizeof(status)));
+ FDB_INFO("append the new status.temp (%d) and status.humi (%d)\n", status.temp, status.humi);
+ }
+
+ { /* QUERY the TSDB */
+ /* query all TSL in TSDB by iterator */
+ fdb_tsl_iter(tsdb, query_cb, tsdb);
+ }
+
+ { /* QUERY the TSDB by time */
+ /* prepare query time (from 1970-01-01 00:00:00 to 2020-05-05 00:00:00) */
+ struct tm tm_from = { .tm_year = 1970 - 1900, .tm_mon = 0, .tm_mday = 1, .tm_hour = 0, .tm_min = 0, .tm_sec = 0 };
+ struct tm tm_to = { .tm_year = 2020 - 1900, .tm_mon = 4, .tm_mday = 5, .tm_hour = 0, .tm_min = 0, .tm_sec = 0 };
+ time_t from_time = mktime(&tm_from), to_time = mktime(&tm_to);
+ size_t count;
+ /* query all TSL in TSDB by time */
+ fdb_tsl_iter_by_time(tsdb, from_time, to_time, query_by_time_cb, tsdb);
+ /* query all FDB_TSL_WRITE status TSL's count in TSDB by time */
+ count = fdb_tsl_query_count(tsdb, from_time, to_time, FDB_TSL_WRITE);
+ FDB_INFO("query count is: %zu\n", count);
+ }
+
+ { /* SET the TSL status */
+ /* Change the TSL status by iterator or time iterator
+ * set_status_cb: the change operation will in this callback
+ *
+ * NOTE: The actions to modify the state must be in order.
+ * like: FDB_TSL_WRITE -> FDB_TSL_USER_STATUS1 -> FDB_TSL_DELETED -> FDB_TSL_USER_STATUS2
+ * The intermediate states can also be ignored.
+ * such as: FDB_TSL_WRITE -> FDB_TSL_DELETED
+ */
+ fdb_tsl_iter(tsdb, set_status_cb, tsdb);
+ }
+
+ FDB_INFO("===========================================================\n");
+}
+
+static bool query_cb(fdb_tsl_t tsl, void *arg)
+{
+ struct fdb_blob blob;
+ struct env_status status;
+ fdb_tsdb_t db = arg;
+
+ fdb_blob_read((fdb_db_t) db, fdb_tsl_to_blob(tsl, fdb_blob_make(&blob, &status, sizeof(status))));
+ FDB_INFO("[query_cb] queried a TSL: time: %" __PRITS ", temp: %d, humi: %d\n", tsl->time, status.temp, status.humi);
+
+ return false;
+}
+
+static bool query_by_time_cb(fdb_tsl_t tsl, void *arg)
+{
+ struct fdb_blob blob;
+ struct env_status status;
+ fdb_tsdb_t db = arg;
+
+ fdb_blob_read((fdb_db_t) db, fdb_tsl_to_blob(tsl, fdb_blob_make(&blob, &status, sizeof(status))));
+ FDB_INFO("[query_by_time_cb] queried a TSL: time: %" __PRITS ", temp: %d, humi: %d\n", tsl->time, status.temp, status.humi);
+
+ return false;
+}
+
+static bool set_status_cb(fdb_tsl_t tsl, void *arg)
+{
+ fdb_tsdb_t db = arg;
+
+ FDB_INFO("set the TSL (time %" __PRITS ") status from %d to %d\n", tsl->time, tsl->status, FDB_TSL_USER_STATUS1);
+ fdb_tsl_set_status(db, tsl, FDB_TSL_USER_STATUS1);
+
+ return false;
+}
+
+#endif /* FDB_USING_TSDB */
diff --git a/User/system/lib/flashdb/fal/fal.c b/User/system/lib/flashdb/fal/fal.c
new file mode 100644
index 0000000..85d4660
--- /dev/null
+++ b/User/system/lib/flashdb/fal/fal.c
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2018-05-17 armink the first version
+ */
+
+#include
+
+static uint8_t init_ok = 0;
+
+/**
+ * FAL (Flash Abstraction Layer) initialization.
+ * It will initialize all flash device and all flash partition.
+ *
+ * @return >= 0: partitions total number
+ */
+int fal_init(void)
+{
+ extern int fal_flash_init(void);
+ extern int fal_partition_init(void);
+
+ int result;
+
+ /* initialize all flash device on FAL flash table */
+ result = fal_flash_init();
+
+ if (result < 0) {
+ goto __exit;
+ }
+
+ /* initialize all flash partition on FAL partition table */
+ result = fal_partition_init();
+
+__exit:
+
+ if ((result > 0) && (!init_ok))
+ {
+ init_ok = 1;
+ log_i("Flash Abstraction Layer (V%s) initialize success.", FAL_SW_VERSION);
+ }
+ else if(result <= 0)
+ {
+ init_ok = 0;
+ log_e("Flash Abstraction Layer (V%s) initialize failed.", FAL_SW_VERSION);
+ }
+
+ return result;
+}
+
+/**
+ * Check if the FAL is initialized successfully
+ *
+ * @return 0: not init or init failed; 1: init success
+ */
+int fal_init_check(void)
+{
+ return init_ok;
+}
diff --git a/User/system/lib/flashdb/fal/fal.h b/User/system/lib/flashdb/fal/fal.h
new file mode 100644
index 0000000..19a996f
--- /dev/null
+++ b/User/system/lib/flashdb/fal/fal.h
@@ -0,0 +1,151 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2018-05-17 armink the first version
+ */
+
+#ifndef _FAL_H_
+#define _FAL_H_
+
+#include
+#include "fal_def.h"
+
+/**
+ * FAL (Flash Abstraction Layer) initialization.
+ * It will initialize all flash device and all flash partition.
+ *
+ * @return >= 0: partitions total number
+ */
+int fal_init(void);
+
+/* =============== flash device operator API =============== */
+/**
+ * find flash device by name
+ *
+ * @param name flash device name
+ *
+ * @return != NULL: flash device
+ * NULL: not found
+ */
+const struct fal_flash_dev *fal_flash_device_find(const char *name);
+
+/* =============== partition operator API =============== */
+/**
+ * find the partition by name
+ *
+ * @param name partition name
+ *
+ * @return != NULL: partition
+ * NULL: not found
+ */
+const struct fal_partition *fal_partition_find(const char *name);
+
+/**
+ * get the partition table
+ *
+ * @param len return the partition table length
+ *
+ * @return partition table
+ */
+const struct fal_partition *fal_get_partition_table(size_t *len);
+
+/**
+ * set partition table temporarily
+ * This setting will modify the partition table temporarily, the setting will be lost after restart.
+ *
+ * @param table partition table
+ * @param len partition table length
+ */
+void fal_set_partition_table_temp(struct fal_partition *table, size_t len);
+
+/**
+ * read data from partition
+ *
+ * @param part partition
+ * @param addr relative address for partition
+ * @param buf read buffer
+ * @param size read size
+ *
+ * @return >= 0: successful read data size
+ * -1: error
+ */
+int fal_partition_read(const struct fal_partition *part, uint32_t addr, uint8_t *buf, size_t size);
+
+/**
+ * write data to partition
+ *
+ * @param part partition
+ * @param addr relative address for partition
+ * @param buf write buffer
+ * @param size write size
+ *
+ * @return >= 0: successful write data size
+ * -1: error
+ */
+int fal_partition_write(const struct fal_partition *part, uint32_t addr, const uint8_t *buf, size_t size);
+
+/**
+ * erase partition data
+ *
+ * @param part partition
+ * @param addr relative address for partition
+ * @param size erase size
+ *
+ * @return >= 0: successful erased data size
+ * -1: error
+ */
+int fal_partition_erase(const struct fal_partition *part, uint32_t addr, size_t size);
+
+/**
+ * erase partition all data
+ *
+ * @param part partition
+ *
+ * @return >= 0: successful erased data size
+ * -1: error
+ */
+int fal_partition_erase_all(const struct fal_partition *part);
+
+/**
+ * print the partition table
+ */
+void fal_show_part_table(void);
+
+/* =============== API provided to RT-Thread =============== */
+/**
+ * create RT-Thread block device by specified partition
+ *
+ * @param parition_name partition name
+ *
+ * @return != NULL: created block device
+ * NULL: created failed
+ */
+struct rt_device *fal_blk_device_create(const char *parition_name);
+
+#if defined(RT_USING_MTD_NOR)
+/**
+ * create RT-Thread MTD NOR device by specified partition
+ *
+ * @param parition_name partition name
+ *
+ * @return != NULL: created MTD NOR device
+ * NULL: created failed
+ */
+struct rt_device *fal_mtd_nor_device_create(const char *parition_name);
+#endif /* defined(RT_USING_MTD_NOR) */
+
+/**
+ * create RT-Thread char device by specified partition
+ *
+ * @param parition_name partition name
+ *
+ * @return != NULL: created char device
+ * NULL: created failed
+ */
+struct rt_device *fal_char_device_create(const char *parition_name);
+
+#endif /* _FAL_H_ */
diff --git a/User/system/lib/flashdb/fal/fal_cfg.h b/User/system/lib/flashdb/fal/fal_cfg.h
new file mode 100644
index 0000000..7a7e53a
--- /dev/null
+++ b/User/system/lib/flashdb/fal/fal_cfg.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2018-05-17 armink the first version
+ */
+
+#ifndef _FAL_CFG_H_
+#define _FAL_CFG_H_
+#include "eeprom_m95.h"
+#include "eeprom_fm24.h"
+#include "flash.h"
+
+#define FAL_PART_HAS_TABLE_CFG
+#define FAL_ERASE_SIZE 100
+// 需要块大小为2的N次方
+#define EEPROM_M95_1_BLOCK_SIZE M95_PAGE_SIZE_256 * 32
+#define EEPROM_M95_2_BLOCK_SIZE M95_PAGE_SIZE_256 * 32
+#define EEPROM_FM24_BLOCK_SIZE FM24_PAGE_SIZE * 16
+
+#define EEPROM_M95_1_SIZE _M95M02_
+#define EEPROM_M95_2_SIZE _M95M02_
+#define EEPROM_FM24_SIZE FM24_SIZE
+
+#define EEPROM_M95_1_DEV_NAME "eeprom_m95_1"
+#define EEPROM_M95_2_DEV_NAME "eeprom_m95_2"
+#define EEPROM_FM24_DEV_NAME "eeprom_fm24"
+
+/* ===================== Flash device Configuration ========================= */
+extern struct fal_flash_dev eeprom_m95_1;
+extern struct fal_flash_dev eeprom_m95_2;
+extern struct fal_flash_dev eeprom_fm24;
+
+/* flash device table */
+#define FAL_FLASH_DEV_TABLE \
+ { \
+ &eeprom_m95_1, \
+ &eeprom_m95_2, \
+ }
+
+/* ====================== Partition Configuration ========================== */
+#ifdef FAL_PART_HAS_TABLE_CFG
+/* partition table */
+// issues :https://github.com/armink/FlashDB/issues/40 ;epprom的扇区太小
+#define FAL_PART_TABLE \
+ { \
+ {FAL_PART_MAGIC_WORD, "KVDB", EEPROM_M95_1_DEV_NAME, 0, EEPROM_M95_1_SIZE, 0}, \
+ {FAL_PART_MAGIC_WORD, "TSDB", EEPROM_M95_2_DEV_NAME, 0, EEPROM_M95_2_SIZE, 0}, \
+ }
+
+#endif /* FAL_PART_HAS_TABLE_CFG */
+
+#endif /* _FAL_CFG_H_ */
diff --git a/User/system/lib/flashdb/fal/fal_def.h b/User/system/lib/flashdb/fal/fal_def.h
new file mode 100644
index 0000000..de8aada
--- /dev/null
+++ b/User/system/lib/flashdb/fal/fal_def.h
@@ -0,0 +1,153 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2018-05-17 armink the first version
+ */
+
+#ifndef _FAL_DEF_H_
+#define _FAL_DEF_H_
+
+#include
+#include
+#ifdef FDB_USING_NATIVE_ASSERT
+#include
+#endif
+
+#define FAL_SW_VERSION "0.5.99"
+
+#ifdef __RTTHREAD__ /* for RT-Thread platform */
+#include
+#define FAL_PRINTF rt_kprintf
+#define FAL_MALLOC rt_malloc
+#define FAL_CALLOC rt_calloc
+#define FAL_REALLOC rt_realloc
+#define FAL_FREE rt_free
+#endif
+
+#ifndef FAL_MALLOC
+#define FAL_MALLOC malloc
+#endif
+
+#ifndef FAL_CALLOC
+#define FAL_CALLOC calloc
+#endif
+
+#ifndef FAL_REALLOC
+#define FAL_REALLOC realloc
+#endif
+
+#ifndef FAL_FREE
+#define FAL_FREE free
+#endif
+
+#ifndef FAL_PRINTF
+#define FAL_PRINTF printf
+#endif
+
+#ifndef FAL_DEBUG
+#define FAL_DEBUG 0
+#endif
+
+#if FAL_DEBUG
+#ifndef FDB_USING_NATIVE_ASSERT
+#ifdef assert
+#undef assert
+#endif
+#define assert(EXPR) \
+if (!(EXPR)) \
+{ \
+ FAL_PRINTF("(%s) has assert failed at %s.\n", #EXPR, __func__ ); \
+ while (1); \
+}
+#endif
+
+/* debug level log */
+#ifdef log_d
+#undef log_d
+#endif
+#include
+#define log_d(...) FAL_PRINTF("[D/FAL] (%s:%" PRIdLEAST16 ") ", __func__, __LINE__); FAL_PRINTF(__VA_ARGS__);FAL_PRINTF("\n")
+
+#else
+
+#ifndef FDB_USING_NATIVE_ASSERT
+#ifdef assert
+#undef assert
+#endif
+#define assert(EXPR) ((void)0);
+#endif
+
+/* debug level log */
+#ifdef log_d
+#undef log_d
+#endif
+#define log_d(...)
+#endif /* FAL_DEBUG */
+
+/* error level log */
+#ifdef log_e
+#undef log_e
+#endif
+#define log_e(...) FAL_PRINTF("\033[31;22m[E/FAL] (%s:%d) ", __func__, __LINE__);FAL_PRINTF(__VA_ARGS__);FAL_PRINTF("\033[0m\n")
+
+/* info level log */
+#ifdef log_i
+#undef log_i
+#endif
+#define log_i(...) FAL_PRINTF("\033[32;22m[I/FAL] "); FAL_PRINTF(__VA_ARGS__);FAL_PRINTF("\033[0m\n")
+
+/* FAL flash and partition device name max length */
+#ifndef FAL_DEV_NAME_MAX
+#define FAL_DEV_NAME_MAX 24
+#endif
+
+struct fal_flash_dev
+{
+ char name[FAL_DEV_NAME_MAX];
+
+ /* flash device start address and len */
+ uint32_t addr;
+ size_t len;
+ /* the block size in the flash for erase minimum granularity */
+ size_t blk_size;
+
+ struct
+ {
+ int (*init)(void);
+ int (*read)(long offset, uint8_t *buf, size_t size);
+ int (*write)(long offset, const uint8_t *buf, size_t size);
+ int (*erase)(long offset, size_t size);
+ } ops;
+
+ /* write minimum granularity, unit: bit.
+ 1(nor flash)/ 8(stm32f2/f4)/ 32(stm32f1)/ 64(stm32l4)
+ 0 will not take effect. */
+ size_t write_gran;
+};
+typedef struct fal_flash_dev *fal_flash_dev_t;
+
+/**
+ * FAL partition
+ */
+struct fal_partition
+{
+ uint32_t magic_word;
+
+ /* partition name */
+ char name[FAL_DEV_NAME_MAX];
+ /* flash device name for partition */
+ char flash_name[FAL_DEV_NAME_MAX];
+
+ /* partition offset address on flash device */
+ long offset;
+ size_t len;
+
+ uint32_t reserved;
+};
+typedef struct fal_partition *fal_partition_t;
+
+#endif /* _FAL_DEF_H_ */
diff --git a/User/system/lib/flashdb/fal/fal_flash.c b/User/system/lib/flashdb/fal/fal_flash.c
new file mode 100644
index 0000000..8cef82c
--- /dev/null
+++ b/User/system/lib/flashdb/fal/fal_flash.c
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2018-05-17 armink the first version
+ */
+
+#include
+#include
+
+/* flash device table, must defined by user */
+#if !defined(FAL_FLASH_DEV_TABLE)
+#error "You must defined flash device table (FAL_FLASH_DEV_TABLE) on 'fal_cfg.h'"
+#endif
+
+static const struct fal_flash_dev * const device_table[] = FAL_FLASH_DEV_TABLE;
+static const size_t device_table_len = sizeof(device_table) / sizeof(device_table[0]);
+static uint8_t init_ok = 0;
+
+/**
+ * Initialize all flash device on FAL flash table
+ *
+ * @return result
+ */
+int fal_flash_init(void)
+{
+ size_t i;
+
+ if (init_ok)
+ {
+ return 0;
+ }
+
+ for (i = 0; i < device_table_len; i++)
+ {
+ assert(device_table[i]->ops.read);
+ assert(device_table[i]->ops.write);
+ assert(device_table[i]->ops.erase);
+ /* init flash device on flash table */
+ if (device_table[i]->ops.init)
+ {
+ device_table[i]->ops.init();
+ }
+ log_d("Flash device | %*.*s | addr: 0x%08lx | len: 0x%08x | blk_size: 0x%08x |initialized finish.",
+ FAL_DEV_NAME_MAX, FAL_DEV_NAME_MAX, device_table[i]->name, device_table[i]->addr, device_table[i]->len,
+ device_table[i]->blk_size);
+ }
+
+ init_ok = 1;
+ return 0;
+}
+
+/**
+ * find flash device by name
+ *
+ * @param name flash device name
+ *
+ * @return != NULL: flash device
+ * NULL: not found
+ */
+const struct fal_flash_dev *fal_flash_device_find(const char *name)
+{
+ assert(init_ok);
+ assert(name);
+
+ size_t i;
+
+ for (i = 0; i < device_table_len; i++)
+ {
+ if (!strncmp(name, device_table[i]->name, FAL_DEV_NAME_MAX)) {
+ return device_table[i];
+ }
+ }
+
+ return NULL;
+}
diff --git a/User/system/lib/flashdb/fal/fal_partition.c b/User/system/lib/flashdb/fal/fal_partition.c
new file mode 100644
index 0000000..a24e631
--- /dev/null
+++ b/User/system/lib/flashdb/fal/fal_partition.c
@@ -0,0 +1,525 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2018-05-17 armink the first version
+ */
+
+#include
+#include
+#include
+
+/* partition magic word */
+#define FAL_PART_MAGIC_WORD 0x45503130
+#define FAL_PART_MAGIC_WORD_H 0x4550L
+#define FAL_PART_MAGIC_WORD_L 0x3130L
+
+struct part_flash_info
+{
+ const struct fal_flash_dev *flash_dev;
+};
+
+/**
+ * FAL partition table config has defined on 'fal_cfg.h'.
+ * When this option is disable, it will auto find the partition table on a specified location in flash partition.
+ */
+#ifdef FAL_PART_HAS_TABLE_CFG
+
+/* check partition table definition */
+#if !defined(FAL_PART_TABLE)
+#error "You must defined FAL_PART_TABLE on 'fal_cfg.h'"
+#endif
+
+#ifdef __CC_ARM /* ARM Compiler */
+ #define SECTION(x) __attribute__((section(x)))
+ #define USED __attribute__((used))
+#elif defined (__IAR_SYSTEMS_ICC__) /* for IAR Compiler */
+ #define SECTION(x) @ x
+ #define USED __root
+#elif defined (__GNUC__) /* GNU GCC Compiler */
+ #define SECTION(x) __attribute__((section(x)))
+ #define USED __attribute__((used))
+#else
+ #error not supported tool chain
+#endif /* __CC_ARM */
+//USED static const struct fal_partition partition_table_def[] SECTION("FalPartTable") = FAL_PART_TABLE;
+static const struct fal_partition partition_table_def[] = FAL_PART_TABLE;
+static const struct fal_partition *partition_table = NULL;
+/* partition and flash object information cache table */
+static struct part_flash_info part_flash_cache[sizeof(partition_table_def) / sizeof(partition_table_def[0])] = { 0 };
+
+#else /* FAL_PART_HAS_TABLE_CFG */
+
+#if !defined(FAL_PART_TABLE_FLASH_DEV_NAME)
+#error "You must defined FAL_PART_TABLE_FLASH_DEV_NAME on 'fal_cfg.h'"
+#endif
+
+/* check partition table end offset address definition */
+#if !defined(FAL_PART_TABLE_END_OFFSET)
+#error "You must defined FAL_PART_TABLE_END_OFFSET on 'fal_cfg.h'"
+#endif
+
+static struct fal_partition *partition_table = NULL;
+static struct part_flash_info *part_flash_cache = NULL;
+#endif /* FAL_PART_HAS_TABLE_CFG */
+
+static uint8_t init_ok = 0;
+static size_t partition_table_len = 0;
+
+/**
+ * print the partition table
+ */
+void fal_show_part_table(void)
+{
+ char *item1 = "name", *item2 = "flash_dev";
+ size_t i, part_name_max = strlen(item1), flash_dev_name_max = strlen(item2);
+ const struct fal_partition *part;
+
+ if (partition_table_len)
+ {
+ for (i = 0; i < partition_table_len; i++)
+ {
+ part = &partition_table[i];
+ if (strlen(part->name) > part_name_max)
+ {
+ part_name_max = strlen(part->name);
+ }
+ if (strlen(part->flash_name) > flash_dev_name_max)
+ {
+ flash_dev_name_max = strlen(part->flash_name);
+ }
+ }
+ }
+ log_i("==================== FAL partition table ====================");
+ log_i("| %-*.*s | %-*.*s | offset | length |", part_name_max, FAL_DEV_NAME_MAX, item1, flash_dev_name_max,
+ FAL_DEV_NAME_MAX, item2);
+ log_i("-------------------------------------------------------------");
+ for (i = 0; i < partition_table_len; i++)
+ {
+
+#ifdef FAL_PART_HAS_TABLE_CFG
+ part = &partition_table[i];
+#else
+ part = &partition_table[partition_table_len - i - 1];
+#endif
+
+ log_i("| %-*.*s | %-*.*s | 0x%08lx | 0x%08x |", part_name_max, FAL_DEV_NAME_MAX, part->name, flash_dev_name_max,
+ FAL_DEV_NAME_MAX, part->flash_name, part->offset, part->len);
+ }
+ log_i("=============================================================");
+}
+
+static int check_and_update_part_cache(const struct fal_partition *table, size_t len)
+{
+ const struct fal_flash_dev *flash_dev = NULL;
+ size_t i;
+
+#ifndef FAL_PART_HAS_TABLE_CFG
+ if (part_flash_cache)
+ {
+ FAL_FREE(part_flash_cache);
+ }
+ part_flash_cache = FAL_MALLOC(len * sizeof(struct part_flash_info));
+ if (part_flash_cache == NULL)
+ {
+ log_e("Initialize failed! No memory for partition table cache");
+ return -2;
+ }
+#endif
+
+ for (i = 0; i < len; i++)
+ {
+ flash_dev = fal_flash_device_find(table[i].flash_name);
+ if (flash_dev == NULL)
+ {
+ log_d("Warning: Do NOT found the flash device(%s).", table[i].flash_name);
+ continue;
+ }
+
+ if (table[i].offset >= (long)flash_dev->len)
+ {
+ log_e("Initialize failed! Partition(%s) offset address(%ld) out of flash bound(<%d).",
+ table[i].name, table[i].offset, flash_dev->len);
+ partition_table_len = 0;
+
+ return -1;
+ }
+
+ part_flash_cache[i].flash_dev = flash_dev;
+ }
+
+ return 0;
+}
+
+/**
+ * Initialize all flash partition on FAL partition table
+ *
+ * @return partitions total number
+ */
+int fal_partition_init(void)
+{
+
+ if (init_ok)
+ {
+ return partition_table_len;
+ }
+
+#ifdef FAL_PART_HAS_TABLE_CFG
+ partition_table = &partition_table_def[0];
+ partition_table_len = sizeof(partition_table_def) / sizeof(partition_table_def[0]);
+#else
+ /* load partition table from the end address FAL_PART_TABLE_END_OFFSET, error return 0 */
+ long part_table_offset = FAL_PART_TABLE_END_OFFSET;
+ size_t table_num = 0, table_item_size = 0;
+ uint8_t part_table_find_ok = 0;
+ uint32_t read_magic_word;
+ fal_partition_t new_part = NULL;
+ size_t i;
+ const struct fal_flash_dev *flash_dev = NULL;
+
+ flash_dev = fal_flash_device_find(FAL_PART_TABLE_FLASH_DEV_NAME);
+ if (flash_dev == NULL)
+ {
+ log_e("Initialize failed! Flash device (%s) NOT found.", FAL_PART_TABLE_FLASH_DEV_NAME);
+ goto _exit;
+ }
+
+ /* check partition table offset address */
+ if (part_table_offset < 0 || part_table_offset >= (long) flash_dev->len)
+ {
+ log_e("Setting partition table end offset address(%ld) out of flash bound(<%d).", part_table_offset, flash_dev->len);
+ goto _exit;
+ }
+
+ table_item_size = sizeof(struct fal_partition);
+ new_part = (fal_partition_t)FAL_MALLOC(table_item_size);
+ if (new_part == NULL)
+ {
+ log_e("Initialize failed! No memory for table buffer.");
+ goto _exit;
+ }
+
+ /* find partition table location */
+ {
+ uint8_t read_buf[64];
+
+ part_table_offset -= sizeof(read_buf);
+ while (part_table_offset >= 0)
+ {
+ if (flash_dev->ops.read(part_table_offset, read_buf, sizeof(read_buf)) > 0)
+ {
+ /* find magic word in read buf */
+ for (i = 0; i < sizeof(read_buf) - sizeof(read_magic_word) + 1; i++)
+ {
+ read_magic_word = read_buf[0 + i] + (read_buf[1 + i] << 8) + (read_buf[2 + i] << 16) + (read_buf[3 + i] << 24);
+ if (read_magic_word == ((FAL_PART_MAGIC_WORD_H << 16) + FAL_PART_MAGIC_WORD_L))
+ {
+ part_table_find_ok = 1;
+ part_table_offset += i;
+ log_d("Find the partition table on '%s' offset @0x%08lx.", FAL_PART_TABLE_FLASH_DEV_NAME,
+ part_table_offset);
+ break;
+ }
+ }
+ }
+ else
+ {
+ /* read failed */
+ break;
+ }
+
+ if (part_table_find_ok)
+ {
+ break;
+ }
+ else
+ {
+ /* calculate next read buf position */
+ if (part_table_offset >= (long)sizeof(read_buf))
+ {
+ part_table_offset -= sizeof(read_buf);
+ part_table_offset += (sizeof(read_magic_word) - 1);
+ }
+ else if (part_table_offset != 0)
+ {
+ part_table_offset = 0;
+ }
+ else
+ {
+ /* find failed */
+ break;
+ }
+ }
+ }
+ }
+
+ /* load partition table */
+ while (part_table_find_ok)
+ {
+ memset(new_part, 0x00, table_num);
+ if (flash_dev->ops.read(part_table_offset - table_item_size * (table_num), (uint8_t *) new_part,
+ table_item_size) < 0)
+ {
+ log_e("Initialize failed! Flash device (%s) read error!", flash_dev->name);
+ table_num = 0;
+ break;
+ }
+
+ if (new_part->magic_word != ((FAL_PART_MAGIC_WORD_H << 16) + FAL_PART_MAGIC_WORD_L))
+ {
+ break;
+ }
+
+ partition_table = (fal_partition_t) FAL_REALLOC(partition_table, table_item_size * (table_num + 1));
+ if (partition_table == NULL)
+ {
+ log_e("Initialize failed! No memory for partition table");
+ table_num = 0;
+ break;
+ }
+
+ memcpy(partition_table + table_num, new_part, table_item_size);
+
+ table_num++;
+ };
+
+ if (table_num == 0)
+ {
+ log_e("Partition table NOT found on flash: %s (len: %d) from offset: 0x%08x.", FAL_PART_TABLE_FLASH_DEV_NAME,
+ FAL_DEV_NAME_MAX, FAL_PART_TABLE_END_OFFSET);
+ goto _exit;
+ }
+ else
+ {
+ partition_table_len = table_num;
+ }
+#endif /* FAL_PART_HAS_TABLE_CFG */
+
+ /* check the partition table device exists */
+ if (check_and_update_part_cache(partition_table, partition_table_len) != 0)
+ {
+ goto _exit;
+ }
+
+ init_ok = 1;
+
+_exit:
+
+#if FAL_DEBUG
+ fal_show_part_table();
+#endif
+
+#ifndef FAL_PART_HAS_TABLE_CFG
+ if (new_part)
+ {
+ FAL_FREE(new_part);
+ }
+#endif /* !FAL_PART_HAS_TABLE_CFG */
+
+ return partition_table_len;
+}
+
+/**
+ * find the partition by name
+ *
+ * @param name partition name
+ *
+ * @return != NULL: partition
+ * NULL: not found
+ */
+const struct fal_partition *fal_partition_find(const char *name)
+{
+ assert(init_ok);
+
+ size_t i;
+
+ for (i = 0; i < partition_table_len; i++)
+ {
+ if (!strcmp(name, partition_table[i].name))
+ {
+ return &partition_table[i];
+ }
+ }
+
+ return NULL;
+}
+
+static const struct fal_flash_dev *flash_device_find_by_part(const struct fal_partition *part)
+{
+ assert(part >= partition_table);
+ assert(part <= &partition_table[partition_table_len - 1]);
+
+ return part_flash_cache[part - partition_table].flash_dev;
+}
+
+/**
+ * get the partition table
+ *
+ * @param len return the partition table length
+ *
+ * @return partition table
+ */
+const struct fal_partition *fal_get_partition_table(size_t *len)
+{
+ assert(init_ok);
+ assert(len);
+
+ *len = partition_table_len;
+
+ return partition_table;
+}
+
+/**
+ * set partition table temporarily
+ * This setting will modify the partition table temporarily, the setting will be lost after restart.
+ *
+ * @param table partition table
+ * @param len partition table length
+ */
+void fal_set_partition_table_temp(struct fal_partition *table, size_t len)
+{
+ assert(init_ok);
+ assert(table);
+
+ check_and_update_part_cache(table, len);
+
+ partition_table_len = len;
+ partition_table = table;
+}
+
+/**
+ * read data from partition
+ *
+ * @param part partition
+ * @param addr relative address for partition
+ * @param buf read buffer
+ * @param size read size
+ *
+ * @return >= 0: successful read data size
+ * -1: error
+ */
+int fal_partition_read(const struct fal_partition *part, uint32_t addr, uint8_t *buf, size_t size)
+{
+ int ret = 0;
+ const struct fal_flash_dev *flash_dev = NULL;
+
+ assert(part);
+ assert(buf);
+
+ if (addr + size > part->len)
+ {
+ log_e("Partition read error! Partition address out of bound.");
+ return -1;
+ }
+
+ flash_dev = flash_device_find_by_part(part);
+ if (flash_dev == NULL)
+ {
+ log_e("Partition read error! Don't found flash device(%s) of the partition(%s).", part->flash_name, part->name);
+ return -1;
+ }
+
+ ret = flash_dev->ops.read(part->offset + addr, buf, size);
+ if (ret < 0)
+ {
+ log_e("Partition read error! Flash device(%s) read error!", part->flash_name);
+ }
+
+ return ret;
+}
+
+/**
+ * write data to partition
+ *
+ * @param part partition
+ * @param addr relative address for partition
+ * @param buf write buffer
+ * @param size write size
+ *
+ * @return >= 0: successful write data size
+ * -1: error
+ */
+int fal_partition_write(const struct fal_partition *part, uint32_t addr, const uint8_t *buf, size_t size)
+{
+ int ret = 0;
+ const struct fal_flash_dev *flash_dev = NULL;
+
+ assert(part);
+ assert(buf);
+
+ if (addr + size > part->len)
+ {
+ log_e("Partition write error! Partition address out of bound.");
+ return -1;
+ }
+
+ flash_dev = flash_device_find_by_part(part);
+ if (flash_dev == NULL)
+ {
+ log_e("Partition write error! Don't found flash device(%s) of the partition(%s).", part->flash_name, part->name);
+ return -1;
+ }
+
+ ret = flash_dev->ops.write(part->offset + addr, buf, size);
+ if (ret < 0)
+ {
+ log_e("Partition write error! Flash device(%s) write error!", part->flash_name);
+ }
+
+ return ret;
+}
+
+/**
+ * erase partition data
+ *
+ * @param part partition
+ * @param addr relative address for partition
+ * @param size erase size
+ *
+ * @return >= 0: successful erased data size
+ * -1: error
+ */
+int fal_partition_erase(const struct fal_partition *part, uint32_t addr, size_t size)
+{
+ int ret = 0;
+ const struct fal_flash_dev *flash_dev = NULL;
+
+ assert(part);
+
+ if (addr + size > part->len)
+ {
+ log_e("Partition erase error! Partition address out of bound.");
+ return -1;
+ }
+
+ flash_dev = flash_device_find_by_part(part);
+ if (flash_dev == NULL)
+ {
+ log_e("Partition erase error! Don't found flash device(%s) of the partition(%s).", part->flash_name, part->name);
+ return -1;
+ }
+
+ ret = flash_dev->ops.erase(part->offset + addr, size);
+ if (ret < 0)
+ {
+ log_e("Partition erase error! Flash device(%s) erase error!", part->flash_name);
+ }
+
+ return ret;
+}
+
+/**
+ * erase partition all data
+ *
+ * @param part partition
+ *
+ * @return >= 0: successful erased data size
+ * -1: error
+ */
+int fal_partition_erase_all(const struct fal_partition *part)
+{
+ return fal_partition_erase(part, 0, part->len);
+}
diff --git a/User/system/lib/flashdb/fal/fal_rtt.c b/User/system/lib/flashdb/fal/fal_rtt.c
new file mode 100644
index 0000000..3b699da
--- /dev/null
+++ b/User/system/lib/flashdb/fal/fal_rtt.c
@@ -0,0 +1,934 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2018-06-23 armink the first version
+ * 2019-08-22 MurphyZhao adapt to none rt-thread case
+ */
+
+#include
+
+#ifdef RT_VER_NUM
+#include
+#include
+#include
+
+/* ========================== block device ======================== */
+struct fal_blk_device
+{
+ struct rt_device parent;
+ struct rt_device_blk_geometry geometry;
+ const struct fal_partition *fal_part;
+};
+
+/* RT-Thread device interface */
+#if RTTHREAD_VERSION >= 30000
+static rt_err_t blk_dev_control(rt_device_t dev, int cmd, void *args)
+#else
+static rt_err_t blk_dev_control(rt_device_t dev, rt_uint8_t cmd, void *args)
+#endif
+{
+ struct fal_blk_device *part = (struct fal_blk_device*) dev;
+
+ assert(part != RT_NULL);
+
+ if (cmd == RT_DEVICE_CTRL_BLK_GETGEOME)
+ {
+ struct rt_device_blk_geometry *geometry;
+
+ geometry = (struct rt_device_blk_geometry *) args;
+ if (geometry == RT_NULL)
+ {
+ return -RT_ERROR;
+ }
+
+ memcpy(geometry, &part->geometry, sizeof(struct rt_device_blk_geometry));
+ }
+ else if (cmd == RT_DEVICE_CTRL_BLK_ERASE)
+ {
+ rt_uint32_t *addrs = (rt_uint32_t *) args, start_addr = addrs[0], end_addr = addrs[1], phy_start_addr;
+ rt_size_t phy_size;
+
+ if (addrs == RT_NULL || start_addr > end_addr)
+ {
+ return -RT_ERROR;
+ }
+
+ if (end_addr == start_addr)
+ {
+ end_addr++;
+ }
+
+ phy_start_addr = start_addr * part->geometry.bytes_per_sector;
+ phy_size = (end_addr - start_addr) * part->geometry.bytes_per_sector;
+
+ if (fal_partition_erase(part->fal_part, phy_start_addr, phy_size) < 0)
+ {
+ return -RT_ERROR;
+ }
+ }
+
+ return RT_EOK;
+}
+
+static rt_size_t blk_dev_read(rt_device_t dev, rt_off_t pos, void* buffer, rt_size_t size)
+{
+ int ret = 0;
+ struct fal_blk_device *part = (struct fal_blk_device*) dev;
+
+ assert(part != RT_NULL);
+
+ ret = fal_partition_read(part->fal_part, pos * part->geometry.block_size, buffer, size * part->geometry.block_size);
+
+ if (ret != (int)(size * part->geometry.block_size))
+ {
+ ret = 0;
+ }
+ else
+ {
+ ret = size;
+ }
+
+ return ret;
+}
+
+static rt_size_t blk_dev_write(rt_device_t dev, rt_off_t pos, const void* buffer, rt_size_t size)
+{
+ int ret = 0;
+ struct fal_blk_device *part;
+ rt_off_t phy_pos;
+ rt_size_t phy_size;
+
+ part = (struct fal_blk_device*) dev;
+ assert(part != RT_NULL);
+
+ /* change the block device's logic address to physical address */
+ phy_pos = pos * part->geometry.bytes_per_sector;
+ phy_size = size * part->geometry.bytes_per_sector;
+
+ ret = fal_partition_erase(part->fal_part, phy_pos, phy_size);
+
+ if (ret == (int) phy_size)
+ {
+ ret = fal_partition_write(part->fal_part, phy_pos, buffer, phy_size);
+ }
+
+ if (ret != (int) phy_size)
+ {
+ ret = 0;
+ }
+ else
+ {
+ ret = size;
+ }
+
+ return ret;
+}
+
+#ifdef RT_USING_DEVICE_OPS
+const static struct rt_device_ops blk_dev_ops =
+{
+ RT_NULL,
+ RT_NULL,
+ RT_NULL,
+ blk_dev_read,
+ blk_dev_write,
+ blk_dev_control
+};
+#endif
+
+/**
+ * create RT-Thread block device by specified partition
+ *
+ * @param parition_name partition name
+ *
+ * @return != NULL: created block device
+ * NULL: created failed
+ */
+struct rt_device *fal_blk_device_create(const char *parition_name)
+{
+ struct fal_blk_device *blk_dev;
+ const struct fal_partition *fal_part = fal_partition_find(parition_name);
+ const struct fal_flash_dev *fal_flash = NULL;
+
+ if (!fal_part)
+ {
+ log_e("Error: the partition name (%s) is not found.", parition_name);
+ return NULL;
+ }
+
+ if ((fal_flash = fal_flash_device_find(fal_part->flash_name)) == NULL)
+ {
+ log_e("Error: the flash device name (%s) is not found.", fal_part->flash_name);
+ return NULL;
+ }
+
+ blk_dev = (struct fal_blk_device*) rt_malloc(sizeof(struct fal_blk_device));
+ if (blk_dev)
+ {
+ blk_dev->fal_part = fal_part;
+ blk_dev->geometry.bytes_per_sector = fal_flash->blk_size;
+ blk_dev->geometry.block_size = fal_flash->blk_size;
+ blk_dev->geometry.sector_count = fal_part->len / fal_flash->blk_size;
+
+ /* register device */
+ blk_dev->parent.type = RT_Device_Class_Block;
+
+#ifdef RT_USING_DEVICE_OPS
+ blk_dev->parent.ops = &blk_dev_ops;
+#else
+ blk_dev->parent.init = NULL;
+ blk_dev->parent.open = NULL;
+ blk_dev->parent.close = NULL;
+ blk_dev->parent.read = blk_dev_read;
+ blk_dev->parent.write = blk_dev_write;
+ blk_dev->parent.control = blk_dev_control;
+#endif
+
+ /* no private */
+ blk_dev->parent.user_data = RT_NULL;
+
+ log_i("The FAL block device (%s) created successfully", fal_part->name);
+ rt_device_register(RT_DEVICE(blk_dev), fal_part->name, RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STANDALONE);
+ }
+ else
+ {
+ log_e("Error: no memory for create FAL block device");
+ }
+
+ return RT_DEVICE(blk_dev);
+}
+
+/* ========================== MTD nor device ======================== */
+#if defined(RT_USING_MTD_NOR)
+
+struct fal_mtd_nor_device
+{
+ struct rt_mtd_nor_device parent;
+ const struct fal_partition *fal_part;
+};
+
+static rt_size_t mtd_nor_dev_read(struct rt_mtd_nor_device* device, rt_off_t offset, rt_uint8_t* data, rt_uint32_t length)
+{
+ int ret = 0;
+ struct fal_mtd_nor_device *part = (struct fal_mtd_nor_device*) device;
+
+ assert(part != RT_NULL);
+
+ ret = fal_partition_read(part->fal_part, offset, data, length);
+
+ if (ret != (int)length)
+ {
+ ret = 0;
+ }
+ else
+ {
+ ret = length;
+ }
+
+ return ret;
+}
+
+static rt_size_t mtd_nor_dev_write(struct rt_mtd_nor_device* device, rt_off_t offset, const rt_uint8_t* data, rt_uint32_t length)
+{
+ int ret = 0;
+ struct fal_mtd_nor_device *part;
+
+ part = (struct fal_mtd_nor_device*) device;
+ assert(part != RT_NULL);
+
+ ret = fal_partition_write(part->fal_part, offset, data, length);
+
+ if (ret != (int) length)
+ {
+ ret = 0;
+ }
+ else
+ {
+ ret = length;
+ }
+
+ return ret;
+}
+
+static rt_err_t mtd_nor_dev_erase(struct rt_mtd_nor_device* device, rt_off_t offset, rt_uint32_t length)
+{
+ int ret = 0;
+ struct fal_mtd_nor_device *part;
+
+ part = (struct fal_mtd_nor_device*) device;
+ assert(part != RT_NULL);
+
+ ret = fal_partition_erase(part->fal_part, offset, length);
+
+ if (ret != length)
+ {
+ return -RT_ERROR;
+ }
+ else
+ {
+ return RT_EOK;
+ }
+}
+
+static const struct rt_mtd_nor_driver_ops _ops =
+{
+ RT_NULL,
+ mtd_nor_dev_read,
+ mtd_nor_dev_write,
+ mtd_nor_dev_erase,
+};
+
+/**
+ * create RT-Thread MTD NOR device by specified partition
+ *
+ * @param parition_name partition name
+ *
+ * @return != NULL: created MTD NOR device
+ * NULL: created failed
+ */
+struct rt_device *fal_mtd_nor_device_create(const char *parition_name)
+{
+ struct fal_mtd_nor_device *mtd_nor_dev;
+ const struct fal_partition *fal_part = fal_partition_find(parition_name);
+ const struct fal_flash_dev *fal_flash = NULL;
+
+ if (!fal_part)
+ {
+ log_e("Error: the partition name (%s) is not found.", parition_name);
+ return NULL;
+ }
+
+ if ((fal_flash = fal_flash_device_find(fal_part->flash_name)) == NULL)
+ {
+ log_e("Error: the flash device name (%s) is not found.", fal_part->flash_name);
+ return NULL;
+ }
+
+ mtd_nor_dev = (struct fal_mtd_nor_device*) rt_malloc(sizeof(struct fal_mtd_nor_device));
+ if (mtd_nor_dev)
+ {
+ mtd_nor_dev->fal_part = fal_part;
+
+ mtd_nor_dev->parent.block_start = 0;
+ mtd_nor_dev->parent.block_end = fal_part->len / fal_flash->blk_size;
+ mtd_nor_dev->parent.block_size = fal_flash->blk_size;
+
+ /* set ops */
+ mtd_nor_dev->parent.ops = &_ops;
+
+ log_i("The FAL MTD NOR device (%s) created successfully", fal_part->name);
+ rt_mtd_nor_register_device(fal_part->name, &mtd_nor_dev->parent);
+ }
+ else
+ {
+ log_e("Error: no memory for create FAL MTD NOR device");
+ }
+
+ return RT_DEVICE(&mtd_nor_dev->parent);
+}
+
+#endif /* defined(RT_USING_MTD_NOR) */
+
+
+/* ========================== char device ======================== */
+struct fal_char_device
+{
+ struct rt_device parent;
+ const struct fal_partition *fal_part;
+};
+
+/* RT-Thread device interface */
+static rt_size_t char_dev_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size)
+{
+ int ret = 0;
+ struct fal_char_device *part = (struct fal_char_device *) dev;
+
+ assert(part != RT_NULL);
+
+ if (pos + size > part->fal_part->len)
+ size = part->fal_part->len - pos;
+
+ ret = fal_partition_read(part->fal_part, pos, buffer, size);
+
+ if (ret != (int)(size))
+ ret = 0;
+
+ return ret;
+}
+
+static rt_size_t char_dev_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size)
+{
+ int ret = 0;
+ struct fal_char_device *part;
+
+ part = (struct fal_char_device *) dev;
+ assert(part != RT_NULL);
+
+ if (pos == 0)
+ {
+ fal_partition_erase_all(part->fal_part);
+ }
+ else if (pos + size > part->fal_part->len)
+ {
+ size = part->fal_part->len - pos;
+ }
+
+ ret = fal_partition_write(part->fal_part, pos, buffer, size);
+
+ if (ret != (int) size)
+ ret = 0;
+
+ return ret;
+}
+
+#ifdef RT_USING_DEVICE_OPS
+const static struct rt_device_ops char_dev_ops =
+{
+ RT_NULL,
+ RT_NULL,
+ RT_NULL,
+ char_dev_read,
+ char_dev_write,
+ RT_NULL
+};
+#endif
+
+#ifdef RT_USING_POSIX
+#include
+
+/* RT-Thread device filesystem interface */
+static int char_dev_fopen(struct dfs_fd *fd)
+{
+ struct fal_char_device *part = (struct fal_char_device *) fd->data;
+
+ assert(part != RT_NULL);
+
+ switch (fd->flags & O_ACCMODE)
+ {
+ case O_RDONLY:
+ break;
+ case O_WRONLY:
+ case O_RDWR:
+ /* erase partition when device file open */
+ fal_partition_erase_all(part->fal_part);
+ break;
+ default:
+ break;
+ }
+ fd->pos = 0;
+
+ return RT_EOK;
+}
+
+static int char_dev_fread(struct dfs_fd *fd, void *buf, size_t count)
+{
+ int ret = 0;
+ struct fal_char_device *part = (struct fal_char_device *) fd->data;
+
+ assert(part != RT_NULL);
+
+ if (fd->pos + count > part->fal_part->len)
+ count = part->fal_part->len - fd->pos;
+
+ ret = fal_partition_read(part->fal_part, fd->pos, buf, count);
+
+ if (ret != (int)(count))
+ return 0;
+
+ fd->pos += ret;
+
+ return ret;
+}
+
+static int char_dev_fwrite(struct dfs_fd *fd, const void *buf, size_t count)
+{
+ int ret = 0;
+ struct fal_char_device *part = (struct fal_char_device *) fd->data;
+
+ assert(part != RT_NULL);
+
+ if (fd->pos + count > part->fal_part->len)
+ count = part->fal_part->len - fd->pos;
+
+ ret = fal_partition_write(part->fal_part, fd->pos, buf, count);
+
+ if (ret != (int) count)
+ return 0;
+
+ fd->pos += ret;
+
+ return ret;
+}
+
+static const struct dfs_file_ops char_dev_fops =
+{
+ char_dev_fopen,
+ RT_NULL,
+ RT_NULL,
+ char_dev_fread,
+ char_dev_fwrite,
+ RT_NULL, /* flush */
+ RT_NULL, /* lseek */
+ RT_NULL, /* getdents */
+ RT_NULL,
+};
+#endif /* defined(RT_USING_POSIX) */
+
+/**
+ * create RT-Thread char device by specified partition
+ *
+ * @param parition_name partition name
+ *
+ * @return != NULL: created char device
+ * NULL: created failed
+ */
+struct rt_device *fal_char_device_create(const char *parition_name)
+{
+ struct fal_char_device *char_dev;
+ const struct fal_partition *fal_part = fal_partition_find(parition_name);
+
+ if (!fal_part)
+ {
+ log_e("Error: the partition name (%s) is not found.", parition_name);
+ return NULL;
+ }
+
+ if ((fal_flash_device_find(fal_part->flash_name)) == NULL)
+ {
+ log_e("Error: the flash device name (%s) is not found.", fal_part->flash_name);
+ return NULL;
+ }
+
+ char_dev = (struct fal_char_device *) rt_malloc(sizeof(struct fal_char_device));
+ if (char_dev)
+ {
+ char_dev->fal_part = fal_part;
+
+ /* register device */
+ char_dev->parent.type = RT_Device_Class_Char;
+
+#ifdef RT_USING_DEVICE_OPS
+ char_dev->parent.ops = &char_dev_ops;
+#else
+ char_dev->parent.init = NULL;
+ char_dev->parent.open = NULL;
+ char_dev->parent.close = NULL;
+ char_dev->parent.read = char_dev_read;
+ char_dev->parent.write = char_dev_write;
+ char_dev->parent.control = NULL;
+ /* no private */
+ char_dev->parent.user_data = NULL;
+#endif
+
+ rt_device_register(RT_DEVICE(char_dev), fal_part->name, RT_DEVICE_FLAG_RDWR);
+ log_i("The FAL char device (%s) created successfully", fal_part->name);
+
+#ifdef RT_USING_POSIX
+ /* set fops */
+ char_dev->parent.fops = &char_dev_fops;
+#endif
+
+ }
+ else
+ {
+ log_e("Error: no memory for create FAL char device");
+ }
+
+ return RT_DEVICE(char_dev);
+}
+
+#if defined(RT_USING_FINSH) && defined(FINSH_USING_MSH)
+
+#include
+extern int fal_init_check(void);
+
+static void fal(uint8_t argc, char **argv) {
+
+#define __is_print(ch) ((unsigned int)((ch) - ' ') < 127u - ' ')
+#define HEXDUMP_WIDTH 16
+#define CMD_PROBE_INDEX 0
+#define CMD_READ_INDEX 1
+#define CMD_WRITE_INDEX 2
+#define CMD_ERASE_INDEX 3
+#define CMD_BENCH_INDEX 4
+
+ int result;
+ static const struct fal_flash_dev *flash_dev = NULL;
+ static const struct fal_partition *part_dev = NULL;
+ size_t i = 0, j = 0;
+
+ const char* help_info[] =
+ {
+ [CMD_PROBE_INDEX] = "fal probe [dev_name|part_name] - probe flash device or partition by given name",
+ [CMD_READ_INDEX] = "fal read addr size - read 'size' bytes starting at 'addr'",
+ [CMD_WRITE_INDEX] = "fal write addr data1 ... dataN - write some bytes 'data' starting at 'addr'",
+ [CMD_ERASE_INDEX] = "fal erase addr size - erase 'size' bytes starting at 'addr'",
+ [CMD_BENCH_INDEX] = "fal bench - benchmark test with per block size",
+ };
+
+ if (fal_init_check() != 1)
+ {
+ rt_kprintf("\n[Warning] FAL is not initialized or failed to initialize!\n\n");
+ return;
+ }
+
+ if (argc < 2)
+ {
+ rt_kprintf("Usage:\n");
+ for (i = 0; i < sizeof(help_info) / sizeof(char*); i++)
+ {
+ rt_kprintf("%s\n", help_info[i]);
+ }
+ rt_kprintf("\n");
+ }
+ else
+ {
+ const char *operator = argv[1];
+ uint32_t addr, size;
+
+ if (!strcmp(operator, "probe"))
+ {
+ if (argc >= 3)
+ {
+ char *dev_name = argv[2];
+ if ((flash_dev = fal_flash_device_find(dev_name)) != NULL)
+ {
+ part_dev = NULL;
+ }
+ else if ((part_dev = fal_partition_find(dev_name)) != NULL)
+ {
+ flash_dev = NULL;
+ }
+ else
+ {
+ rt_kprintf("Device %s NOT found. Probe failed.\n", dev_name);
+ flash_dev = NULL;
+ part_dev = NULL;
+ }
+ }
+
+ if (flash_dev)
+ {
+ rt_kprintf("Probed a flash device | %s | addr: %ld | len: %d |.\n", flash_dev->name,
+ flash_dev->addr, flash_dev->len);
+ }
+ else if (part_dev)
+ {
+ rt_kprintf("Probed a flash partition | %s | flash_dev: %s | offset: %ld | len: %d |.\n",
+ part_dev->name, part_dev->flash_name, part_dev->offset, part_dev->len);
+ }
+ else
+ {
+ rt_kprintf("No flash device or partition was probed.\n");
+ rt_kprintf("Usage: %s.\n", help_info[CMD_PROBE_INDEX]);
+ fal_show_part_table();
+ }
+ }
+ else
+ {
+ if (!flash_dev && !part_dev)
+ {
+ rt_kprintf("No flash device or partition was probed. Please run 'fal probe'.\n");
+ return;
+ }
+ if (!rt_strcmp(operator, "read"))
+ {
+ if (argc < 4)
+ {
+ rt_kprintf("Usage: %s.\n", help_info[CMD_READ_INDEX]);
+ return;
+ }
+ else
+ {
+ addr = strtol(argv[2], NULL, 0);
+ size = strtol(argv[3], NULL, 0);
+ uint8_t *data = rt_malloc(size);
+ if (data)
+ {
+ if (flash_dev)
+ {
+ result = flash_dev->ops.read(addr, data, size);
+ }
+ else if (part_dev)
+ {
+ result = fal_partition_read(part_dev, addr, data, size);
+ }
+ if (result >= 0)
+ {
+ rt_kprintf("Read data success. Start from 0x%08X, size is %ld. The data is:\n", addr,
+ size);
+ rt_kprintf("Offset (h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\n");
+ for (i = 0; i < size; i += HEXDUMP_WIDTH)
+ {
+ rt_kprintf("[%08X] ", addr + i);
+ /* dump hex */
+ for (j = 0; j < HEXDUMP_WIDTH; j++)
+ {
+ if (i + j < size)
+ {
+ rt_kprintf("%02X ", data[i + j]);
+ }
+ else
+ {
+ rt_kprintf(" ");
+ }
+ }
+ /* dump char for hex */
+ for (j = 0; j < HEXDUMP_WIDTH; j++)
+ {
+ if (i + j < size)
+ {
+ rt_kprintf("%c", __is_print(data[i + j]) ? data[i + j] : '.');
+ }
+ }
+ rt_kprintf("\n");
+ }
+ rt_kprintf("\n");
+ }
+ rt_free(data);
+ }
+ else
+ {
+ rt_kprintf("Low memory!\n");
+ }
+ }
+ }
+ else if (!strcmp(operator, "write"))
+ {
+ if (argc < 4)
+ {
+ rt_kprintf("Usage: %s.\n", help_info[CMD_WRITE_INDEX]);
+ return;
+ }
+ else
+ {
+ addr = strtol(argv[2], NULL, 0);
+ size = argc - 3;
+ uint8_t *data = rt_malloc(size);
+ if (data)
+ {
+ for (i = 0; i < size; i++)
+ {
+ data[i] = strtol(argv[3 + i], NULL, 0);
+ }
+ if (flash_dev)
+ {
+ result = flash_dev->ops.write(addr, data, size);
+ }
+ else if (part_dev)
+ {
+ result = fal_partition_write(part_dev, addr, data, size);
+ }
+ if (result >= 0)
+ {
+ rt_kprintf("Write data success. Start from 0x%08X, size is %ld.\n", addr, size);
+ rt_kprintf("Write data: ");
+ for (i = 0; i < size; i++)
+ {
+ rt_kprintf("%d ", data[i]);
+ }
+ rt_kprintf(".\n");
+ }
+ rt_free(data);
+ }
+ else
+ {
+ rt_kprintf("Low memory!\n");
+ }
+ }
+ }
+ else if (!rt_strcmp(operator, "erase"))
+ {
+ if (argc < 4)
+ {
+ rt_kprintf("Usage: %s.\n", help_info[CMD_ERASE_INDEX]);
+ return;
+ }
+ else
+ {
+ addr = strtol(argv[2], NULL, 0);
+ size = strtol(argv[3], NULL, 0);
+ if (flash_dev)
+ {
+ result = flash_dev->ops.erase(addr, size);
+ }
+ else if (part_dev)
+ {
+ result = fal_partition_erase(part_dev, addr, size);
+ }
+ if (result >= 0)
+ {
+ rt_kprintf("Erase data success. Start from 0x%08X, size is %ld.\n", addr, size);
+ }
+ }
+ }
+ else if (!strcmp(operator, "bench"))
+ {
+ if (argc < 3)
+ {
+ rt_kprintf("Usage: %s.\n", help_info[CMD_BENCH_INDEX]);
+ return;
+ }
+ else if ((argc > 3 && strcmp(argv[3], "yes")) || argc < 4)
+ {
+ rt_kprintf("DANGER: It will erase full chip or partition! Please run 'fal bench %d yes'.\n", strtol(argv[2], NULL, 0));
+ return;
+ }
+ /* full chip benchmark test */
+ uint32_t start_time, time_cast;
+ size_t write_size = strtol(argv[2], NULL, 0), read_size = strtol(argv[2], NULL, 0), cur_op_size;
+ uint8_t *write_data = (uint8_t *)rt_malloc(write_size), *read_data = (uint8_t *)rt_malloc(read_size);
+
+ if (write_data && read_data)
+ {
+ for (i = 0; i < write_size; i ++) {
+ write_data[i] = i & 0xFF;
+ }
+ if (flash_dev)
+ {
+ size = flash_dev->len;
+ }
+ else if (part_dev)
+ {
+ size = part_dev->len;
+ }
+ /* benchmark testing */
+ rt_kprintf("Erasing %ld bytes data, waiting...\n", size);
+ start_time = rt_tick_get();
+ if (flash_dev)
+ {
+ result = flash_dev->ops.erase(0, size);
+ }
+ else if (part_dev)
+ {
+ result = fal_partition_erase(part_dev, 0, size);
+ }
+ if (result >= 0)
+ {
+ time_cast = rt_tick_get() - start_time;
+ rt_kprintf("Erase benchmark success, total time: %d.%03dS.\n", time_cast / RT_TICK_PER_SECOND,
+ time_cast % RT_TICK_PER_SECOND / ((RT_TICK_PER_SECOND * 1 + 999) / 1000));
+ }
+ else
+ {
+ rt_kprintf("Erase benchmark has an error. Error code: %d.\n", result);
+ }
+ /* write test */
+ rt_kprintf("Writing %ld bytes data, waiting...\n", size);
+ start_time = rt_tick_get();
+ for (i = 0; i < size; i += write_size)
+ {
+ if (i + write_size <= size)
+ {
+ cur_op_size = write_size;
+ }
+ else
+ {
+ cur_op_size = size - i;
+ }
+ if (flash_dev)
+ {
+ result = flash_dev->ops.write(i, write_data, cur_op_size);
+ }
+ else if (part_dev)
+ {
+ result = fal_partition_write(part_dev, i, write_data, cur_op_size);
+ }
+ if (result < 0)
+ {
+ break;
+ }
+ }
+ if (result >= 0)
+ {
+ time_cast = rt_tick_get() - start_time;
+ rt_kprintf("Write benchmark success, total time: %d.%03dS.\n", time_cast / RT_TICK_PER_SECOND,
+ time_cast % RT_TICK_PER_SECOND / ((RT_TICK_PER_SECOND * 1 + 999) / 1000));
+ }
+ else
+ {
+ rt_kprintf("Write benchmark has an error. Error code: %d.\n", result);
+ }
+ /* read test */
+ rt_kprintf("Reading %ld bytes data, waiting...\n", size);
+ start_time = rt_tick_get();
+ for (i = 0; i < size; i += read_size)
+ {
+ if (i + read_size <= size)
+ {
+ cur_op_size = read_size;
+ }
+ else
+ {
+ cur_op_size = size - i;
+ }
+ if (flash_dev)
+ {
+ result = flash_dev->ops.read(i, read_data, cur_op_size);
+ }
+ else if (part_dev)
+ {
+ result = fal_partition_read(part_dev, i, read_data, cur_op_size);
+ }
+ /* data check */
+ for (int index = 0; index < cur_op_size; index ++)
+ {
+ if (write_data[index] != read_data[index])
+ {
+ rt_kprintf("%d %d %02x %02x.\n", i, index, write_data[index], read_data[index]);
+ }
+ }
+
+ if (memcmp(write_data, read_data, cur_op_size))
+ {
+ result = -RT_ERROR;
+ rt_kprintf("Data check ERROR! Please check you flash by other command.\n");
+ }
+ /* has an error */
+ if (result < 0)
+ {
+ break;
+ }
+ }
+ if (result >= 0)
+ {
+ time_cast = rt_tick_get() - start_time;
+ rt_kprintf("Read benchmark success, total time: %d.%03dS.\n", time_cast / RT_TICK_PER_SECOND,
+ time_cast % RT_TICK_PER_SECOND / ((RT_TICK_PER_SECOND * 1 + 999) / 1000));
+ }
+ else
+ {
+ rt_kprintf("Read benchmark has an error. Error code: %d.\n", result);
+ }
+ }
+ else
+ {
+ rt_kprintf("Low memory!\n");
+ }
+ rt_free(write_data);
+ rt_free(read_data);
+ }
+ else
+ {
+ rt_kprintf("Usage:\n");
+ for (i = 0; i < sizeof(help_info) / sizeof(char*); i++)
+ {
+ rt_kprintf("%s\n", help_info[i]);
+ }
+ rt_kprintf("\n");
+ return;
+ }
+ if (result < 0) {
+ rt_kprintf("This operate has an error. Error code: %d.\n", result);
+ }
+ }
+ }
+}
+MSH_CMD_EXPORT(fal, FAL (Flash Abstraction Layer) operate.);
+
+#endif /* defined(RT_USING_FINSH) && defined(FINSH_USING_MSH) */
+#endif /* RT_VER_NUM */
diff --git a/User/system/lib/flashdb/fal_eeprom24_port.c b/User/system/lib/flashdb/fal_eeprom24_port.c
new file mode 100644
index 0000000..9047925
--- /dev/null
+++ b/User/system/lib/flashdb/fal_eeprom24_port.c
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2018-01-26 armink the first version
+ */
+#include "eeprom_fm24.h"
+#include
+
+static int init(void);
+static int erase(long offset, size_t size);
+
+static int read(long offset, uint8_t *buf, size_t size);
+static int write(long offset, const uint8_t *buf, size_t size);
+
+// 1.定义 flash 设备
+struct fal_flash_dev eeprom_fm24 =
+ {
+ .name = EEPROM_FM24_DEV_NAME,
+ .addr = 0,
+ .len = FM24_PAGE_SIZE,
+ .blk_size = EEPROM_FM24_BLOCK_SIZE,
+ .ops = {init, read, write, erase},
+ .write_gran = 1};
+
+static int init(void)
+{
+ return 1;
+}
+
+static int erase(long offset, size_t size)
+{
+ // uint8_t erase_size = size > FAL_ERASE_SIZE ? FAL_ERASE_SIZE : size;
+ // uint8_t buf[FAL_ERASE_SIZE];
+ // osel_memset(buf, 0xFF, FAL_ERASE_SIZE);
+
+ // for (uint8_t i = 0; i < (size / FM24_PAGE_SIZE); i++)
+ // {
+ // uint32_t addr = eeprom_fm24.addr + offset + i * FM24_PAGE_SIZE;
+ // eeprom_fm24_write(addr, (uint8_t *)buf, erase_size);
+ // }
+ return size;
+}
+
+static int read(long offset, uint8_t *buf, size_t size)
+{
+ /* You can add your code under here. */
+ if (size == 0)
+ {
+ return 0;
+ }
+ uint32_t addr = eeprom_fm24.addr + offset;
+ BOOL res = eeprom_fm24_read(addr, buf, size);
+ return res == TRUE ? size : 0;
+}
+
+static int write(long offset, const uint8_t *buf, size_t size)
+{
+ if (size == 0)
+ {
+ return 0;
+ }
+ uint32_t addr = eeprom_fm24.addr + offset;
+ BOOL res = eeprom_fm24_write(addr, (uint8_t *)buf, size);
+ return res == TRUE ? (int)size : -1;
+}
diff --git a/User/system/lib/flashdb/fal_eeprom95_port.c b/User/system/lib/flashdb/fal_eeprom95_port.c
new file mode 100644
index 0000000..142cf78
--- /dev/null
+++ b/User/system/lib/flashdb/fal_eeprom95_port.c
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2018-01-26 armink the first version
+ */
+#include "eeprom_m95.h"
+#include
+
+static int init(void);
+static int erase(long offset, size_t size);
+
+static int read1(long offset, uint8_t *buf, size_t size);
+static int read2(long offset, uint8_t *buf, size_t size);
+static int write1(long offset, const uint8_t *buf, size_t size);
+static int write2(long offset, const uint8_t *buf, size_t size);
+
+// 1.定义 flash 设备
+struct fal_flash_dev eeprom_m95_1 =
+ {
+ .name = EEPROM_M95_1_DEV_NAME,
+ .addr = 10 * M95_PAGE_SIZE_256,
+ .len = EEPROM_M95_1_SIZE - 10 * M95_PAGE_SIZE_256,
+ .blk_size = EEPROM_M95_1_BLOCK_SIZE,
+ .ops = {init, read1, write1, erase},
+ .write_gran = 1}; // 设置写粒度,单位 bit,EPPROM写粒度为1bit
+
+struct fal_flash_dev eeprom_m95_2 =
+ {
+ .name = EEPROM_M95_2_DEV_NAME,
+ .addr = 0x000000,
+ .len = EEPROM_M95_2_SIZE,
+ .blk_size = EEPROM_M95_2_BLOCK_SIZE,
+ .ops = {init, read2, write2, erase},
+ .write_gran = 1};
+
+static int init(void)
+{
+ return 1;
+}
+
+static int erase(long offset, size_t size)
+{
+ // uint8_t erase_size = size > FAL_ERASE_SIZE ? FAL_ERASE_SIZE : size;
+ // uint8_t buf[FAL_ERASE_SIZE];
+ // osel_memset(buf, 0xFF, FAL_ERASE_SIZE);
+
+ // for (uint8_t i = 0; i < (size / M95_PAGE_SIZE_256); i++)
+ // {
+ // uint32_t addr = eeprom_m95_1.addr + offset + i * M95_PAGE_SIZE_256;
+ // eeprom_m95_write(M95_1, addr, (uint8_t *)buf, erase_size);
+ // }
+ return size;
+}
+
+static int read1(long offset, uint8_t *buf, size_t size)
+{
+ /* You can add your code under here. */
+ uint32_t addr = eeprom_m95_1.addr + offset;
+ BOOL res = eeprom_m95_read(M95_1, addr, buf, size);
+ return res == TRUE ? size : 0;
+}
+
+static int write1(long offset, const uint8_t *buf, size_t size)
+{
+ uint32_t addr = eeprom_m95_1.addr + offset;
+ BOOL res = eeprom_m95_write(M95_1, addr, (uint8_t *)buf, size);
+ return res == TRUE ? (int)size : -1;
+}
+
+static int read2(long offset, uint8_t *buf, size_t size)
+{
+ /* You can add your code under here. */
+ uint32_t addr = eeprom_m95_2.addr + offset;
+ BOOL res = eeprom_m95_read(M95_2, addr, buf, size);
+ return res == TRUE ? size : 0;
+}
+
+static int write2(long offset, const uint8_t *buf, size_t size)
+{
+ uint32_t addr = eeprom_m95_2.addr + offset;
+ BOOL res = eeprom_m95_write(M95_2, addr, (uint8_t *)buf, size);
+ return res == TRUE ? (int)size : -1;
+}
diff --git a/User/system/lib/flashdb/fdb.c b/User/system/lib/flashdb/fdb.c
new file mode 100644
index 0000000..8de2b2a
--- /dev/null
+++ b/User/system/lib/flashdb/fdb.c
@@ -0,0 +1,157 @@
+/*
+ * Copyright (c) 2020, Armink,
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/**
+ * @file
+ * @brief Initialize interface.
+ *
+ * Some initialize interface for this library.
+ */
+
+#include
+#include
+#include
+#include
+
+#ifdef FDB_USING_FILE_POSIX_MODE
+#if !defined(_MSC_VER)
+#include
+#endif
+#endif /* FDB_USING_FILE_POSIX_MODE */
+
+#define FDB_LOG_TAG ""
+
+#if !defined(FDB_USING_FAL_MODE) && !defined(FDB_USING_FILE_MODE)
+#error "Please defined the FDB_USING_FAL_MODE or FDB_USING_FILE_MODE macro"
+#endif
+
+fdb_err_t _fdb_init_ex(fdb_db_t db, const char *name, const char *path, fdb_db_type type, void *user_data)
+{
+ FDB_ASSERT(db);
+ FDB_ASSERT(name);
+ FDB_ASSERT(path);
+
+ if (db->init_ok) {
+ return FDB_NO_ERR;
+ }
+
+ db->name = name;
+ db->type = type;
+ db->user_data = user_data;
+
+ if (db->file_mode) {
+#ifdef FDB_USING_FILE_MODE
+ memset(db->cur_file_sec, FDB_FAILED_ADDR, FDB_FILE_CACHE_TABLE_SIZE * sizeof(db->cur_file_sec[0]));
+ /* must set when using file mode */
+ FDB_ASSERT(db->sec_size != 0);
+ FDB_ASSERT(db->max_size != 0);
+#ifdef FDB_USING_FILE_POSIX_MODE
+ memset(db->cur_file, -1, FDB_FILE_CACHE_TABLE_SIZE * sizeof(db->cur_file[0]));
+#else
+ memset(db->cur_file, 0, FDB_FILE_CACHE_TABLE_SIZE * sizeof(db->cur_file[0]));
+#endif
+ db->storage.dir = path;
+ FDB_ASSERT(strlen(path) != 0)
+#endif
+ } else {
+#ifdef FDB_USING_FAL_MODE
+ size_t block_size;
+
+ /* FAL (Flash Abstraction Layer) initialization */
+ fal_init();
+ /* check the flash partition */
+ if ((db->storage.part = fal_partition_find(path)) == NULL) {
+ FDB_INFO("Error: Partition (%s) not found.\n", path);
+ return FDB_PART_NOT_FOUND;
+ }
+
+ block_size = fal_flash_device_find(db->storage.part->flash_name)->blk_size;
+ if (db->sec_size == 0) {
+ db->sec_size = block_size;
+ } else {
+ /* must be aligned with block size */
+ if (db->sec_size % block_size != 0) {
+ FDB_INFO("Error: db sector size (%" PRIu32 ") MUST align with block size (%zu).\n", db->sec_size, block_size);
+ return FDB_INIT_FAILED;
+ }
+ }
+
+ db->max_size = db->storage.part->len;
+#endif /* FDB_USING_FAL_MODE */
+ }
+
+ /* the block size MUST to be the Nth power of 2 */
+ FDB_ASSERT((db->sec_size & (db->sec_size - 1)) == 0);
+ /* must align with sector size */
+ if (db->max_size % db->sec_size != 0) {
+ FDB_INFO("Error: db total size (%" PRIu32 ") MUST align with sector size (%" PRIu32 ").\n", db->max_size, db->sec_size);
+ return FDB_INIT_FAILED;
+ }
+ /* must has more than or equal 2 sectors */
+ if (db->max_size / db->sec_size < 2) {
+ FDB_INFO("Error: db MUST has more than or equal 2 sectors, current has %" PRIu32 " sector(s)\n", db->max_size / db->sec_size);
+ return FDB_INIT_FAILED;
+ }
+
+ return FDB_NO_ERR;
+}
+
+void _fdb_init_finish(fdb_db_t db, fdb_err_t result)
+{
+ static bool log_is_show = false;
+ if (result == FDB_NO_ERR) {
+ db->init_ok = true;
+ if (!log_is_show) {
+ FDB_INFO("FlashDB V%s is initialize success.\n", FDB_SW_VERSION);
+ FDB_INFO("You can get the latest version on https://github.com/armink/FlashDB .\n");
+ log_is_show = true;
+ }
+ } else if (!db->not_formatable) {
+ FDB_INFO("Error: %s (%s@%s) is initialize fail (%d).\n", db->type == FDB_DB_TYPE_KV ? "KVDB" : "TSDB",
+ db->name, _fdb_db_path(db), (int)result);
+ }
+}
+
+void _fdb_deinit(fdb_db_t db)
+{
+ FDB_ASSERT(db);
+
+ if (db->init_ok) {
+#ifdef FDB_USING_FILE_MODE
+ for (int i = 0; i < FDB_FILE_CACHE_TABLE_SIZE; i++) {
+#ifdef FDB_USING_FILE_POSIX_MODE
+ if (db->cur_file[i] > 0) {
+ close(db->cur_file[i]);
+ }
+#else
+ if (db->cur_file[i] != 0) {
+ fclose(db->cur_file[i]);
+ }
+#endif /* FDB_USING_FILE_POSIX_MODE */
+ }
+#endif /* FDB_USING_FILE_MODE */
+ }
+
+ db->init_ok = false;
+}
+
+const char *_fdb_db_path(fdb_db_t db)
+{
+ if (db->file_mode) {
+#ifdef FDB_USING_FILE_MODE
+ return db->storage.dir;
+#else
+ return NULL;
+#endif
+ }
+ else {
+#ifdef FDB_USING_FAL_MODE
+ return db->storage.part->name;
+#else
+ return NULL;
+#endif
+ }
+}
diff --git a/User/system/lib/flashdb/fdb_cfg.h b/User/system/lib/flashdb/fdb_cfg.h
new file mode 100644
index 0000000..239d9a2
--- /dev/null
+++ b/User/system/lib/flashdb/fdb_cfg.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2020, Armink,
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/**
+ * @file
+ * @brief configuration file
+ */
+
+#ifndef _FDB_CFG_H_
+#define _FDB_CFG_H_
+
+/* using KVDB feature */
+#define FDB_USING_KVDB
+
+#ifdef FDB_USING_KVDB
+/* Auto update KV to latest default when current KVDB version number is changed. @see fdb_kvdb.ver_num */
+#define FDB_KV_AUTO_UPDATE
+#endif
+
+/* using TSDB (Time series database) feature */
+#define FDB_USING_TSDB
+
+/* Using FAL storage mode */
+#define FDB_USING_FAL_MODE
+
+#ifdef FDB_USING_FAL_MODE
+/* the flash write granularity, unit: bit
+ * only support 1(nor flash)/ 8(stm32f2/f4)/ 32(stm32f1)/ 64(stm32f7)/ 128(stm32h5) */
+#define FDB_WRITE_GRAN 1 /* @note you must define it for a value */
+#endif
+
+/* Using file storage mode by LIBC file API, like fopen/fread/fwrte/fclose */
+/* #define FDB_USING_FILE_LIBC_MODE */
+
+/* Using file storage mode by POSIX file API, like open/read/write/close */
+/* #define FDB_USING_FILE_POSIX_MODE */
+
+/* MCU Endian Configuration, default is Little Endian Order. */
+/* #define FDB_BIG_ENDIAN */
+
+/* log print macro. default EF_PRINT macro is printf() */
+/* #define FDB_PRINT(...) my_printf(__VA_ARGS__) */
+
+/* print debug information */
+// #define FDB_DEBUG_ENABLE
+
+#endif /* _FDB_CFG_H_ */
diff --git a/User/system/lib/flashdb/fdb_def.h b/User/system/lib/flashdb/fdb_def.h
new file mode 100644
index 0000000..acba9e0
--- /dev/null
+++ b/User/system/lib/flashdb/fdb_def.h
@@ -0,0 +1,385 @@
+/*
+ * Copyright (c) 2020-2023, Armink,
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/**
+ * @file
+ * @brief Public definition.
+ */
+
+#ifndef _FDB_DEF_H_
+#define _FDB_DEF_H_
+
+#ifdef FDB_USING_NATIVE_ASSERT
+#include
+#endif
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+/* software version number */
+#define FDB_SW_VERSION "2.1.1"
+#define FDB_SW_VERSION_NUM 0x20101
+
+/* the KV max name length must less then it */
+#ifndef FDB_KV_NAME_MAX
+#define FDB_KV_NAME_MAX 64
+#endif
+
+/* the KV cache table size, it will improve KV search speed when using cache */
+#ifndef FDB_KV_CACHE_TABLE_SIZE
+#define FDB_KV_CACHE_TABLE_SIZE 64
+#endif
+
+/* the sector cache table size, it will improve KV save speed when using cache */
+#ifndef FDB_SECTOR_CACHE_TABLE_SIZE
+#define FDB_SECTOR_CACHE_TABLE_SIZE 8
+#endif
+
+#if (FDB_KV_CACHE_TABLE_SIZE > 0) && (FDB_SECTOR_CACHE_TABLE_SIZE > 0)
+#define FDB_KV_USING_CACHE
+#endif
+
+#if defined(FDB_USING_FILE_LIBC_MODE) || defined(FDB_USING_FILE_POSIX_MODE)
+#define FDB_USING_FILE_MODE
+#endif
+
+/* the file cache table size, it will improve GC speed in file mode when using cache */
+#ifndef FDB_FILE_CACHE_TABLE_SIZE
+#define FDB_FILE_CACHE_TABLE_SIZE 4
+#endif
+
+#ifndef FDB_WRITE_GRAN
+#define FDB_WRITE_GRAN 1
+#endif
+
+/* log function. default FDB_PRINT macro is printf() */
+// #ifndef FDB_PRINT
+// #define FDB_PRINT(...) printf(__VA_ARGS__)
+// #endif
+#ifndef FDB_PRINT
+#define FDB_PRINT(...)
+#endif
+#define FDB_LOG_PREFIX1() FDB_PRINT("[FlashDB]" FDB_LOG_TAG)
+#define FDB_LOG_PREFIX2() FDB_PRINT(" ")
+#define FDB_LOG_PREFIX() \
+ FDB_LOG_PREFIX1(); \
+ FDB_LOG_PREFIX2()
+#ifdef FDB_DEBUG_ENABLE
+#define FDB_DEBUG(...) \
+ FDB_LOG_PREFIX(); \
+ FDB_PRINT("(%s:%d) ", __FILE__, __LINE__); \
+ FDB_PRINT(__VA_ARGS__)
+#else
+#define FDB_DEBUG(...)
+#endif
+/* routine print function. Must be implement by user. */
+#define FDB_INFO(...) \
+ FDB_LOG_PREFIX(); \
+ FDB_PRINT(__VA_ARGS__)
+/* assert for developer. */
+#ifdef FDB_USING_NATIVE_ASSERT
+#define FDB_ASSERT(EXPR) assert(EXPR);
+#else
+#ifndef FDB_ASSERT
+#define FDB_ASSERT(EXPR) \
+ if (!(EXPR)) \
+ { \
+ FDB_INFO("(%s) has assert failed at %s.\n", #EXPR, __func__); \
+ while (1) \
+ ; \
+ }
+#endif /* FDB_ASSERT */
+#endif /* FDB_USING_NATIVE_ASSERT */
+
+#define FDB_KVDB_CTRL_SET_SEC_SIZE 0x00 /**< set sector size control command, this change MUST before database initialization */
+#define FDB_KVDB_CTRL_GET_SEC_SIZE 0x01 /**< get sector size control command */
+#define FDB_KVDB_CTRL_SET_LOCK 0x02 /**< set lock function control command */
+#define FDB_KVDB_CTRL_SET_UNLOCK 0x03 /**< set unlock function control command */
+#define FDB_KVDB_CTRL_SET_FILE_MODE 0x09 /**< set file mode control command, this change MUST before database initialization */
+#define FDB_KVDB_CTRL_SET_MAX_SIZE 0x0A /**< set database max size in file mode control command, this change MUST before database initialization */
+#define FDB_KVDB_CTRL_SET_NOT_FORMAT 0x0B /**< set database NOT format mode control command, this change MUST before database initialization */
+
+#define FDB_TSDB_CTRL_SET_SEC_SIZE 0x00 /**< set sector size control command, this change MUST before database initialization */
+#define FDB_TSDB_CTRL_GET_SEC_SIZE 0x01 /**< get sector size control command */
+#define FDB_TSDB_CTRL_SET_LOCK 0x02 /**< set lock function control command */
+#define FDB_TSDB_CTRL_SET_UNLOCK 0x03 /**< set unlock function control command */
+#define FDB_TSDB_CTRL_SET_ROLLOVER 0x04 /**< set rollover control command, this change MUST after database initialization */
+#define FDB_TSDB_CTRL_GET_ROLLOVER 0x05 /**< get rollover control command */
+#define FDB_TSDB_CTRL_GET_LAST_TIME 0x06 /**< get last save time control command */
+#define FDB_TSDB_CTRL_SET_FILE_MODE 0x09 /**< set file mode control command, this change MUST before database initialization */
+#define FDB_TSDB_CTRL_SET_MAX_SIZE 0x0A /**< set database max size in file mode control command, this change MUST before database initialization */
+#define FDB_TSDB_CTRL_SET_NOT_FORMAT 0x0B /**< set database NOT formatable mode control command, this change MUST before database initialization */
+
+#ifdef FDB_USING_TIMESTAMP_64BIT
+ typedef int64_t fdb_time_t;
+#else
+typedef int32_t fdb_time_t;
+#endif /* FDB_USING_TIMESTAMP_64BIT */
+
+ typedef fdb_time_t (*fdb_get_time)(void);
+
+ struct fdb_default_kv_node
+ {
+ char *key;
+ void *value;
+ size_t value_len;
+ };
+
+ struct fdb_default_kv
+ {
+ struct fdb_default_kv_node *kvs;
+ size_t num;
+ };
+
+ /* error code */
+ typedef enum
+ {
+ FDB_NO_ERR,
+ FDB_ERASE_ERR,
+ FDB_READ_ERR,
+ FDB_WRITE_ERR,
+ FDB_PART_NOT_FOUND,
+ FDB_KV_NAME_ERR,
+ FDB_KV_NAME_EXIST,
+ FDB_SAVED_FULL,
+ FDB_INIT_FAILED,
+ } fdb_err_t;
+
+ enum fdb_kv_status
+ {
+ FDB_KV_UNUSED,
+ FDB_KV_PRE_WRITE,
+ FDB_KV_WRITE,
+ FDB_KV_PRE_DELETE,
+ FDB_KV_DELETED,
+ FDB_KV_ERR_HDR,
+#define FDB_KV_STATUS_NUM 6
+ };
+ typedef enum fdb_kv_status fdb_kv_status_t;
+
+ enum fdb_tsl_status
+ {
+ FDB_TSL_UNUSED,
+ FDB_TSL_PRE_WRITE,
+ FDB_TSL_WRITE,
+ FDB_TSL_USER_STATUS1,
+ FDB_TSL_DELETED,
+ FDB_TSL_USER_STATUS2,
+#define FDB_TSL_STATUS_NUM 6
+ };
+ typedef enum fdb_tsl_status fdb_tsl_status_t;
+
+ /* key-value node object */
+ struct fdb_kv
+ {
+ fdb_kv_status_t status; /**< node status, @see fdb_kv_status_t */
+ bool crc_is_ok; /**< node CRC32 check is OK */
+ uint8_t name_len; /**< name length */
+ uint32_t magic; /**< magic word(`K`, `V`, `4`, `0`) */
+ uint32_t len; /**< node total length (header + name + value), must align by FDB_WRITE_GRAN */
+ uint32_t value_len; /**< value length */
+ char name[FDB_KV_NAME_MAX]; /**< name */
+ struct
+ {
+ uint32_t start; /**< node start address */
+ uint32_t value; /**< value start address */
+ } addr;
+ };
+ typedef struct fdb_kv *fdb_kv_t;
+
+ struct fdb_kv_iterator
+ {
+ struct fdb_kv curr_kv; /**< Current KV we get from the iterator */
+ uint32_t iterated_cnt; /**< How many KVs have we iterated already */
+ size_t iterated_obj_bytes; /**< Total storage size of KVs we have iterated. */
+ size_t iterated_value_bytes; /**< Total value size of KVs we have iterated. */
+ uint32_t sector_addr; /**< Current sector address we're iterating. DO NOT touch it. */
+ uint32_t traversed_len; /**< Traversed sector total length. */
+ };
+ typedef struct fdb_kv_iterator *fdb_kv_iterator_t;
+
+ /* time series log node object */
+ struct fdb_tsl
+ {
+ fdb_tsl_status_t status; /**< node status, @see fdb_log_status_t */
+ fdb_time_t time; /**< node timestamp */
+ uint32_t log_len; /**< log length, must align by FDB_WRITE_GRAN */
+ struct
+ {
+ uint32_t index; /**< node index address */
+ uint32_t log; /**< log data address */
+ } addr;
+ };
+ typedef struct fdb_tsl *fdb_tsl_t;
+ typedef bool (*fdb_tsl_cb)(fdb_tsl_t tsl, void *arg);
+
+ typedef enum
+ {
+ FDB_DB_TYPE_KV,
+ FDB_DB_TYPE_TS,
+ } fdb_db_type;
+
+ /* the flash sector store status */
+ enum fdb_sector_store_status
+ {
+ FDB_SECTOR_STORE_UNUSED,
+ FDB_SECTOR_STORE_EMPTY,
+ FDB_SECTOR_STORE_USING,
+ FDB_SECTOR_STORE_FULL,
+#define FDB_SECTOR_STORE_STATUS_NUM 4
+ };
+ typedef enum fdb_sector_store_status fdb_sector_store_status_t;
+
+ /* the flash sector dirty status */
+ enum fdb_sector_dirty_status
+ {
+ FDB_SECTOR_DIRTY_UNUSED,
+ FDB_SECTOR_DIRTY_FALSE,
+ FDB_SECTOR_DIRTY_TRUE,
+ FDB_SECTOR_DIRTY_GC,
+#define FDB_SECTOR_DIRTY_STATUS_NUM 4
+ };
+ typedef enum fdb_sector_dirty_status fdb_sector_dirty_status_t;
+
+ /* KVDB section information */
+ struct kvdb_sec_info
+ {
+ bool check_ok; /**< sector header check is OK */
+ struct
+ {
+ fdb_sector_store_status_t store; /**< sector store status @see fdb_sector_store_status_t */
+ fdb_sector_dirty_status_t dirty; /**< sector dirty status @see sector_dirty_status_t */
+ } status;
+ uint32_t addr; /**< sector start address */
+ uint32_t magic; /**< magic word(`E`, `F`, `4`, `0`) */
+ uint32_t combined; /**< the combined next sector number, 0xFFFFFFFF: not combined */
+ size_t remain; /**< remain size */
+ uint32_t empty_kv; /**< the next empty KV node start address */
+ };
+ typedef struct kvdb_sec_info *kv_sec_info_t;
+
+ /* TSDB section information */
+ struct tsdb_sec_info
+ {
+ bool check_ok; /**< sector header check is OK */
+ fdb_sector_store_status_t status; /**< sector store status @see fdb_sector_store_status_t */
+ uint32_t addr; /**< sector start address */
+ uint32_t magic; /**< magic word(`T`, `S`, `L`, `0`) */
+ fdb_time_t start_time; /**< the first start node's timestamp, 0xFFFFFFFF: unused */
+ fdb_time_t end_time; /**< the last end node's timestamp, 0xFFFFFFFF: unused */
+ uint32_t end_idx; /**< the last end node's index, 0xFFFFFFFF: unused */
+ fdb_tsl_status_t end_info_stat[2]; /**< the last end node's info status */
+ size_t remain; /**< remain size */
+ uint32_t empty_idx; /**< the next empty node index address */
+ uint32_t empty_data; /**< the next empty node's data end address */
+ };
+ typedef struct tsdb_sec_info *tsdb_sec_info_t;
+
+ struct kv_cache_node
+ {
+ uint16_t name_crc; /**< KV name's CRC32 low 16bit value */
+ uint16_t active; /**< KV node access active degree */
+ uint32_t addr; /**< KV node address */
+ };
+ typedef struct kv_cache_node *kv_cache_node_t;
+
+ /* database structure */
+ typedef struct fdb_db *fdb_db_t;
+ struct fdb_db
+ {
+ const char *name; /**< database name */
+ fdb_db_type type; /**< database type */
+ union
+ {
+#ifdef FDB_USING_FAL_MODE
+ const struct fal_partition *part; /**< flash partition for saving database */
+#endif
+#ifdef FDB_USING_FILE_MODE
+ const char *dir; /**< directory path for saving database */
+#endif
+ } storage;
+ uint32_t sec_size; /**< flash section size. It's a multiple of block size */
+ uint32_t max_size; /**< database max size. It's a multiple of section size */
+ uint32_t oldest_addr; /**< the oldest sector start address */
+ bool init_ok; /**< initialized successfully */
+ bool file_mode; /**< is file mode, default is false */
+ bool not_formatable; /**< is can NOT be formated mode, default is false */
+#ifdef FDB_USING_FILE_MODE
+ uint32_t cur_file_sec[FDB_FILE_CACHE_TABLE_SIZE]; /**< last operate sector address */
+#if defined(FDB_USING_FILE_POSIX_MODE)
+ int cur_file[FDB_FILE_CACHE_TABLE_SIZE]; /**< current file object */
+#elif defined(FDB_USING_FILE_LIBC_MODE)
+ FILE *cur_file[FDB_FILE_CACHE_TABLE_SIZE]; /**< current file object */
+#endif /* FDB_USING_FILE_MODE */
+ uint32_t cur_sec; /**< current operate sector address */
+#endif
+ void (*lock)(fdb_db_t db); /**< lock the database operate */
+ void (*unlock)(fdb_db_t db); /**< unlock the database operate */
+
+ void *user_data;
+ };
+
+ /* KVDB structure */
+ struct fdb_kvdb
+ {
+ struct fdb_db parent; /**< inherit from fdb_db */
+ struct fdb_default_kv default_kvs; /**< default KV */
+ bool gc_request; /**< request a GC check */
+ bool in_recovery_check; /**< is in recovery check status when first reboot */
+ struct fdb_kv cur_kv;
+ struct kvdb_sec_info cur_sector;
+ bool last_is_complete_del;
+
+#ifdef FDB_KV_USING_CACHE
+ /* KV cache table */
+ struct kv_cache_node kv_cache_table[FDB_KV_CACHE_TABLE_SIZE];
+ /* sector cache table, it caching the sector info which status is current using */
+ struct kvdb_sec_info sector_cache_table[FDB_SECTOR_CACHE_TABLE_SIZE];
+#endif /* FDB_KV_USING_CACHE */
+
+#ifdef FDB_KV_AUTO_UPDATE
+ uint32_t ver_num; /**< setting version number for update */
+#endif
+
+ void *user_data;
+ };
+ typedef struct fdb_kvdb *fdb_kvdb_t;
+
+ /* TSDB structure */
+ struct fdb_tsdb
+ {
+ struct fdb_db parent; /**< inherit from fdb_db */
+ struct tsdb_sec_info cur_sec; /**< current using sector */
+ fdb_time_t last_time; /**< last TSL timestamp */
+ fdb_get_time get_time; /**< the current timestamp get function */
+ size_t max_len; /**< the maximum length of each log */
+ bool rollover; /**< the oldest data will rollover by newest data, default is true */
+
+ void *user_data;
+ };
+ typedef struct fdb_tsdb *fdb_tsdb_t;
+
+ /* blob structure */
+ struct fdb_blob
+ {
+ void *buf; /**< blob data buffer */
+ size_t size; /**< blob data buffer size */
+ struct
+ {
+ uint32_t meta_addr; /**< saved KV or TSL index address */
+ uint32_t addr; /**< blob data saved address */
+ size_t len; /**< blob data saved length */
+ } saved;
+ };
+ typedef struct fdb_blob *fdb_blob_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _FDB_DEF_H_ */
diff --git a/User/system/lib/flashdb/fdb_file.c b/User/system/lib/flashdb/fdb_file.c
new file mode 100644
index 0000000..0226122
--- /dev/null
+++ b/User/system/lib/flashdb/fdb_file.c
@@ -0,0 +1,318 @@
+/*
+ * Copyright (c) 2020, Armink,
+ * Copyright (c) 2020, enkiller, <462747508@qq.com>
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+#include
+#include
+#include
+#include
+
+#define FDB_LOG_TAG "[file]"
+
+#ifdef FDB_USING_FILE_MODE
+
+#define DB_PATH_MAX 256
+
+static void get_db_file_path(fdb_db_t db, uint32_t addr, char *path, size_t size)
+{
+#define DB_NAME_MAX 8
+
+ /* from db_name.fdb.0 to db_name.fdb.n */
+ char file_name[DB_NAME_MAX + 4 + 10];
+ uint32_t sec_addr = FDB_ALIGN_DOWN(addr, db->sec_size);
+ int index = sec_addr / db->sec_size;
+
+ snprintf(file_name, sizeof(file_name), "%.*s.fdb.%d", DB_NAME_MAX, db->name, index);
+ if (strlen(db->storage.dir) + 1 + strlen(file_name) >= size) {
+ /* path is too long */
+ FDB_INFO("Error: db (%s) file path (%s) is too log.\n", file_name, db->storage.dir);
+ FDB_ASSERT(0)
+ }
+ snprintf(path, size, "%s/%s", db->storage.dir, file_name);
+}
+
+#if defined(FDB_USING_FILE_POSIX_MODE)
+#include
+#include
+#include
+#if !defined(_MSC_VER)
+#include
+#endif
+
+static int get_file_from_cache(fdb_db_t db, uint32_t sec_addr)
+{
+ for (int i = 0; i < FDB_FILE_CACHE_TABLE_SIZE; i++) {
+ if (db->cur_file_sec[i] == sec_addr)
+ return db->cur_file[i];
+ }
+
+ return -1;
+}
+
+static void update_file_cache(fdb_db_t db, uint32_t sec_addr, int fd)
+{
+ int free_index = FDB_FILE_CACHE_TABLE_SIZE;
+
+ for (int i = 0; i < FDB_FILE_CACHE_TABLE_SIZE; i++) {
+ if (db->cur_file_sec[i] == sec_addr) {
+ db->cur_file[i] = fd;
+ return;
+ } else if (db->cur_file[i] == -1) {
+ free_index = i;
+ }
+ }
+
+ if (fd > 0) {
+ if (free_index < FDB_FILE_CACHE_TABLE_SIZE) {
+ db->cur_file[free_index] = fd;
+ db->cur_file_sec[free_index] = sec_addr;
+ } else {
+ /* cache is full, move to end */
+ for (int i = FDB_FILE_CACHE_TABLE_SIZE - 1; i > 0; i--) {
+ close(db->cur_file[i]);
+ memcpy(&db->cur_file[i], &db->cur_file[i - 1], sizeof(db->cur_file[0]));
+ memcpy(&db->cur_file_sec[i], &db->cur_file_sec[i - 1], sizeof(db->cur_file_sec[0]));
+ }
+ /* add to head */
+ db->cur_file[0] = fd;
+ db->cur_file_sec[0] = sec_addr;
+ }
+ }
+}
+
+static int open_db_file(fdb_db_t db, uint32_t addr, bool clean)
+{
+ uint32_t sec_addr = FDB_ALIGN_DOWN(addr, db->sec_size);
+ int fd = get_file_from_cache(db, sec_addr);
+ char path[DB_PATH_MAX];
+
+ if (fd <= 0 || clean) {
+ get_db_file_path(db, addr, path, DB_PATH_MAX);
+
+ if (fd > 0) {
+ close(fd);
+ fd = -1;
+ update_file_cache(db, sec_addr, fd);
+ }
+ if (clean) {
+ /* clean the old file */
+ int clean_fd = open(path, O_RDWR | O_CREAT | O_TRUNC, 0777);
+ if (clean_fd <= 0) {
+ FDB_INFO("Error: open (%s) file failed.\n", path);
+ }
+ else {
+ close(clean_fd);
+ clean_fd = -1;
+ }
+ }
+ if (get_file_from_cache(db, sec_addr) < 0) {
+ /* open the database file */
+ fd = open(path, O_RDWR, 0777);
+ update_file_cache(db, sec_addr, fd);
+ }
+ db->cur_sec = sec_addr;
+ }
+
+ return fd;
+}
+
+fdb_err_t _fdb_file_read(fdb_db_t db, uint32_t addr, void *buf, size_t size)
+{
+ fdb_err_t result = FDB_NO_ERR;
+ int fd = open_db_file(db, addr, false);
+ if (fd > 0) {
+ /* get the offset address is relative to the start of the current file */
+ addr = addr % db->sec_size;
+
+ if ((lseek(fd, addr, SEEK_SET) != (int32_t)addr) || (read(fd, buf, size) != (ssize_t)size))
+ result = FDB_READ_ERR;
+ } else {
+ result = FDB_READ_ERR;
+ }
+ return result;
+}
+
+fdb_err_t _fdb_file_write(fdb_db_t db, uint32_t addr, const void *buf, size_t size, bool sync)
+{
+ fdb_err_t result = FDB_NO_ERR;
+ int fd = open_db_file(db, addr, false);
+ if (fd > 0) {
+ /* get the offset address is relative to the start of the current file */
+ addr = addr % db->sec_size;
+
+ if ((lseek(fd, addr, SEEK_SET) != (int32_t)addr) || (write(fd, buf, size) != (ssize_t)size))
+ result = FDB_WRITE_ERR;
+ if(sync) {
+ fsync(fd);
+ }
+ } else {
+ result = FDB_WRITE_ERR;
+ }
+ return result;
+}
+
+fdb_err_t _fdb_file_erase(fdb_db_t db, uint32_t addr, size_t size)
+{
+ fdb_err_t result = FDB_NO_ERR;
+ int fd = open_db_file(db, addr, true);
+ if (fd > 0) {
+#define BUF_SIZE 32
+ uint8_t buf[BUF_SIZE];
+ size_t i;
+ lseek(fd, 0, SEEK_SET);
+ for (i = 0; i * BUF_SIZE < size; i++)
+ {
+ memset(buf, 0xFF, BUF_SIZE);
+ write(fd, buf, BUF_SIZE);
+ }
+ memset(buf, 0xFF, BUF_SIZE);
+ write(fd, buf, size - i * BUF_SIZE);
+ fsync(fd);
+ } else {
+ result = FDB_ERASE_ERR;
+ }
+ return result;
+}
+#elif defined(FDB_USING_FILE_LIBC_MODE)
+
+static FILE *get_file_from_cache(fdb_db_t db, uint32_t sec_addr)
+{
+ for (int i = 0; i < FDB_FILE_CACHE_TABLE_SIZE; i++) {
+ if (db->cur_file_sec[i] == sec_addr)
+ return db->cur_file[i];
+ }
+
+ return NULL;
+}
+
+static void update_file_cache(fdb_db_t db, uint32_t sec_addr, FILE *fd)
+{
+ int free_index = FDB_FILE_CACHE_TABLE_SIZE;
+
+ for (int i = 0; i < FDB_FILE_CACHE_TABLE_SIZE; i++) {
+ if (db->cur_file_sec[i] == sec_addr) {
+ db->cur_file[i] = fd;
+ return;
+ }
+ else if (db->cur_file[i] == 0) {
+ free_index = i;
+ }
+ }
+
+ if (fd) {
+ if (free_index < FDB_FILE_CACHE_TABLE_SIZE) {
+ db->cur_file[free_index] = fd;
+ db->cur_file_sec[free_index] = sec_addr;
+ }
+ else {
+ /* cache is full, move to end */
+ for (int i = FDB_FILE_CACHE_TABLE_SIZE - 1; i > 0; i--) {
+ fclose(db->cur_file[i]);
+ memcpy(&db->cur_file[i], &db->cur_file[i - 1], sizeof(db->cur_file[0]));
+ memcpy(&db->cur_file_sec[i], &db->cur_file_sec[i - 1], sizeof(db->cur_file_sec[0]));
+ }
+ /* add to head */
+ db->cur_file[0] = fd;
+ db->cur_file_sec[0] = sec_addr;
+ }
+ }
+}
+
+static FILE *open_db_file(fdb_db_t db, uint32_t addr, bool clean)
+{
+ uint32_t sec_addr = FDB_ALIGN_DOWN(addr, db->sec_size);
+ FILE *fd = get_file_from_cache(db, sec_addr);
+ char path[DB_PATH_MAX];
+
+ if (fd == NULL || clean) {
+ get_db_file_path(db, addr, path, DB_PATH_MAX);
+
+ if (fd) {
+ fclose(fd);
+ fd = NULL;
+ update_file_cache(db, sec_addr, fd);
+ }
+
+ if (clean) {
+ /* clean the old file */
+ FILE *clean_fd = fopen(path, "wb+");
+ if (clean_fd == NULL) {
+ FDB_INFO("Error: open (%s) file failed.\n", path);
+ } else {
+ fclose(clean_fd);
+ clean_fd = NULL;
+ }
+ }
+ if (get_file_from_cache(db, sec_addr) == NULL) {
+ /* open the database file */
+ fd = fopen(path, "rb+");
+ update_file_cache(db, sec_addr, fd);
+ }
+ db->cur_sec = sec_addr;
+ }
+
+ return fd;
+}
+
+fdb_err_t _fdb_file_read(fdb_db_t db, uint32_t addr, void *buf, size_t size)
+{
+ fdb_err_t result = FDB_NO_ERR;
+ FILE *fp = open_db_file(db, addr, false);
+ if (fp) {
+ addr = addr % db->sec_size;
+ if ((fseek(fp, addr, SEEK_SET) != 0) || (fread(buf, size, 1, fp) != size))
+ result = FDB_READ_ERR;
+ } else {
+ result = FDB_READ_ERR;
+ }
+ return result;
+}
+
+fdb_err_t _fdb_file_write(fdb_db_t db, uint32_t addr, const void *buf, size_t size, bool sync)
+{
+ fdb_err_t result = FDB_NO_ERR;
+ FILE *fp = open_db_file(db, addr, false);
+ if (fp) {
+ addr = addr % db->sec_size;
+ if ((fseek(fp, addr, SEEK_SET) != 0) || (fwrite(buf, size, 1, fp) != size))
+ result = FDB_READ_ERR;
+ if(sync) {
+ fflush(fp);
+ }
+ } else {
+ result = FDB_READ_ERR;
+ }
+
+ return result;
+}
+
+fdb_err_t _fdb_file_erase(fdb_db_t db, uint32_t addr, size_t size)
+{
+ fdb_err_t result = FDB_NO_ERR;
+
+ FILE *fp = open_db_file(db, addr, true);
+ if (fp != NULL) {
+#define BUF_SIZE 32
+ uint8_t buf[BUF_SIZE];
+ size_t i;
+ fseek(fp, 0, SEEK_SET);
+ for (i = 0; i * BUF_SIZE < size; i++)
+ {
+ memset(buf, 0xFF, BUF_SIZE);
+ fwrite(buf, BUF_SIZE, 1, fp);
+ }
+ memset(buf, 0xFF, BUF_SIZE);
+ fwrite(buf, size - i * BUF_SIZE, 1, fp);
+ fflush(fp);
+ } else {
+ result = FDB_ERASE_ERR;
+ }
+ return result;
+}
+#endif /* defined(FDB_USING_FILE_LIBC_MODE) */
+
+#endif /* FDB_USING_FILE_MODE */
+
diff --git a/User/system/lib/flashdb/fdb_kvdb.c b/User/system/lib/flashdb/fdb_kvdb.c
new file mode 100644
index 0000000..2bf2375
--- /dev/null
+++ b/User/system/lib/flashdb/fdb_kvdb.c
@@ -0,0 +1,1967 @@
+/*
+ * Copyright (c) 2020, Armink,
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/**
+ * @file
+ * @brief KVDB feature.
+ *
+ * Key-Value Database feature implement source file.
+ */
+
+#include
+#include
+#include
+#include
+
+#define FDB_LOG_TAG "[kv]"
+/* rewrite log prefix */
+#undef FDB_LOG_PREFIX2
+#define FDB_LOG_PREFIX2() FDB_PRINT("[%s][%s] ", db_name(db), _fdb_db_path((fdb_db_t)db))
+
+#if defined(FDB_USING_KVDB)
+
+#ifndef FDB_WRITE_GRAN
+#error "Please configure flash write granularity (in fdb_cfg.h)"
+#endif
+
+#if FDB_WRITE_GRAN != 1 && FDB_WRITE_GRAN != 8 && FDB_WRITE_GRAN != 32 && FDB_WRITE_GRAN != 64 && FDB_WRITE_GRAN != 128
+#error "the write gran can be only setting as 1, 8, 32, 64 and 128"
+#endif
+
+/* magic word(`F`, `D`, `B`, `1`) */
+#define SECTOR_MAGIC_WORD 0x30424446
+/* magic word(`K`, `V`, `0`, `0`) */
+#define KV_MAGIC_WORD 0x3030564B
+/* GC minimum number of empty sectors. GC will using at least 1 empty sector. */
+#define GC_MIN_EMPTY_SEC_NUM 1
+
+/* the sector remain threshold before full status */
+#ifndef FDB_SEC_REMAIN_THRESHOLD
+#define FDB_SEC_REMAIN_THRESHOLD (KV_HDR_DATA_SIZE + FDB_KV_NAME_MAX)
+#endif
+
+/* the total remain empty sector threshold before GC */
+#ifndef FDB_GC_EMPTY_SEC_THRESHOLD
+#define FDB_GC_EMPTY_SEC_THRESHOLD 1
+#endif
+
+/* the string KV value buffer size for legacy fdb_get_kv(db, ) function */
+#ifndef FDB_STR_KV_VALUE_MAX_SIZE
+#define FDB_STR_KV_VALUE_MAX_SIZE 128
+#endif
+
+#if FDB_KV_CACHE_TABLE_SIZE > 0xFFFF
+#error "The KV cache table size must less than 0xFFFF"
+#endif
+
+/* the sector is not combined value */
+#if (FDB_BYTE_ERASED == 0xFF)
+#define SECTOR_NOT_COMBINED 0xFFFFFFFF
+#define SECTOR_COMBINED 0x00000000
+#else
+#define SECTOR_NOT_COMBINED 0x00000000
+#define SECTOR_COMBINED 0xFFFFFFFF
+#endif
+/* the next address is get failed */
+#define FAILED_ADDR 0xFFFFFFFF
+
+#define KV_STATUS_TABLE_SIZE FDB_STATUS_TABLE_SIZE(FDB_KV_STATUS_NUM)
+
+#define SECTOR_NUM (db_max_size(db) / db_sec_size(db))
+
+#define SECTOR_HDR_DATA_SIZE (FDB_WG_ALIGN(sizeof(struct sector_hdr_data)))
+#define SECTOR_STORE_OFFSET ((unsigned long)(&((struct sector_hdr_data *)0)->status_table.store))
+#define SECTOR_DIRTY_OFFSET ((unsigned long)(&((struct sector_hdr_data *)0)->status_table.dirty))
+#define SECTOR_MAGIC_OFFSET ((unsigned long)(&((struct sector_hdr_data *)0)->magic))
+#define KV_HDR_DATA_SIZE (FDB_WG_ALIGN(sizeof(struct kv_hdr_data)))
+#define KV_MAGIC_OFFSET ((unsigned long)(&((struct kv_hdr_data *)0)->magic))
+#define KV_LEN_OFFSET ((unsigned long)(&((struct kv_hdr_data *)0)->len))
+#define KV_NAME_LEN_OFFSET ((unsigned long)(&((struct kv_hdr_data *)0)->name_len))
+
+#define db_name(db) (((fdb_db_t)db)->name)
+#define db_init_ok(db) (((fdb_db_t)db)->init_ok)
+#define db_sec_size(db) (((fdb_db_t)db)->sec_size)
+#define db_max_size(db) (((fdb_db_t)db)->max_size)
+#define db_oldest_addr(db) (((fdb_db_t)db)->oldest_addr)
+
+#define db_lock(db) \
+ do { \
+ if (((fdb_db_t)db)->lock) ((fdb_db_t)db)->lock((fdb_db_t)db); \
+ } while(0);
+
+#define db_unlock(db) \
+ do { \
+ if (((fdb_db_t)db)->unlock) ((fdb_db_t)db)->unlock((fdb_db_t)db); \
+ } while(0);
+
+#define VER_NUM_KV_NAME "__ver_num__"
+
+struct sector_hdr_data {
+ struct {
+ uint8_t store[FDB_STORE_STATUS_TABLE_SIZE]; /**< sector store status @see fdb_sector_store_status_t */
+ uint8_t dirty[FDB_DIRTY_STATUS_TABLE_SIZE]; /**< sector dirty status @see fdb_sector_dirty_status_t */
+ } status_table;
+ uint32_t magic; /**< magic word(`E`, `F`, `4`, `0`) */
+ uint32_t combined; /**< the combined next sector number, default: not combined */
+ uint32_t reserved;
+#if (FDB_WRITE_GRAN == 64) || (FDB_WRITE_GRAN == 128)
+ uint8_t padding[4]; /**< align padding for 64bit and 128bit write granularity */
+#endif
+};
+typedef struct sector_hdr_data *sector_hdr_data_t;
+
+struct kv_hdr_data {
+ uint8_t status_table[KV_STATUS_TABLE_SIZE]; /**< KV node status, @see fdb_kv_status_t */
+ uint32_t magic; /**< magic word(`K`, `V`, `0`, `0`) */
+ uint32_t len; /**< KV node total length (header + name + value), must align by FDB_WRITE_GRAN */
+ uint32_t crc32; /**< KV node crc32(name_len + data_len + name + value) */
+ uint8_t name_len; /**< name length */
+ uint32_t value_len; /**< value length */
+#if (FDB_WRITE_GRAN == 64)
+ uint8_t padding[4]; /**< align padding for 64bit write granularity */
+#endif
+#if (FDB_WRITE_GRAN == 128)
+ uint8_t padding[12]; /**< align padding for 128bit write granularity */
+#endif
+};
+typedef struct kv_hdr_data *kv_hdr_data_t;
+
+struct alloc_kv_cb_args {
+ fdb_kvdb_t db;
+ size_t kv_size;
+ uint32_t *empty_kv;
+};
+
+struct gc_cb_args {
+ fdb_kvdb_t db;
+ size_t setting_free_size;
+ size_t last_gc_sec_addr;
+};
+
+static void gc_collect(fdb_kvdb_t db);
+static void gc_collect_by_free_size(fdb_kvdb_t db, size_t free_size);
+
+#ifdef FDB_KV_USING_CACHE
+static void update_sector_cache(fdb_kvdb_t db, kv_sec_info_t sector)
+{
+ size_t i, empty_index = FDB_SECTOR_CACHE_TABLE_SIZE;
+
+ for (i = 0; i < FDB_SECTOR_CACHE_TABLE_SIZE; i++) {
+ /* update the sector empty_addr in cache */
+ if (db->sector_cache_table[i].addr == sector->addr) {
+ if (sector->check_ok) {
+ memcpy(&db->sector_cache_table[i], sector, sizeof(struct kvdb_sec_info));
+ } else {
+ db->sector_cache_table[i].addr = FDB_DATA_UNUSED;
+ }
+ return;
+ } else if (db->sector_cache_table[i].addr == FDB_DATA_UNUSED) {
+ empty_index = i;
+ }
+ }
+ /* add the sector empty_addr to cache */
+ if (sector->check_ok && empty_index < FDB_SECTOR_CACHE_TABLE_SIZE) {
+ memcpy(&db->sector_cache_table[empty_index], sector, sizeof(struct kvdb_sec_info));
+ }
+}
+
+/*
+ * Get sector info from cache. It's return true when cache is hit.
+ */
+static kv_sec_info_t get_sector_from_cache(fdb_kvdb_t db, uint32_t sec_addr)
+{
+ size_t i;
+
+ for (i = 0; i < FDB_SECTOR_CACHE_TABLE_SIZE; i++) {
+ if (db->sector_cache_table[i].addr == sec_addr) {
+ return &db->sector_cache_table[i];
+ }
+ }
+
+ return NULL;
+}
+
+static void update_sector_empty_addr_cache(fdb_kvdb_t db, uint32_t sec_addr, uint32_t empty_addr)
+{
+ kv_sec_info_t sector = get_sector_from_cache(db, sec_addr);
+ if (sector) {
+ sector->empty_kv = empty_addr;
+ sector->remain = db_sec_size(db) - (sector->empty_kv - sector->addr);
+ }
+}
+
+static void update_sector_status_store_cache(fdb_kvdb_t db, uint32_t sec_addr, fdb_sector_store_status_t stauts)
+{
+ kv_sec_info_t sector = get_sector_from_cache(db, sec_addr);
+ if (sector) {
+ sector->status.store = stauts;
+ }
+}
+
+static void update_kv_cache(fdb_kvdb_t db, const char *name, size_t name_len, uint32_t addr)
+{
+ size_t i, empty_index = FDB_KV_CACHE_TABLE_SIZE, min_activity_index = FDB_KV_CACHE_TABLE_SIZE;
+ uint16_t name_crc = (uint16_t) (fdb_calc_crc32(0, name, name_len) >> 16), min_activity = 0xFFFF;
+
+ for (i = 0; i < FDB_KV_CACHE_TABLE_SIZE; i++) {
+ if (addr != FDB_DATA_UNUSED) {
+ /* update the KV address in cache */
+ if (db->kv_cache_table[i].name_crc == name_crc) {
+ db->kv_cache_table[i].addr = addr;
+ return;
+ } else if ((db->kv_cache_table[i].addr == FDB_DATA_UNUSED) && (empty_index == FDB_KV_CACHE_TABLE_SIZE)) {
+ empty_index = i;
+ } else if (db->kv_cache_table[i].addr != FDB_DATA_UNUSED) {
+ if (db->kv_cache_table[i].active > 0) {
+ db->kv_cache_table[i].active--;
+ }
+ if (db->kv_cache_table[i].active < min_activity) {
+ min_activity_index = i;
+ min_activity = db->kv_cache_table[i].active;
+ }
+ }
+ } else if (db->kv_cache_table[i].name_crc == name_crc) {
+ /* delete the KV */
+ db->kv_cache_table[i].addr = FDB_DATA_UNUSED;
+ db->kv_cache_table[i].active = 0;
+ return;
+ }
+ }
+ /* add the KV to cache, using LRU (Least Recently Used) like algorithm */
+ if (empty_index < FDB_KV_CACHE_TABLE_SIZE) {
+ db->kv_cache_table[empty_index].addr = addr;
+ db->kv_cache_table[empty_index].name_crc = name_crc;
+ db->kv_cache_table[empty_index].active = FDB_KV_CACHE_TABLE_SIZE;
+ } else if (min_activity_index < FDB_KV_CACHE_TABLE_SIZE) {
+ db->kv_cache_table[min_activity_index].addr = addr;
+ db->kv_cache_table[min_activity_index].name_crc = name_crc;
+ db->kv_cache_table[min_activity_index].active = FDB_KV_CACHE_TABLE_SIZE;
+ }
+}
+
+/*
+ * Get KV info from cache. It's return true when cache is hit.
+ */
+static bool get_kv_from_cache(fdb_kvdb_t db, const char *name, size_t name_len, uint32_t *addr)
+{
+ size_t i;
+ uint16_t name_crc = (uint16_t) (fdb_calc_crc32(0, name, name_len) >> 16);
+
+ for (i = 0; i < FDB_KV_CACHE_TABLE_SIZE; i++) {
+ if ((db->kv_cache_table[i].addr != FDB_DATA_UNUSED) && (db->kv_cache_table[i].name_crc == name_crc)) {
+ char saved_name[FDB_KV_NAME_MAX] = { 0 };
+ /* read the KV name in flash */
+ _fdb_flash_read((fdb_db_t)db, db->kv_cache_table[i].addr + KV_HDR_DATA_SIZE, (uint32_t *) saved_name, FDB_KV_NAME_MAX);
+ if (!strncmp(name, saved_name, name_len)) {
+ *addr = db->kv_cache_table[i].addr;
+ if (db->kv_cache_table[i].active >= 0xFFFF - FDB_KV_CACHE_TABLE_SIZE) {
+ db->kv_cache_table[i].active = 0xFFFF;
+ } else {
+ db->kv_cache_table[i].active += FDB_KV_CACHE_TABLE_SIZE;
+ }
+ return true;
+ }
+ }
+ }
+
+ return false;
+}
+#endif /* FDB_KV_USING_CACHE */
+
+/*
+ * find the next KV address by magic word on the flash
+ */
+static uint32_t find_next_kv_addr(fdb_kvdb_t db, uint32_t start, uint32_t end)
+{
+ uint8_t buf[32];
+ uint32_t start_bak = start, i;
+ uint32_t magic;
+
+#ifdef FDB_KV_USING_CACHE
+ kv_sec_info_t sector;
+ sector = get_sector_from_cache(db, FDB_ALIGN_DOWN(start, db_sec_size(db)));
+ if (sector && start == sector->empty_kv) {
+ return FAILED_ADDR;
+ }
+#endif /* FDB_KV_USING_CACHE */
+
+ for (; start < end && start + sizeof(buf) < end; start += (sizeof(buf) - sizeof(uint32_t))) {
+ if (_fdb_flash_read((fdb_db_t)db, start, (uint32_t *) buf, sizeof(buf)) != FDB_NO_ERR)
+ return FAILED_ADDR;
+ for (i = 0; i < sizeof(buf) - sizeof(uint32_t) && start + i < end; i++) {
+#ifndef FDB_BIG_ENDIAN /* Little Endian Order */
+ magic = buf[i] + ((uint32_t)buf[i + 1] << 8) + ((uint32_t)buf[i + 2] << 16) + ((uint32_t)buf[i + 3] << 24);
+#else /* Big Endian Order */
+ magic = buf[i + 3] + ((uint32_t)buf[i + 2] << 8) + ((uint32_t)buf[i + 1] << 16) + ((uint32_t)buf[i] << 24);
+#endif
+ if (magic == KV_MAGIC_WORD && (start + i - KV_MAGIC_OFFSET) >= start_bak) {
+ return start + i - KV_MAGIC_OFFSET;
+ }
+ }
+ }
+
+ return FAILED_ADDR;
+}
+
+static uint32_t get_next_kv_addr(fdb_kvdb_t db, kv_sec_info_t sector, fdb_kv_t pre_kv)
+{
+ uint32_t addr = FAILED_ADDR;
+
+ if (sector->status.store == FDB_SECTOR_STORE_EMPTY) {
+ return FAILED_ADDR;
+ }
+
+ if (pre_kv->addr.start == FAILED_ADDR) {
+ /* the first KV address */
+ addr = sector->addr + SECTOR_HDR_DATA_SIZE;
+ } else {
+ if (pre_kv->addr.start <= sector->addr + db_sec_size(db)) {
+ if (pre_kv->crc_is_ok) {
+ addr = pre_kv->addr.start + pre_kv->len;
+ } else {
+ /* when pre_kv CRC check failed, maybe the flash has error data
+ * find_next_kv_addr after pre_kv address */
+ addr = pre_kv->addr.start + FDB_WG_ALIGN(1);
+ }
+ /* check and find next KV address */
+ addr = find_next_kv_addr(db, addr, sector->addr + db_sec_size(db) - SECTOR_HDR_DATA_SIZE);
+
+ if (addr == FAILED_ADDR || addr > sector->addr + db_sec_size(db) || pre_kv->len == 0) {
+ //TODO Sector continuous mode
+ return FAILED_ADDR;
+ }
+ } else {
+ /* no KV */
+ return FAILED_ADDR;
+ }
+ }
+
+ return addr;
+}
+
+static fdb_err_t read_kv(fdb_kvdb_t db, fdb_kv_t kv)
+{
+ struct kv_hdr_data kv_hdr;
+ uint8_t buf[32];
+ uint32_t calc_crc32 = 0, crc_data_len, kv_name_addr;
+ fdb_err_t result = FDB_NO_ERR;
+ size_t len, size;
+ /* read KV header raw data */
+ _fdb_flash_read((fdb_db_t)db, kv->addr.start, (uint32_t *)&kv_hdr, sizeof(struct kv_hdr_data));
+ kv->status = (fdb_kv_status_t) _fdb_get_status(kv_hdr.status_table, FDB_KV_STATUS_NUM);
+ kv->len = kv_hdr.len;
+
+ if (kv->len == UINT32_MAX || kv->len > db_max_size(db) || kv->len < KV_HDR_DATA_SIZE) {
+ /* the KV length was not write, so reserved the info for current KV */
+ kv->len = KV_HDR_DATA_SIZE;
+ if (kv->status != FDB_KV_ERR_HDR) {
+ kv->status = FDB_KV_ERR_HDR;
+ FDB_INFO("Error: The KV @0x%08" PRIX32 " length has an error.\n", kv->addr.start);
+ _fdb_write_status((fdb_db_t)db, kv->addr.start, kv_hdr.status_table, FDB_KV_STATUS_NUM, FDB_KV_ERR_HDR, true);
+ }
+ kv->crc_is_ok = false;
+ return FDB_READ_ERR;
+ } else if (kv->len > db_sec_size(db) - SECTOR_HDR_DATA_SIZE && kv->len < db_max_size(db)) {
+ //TODO Sector continuous mode, or the write length is not written completely
+ }
+
+ /* CRC32 data len(header.name_len + header.value_len + name + value), using sizeof(uint32_t) for compatible V1.x */
+ calc_crc32 = fdb_calc_crc32(calc_crc32, &kv_hdr.name_len, sizeof(uint32_t));
+ calc_crc32 = fdb_calc_crc32(calc_crc32, &kv_hdr.value_len, sizeof(uint32_t));
+ crc_data_len = kv->len - KV_HDR_DATA_SIZE;
+ /* calculate the CRC32 value */
+ for (len = 0, size = 0; len < crc_data_len; len += size) {
+ if (len + sizeof(buf) < crc_data_len) {
+ size = sizeof(buf);
+ } else {
+ size = crc_data_len - len;
+ }
+
+ _fdb_flash_read((fdb_db_t)db, kv->addr.start + KV_HDR_DATA_SIZE + len, (uint32_t *) buf, FDB_WG_ALIGN(size));
+ calc_crc32 = fdb_calc_crc32(calc_crc32, buf, size);
+ }
+ /* check CRC32 */
+ if (calc_crc32 != kv_hdr.crc32) {
+ size_t name_len = kv_hdr.name_len > FDB_KV_NAME_MAX ? FDB_KV_NAME_MAX : kv_hdr.name_len;
+ kv->crc_is_ok = false;
+ result = FDB_READ_ERR;
+ /* try read the KV name, maybe read name has error */
+ kv_name_addr = kv->addr.start + KV_HDR_DATA_SIZE;
+ _fdb_flash_read((fdb_db_t)db, kv_name_addr, (uint32_t *)kv->name, FDB_WG_ALIGN(name_len));
+ FDB_INFO("Error: Read the KV (%.*s@0x%08" PRIX32 ") CRC32 check failed!\n", name_len, kv->name, kv->addr.start);
+ } else {
+ kv->crc_is_ok = true;
+ /* the name is behind aligned KV header */
+ kv_name_addr = kv->addr.start + KV_HDR_DATA_SIZE;
+ _fdb_flash_read((fdb_db_t)db, kv_name_addr, (uint32_t *) kv->name, FDB_WG_ALIGN(kv_hdr.name_len));
+ /* the value is behind aligned name */
+ kv->addr.value = kv_name_addr + FDB_WG_ALIGN(kv_hdr.name_len);
+ kv->value_len = kv_hdr.value_len;
+ kv->name_len = kv_hdr.name_len;
+ if (kv_hdr.name_len >= sizeof(kv->name) / sizeof(kv->name[0])) {
+ kv_hdr.name_len = sizeof(kv->name) / sizeof(kv->name[0]) - 1;
+ }
+ kv->name[kv_hdr.name_len] = '\0';
+ }
+
+ return result;
+}
+
+static fdb_err_t read_sector_info(fdb_kvdb_t db, uint32_t addr, kv_sec_info_t sector, bool traversal)
+{
+ fdb_err_t result = FDB_NO_ERR;
+ struct sector_hdr_data sec_hdr = { 0 };
+
+ FDB_ASSERT(addr % db_sec_size(db) == 0);
+ FDB_ASSERT(sector);
+
+#ifdef FDB_KV_USING_CACHE
+ kv_sec_info_t sector_cache = get_sector_from_cache(db, addr);
+ if (sector_cache && ((!traversal) || (traversal && sector_cache->empty_kv != FAILED_ADDR))) {
+ memcpy(sector, sector_cache, sizeof(struct kvdb_sec_info));
+ return result;
+ }
+#endif /* FDB_KV_USING_CACHE */
+
+ /* read sector header raw data */
+ _fdb_flash_read((fdb_db_t)db, addr, (uint32_t *)&sec_hdr, sizeof(struct sector_hdr_data));
+
+ sector->status.store = FDB_SECTOR_STORE_UNUSED;
+ sector->status.dirty = FDB_SECTOR_DIRTY_UNUSED;
+ sector->addr = addr;
+ sector->magic = sec_hdr.magic;
+ /* check magic word and combined value */
+ if (sector->magic != SECTOR_MAGIC_WORD ||
+ (sec_hdr.combined != SECTOR_NOT_COMBINED && sec_hdr.combined != SECTOR_COMBINED)) {
+ sector->check_ok = false;
+ sector->combined = SECTOR_NOT_COMBINED;
+ return FDB_INIT_FAILED;
+ }
+ sector->check_ok = true;
+ /* get other sector info */
+ sector->combined = sec_hdr.combined;
+ sector->status.store = (fdb_sector_store_status_t) _fdb_get_status(sec_hdr.status_table.store, FDB_SECTOR_STORE_STATUS_NUM);
+ sector->status.dirty = (fdb_sector_dirty_status_t) _fdb_get_status(sec_hdr.status_table.dirty, FDB_SECTOR_DIRTY_STATUS_NUM);
+ /* traversal all KV and calculate the remain space size */
+ if (traversal) {
+ sector->remain = 0;
+ sector->empty_kv = sector->addr + SECTOR_HDR_DATA_SIZE;
+ if (sector->status.store == FDB_SECTOR_STORE_EMPTY) {
+ sector->remain = db_sec_size(db) - SECTOR_HDR_DATA_SIZE;
+ }
+ else if (sector->status.store == FDB_SECTOR_STORE_USING) {
+ struct fdb_kv kv_obj;
+
+ sector->remain = db_sec_size(db) - SECTOR_HDR_DATA_SIZE;
+ kv_obj.addr.start = sector->addr + SECTOR_HDR_DATA_SIZE;
+ do {
+ read_kv(db, &kv_obj);
+ if (!kv_obj.crc_is_ok) {
+ if (kv_obj.status != FDB_KV_PRE_WRITE && kv_obj.status != FDB_KV_ERR_HDR) {
+ sector->remain = 0;
+ result = FDB_READ_ERR;
+ break;
+ }
+ }
+ sector->empty_kv += kv_obj.len;
+ sector->remain -= kv_obj.len;
+ } while ((kv_obj.addr.start = get_next_kv_addr(db, sector, &kv_obj)) != FAILED_ADDR);
+ /* check the empty KV address by read continue 0xFF on flash */
+ {
+ uint32_t ff_addr;
+
+ ff_addr = _fdb_continue_ff_addr((fdb_db_t)db, sector->empty_kv, sector->addr + db_sec_size(db));
+ /* check the flash data is clean */
+ if (sector->empty_kv != ff_addr) {
+ /* update the sector information */
+ sector->empty_kv = ff_addr;
+ sector->remain = db_sec_size(db) - (ff_addr - sector->addr);
+ }
+ }
+
+ }
+#ifdef FDB_KV_USING_CACHE
+ update_sector_cache(db, sector);
+ } else {
+ kv_sec_info_t sec_cache = get_sector_from_cache(db, sector->addr);
+ if (!sec_cache) {
+ sector->empty_kv = FAILED_ADDR;
+ sector->remain = 0;
+ update_sector_cache(db, sector);
+ }
+#endif
+ }
+
+ return result;
+}
+
+static uint32_t get_next_sector_addr(fdb_kvdb_t db, kv_sec_info_t pre_sec, uint32_t traversed_len)
+{
+ uint32_t cur_block_size;
+
+ if (pre_sec->combined == SECTOR_NOT_COMBINED) {
+ cur_block_size = db_sec_size(db);
+ } else {
+ cur_block_size = pre_sec->combined * db_sec_size(db);
+ }
+
+ if (traversed_len + cur_block_size <= db_max_size(db)) {
+ /* if reach to the end, roll back to the first sector */
+ if (pre_sec->addr + cur_block_size < db_max_size(db)) {
+ return pre_sec->addr + cur_block_size;
+ } else {
+ /* the next sector is on the top of the database */
+ return 0;
+ }
+ } else {
+ /* finished */
+ return FAILED_ADDR;
+ }
+}
+
+static void kv_iterator(fdb_kvdb_t db, fdb_kv_t kv, void *arg1, void *arg2,
+ bool (*callback)(fdb_kv_t kv, void *arg1, void *arg2))
+{
+ struct kvdb_sec_info sector;
+ uint32_t sec_addr, traversed_len = 0;
+
+ sec_addr = db_oldest_addr(db);
+ /* search all sectors */
+ do {
+ traversed_len += db_sec_size(db);
+ if (read_sector_info(db, sec_addr, §or, false) != FDB_NO_ERR) {
+ continue;
+ }
+ if (callback == NULL) {
+ continue;
+ }
+ /* sector has KV */
+ if (sector.status.store == FDB_SECTOR_STORE_USING || sector.status.store == FDB_SECTOR_STORE_FULL) {
+ kv->addr.start = sector.addr + SECTOR_HDR_DATA_SIZE;
+ /* search all KV */
+ do {
+ read_kv(db, kv);
+ /* iterator is interrupted when callback return true */
+ if (callback(kv, arg1, arg2)) {
+ return;
+ }
+ } while ((kv->addr.start = get_next_kv_addr(db, §or, kv)) != FAILED_ADDR);
+ }
+ } while ((sec_addr = get_next_sector_addr(db, §or, traversed_len)) != FAILED_ADDR);
+}
+
+static bool find_kv_cb(fdb_kv_t kv, void *arg1, void *arg2)
+{
+ const char *key = arg1;
+ bool *find_ok = arg2;
+ size_t key_len = strlen(key);
+
+ if (key_len != kv->name_len) {
+ return false;
+ }
+ /* check KV */
+ if (kv->crc_is_ok && kv->status == FDB_KV_WRITE && !strncmp(kv->name, key, key_len)) {
+ *find_ok = true;
+ return true;
+ }
+ return false;
+}
+
+static bool find_kv_no_cache(fdb_kvdb_t db, const char *key, fdb_kv_t kv)
+{
+ bool find_ok = false;
+
+ kv_iterator(db, kv, (void *)key, &find_ok, find_kv_cb);
+
+ return find_ok;
+}
+
+static bool find_kv(fdb_kvdb_t db, const char *key, fdb_kv_t kv)
+{
+ bool find_ok = false;
+
+#ifdef FDB_KV_USING_CACHE
+ size_t key_len = strlen(key);
+
+ if (get_kv_from_cache(db, key, key_len, &kv->addr.start)) {
+ read_kv(db, kv);
+ return true;
+ }
+#endif /* FDB_KV_USING_CACHE */
+
+ find_ok = find_kv_no_cache(db, key, kv);
+
+#ifdef FDB_KV_USING_CACHE
+ if (find_ok) {
+ update_kv_cache(db, key, key_len, kv->addr.start);
+ }
+#endif /* FDB_KV_USING_CACHE */
+
+ return find_ok;
+}
+
+static bool fdb_is_str(uint8_t *value, size_t len)
+{
+#define __is_print(ch) ((unsigned int)((ch) - ' ') < 127u - ' ')
+ size_t i;
+
+ for (i = 0; i < len; i++) {
+ if (!__is_print(value[i])) {
+ return false;
+ }
+ }
+ return true;
+}
+
+static size_t get_kv(fdb_kvdb_t db, const char *key, void *value_buf, size_t buf_len, size_t *value_len)
+{
+ struct fdb_kv kv;
+ size_t read_len = 0;
+
+ if (find_kv(db, key, &kv)) {
+ if (value_len) {
+ *value_len = kv.value_len;
+ }
+ if (buf_len > kv.value_len) {
+ read_len = kv.value_len;
+ } else {
+ read_len = buf_len;
+ }
+ if (value_buf){
+ _fdb_flash_read((fdb_db_t)db, kv.addr.value, (uint32_t *) value_buf, read_len);
+ }
+ } else if (value_len) {
+ *value_len = 0;
+ }
+
+ return read_len;
+}
+
+/**
+ * Get a KV object by key name
+ *
+ * @param db database object
+ * @param key KV name
+ * @param kv KV object
+ *
+ * @return KV object when is not NULL
+ */
+fdb_kv_t fdb_kv_get_obj(fdb_kvdb_t db, const char *key, fdb_kv_t kv)
+{
+ bool find_ok = false;
+
+ if (!db_init_ok(db)) {
+ FDB_INFO("Error: KV (%s) isn't initialize OK.\n", db_name(db));
+ return 0;
+ }
+
+ /* lock the KV cache */
+ db_lock(db);
+
+ find_ok = find_kv(db, key, kv);
+
+ /* unlock the KV cache */
+ db_unlock(db);
+
+ return find_ok ? kv : NULL;
+}
+
+/**
+ * Convert the KV object to blob object
+ *
+ * @param kv KV object
+ * @param blob blob object
+ *
+ * @return new blob object
+ */
+fdb_blob_t fdb_kv_to_blob(fdb_kv_t kv, fdb_blob_t blob)
+{
+ blob->saved.meta_addr = kv->addr.start;
+ blob->saved.addr = kv->addr.value;
+ blob->saved.len = kv->value_len;
+
+ return blob;
+}
+
+/**
+ * Get a blob KV value by key name.
+ *
+ * @param db database object
+ * @param key KV name
+ * @param blob blob object
+ *
+ * @return the actually get size on successful
+ */
+size_t fdb_kv_get_blob(fdb_kvdb_t db, const char *key, fdb_blob_t blob)
+{
+ size_t read_len = 0;
+
+ if (!db_init_ok(db)) {
+ FDB_INFO("Error: KV (%s) isn't initialize OK.\n", db_name(db));
+ return 0;
+ }
+
+ /* lock the KV cache */
+ db_lock(db);
+
+ read_len = get_kv(db, key, blob->buf, blob->size, &blob->saved.len);
+
+ /* unlock the KV cache */
+ db_unlock(db);
+
+ return read_len;
+}
+
+/**
+ * Get an KV value by key name.
+ *
+ * @note this function is NOT supported reentrant
+ * @note this function is DEPRECATED
+ *
+ * @param db database object
+ * @param key KV name
+ *
+ * @return value
+ */
+char *fdb_kv_get(fdb_kvdb_t db, const char *key)
+{
+ static char value[FDB_STR_KV_VALUE_MAX_SIZE + 1];
+ size_t get_size;
+ struct fdb_blob blob;
+
+ if ((get_size = fdb_kv_get_blob(db, key, fdb_blob_make(&blob, value, FDB_STR_KV_VALUE_MAX_SIZE))) > 0) {
+ /* the return value must be string */
+ if (fdb_is_str((uint8_t *)value, get_size)) {
+ value[get_size] = '\0';
+ return value;
+ } else if (blob.saved.len > FDB_STR_KV_VALUE_MAX_SIZE) {
+ FDB_INFO("Warning: The default string KV value buffer length (%" PRIdLEAST16 ") is too less (%" PRIu32 ").\n", FDB_STR_KV_VALUE_MAX_SIZE,
+ (uint32_t)blob.saved.len);
+ } else {
+ FDB_INFO("Warning: The KV value isn't string. Could not be returned\n");
+ return NULL;
+ }
+ }
+
+ return NULL;
+}
+
+static fdb_err_t write_kv_hdr(fdb_kvdb_t db, uint32_t addr, kv_hdr_data_t kv_hdr)
+{
+ fdb_err_t result = FDB_NO_ERR;
+ /* write the status will by write granularity */
+ result = _fdb_write_status((fdb_db_t)db, addr, kv_hdr->status_table, FDB_KV_STATUS_NUM, FDB_KV_PRE_WRITE, false);
+ if (result != FDB_NO_ERR) {
+ return result;
+ }
+ /* write other header data */
+ result = _fdb_flash_write((fdb_db_t)db, addr + KV_MAGIC_OFFSET, &kv_hdr->magic, sizeof(struct kv_hdr_data) - KV_MAGIC_OFFSET, false);
+
+ return result;
+}
+
+static fdb_err_t format_sector(fdb_kvdb_t db, uint32_t addr, uint32_t combined_value)
+{
+ fdb_err_t result = FDB_NO_ERR;
+ struct sector_hdr_data sec_hdr = { 0 };
+
+ FDB_ASSERT(addr % db_sec_size(db) == 0);
+
+ result = _fdb_flash_erase((fdb_db_t)db, addr, db_sec_size(db));
+ if (result == FDB_NO_ERR) {
+ /* initialize the header data */
+ memset(&sec_hdr, FDB_BYTE_ERASED, sizeof(struct sector_hdr_data));
+#if (FDB_WRITE_GRAN == 1)
+ _fdb_set_status(sec_hdr.status_table.store, FDB_SECTOR_STORE_STATUS_NUM, FDB_SECTOR_STORE_EMPTY);
+ _fdb_set_status(sec_hdr.status_table.dirty, FDB_SECTOR_DIRTY_STATUS_NUM, FDB_SECTOR_DIRTY_FALSE);
+ sec_hdr.magic = SECTOR_MAGIC_WORD;
+ sec_hdr.combined = combined_value;
+ sec_hdr.reserved = FDB_DATA_UNUSED;
+ /* save the header */
+ result = _fdb_flash_write((fdb_db_t)db, addr, (uint32_t *)&sec_hdr, SECTOR_HDR_DATA_SIZE, true);
+#else // seperate the whole "sec_hdr" program to serval sinle program operation to prevent re-program issue on STM32L4xx or
+ // other MCU internal flash
+ /* write the sector store status */
+ _fdb_write_status((fdb_db_t)db,
+ addr + SECTOR_STORE_OFFSET,
+ sec_hdr.status_table.store,
+ FDB_SECTOR_STORE_STATUS_NUM,
+ FDB_SECTOR_STORE_EMPTY,
+ true);
+
+ /* write the sector dirty status */
+ _fdb_write_status((fdb_db_t)db,
+ addr + SECTOR_DIRTY_OFFSET,
+ sec_hdr.status_table.dirty,
+ FDB_SECTOR_DIRTY_STATUS_NUM,
+ FDB_SECTOR_DIRTY_FALSE,
+ true);
+
+ /* write the magic word and combined next sector number */
+ sec_hdr.magic = SECTOR_MAGIC_WORD;
+ sec_hdr.combined = combined_value;
+ sec_hdr.reserved = FDB_DATA_UNUSED;
+ result = _fdb_flash_write((fdb_db_t)db,
+ addr + SECTOR_MAGIC_OFFSET,
+ (void *)(&(sec_hdr.magic)),
+ (sizeof(struct sector_hdr_data) - SECTOR_MAGIC_OFFSET),
+ true);
+#endif
+
+#ifdef FDB_KV_USING_CACHE
+ {
+ struct kvdb_sec_info sector = {.addr = addr, .check_ok = false, .empty_kv = FAILED_ADDR };
+ /* delete the sector cache */
+ update_sector_cache(db, §or);
+ }
+#endif /* FDB_KV_USING_CACHE */
+ }
+
+ return result;
+}
+
+static fdb_err_t update_sec_status(fdb_kvdb_t db, kv_sec_info_t sector, size_t new_kv_len, bool *is_full)
+{
+ uint8_t status_table[FDB_STORE_STATUS_TABLE_SIZE];
+ fdb_err_t result = FDB_NO_ERR;
+ /* change the current sector status */
+ if (sector->status.store == FDB_SECTOR_STORE_EMPTY) {
+ /* change the sector status to using */
+ result = _fdb_write_status((fdb_db_t)db, sector->addr, status_table, FDB_SECTOR_STORE_STATUS_NUM, FDB_SECTOR_STORE_USING, true);
+
+#ifdef FDB_KV_USING_CACHE
+ update_sector_status_store_cache(db, sector->addr, FDB_SECTOR_STORE_USING);
+#endif /* FDB_KV_USING_CACHE */
+
+ } else if (sector->status.store == FDB_SECTOR_STORE_USING) {
+ /* check remain size */
+ if (sector->remain < FDB_SEC_REMAIN_THRESHOLD || sector->remain - new_kv_len < FDB_SEC_REMAIN_THRESHOLD) {
+ /* change the sector status to full */
+ result = _fdb_write_status((fdb_db_t)db, sector->addr, status_table, FDB_SECTOR_STORE_STATUS_NUM, FDB_SECTOR_STORE_FULL, true);
+
+#ifdef FDB_KV_USING_CACHE
+ update_sector_status_store_cache(db, sector->addr, FDB_SECTOR_STORE_FULL);
+#endif /* FDB_KV_USING_CACHE */
+
+ if (is_full) {
+ *is_full = true;
+ }
+ } else if (is_full) {
+ *is_full = false;
+ }
+ }
+
+ return result;
+}
+
+static void sector_iterator(fdb_kvdb_t db, kv_sec_info_t sector, fdb_sector_store_status_t status, void *arg1, void *arg2,
+ bool (*callback)(kv_sec_info_t sector, void *arg1, void *arg2), bool traversal_kv)
+{
+ uint32_t sec_addr, traversed_len = 0;
+
+ /* search all sectors */
+ sec_addr = db_oldest_addr(db);
+ do {
+ traversed_len += db_sec_size(db);
+ read_sector_info(db, sec_addr, sector, false);
+ if (status == FDB_SECTOR_STORE_UNUSED || status == sector->status.store) {
+ if (traversal_kv) {
+ read_sector_info(db, sec_addr, sector, true);
+ }
+ /* iterator is interrupted when callback return true */
+ if (callback && callback(sector, arg1, arg2)) {
+ return;
+ }
+ }
+ } while ((sec_addr = get_next_sector_addr(db, sector, traversed_len)) != FAILED_ADDR);
+}
+
+static bool sector_statistics_cb(kv_sec_info_t sector, void *arg1, void *arg2)
+{
+ size_t *empty_sector = arg1, *using_sector = arg2;
+
+ if (sector->check_ok && sector->status.store == FDB_SECTOR_STORE_EMPTY) {
+ (*empty_sector)++;
+ } else if (sector->check_ok && sector->status.store == FDB_SECTOR_STORE_USING) {
+ (*using_sector)++;
+ }
+
+ return false;
+}
+
+static bool alloc_kv_cb(kv_sec_info_t sector, void *arg1, void *arg2)
+{
+ struct alloc_kv_cb_args *arg = arg1;
+
+ /* 1. sector has space
+ * 2. the NO dirty sector
+ * 3. the dirty sector only when the gc_request is false */
+ if (sector->check_ok && sector->remain > arg->kv_size + FDB_SEC_REMAIN_THRESHOLD
+ && ((sector->status.dirty == FDB_SECTOR_DIRTY_FALSE)
+ || (sector->status.dirty == FDB_SECTOR_DIRTY_TRUE && !arg->db->gc_request))) {
+ *(arg->empty_kv) = sector->empty_kv;
+ return true;
+ }
+
+ return false;
+}
+
+static uint32_t alloc_kv(fdb_kvdb_t db, kv_sec_info_t sector, size_t kv_size)
+{
+ uint32_t empty_kv = FAILED_ADDR;
+ size_t empty_sector = 0, using_sector = 0;
+ struct alloc_kv_cb_args arg = {db, kv_size, &empty_kv};
+
+ /* sector status statistics */
+ sector_iterator(db, sector, FDB_SECTOR_STORE_UNUSED, &empty_sector, &using_sector, sector_statistics_cb, false);
+ if (using_sector > 0) {
+ /* alloc the KV from the using status sector first */
+ sector_iterator(db, sector, FDB_SECTOR_STORE_USING, &arg, NULL, alloc_kv_cb, true);
+ }
+ if (empty_sector > 0 && empty_kv == FAILED_ADDR) {
+ if (empty_sector > FDB_GC_EMPTY_SEC_THRESHOLD || db->gc_request) {
+ sector_iterator(db, sector, FDB_SECTOR_STORE_EMPTY, &arg, NULL, alloc_kv_cb, true);
+ } else {
+ /* no space for new KV now will GC and retry */
+ FDB_DEBUG("Trigger a GC check after alloc KV failed.\n");
+ db->gc_request = true;
+ }
+ }
+
+ return empty_kv;
+}
+
+static fdb_err_t del_kv(fdb_kvdb_t db, const char *key, fdb_kv_t old_kv, bool complete_del)
+{
+ fdb_err_t result = FDB_NO_ERR;
+ uint32_t dirty_status_addr;
+ struct fdb_kv kv = { .status = FDB_KV_UNUSED };
+
+#if (KV_STATUS_TABLE_SIZE >= FDB_DIRTY_STATUS_TABLE_SIZE)
+ uint8_t status_table[KV_STATUS_TABLE_SIZE];
+#else
+ uint8_t status_table[DIRTY_STATUS_TABLE_SIZE];
+#endif
+
+ /* need find KV */
+ if (!old_kv) {
+ /* find KV */
+ if (find_kv(db, key, &kv)) {
+ old_kv = &kv;
+ } else {
+ FDB_DEBUG("Not found '%s' in KV.\n", key);
+ return FDB_KV_NAME_ERR;
+ }
+ }
+ /* change and save the new status */
+ if (!complete_del) {
+ result = _fdb_write_status((fdb_db_t)db, old_kv->addr.start, status_table, FDB_KV_STATUS_NUM, FDB_KV_PRE_DELETE, false);
+ db->last_is_complete_del = true;
+ } else {
+ result = _fdb_write_status((fdb_db_t)db, old_kv->addr.start, status_table, FDB_KV_STATUS_NUM, FDB_KV_DELETED, true);
+
+ if (!db->last_is_complete_del && result == FDB_NO_ERR) {
+#ifdef FDB_KV_USING_CACHE
+ /* delete the KV in flash and cache */
+ if (key != NULL) {
+ /* when using del_kv(db, key, NULL, true) or del_kv(db, key, kv, true) in fdb_del_kv(db, ) and set_kv(db, ) */
+ update_kv_cache(db, key, strlen(key), FDB_DATA_UNUSED);
+ } else if (old_kv != NULL) {
+ /* when using del_kv(db, NULL, kv, true) in move_kv(db, ) */
+ update_kv_cache(db, old_kv->name, old_kv->name_len, FDB_DATA_UNUSED);
+ }
+#endif /* FDB_KV_USING_CACHE */
+ }
+
+ db->last_is_complete_del = false;
+ }
+
+ dirty_status_addr = FDB_ALIGN_DOWN(old_kv->addr.start, db_sec_size(db)) + SECTOR_DIRTY_OFFSET;
+ /* read and change the sector dirty status */
+ if (result == FDB_NO_ERR
+ && _fdb_read_status((fdb_db_t)db, dirty_status_addr, status_table, FDB_SECTOR_DIRTY_STATUS_NUM) == FDB_SECTOR_DIRTY_FALSE) {
+ result = _fdb_write_status((fdb_db_t)db, dirty_status_addr, status_table, FDB_SECTOR_DIRTY_STATUS_NUM, FDB_SECTOR_DIRTY_TRUE, true);
+#ifdef FDB_KV_USING_CACHE
+ {
+ kv_sec_info_t sector_cache = get_sector_from_cache(db, FDB_ALIGN_DOWN(old_kv->addr.start, db_sec_size(db)));
+ if (sector_cache) {
+ sector_cache->status.dirty = FDB_SECTOR_DIRTY_TRUE;
+ }
+ }
+#endif /* FDB_KV_USING_CACHE */
+ }
+
+ return result;
+}
+
+/*
+ * move the KV to new space
+ */
+static fdb_err_t move_kv(fdb_kvdb_t db, fdb_kv_t kv)
+{
+ fdb_err_t result = FDB_NO_ERR;
+ uint8_t status_table[KV_STATUS_TABLE_SIZE];
+ uint32_t kv_addr;
+ struct kvdb_sec_info sector;
+
+ /* prepare to delete the current KV */
+ if (kv->status == FDB_KV_WRITE) {
+ del_kv(db, NULL, kv, false);
+ }
+
+ if ((kv_addr = alloc_kv(db, §or, kv->len)) != FAILED_ADDR) {
+ if (db->in_recovery_check && kv->status == FDB_KV_PRE_DELETE) {
+ struct fdb_kv kv_bak;
+ char name[FDB_KV_NAME_MAX + 1] = { 0 };
+ strncpy(name, kv->name, kv->name_len);
+ /* check the KV in flash is already create success */
+ if (find_kv_no_cache(db, name, &kv_bak)) {
+ /* already create success, don't need to duplicate */
+ result = FDB_NO_ERR;
+ goto __exit;
+ }
+ }
+ } else {
+ return FDB_SAVED_FULL;
+ }
+ /* start move the KV */
+ {
+ uint8_t buf[32];
+ size_t len, size, kv_len = kv->len;
+
+ /* update the new KV sector status first */
+ update_sec_status(db, §or, kv->len, NULL);
+
+ _fdb_write_status((fdb_db_t)db, kv_addr, status_table, FDB_KV_STATUS_NUM, FDB_KV_PRE_WRITE, false);
+ kv_len -= KV_MAGIC_OFFSET;
+ for (len = 0, size = 0; len < kv_len; len += size) {
+ if (len + sizeof(buf) < kv_len) {
+ size = sizeof(buf);
+ } else {
+ size = kv_len - len;
+ }
+ _fdb_flash_read((fdb_db_t)db, kv->addr.start + KV_MAGIC_OFFSET + len, (uint32_t *) buf, FDB_WG_ALIGN(size));
+ result = _fdb_flash_write((fdb_db_t)db, kv_addr + KV_MAGIC_OFFSET + len, (uint32_t *) buf, size, true);
+ }
+ _fdb_write_status((fdb_db_t)db, kv_addr, status_table, FDB_KV_STATUS_NUM, FDB_KV_WRITE, true);
+
+#ifdef FDB_KV_USING_CACHE
+ update_sector_empty_addr_cache(db, FDB_ALIGN_DOWN(kv_addr, db_sec_size(db)),
+ kv_addr + KV_HDR_DATA_SIZE + FDB_WG_ALIGN(kv->name_len) + FDB_WG_ALIGN(kv->value_len));
+ update_kv_cache(db, kv->name, kv->name_len, kv_addr);
+#endif /* FDB_KV_USING_CACHE */
+ }
+
+ FDB_DEBUG("Moved the KV (%.*s) from 0x%08" PRIX32 " to 0x%08" PRIX32 ".\n", kv->name_len, kv->name, kv->addr.start, kv_addr);
+
+__exit:
+ del_kv(db, NULL, kv, true);
+
+ return result;
+}
+
+static uint32_t new_kv(fdb_kvdb_t db, kv_sec_info_t sector, size_t kv_size)
+{
+ bool already_gc = false;
+ uint32_t empty_kv = FAILED_ADDR;
+
+__retry:
+
+ if ((empty_kv = alloc_kv(db, sector, kv_size)) == FAILED_ADDR) {
+ if (db->gc_request && !already_gc) {
+ FDB_DEBUG("Alloc an KV (size %" PRIu32 ") failed when new KV. Now will GC then retry.\n", (uint32_t)kv_size);
+ gc_collect_by_free_size(db, kv_size);
+ already_gc = true;
+ goto __retry;
+ } else if (already_gc) {
+ FDB_INFO("Error: Alloc an KV (size %" PRIuLEAST16 ") failed after GC. KV full.\n", kv_size);
+ db->gc_request = false;
+ }
+ }
+
+ return empty_kv;
+}
+
+static uint32_t new_kv_ex(fdb_kvdb_t db, kv_sec_info_t sector, size_t key_len, size_t buf_len)
+{
+ size_t kv_len = KV_HDR_DATA_SIZE + FDB_WG_ALIGN(key_len) + FDB_WG_ALIGN(buf_len);
+
+ return new_kv(db, sector, kv_len);
+}
+
+static bool gc_check_cb(kv_sec_info_t sector, void *arg1, void *arg2)
+{
+ size_t *empty_sec_num = arg1;
+ uint32_t *empty_sec_addr = arg2;
+
+ if (sector->check_ok) {
+ *empty_sec_num = *empty_sec_num + 1;
+ *empty_sec_addr = sector->addr;
+ }
+
+ return false;
+
+}
+
+static bool do_gc(kv_sec_info_t sector, void *arg1, void *arg2)
+{
+ struct fdb_kv kv;
+ struct gc_cb_args *gc = (struct gc_cb_args *)arg1;
+ fdb_kvdb_t db = gc->db;
+ uint32_t last_gc_sec_addr = 0;
+
+ if (sector->check_ok && (sector->status.dirty == FDB_SECTOR_DIRTY_TRUE || sector->status.dirty == FDB_SECTOR_DIRTY_GC)) {
+ uint8_t status_table[FDB_DIRTY_STATUS_TABLE_SIZE];
+ /* change the sector status to GC */
+ _fdb_write_status((fdb_db_t)db, sector->addr + SECTOR_DIRTY_OFFSET, status_table, FDB_SECTOR_DIRTY_STATUS_NUM, FDB_SECTOR_DIRTY_GC, true);
+ /* search all KV */
+ kv.addr.start = sector->addr + SECTOR_HDR_DATA_SIZE;
+ do {
+ read_kv(db, &kv);
+ if (kv.crc_is_ok && (kv.status == FDB_KV_WRITE || kv.status == FDB_KV_PRE_DELETE)) {
+ /* move the KV to new space */
+ if (move_kv(db, &kv) != FDB_NO_ERR) {
+ FDB_INFO("Error: Moved the KV (%.*s) for GC failed.\n", kv.name_len, kv.name);
+ }
+ } else {
+ FDB_DEBUG("KV (%.*s) is garbage NOT need move, collect it.\n", kv.name_len, kv.name);
+ }
+ } while ((kv.addr.start = get_next_kv_addr(db, sector, &kv)) != FAILED_ADDR);
+ format_sector(db, sector->addr, SECTOR_NOT_COMBINED);
+ last_gc_sec_addr = gc->last_gc_sec_addr;
+ gc->last_gc_sec_addr = sector->addr;
+ /* update oldest_addr for next GC sector format */
+ db_oldest_addr(db) = get_next_sector_addr(db, sector, 0);
+ FDB_DEBUG("Collect a sector @0x%08" PRIX32 "\n", sector->addr);
+ /* the collect new space is in last GC sector */
+ struct kvdb_sec_info last_gc_sector;
+ if (read_sector_info(db, last_gc_sec_addr, &last_gc_sector, true) == FDB_NO_ERR) {
+ if (last_gc_sector.remain > gc->setting_free_size)
+ return true;
+ }
+ }
+
+ return false;
+}
+
+static void gc_collect_by_free_size(fdb_kvdb_t db, size_t free_size)
+{
+ struct kvdb_sec_info sector;
+ size_t empty_sec_num = 0;
+ /* an empty sector address */
+ uint32_t empty_sec_addr = 0;
+
+ /* GC check the empty sector number */
+ sector_iterator(db, §or, FDB_SECTOR_STORE_EMPTY, &empty_sec_num, &empty_sec_addr, gc_check_cb, false);
+
+ /* do GC collect */
+ FDB_DEBUG("The remain empty sector is %" PRIu32 ", GC threshold is %" PRIdLEAST16 ".\n", (uint32_t)empty_sec_num, FDB_GC_EMPTY_SEC_THRESHOLD);
+ if (empty_sec_num <= FDB_GC_EMPTY_SEC_THRESHOLD) {
+ struct gc_cb_args arg = { db, free_size, empty_sec_addr };
+ sector_iterator(db, §or, FDB_SECTOR_STORE_UNUSED, &arg, NULL, do_gc, false);
+ }
+
+ db->gc_request = false;
+}
+
+/*
+ * The GC will be triggered on the following scene:
+ * 1. alloc an KV when the flash not has enough space
+ * 2. write an KV then the flash not has enough space
+ */
+static void gc_collect(fdb_kvdb_t db)
+{
+ gc_collect_by_free_size(db, db_max_size(db));
+}
+
+static fdb_err_t align_write(fdb_kvdb_t db, uint32_t addr, const uint32_t *buf, size_t size)
+{
+ fdb_err_t result = FDB_NO_ERR;
+ size_t align_remain;
+
+#if (FDB_WRITE_GRAN / 8 > 0)
+ uint8_t align_data[FDB_WRITE_GRAN / 8];
+ size_t align_data_size = sizeof(align_data);
+#else
+ /* For compatibility with C89 */
+ uint8_t align_data_u8, *align_data = &align_data_u8;
+ size_t align_data_size = 1;
+#endif
+
+ memset(align_data, FDB_BYTE_ERASED, align_data_size);
+ result = _fdb_flash_write((fdb_db_t) db, addr, buf, FDB_WG_ALIGN_DOWN(size), false);
+
+ align_remain = size - FDB_WG_ALIGN_DOWN(size);
+ if (result == FDB_NO_ERR && align_remain) {
+ memcpy(align_data, (uint8_t *) buf + FDB_WG_ALIGN_DOWN(size), align_remain);
+ result = _fdb_flash_write((fdb_db_t) db, addr + FDB_WG_ALIGN_DOWN(size), (uint32_t *) align_data,
+ align_data_size, false);
+ }
+
+ return result;
+}
+
+static fdb_err_t create_kv_blob(fdb_kvdb_t db, kv_sec_info_t sector, const char *key, const void *value, size_t len)
+{
+ fdb_err_t result = FDB_NO_ERR;
+ struct kv_hdr_data kv_hdr;
+ bool is_full = false;
+ uint32_t kv_addr = sector->empty_kv;
+
+ if (strlen(key) > FDB_KV_NAME_MAX) {
+ FDB_INFO("Error: The KV name length is more than %d\n", FDB_KV_NAME_MAX);
+ return FDB_KV_NAME_ERR;
+ }
+
+ memset(&kv_hdr, FDB_BYTE_ERASED, sizeof(struct kv_hdr_data));
+ kv_hdr.magic = KV_MAGIC_WORD;
+ kv_hdr.name_len = strlen(key);
+ kv_hdr.value_len = len;
+ kv_hdr.len = KV_HDR_DATA_SIZE + FDB_WG_ALIGN(kv_hdr.name_len) + FDB_WG_ALIGN(kv_hdr.value_len);
+
+ if (kv_hdr.len > db_sec_size(db) - SECTOR_HDR_DATA_SIZE) {
+ FDB_INFO("Error: The KV size is too big\n");
+ return FDB_SAVED_FULL;
+ }
+
+ if (kv_addr != FAILED_ADDR || (kv_addr = new_kv(db, sector, kv_hdr.len)) != FAILED_ADDR) {
+ size_t align_remain;
+ /* update the sector status */
+ if (result == FDB_NO_ERR) {
+ result = update_sec_status(db, sector, kv_hdr.len, &is_full);
+ }
+ if (result == FDB_NO_ERR) {
+ uint8_t ff = FDB_BYTE_ERASED;
+ /* start calculate CRC32 */
+ kv_hdr.crc32 = 0;
+ /* CRC32(header.name_len + header.value_len + name + value), using sizeof(uint32_t) for compatible V1.x */
+ kv_hdr.crc32 = fdb_calc_crc32(kv_hdr.crc32, &kv_hdr.name_len, sizeof(uint32_t));
+ kv_hdr.crc32 = fdb_calc_crc32(kv_hdr.crc32, &kv_hdr.value_len, sizeof(uint32_t));
+ kv_hdr.crc32 = fdb_calc_crc32(kv_hdr.crc32, key, kv_hdr.name_len);
+ align_remain = FDB_WG_ALIGN(kv_hdr.name_len) - kv_hdr.name_len;
+ while (align_remain--) {
+ kv_hdr.crc32 = fdb_calc_crc32(kv_hdr.crc32, &ff, 1);
+ }
+ kv_hdr.crc32 = fdb_calc_crc32(kv_hdr.crc32, value, kv_hdr.value_len);
+ align_remain = FDB_WG_ALIGN(kv_hdr.value_len) - kv_hdr.value_len;
+ while (align_remain--) {
+ kv_hdr.crc32 = fdb_calc_crc32(kv_hdr.crc32, &ff, 1);
+ }
+ /* write KV header data */
+ result = write_kv_hdr(db, kv_addr, &kv_hdr);
+ }
+ /* write key name */
+ if (result == FDB_NO_ERR) {
+ result = align_write(db, kv_addr + KV_HDR_DATA_SIZE, (uint32_t *) key, kv_hdr.name_len);
+
+#ifdef FDB_KV_USING_CACHE
+ if (!is_full) {
+ update_sector_empty_addr_cache(db, sector->addr,
+ kv_addr + KV_HDR_DATA_SIZE + FDB_WG_ALIGN(kv_hdr.name_len) + FDB_WG_ALIGN(kv_hdr.value_len));
+ }
+ update_kv_cache(db, key, kv_hdr.name_len, kv_addr);
+#endif /* FDB_KV_USING_CACHE */
+ }
+ /* write value */
+ if (result == FDB_NO_ERR) {
+ result = align_write(db, kv_addr + KV_HDR_DATA_SIZE + FDB_WG_ALIGN(kv_hdr.name_len), value,
+ kv_hdr.value_len);
+ }
+ /* change the KV status to KV_WRITE */
+ if (result == FDB_NO_ERR) {
+ result = _fdb_write_status((fdb_db_t) db, kv_addr, kv_hdr.status_table, FDB_KV_STATUS_NUM, FDB_KV_WRITE,
+ true);
+ }
+ /* trigger GC collect when current sector is full */
+ if (result == FDB_NO_ERR && is_full) {
+ FDB_DEBUG("Trigger a GC check after created KV.\n");
+ db->gc_request = true;
+ }
+ } else {
+ result = FDB_SAVED_FULL;
+ }
+
+ return result;
+}
+
+/**
+ * Delete an KV.
+ *
+ * @param db database object
+ * @param key KV name
+ *
+ * @return result
+ */
+fdb_err_t fdb_kv_del(fdb_kvdb_t db, const char *key)
+{
+ fdb_err_t result = FDB_NO_ERR;
+
+ if (!db_init_ok(db)) {
+ FDB_INFO("Error: KV (%s) isn't initialize OK.\n", db_name(db));
+ return FDB_INIT_FAILED;
+ }
+
+ /* lock the KV cache */
+ db_lock(db);
+
+ result = del_kv(db, key, NULL, true);
+
+ /* unlock the KV cache */
+ db_unlock(db);
+
+ return result;
+}
+
+static fdb_err_t set_kv(fdb_kvdb_t db, const char *key, const void *value_buf, size_t buf_len)
+{
+ fdb_err_t result = FDB_NO_ERR;
+ bool kv_is_found = false;
+
+ if (value_buf == NULL) {
+ result = del_kv(db, key, NULL, true);
+ } else {
+ /* make sure the flash has enough space */
+ if (new_kv_ex(db, &db->cur_sector, strlen(key), buf_len) == FAILED_ADDR) {
+ return FDB_SAVED_FULL;
+ }
+ kv_is_found = find_kv(db, key, &db->cur_kv);
+ /* prepare to delete the old KV */
+ if (kv_is_found) {
+ result = del_kv(db, key, &db->cur_kv, false);
+ }
+ /* create the new KV */
+ if (result == FDB_NO_ERR) {
+ result = create_kv_blob(db, &db->cur_sector, key, value_buf, buf_len);
+ }
+ /* delete the old KV */
+ if (kv_is_found && result == FDB_NO_ERR) {
+ result = del_kv(db, key, &db->cur_kv, true);
+ }
+ /* process the GC after set KV */
+ if (db->gc_request) {
+ gc_collect_by_free_size(db, KV_HDR_DATA_SIZE + FDB_WG_ALIGN(strlen(key)) + FDB_WG_ALIGN(buf_len));
+ }
+ }
+
+ return result;
+}
+
+/**
+ * Set a blob KV. If it blob value is NULL, delete it.
+ * If not find it in flash, then create it.
+ *
+ * @param db database object
+ * @param key KV name
+ * @param blob blob object
+ *
+ * @return result
+ */
+fdb_err_t fdb_kv_set_blob(fdb_kvdb_t db, const char *key, fdb_blob_t blob)
+{
+ fdb_err_t result = FDB_NO_ERR;
+
+ if (!db_init_ok(db)) {
+ FDB_INFO("Error: KV (%s) isn't initialize OK.\n", db_name(db));
+ return FDB_INIT_FAILED;
+ }
+
+ /* lock the KV cache */
+ db_lock(db);
+
+ result = set_kv(db, key, blob->buf, blob->size);
+
+ /* unlock the KV cache */
+ db_unlock(db);
+
+ return result;
+}
+
+/**
+ * Set a string KV. If it value is NULL, delete it.
+ * If not find it in flash, then create it.
+ *
+ * @param db database object
+ * @param key KV name
+ * @param value KV value
+ *
+ * @return result
+ */
+fdb_err_t fdb_kv_set(fdb_kvdb_t db, const char *key, const char *value)
+{
+ struct fdb_blob blob;
+
+ if (value) {
+ return fdb_kv_set_blob(db, key, fdb_blob_make(&blob, value, strlen(value)));
+ } else {
+ return fdb_kv_del(db, key);
+ }
+}
+
+/**
+ * recovery all KV to default.
+ *
+ * @param db database object
+ * @return result
+ */
+fdb_err_t fdb_kv_set_default(fdb_kvdb_t db)
+{
+ fdb_err_t result = FDB_NO_ERR;
+ uint32_t addr, i, value_len;
+ struct kvdb_sec_info sector;
+
+ /* lock the KV cache */
+ db_lock(db);
+
+#ifdef FDB_KV_USING_CACHE
+ for (i = 0; i < FDB_KV_CACHE_TABLE_SIZE; i++) {
+ db->kv_cache_table[i].addr = FDB_DATA_UNUSED;
+ }
+#endif /* FDB_KV_USING_CACHE */
+
+ /* format all sectors */
+ for (addr = 0; addr < db_max_size(db); addr += db_sec_size(db)) {
+ result = format_sector(db, addr, SECTOR_NOT_COMBINED);
+ if (result != FDB_NO_ERR) {
+ goto __exit;
+ }
+ }
+ /* create default KV */
+ for (i = 0; i < db->default_kvs.num; i++) {
+ /* It seems to be a string when value length is 0.
+ * This mechanism is for compatibility with older versions (less then V4.0). */
+ if (db->default_kvs.kvs[i].value_len == 0) {
+ value_len = strlen(db->default_kvs.kvs[i].value);
+ } else {
+ value_len = db->default_kvs.kvs[i].value_len;
+ }
+ sector.empty_kv = FAILED_ADDR;
+ create_kv_blob(db, §or, db->default_kvs.kvs[i].key, db->default_kvs.kvs[i].value, value_len);
+ if (result != FDB_NO_ERR) {
+ goto __exit;
+ }
+ }
+
+__exit:
+ db_oldest_addr(db) = 0;
+ /* unlock the KV cache */
+ db_unlock(db);
+
+ return result;
+}
+
+static bool print_kv_cb(fdb_kv_t kv, void *arg1, void *arg2)
+{
+ bool value_is_str = true, print_value = false;
+ size_t *using_size = arg1;
+ fdb_kvdb_t db = arg2;
+
+ if (kv->crc_is_ok) {
+ /* calculate the total using flash size */
+ *using_size += kv->len;
+ /* check KV */
+ if (kv->status == FDB_KV_WRITE) {
+ FDB_PRINT("%.*s=", kv->name_len, kv->name);
+
+ if (kv->value_len < FDB_STR_KV_VALUE_MAX_SIZE ) {
+ uint8_t buf[32];
+ size_t len, size;
+__reload:
+ /* check the value is string */
+ for (len = 0, size = 0; len < kv->value_len; len += size) {
+ if (len + sizeof(buf) < kv->value_len) {
+ size = sizeof(buf);
+ } else {
+ size = kv->value_len - len;
+ }
+ _fdb_flash_read((fdb_db_t)db, kv->addr.value + len, (uint32_t *) buf, FDB_WG_ALIGN(size));
+ if (print_value) {
+ FDB_PRINT("%.*s", (int)size, buf);
+ } else if (!fdb_is_str(buf, size)) {
+ value_is_str = false;
+ break;
+ }
+ }
+ } else {
+ value_is_str = false;
+ }
+ if (value_is_str && !print_value) {
+ print_value = true;
+ goto __reload;
+ } else if (!value_is_str) {
+ FDB_PRINT("blob @0x%08" PRIX32 " %" PRIu32 "bytes", kv->addr.value, kv->value_len);
+ }
+ FDB_PRINT("\n");
+ }
+ }
+
+ return false;
+}
+
+
+/**
+ * Print all KV.
+ *
+ * @param db database object
+ */
+void fdb_kv_print(fdb_kvdb_t db)
+{
+ struct fdb_kv kv;
+ size_t using_size = 0;
+
+ if (!db_init_ok(db)) {
+ FDB_INFO("Error: KV (%s) isn't initialize OK.\n", db_name(db));
+ return;
+ }
+
+ /* lock the KV cache */
+ db_lock(db);
+
+ kv_iterator(db, &kv, &using_size, db, print_kv_cb);
+
+ FDB_PRINT("\nmode: next generation\n");
+ FDB_PRINT("size: %" PRIu32 "/%" PRIu32 " bytes.\n", (uint32_t)using_size + ((SECTOR_NUM - FDB_GC_EMPTY_SEC_THRESHOLD) * SECTOR_HDR_DATA_SIZE),
+ db_max_size(db) - db_sec_size(db) * FDB_GC_EMPTY_SEC_THRESHOLD);
+
+ /* unlock the KV cache */
+ db_unlock(db);
+}
+
+#ifdef FDB_KV_AUTO_UPDATE
+/*
+ * Auto update KV to latest default when current setting version number is changed.
+ */
+static void kv_auto_update(fdb_kvdb_t db)
+{
+ size_t saved_ver_num, setting_ver_num = db->ver_num;
+
+ if (get_kv(db, VER_NUM_KV_NAME, &saved_ver_num, sizeof(size_t), NULL) > 0) {
+ /* check version number */
+ if (saved_ver_num != setting_ver_num) {
+ size_t i, value_len;
+ FDB_DEBUG("Update the KV from version %zu to %zu.\n", saved_ver_num, setting_ver_num);
+ for (i = 0; i < db->default_kvs.num; i++) {
+ /* add a new KV when it's not found */
+ if (!find_kv(db, db->default_kvs.kvs[i].key, &db->cur_kv)) {
+ /* It seems to be a string when value length is 0.
+ * This mechanism is for compatibility with older versions (less then V4.0). */
+ if (db->default_kvs.kvs[i].value_len == 0) {
+ value_len = strlen(db->default_kvs.kvs[i].value);
+ } else {
+ value_len = db->default_kvs.kvs[i].value_len;
+ }
+ db->cur_sector.empty_kv = FAILED_ADDR;
+ create_kv_blob(db, &db->cur_sector, db->default_kvs.kvs[i].key, db->default_kvs.kvs[i].value, value_len);
+ }
+ }
+ } else {
+ /* version number not changed now return */
+ return;
+ }
+ }
+
+ set_kv(db, VER_NUM_KV_NAME, &setting_ver_num, sizeof(size_t));
+}
+#endif /* FDB_KV_AUTO_UPDATE */
+
+static bool check_oldest_addr_cb(kv_sec_info_t sector, void *arg1, void *arg2)
+{
+ uint32_t *sector_oldest_addr = (uint32_t *) arg1;
+ fdb_sector_store_status_t *last_sector_status = (fdb_sector_store_status_t *)arg2;
+
+ /* The oldest address is 0 by default.
+ * The new oldest sector is found when sector status change from empty to full or using.
+ */
+ if (*last_sector_status == FDB_SECTOR_STORE_EMPTY
+ && (sector->status.store == FDB_SECTOR_STORE_FULL || sector->status.store == FDB_SECTOR_STORE_USING)) {
+ *sector_oldest_addr = sector->addr;
+ }
+
+ *last_sector_status = sector->status.store;
+ return false;
+}
+
+static bool check_sec_hdr_cb(kv_sec_info_t sector, void *arg1, void *arg2)
+{
+ if (!sector->check_ok) {
+ size_t *failed_count = arg1;
+ fdb_kvdb_t db = arg2;
+
+ (*failed_count) ++;
+ if (db->parent.not_formatable) {
+ return true;
+ } else {
+ FDB_DEBUG("Sector header info is incorrect. Auto format this sector (0x%08" PRIX32 ").\n", sector->addr);
+ format_sector(db, sector->addr, SECTOR_NOT_COMBINED);
+ }
+ }
+
+ return false;
+}
+
+static bool check_and_recovery_gc_cb(kv_sec_info_t sector, void *arg1, void *arg2)
+{
+ fdb_kvdb_t db = arg1;
+
+ if (sector->check_ok && sector->status.dirty == FDB_SECTOR_DIRTY_GC) {
+ /* make sure the GC request flag to true */
+ db->gc_request = true;
+ /* resume the GC operate */
+ gc_collect(db);
+ }
+
+ return false;
+}
+
+static bool check_and_recovery_kv_cb(fdb_kv_t kv, void *arg1, void *arg2)
+{
+ fdb_kvdb_t db = arg1;
+
+ /* recovery the prepare deleted KV */
+ if (kv->crc_is_ok && kv->status == FDB_KV_PRE_DELETE) {
+ FDB_INFO("Found an KV (%.*s) which has changed value failed. Now will recovery it.\n", kv->name_len, kv->name);
+ /* recovery the old KV */
+ if (move_kv(db, kv) == FDB_NO_ERR) {
+ FDB_DEBUG("Recovery the KV successful.\n");
+ } else {
+ FDB_DEBUG("Warning: Moved an KV (size %" PRIu32 ") failed when recovery. Now will GC then retry.\n", kv->len);
+ return true;
+ }
+ } else if (kv->status == FDB_KV_PRE_WRITE) {
+ uint8_t status_table[KV_STATUS_TABLE_SIZE];
+ /* the KV has not write finish, change the status to error */
+ //TODO Draw the state replacement diagram of exception handling
+ _fdb_write_status((fdb_db_t)db, kv->addr.start, status_table, FDB_KV_STATUS_NUM, FDB_KV_ERR_HDR, true);
+ return true;
+ } else if (kv->crc_is_ok && kv->status == FDB_KV_WRITE) {
+#ifdef FDB_KV_USING_CACHE
+ /* update the cache when first load. If caching is disabled, this step is not performed */
+ update_kv_cache(db, kv->name, kv->name_len, kv->addr.start);
+#endif
+ }
+
+ return false;
+}
+
+/**
+ * Check and load the flash KV.
+ *
+ * @return result
+ */
+static fdb_err_t _fdb_kv_load(fdb_kvdb_t db)
+{
+ fdb_err_t result = FDB_NO_ERR;
+ struct fdb_kv kv;
+ struct kvdb_sec_info sector;
+ size_t check_failed_count = 0;
+
+ db->in_recovery_check = true;
+ /* check all sector header */
+ sector_iterator(db, §or, FDB_SECTOR_STORE_UNUSED, &check_failed_count, db, check_sec_hdr_cb, false);
+ if (db->parent.not_formatable && check_failed_count > 0) {
+ return FDB_READ_ERR;
+ }
+ /* all sector header check failed */
+ if (check_failed_count == SECTOR_NUM) {
+ FDB_INFO("All sector header is incorrect. Set it to default.\n");
+ fdb_kv_set_default(db);
+ }
+
+ /* check all sector header for recovery GC */
+ sector_iterator(db, §or, FDB_SECTOR_STORE_UNUSED, db, NULL, check_and_recovery_gc_cb, false);
+
+__retry:
+ /* check all KV for recovery */
+ kv_iterator(db, &kv, db, NULL, check_and_recovery_kv_cb);
+ if (db->gc_request) {
+ gc_collect(db);
+ goto __retry;
+ }
+
+ db->in_recovery_check = false;
+
+ return result;
+}
+
+/**
+ * This function will get or set some options of the database
+ *
+ * @param db database object
+ * @param cmd the control command
+ * @param arg the argument
+ */
+void fdb_kvdb_control(fdb_kvdb_t db, int cmd, void *arg)
+{
+ FDB_ASSERT(db);
+
+ switch (cmd) {
+ case FDB_KVDB_CTRL_SET_SEC_SIZE:
+ /* this change MUST before database initialization */
+ FDB_ASSERT(db->parent.init_ok == false);
+ db->parent.sec_size = *(uint32_t *) arg;
+ break;
+ case FDB_KVDB_CTRL_GET_SEC_SIZE:
+ *(uint32_t *) arg = db->parent.sec_size;
+ break;
+ case FDB_KVDB_CTRL_SET_LOCK:
+#if !defined(__ARMCC_VERSION) && defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wpedantic"
+#endif
+ db->parent.lock = (void (*)(fdb_db_t db)) arg;
+#if !defined(__ARMCC_VERSION) && defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+ break;
+ case FDB_KVDB_CTRL_SET_UNLOCK:
+#if !defined(__ARMCC_VERSION) && defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wpedantic"
+#endif
+ db->parent.unlock = (void (*)(fdb_db_t db)) arg;
+#if !defined(__ARMCC_VERSION) && defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+ break;
+ case FDB_KVDB_CTRL_SET_FILE_MODE:
+#ifdef FDB_USING_FILE_MODE
+ /* this change MUST before database initialization */
+ FDB_ASSERT(db->parent.init_ok == false);
+ db->parent.file_mode = *(bool *) arg;
+#else
+ FDB_INFO("Error: set file mode Failed. Please defined the FDB_USING_FILE_MODE macro.");
+#endif
+ break;
+ case FDB_KVDB_CTRL_SET_MAX_SIZE:
+#ifdef FDB_USING_FILE_MODE
+ /* this change MUST before database initialization */
+ FDB_ASSERT(db->parent.init_ok == false);
+ db->parent.max_size = *(uint32_t *)arg;
+#endif
+ break;
+ case FDB_KVDB_CTRL_SET_NOT_FORMAT:
+ /* this change MUST before database initialization */
+ FDB_ASSERT(db->parent.init_ok == false);
+ db->parent.not_formatable = *(bool *)arg;
+ break;
+ }
+}
+
+/**
+ * The KV database initialization.
+ *
+ * @param db database object
+ * @param name database name
+ * @param path FAL mode: partition name, file mode: database saved directory path
+ * @param default_kv the default KV set @see fdb_default_kv
+ * @param user_data user data
+ *
+ * @return result
+ */
+fdb_err_t fdb_kvdb_init(fdb_kvdb_t db, const char *name, const char *path, struct fdb_default_kv *default_kv,
+ void *user_data)
+{
+ fdb_err_t result = FDB_NO_ERR;
+ struct kvdb_sec_info sector;
+
+#ifdef FDB_KV_USING_CACHE
+ size_t i;
+#endif
+
+ /* must be aligned with write granularity */
+ FDB_ASSERT((FDB_STR_KV_VALUE_MAX_SIZE * 8) % FDB_WRITE_GRAN == 0);
+
+ result = _fdb_init_ex((fdb_db_t) db, name, path, FDB_DB_TYPE_KV, user_data);
+ if (result != FDB_NO_ERR) {
+ goto __exit;
+ }
+
+ /* lock the KVDB */
+ db_lock(db);
+
+ db->gc_request = false;
+ db->in_recovery_check = false;
+ if (default_kv) {
+ db->default_kvs = *default_kv;
+ } else {
+ db->default_kvs.num = 0;
+ db->default_kvs.kvs = NULL;
+ }
+
+ { /* find the oldest sector address */
+ uint32_t sector_oldest_addr = 0;
+ fdb_sector_store_status_t last_sector_status = FDB_SECTOR_STORE_UNUSED;
+
+ db_oldest_addr(db) = 0;
+ sector_iterator(db, §or, FDB_SECTOR_STORE_UNUSED, §or_oldest_addr, &last_sector_status,
+ check_oldest_addr_cb, false);
+ db_oldest_addr(db) = sector_oldest_addr;
+ FDB_DEBUG("The oldest addr is @0x%08" PRIX32 "\n", db_oldest_addr(db));
+ }
+ /* there is at least one empty sector for GC. */
+ FDB_ASSERT((FDB_GC_EMPTY_SEC_THRESHOLD > 0 && FDB_GC_EMPTY_SEC_THRESHOLD < SECTOR_NUM))
+
+#ifdef FDB_KV_USING_CACHE
+ for (i = 0; i < FDB_SECTOR_CACHE_TABLE_SIZE; i++) {
+ db->sector_cache_table[i].check_ok = false;
+ db->sector_cache_table[i].empty_kv = FAILED_ADDR;
+ db->sector_cache_table[i].addr = FDB_DATA_UNUSED;
+ }
+ for (i = 0; i < FDB_KV_CACHE_TABLE_SIZE; i++) {
+ db->kv_cache_table[i].addr = FDB_DATA_UNUSED;
+ }
+#endif /* FDB_KV_USING_CACHE */
+
+ FDB_DEBUG("KVDB size is %" PRIu32 " bytes.\n", db_max_size(db));
+ db_unlock(db);
+
+ result = _fdb_kv_load(db);
+
+ db_lock(db);
+#ifdef FDB_KV_AUTO_UPDATE
+ if (result == FDB_NO_ERR) {
+ kv_auto_update(db);
+ }
+#endif
+
+ /* unlock the KVDB */
+ db_unlock(db);
+
+__exit:
+
+ _fdb_init_finish((fdb_db_t)db, result);
+
+ return result;
+}
+
+/**
+ * The KV database initialization.
+ *
+ * @param db database object
+ *
+ * @return result
+ */
+fdb_err_t fdb_kvdb_deinit(fdb_kvdb_t db)
+{
+ _fdb_deinit((fdb_db_t) db);
+
+ return FDB_NO_ERR;
+}
+
+/**
+ * The KV database initialization.
+ *
+ * @param db database object
+ * @param itr iterator structure to be initialized
+ *
+ * @return pointer to the iterator initialized.
+ */
+fdb_kv_iterator_t fdb_kv_iterator_init(fdb_kvdb_t db, fdb_kv_iterator_t itr)
+{
+ itr->curr_kv.addr.start = 0;
+
+ /* If iterator statistics is needed */
+ itr->iterated_cnt = 0;
+ itr->iterated_obj_bytes = 0;
+ itr->iterated_value_bytes = 0;
+ itr->traversed_len = 0;
+ /* Start from sector head */
+ itr->sector_addr = db_oldest_addr(db);
+ return itr;
+}
+
+/**
+ * The KV database iterator.
+ *
+ * @param db database object
+ * @param itr the iterator structure
+ *
+ * @return false if iteration is ended, true if iteration is not ended.
+ */
+bool fdb_kv_iterate(fdb_kvdb_t db, fdb_kv_iterator_t itr)
+{
+ struct kvdb_sec_info sector;
+ fdb_kv_t kv = &(itr->curr_kv);
+
+ do {
+ if (read_sector_info(db, itr->sector_addr, §or, false) == FDB_NO_ERR) {
+ if (sector.status.store == FDB_SECTOR_STORE_USING || sector.status.store == FDB_SECTOR_STORE_FULL) {
+ if (kv->addr.start == 0) {
+ kv->addr.start = sector.addr + SECTOR_HDR_DATA_SIZE;
+ } else if ((kv->addr.start = get_next_kv_addr(db, §or, kv)) == FAILED_ADDR) {
+ kv->addr.start = 0;
+ itr->traversed_len += db_sec_size(db);
+ continue;
+ }
+ do {
+ read_kv(db, kv);
+ if (kv->status == FDB_KV_WRITE && kv->crc_is_ok == true) {
+ /* We got a valid kv here. */
+ /* If iterator statistics is needed */
+ itr->iterated_cnt++;
+ itr->iterated_obj_bytes += kv->len;
+ itr->iterated_value_bytes += kv->value_len;
+ return true;
+ }
+ } while ((kv->addr.start = get_next_kv_addr(db, §or, kv)) != FAILED_ADDR);
+ }
+ }
+ /** Set kv->addr.start to 0 when we get into a new sector so that if we successfully get the next sector info,
+ * the kv->addr.start is set to the new sector.addr + SECTOR_HDR_DATA_SIZE.
+ */
+ kv->addr.start = 0;
+ itr->traversed_len += db_sec_size(db);
+ } while ((itr->sector_addr = get_next_sector_addr(db, §or, itr->traversed_len)) != FAILED_ADDR);
+ /* Finally we have iterated all the KVs. */
+ return false;
+}
+
+/**
+ * The database inergrity check
+ *
+ * @param db database object
+ *
+ * @return result, FDB_NO_ERR: check OK
+ */
+fdb_err_t fdb_kvdb_check(fdb_kvdb_t db)
+{
+ fdb_err_t result = FDB_NO_ERR;
+ uint32_t sec_addr, traversed_len = 0;
+ struct kvdb_sec_info sector;
+ struct fdb_kv kv;
+
+ if (!db_init_ok(db)) {
+ FDB_INFO("Error: KV (%s) isn't initialize OK.\n", db_name(db));
+ return FDB_INIT_FAILED;
+ }
+
+ /* lock the KV cache */
+ db_lock(db);
+
+ sec_addr = db_oldest_addr(db);
+ /* search all sectors */
+ do {
+ traversed_len += db_sec_size(db);
+ result = read_sector_info(db, sec_addr, §or, false);
+ if (result == FDB_NO_ERR)
+ {
+ /* sector has KV */
+ if (sector.status.store == FDB_SECTOR_STORE_USING || sector.status.store == FDB_SECTOR_STORE_FULL) {
+ kv.addr.start = sector.addr + SECTOR_HDR_DATA_SIZE;
+ /* search all KV */
+ do {
+ result = read_kv(db, &kv);
+ } while ((kv.addr.start = get_next_kv_addr(db, §or, &kv)) != FAILED_ADDR && result == FDB_NO_ERR);
+ }
+ }
+ } while ((sec_addr = get_next_sector_addr(db, §or, traversed_len)) != FAILED_ADDR && result == FDB_NO_ERR);
+
+ /* unlock the KV cache */
+ db_unlock(db);
+
+ return result;
+}
+
+#endif /* defined(FDB_USING_KVDB) */
diff --git a/User/system/lib/flashdb/fdb_low_lvl.h b/User/system/lib/flashdb/fdb_low_lvl.h
new file mode 100644
index 0000000..c252dca
--- /dev/null
+++ b/User/system/lib/flashdb/fdb_low_lvl.h
@@ -0,0 +1,69 @@
+/*
+ * Copyright (c) 2020, Armink,
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/**
+ * @file
+ * @brief low level API and definition
+ */
+
+#ifndef _FDB_LOW_LVL_H_
+#define _FDB_LOW_LVL_H_
+
+#include
+#include
+
+#if (FDB_WRITE_GRAN == 1)
+#define FDB_STATUS_TABLE_SIZE(status_number) ((status_number * FDB_WRITE_GRAN + 7)/8)
+#else
+#define FDB_STATUS_TABLE_SIZE(status_number) (((status_number - 1) * FDB_WRITE_GRAN + 7)/8)
+#endif
+
+/* the data is erased */
+#define FDB_BYTE_ERASED 0xFF
+/* the data is written */
+#define FDB_BYTE_WRITTEN 0x00
+
+/* Return the most contiguous size aligned at specified width. RT_ALIGN(13, 4)
+ * would return 16.
+ */
+#define FDB_ALIGN(size, align) (((size) + (align) - 1) - (((size) + (align) -1) % (align)))
+/* align by write granularity */
+#define FDB_WG_ALIGN(size) (FDB_ALIGN(size, ((FDB_WRITE_GRAN + 7)/8)))
+/**
+ * Return the down number of aligned at specified width. RT_ALIGN_DOWN(13, 4)
+ * would return 12.
+ */
+#define FDB_ALIGN_DOWN(size, align) (((size) / (align)) * (align))
+/* align down by write granularity */
+#define FDB_WG_ALIGN_DOWN(size) (FDB_ALIGN_DOWN(size, (FDB_WRITE_GRAN + 7)/8))
+
+#define FDB_STORE_STATUS_TABLE_SIZE FDB_STATUS_TABLE_SIZE(FDB_SECTOR_STORE_STATUS_NUM)
+#define FDB_DIRTY_STATUS_TABLE_SIZE FDB_STATUS_TABLE_SIZE(FDB_SECTOR_DIRTY_STATUS_NUM)
+
+/* the data is unused */
+#if (FDB_BYTE_ERASED == 0xFF)
+#define FDB_DATA_UNUSED 0xFFFFFFFF
+#else
+#define FDB_DATA_UNUSED 0x00000000
+#endif
+
+/* invalid address */
+#define FDB_FAILED_ADDR 0xFFFFFFFF
+
+size_t _fdb_set_status(uint8_t status_table[], size_t status_num, size_t status_index);
+size_t _fdb_get_status(uint8_t status_table[], size_t status_num);
+uint32_t _fdb_continue_ff_addr(fdb_db_t db, uint32_t start, uint32_t end);
+fdb_err_t _fdb_init_ex(fdb_db_t db, const char *name, const char *part_name, fdb_db_type type, void *user_data);
+void _fdb_init_finish(fdb_db_t db, fdb_err_t result);
+void _fdb_deinit(fdb_db_t db);
+const char *_fdb_db_path(fdb_db_t db);
+fdb_err_t _fdb_write_status(fdb_db_t db, uint32_t addr, uint8_t status_table[], size_t status_num, size_t status_index, bool sync);
+size_t _fdb_read_status(fdb_db_t db, uint32_t addr, uint8_t status_table[], size_t total_num);
+fdb_err_t _fdb_flash_read(fdb_db_t db, uint32_t addr, void *buf, size_t size);
+fdb_err_t _fdb_flash_erase(fdb_db_t db, uint32_t addr, size_t size);
+fdb_err_t _fdb_flash_write(fdb_db_t db, uint32_t addr, const void *buf, size_t size, bool sync);
+
+#endif /* _FDB_LOW_LVL_H_ */
diff --git a/User/system/lib/flashdb/fdb_tsdb.c b/User/system/lib/flashdb/fdb_tsdb.c
new file mode 100644
index 0000000..2d66c92
--- /dev/null
+++ b/User/system/lib/flashdb/fdb_tsdb.c
@@ -0,0 +1,1024 @@
+/*
+ * Copyright (c) 2020, Armink,
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/**
+ * @file
+ * @brief TSDB feature.
+ *
+ * Time series log (like TSDB) feature implement source file.
+ *
+ * TSL is time series log, the TSDB saved many TSLs.
+ */
+
+#include
+#include
+#include
+#include
+
+#define FDB_LOG_TAG "[tsl]"
+/* rewrite log prefix */
+#undef FDB_LOG_PREFIX2
+#define FDB_LOG_PREFIX2() FDB_PRINT("[%s][%s] ", db_name(db), _fdb_db_path((fdb_db_t)db))
+
+#if defined(FDB_USING_TSDB)
+
+#if (FDB_WRITE_GRAN == 64) || (FDB_WRITE_GRAN == 128)
+#error "Flash 64 or 128 bits write granularity is not supported in TSDB yet!"
+#endif
+
+/* magic word(`T`, `S`, `L`, `0`) */
+#define SECTOR_MAGIC_WORD 0x304C5354
+
+#define TSL_STATUS_TABLE_SIZE FDB_STATUS_TABLE_SIZE(FDB_TSL_STATUS_NUM)
+
+#define SECTOR_HDR_DATA_SIZE (FDB_WG_ALIGN(sizeof(struct sector_hdr_data)))
+#define LOG_IDX_DATA_SIZE (FDB_WG_ALIGN(sizeof(struct log_idx_data)))
+#define LOG_IDX_TS_OFFSET ((unsigned long)(&((struct log_idx_data *)0)->time))
+#define SECTOR_MAGIC_OFFSET ((unsigned long)(&((struct sector_hdr_data *)0)->magic))
+#define SECTOR_START_TIME_OFFSET ((unsigned long)(&((struct sector_hdr_data *)0)->start_time))
+#define SECTOR_END0_TIME_OFFSET ((unsigned long)(&((struct sector_hdr_data *)0)->end_info[0].time))
+#define SECTOR_END0_IDX_OFFSET ((unsigned long)(&((struct sector_hdr_data *)0)->end_info[0].index))
+#define SECTOR_END0_STATUS_OFFSET ((unsigned long)(&((struct sector_hdr_data *)0)->end_info[0].status))
+#define SECTOR_END1_TIME_OFFSET ((unsigned long)(&((struct sector_hdr_data *)0)->end_info[1].time))
+#define SECTOR_END1_IDX_OFFSET ((unsigned long)(&((struct sector_hdr_data *)0)->end_info[1].index))
+#define SECTOR_END1_STATUS_OFFSET ((unsigned long)(&((struct sector_hdr_data *)0)->end_info[1].status))
+
+/* the next address is get failed */
+#define FAILED_ADDR 0xFFFFFFFF
+
+#define db_name(db) (((fdb_db_t)db)->name)
+#define db_init_ok(db) (((fdb_db_t)db)->init_ok)
+#define db_sec_size(db) (((fdb_db_t)db)->sec_size)
+#define db_max_size(db) (((fdb_db_t)db)->max_size)
+#define db_oldest_addr(db) (((fdb_db_t)db)->oldest_addr)
+
+#define db_lock(db) \
+ do { \
+ if (((fdb_db_t)db)->lock) ((fdb_db_t)db)->lock((fdb_db_t)db); \
+ } while(0);
+
+#define db_unlock(db) \
+ do { \
+ if (((fdb_db_t)db)->unlock) ((fdb_db_t)db)->unlock((fdb_db_t)db); \
+ } while(0);
+
+#define _FDB_WRITE_STATUS(db, addr, status_table, status_num, status_index, sync) \
+ do { \
+ result = _fdb_write_status((fdb_db_t)db, addr, status_table, status_num, status_index, sync);\
+ if (result != FDB_NO_ERR) return result; \
+ } while(0);
+
+#define FLASH_WRITE(db, addr, buf, size, sync) \
+ do { \
+ result = _fdb_flash_write((fdb_db_t)db, addr, buf, size, sync); \
+ if (result != FDB_NO_ERR) return result; \
+ } while(0);
+
+struct sector_hdr_data {
+ uint8_t status[FDB_STORE_STATUS_TABLE_SIZE]; /**< sector store status @see fdb_sector_store_status_t */
+ uint32_t magic; /**< magic word(`T`, `S`, `L`, `0`) */
+ fdb_time_t start_time; /**< the first start node's timestamp */
+ struct {
+ fdb_time_t time; /**< the last end node's timestamp */
+ uint32_t index; /**< the last end node's index */
+ uint8_t status[TSL_STATUS_TABLE_SIZE]; /**< end node status, @see fdb_tsl_status_t */
+ } end_info[2];
+ uint32_t reserved;
+};
+typedef struct sector_hdr_data *sector_hdr_data_t;
+
+/* time series log node index data */
+struct log_idx_data {
+ uint8_t status_table[TSL_STATUS_TABLE_SIZE]; /**< node status, @see fdb_tsl_status_t */
+ fdb_time_t time; /**< node timestamp */
+ uint32_t log_len; /**< node total length (header + name + value), must align by FDB_WRITE_GRAN */
+ uint32_t log_addr; /**< node address */
+};
+typedef struct log_idx_data *log_idx_data_t;
+
+struct query_count_args {
+ fdb_tsl_status_t status;
+ size_t count;
+};
+
+struct check_sec_hdr_cb_args {
+ fdb_tsdb_t db;
+ bool check_failed;
+ size_t empty_num;
+ uint32_t empty_addr;
+};
+
+static fdb_err_t read_tsl(fdb_tsdb_t db, fdb_tsl_t tsl)
+{
+ struct log_idx_data idx;
+ /* read TSL index raw data */
+ _fdb_flash_read((fdb_db_t)db, tsl->addr.index, (uint32_t *) &idx, sizeof(struct log_idx_data));
+ tsl->status = (fdb_tsl_status_t) _fdb_get_status(idx.status_table, FDB_TSL_STATUS_NUM);
+ if ((tsl->status == FDB_TSL_PRE_WRITE) || (tsl->status == FDB_TSL_UNUSED)) {
+ tsl->log_len = db->max_len;
+ tsl->addr.log = FDB_DATA_UNUSED;
+ tsl->time = 0;
+ } else {
+ tsl->log_len = idx.log_len;
+ tsl->addr.log = idx.log_addr;
+ tsl->time = idx.time;
+ }
+
+ return FDB_NO_ERR;
+}
+
+static uint32_t get_next_sector_addr(fdb_tsdb_t db, tsdb_sec_info_t pre_sec, uint32_t traversed_len)
+{
+ if (traversed_len + db_sec_size(db) <= db_max_size(db)) {
+ if (pre_sec->addr + db_sec_size(db) < db_max_size(db)) {
+ return pre_sec->addr + db_sec_size(db);
+ } else {
+ /* the next sector is on the top of the database */
+ return 0;
+ }
+ } else {
+ /* finished */
+ return FAILED_ADDR;
+ }
+}
+
+static uint32_t get_next_tsl_addr(tsdb_sec_info_t sector, fdb_tsl_t pre_tsl)
+{
+ uint32_t addr = FAILED_ADDR;
+
+ if (sector->status == FDB_SECTOR_STORE_EMPTY) {
+ return FAILED_ADDR;
+ }
+
+ if (pre_tsl->addr.index + LOG_IDX_DATA_SIZE <= sector->end_idx) {
+ addr = pre_tsl->addr.index + LOG_IDX_DATA_SIZE;
+ } else {
+ /* no TSL */
+ return FAILED_ADDR;
+ }
+
+ return addr;
+}
+
+static uint32_t get_last_tsl_addr(tsdb_sec_info_t sector, fdb_tsl_t pre_tsl)
+{
+ uint32_t addr = FAILED_ADDR;
+
+ if (sector->status == FDB_SECTOR_STORE_EMPTY) {
+ return FAILED_ADDR;
+ }
+
+ if (pre_tsl->addr.index >= (sector->addr + SECTOR_HDR_DATA_SIZE + LOG_IDX_DATA_SIZE)) {
+ addr = pre_tsl->addr.index - LOG_IDX_DATA_SIZE;
+ } else {
+ return FAILED_ADDR;
+ }
+
+ return addr;
+}
+
+static uint32_t get_last_sector_addr(fdb_tsdb_t db, tsdb_sec_info_t pre_sec, uint32_t traversed_len)
+{
+ if (traversed_len + db_sec_size(db) <= db_max_size(db)) {
+ if (pre_sec->addr >= db_sec_size(db)) {
+ /* the next sector is previous sector */
+ return pre_sec->addr - db_sec_size(db);
+ } else {
+ /* the next sector is the last sector */
+ return db_max_size(db) - db_sec_size(db);
+ }
+ } else {
+ return FAILED_ADDR;
+ }
+}
+
+static fdb_err_t read_sector_info(fdb_tsdb_t db, uint32_t addr, tsdb_sec_info_t sector, bool traversal)
+{
+ fdb_err_t result = FDB_NO_ERR;
+ struct sector_hdr_data sec_hdr;
+
+ FDB_ASSERT(sector);
+
+ /* read sector header raw data */
+ _fdb_flash_read((fdb_db_t)db, addr, (uint32_t *)&sec_hdr, sizeof(struct sector_hdr_data));
+
+ sector->addr = addr;
+ sector->magic = sec_hdr.magic;
+
+ /* check magic word */
+ if (sector->magic != SECTOR_MAGIC_WORD) {
+ sector->check_ok = false;
+ return FDB_INIT_FAILED;
+ }
+ sector->check_ok = true;
+ sector->status = (fdb_sector_store_status_t) _fdb_get_status(sec_hdr.status, FDB_SECTOR_STORE_STATUS_NUM);
+ sector->start_time = sec_hdr.start_time;
+ sector->end_info_stat[0] = (fdb_tsl_status_t) _fdb_get_status(sec_hdr.end_info[0].status, FDB_TSL_STATUS_NUM);
+ sector->end_info_stat[1] = (fdb_tsl_status_t) _fdb_get_status(sec_hdr.end_info[1].status, FDB_TSL_STATUS_NUM);
+ if (sector->end_info_stat[0] == FDB_TSL_WRITE) {
+ sector->end_time = sec_hdr.end_info[0].time;
+ sector->end_idx = sec_hdr.end_info[0].index;
+ } else if (sector->end_info_stat[1] == FDB_TSL_WRITE) {
+ sector->end_time = sec_hdr.end_info[1].time;
+ sector->end_idx = sec_hdr.end_info[1].index;
+ } else if (sector->end_info_stat[0] == FDB_TSL_PRE_WRITE && sector->end_info_stat[1] == FDB_TSL_PRE_WRITE) {
+ //TODO There is no valid end node info on this sector, need impl fast query this sector by fdb_tsl_iter_by_time
+ FDB_ASSERT(0);
+ }
+ /* traversal all TSL and calculate the remain space size */
+ sector->empty_idx = sector->addr + SECTOR_HDR_DATA_SIZE;
+ sector->empty_data = sector->addr + db_sec_size(db);
+ /* the TSL's data is saved from sector bottom, and the TSL's index saved from the sector top */
+ sector->remain = sector->empty_data - sector->empty_idx;
+ if (sector->status == FDB_SECTOR_STORE_USING && traversal) {
+ struct fdb_tsl tsl;
+
+ tsl.addr.index = sector->empty_idx;
+ while (read_tsl(db, &tsl) == FDB_NO_ERR) {
+ if (tsl.status == FDB_TSL_UNUSED) {
+ break;
+ }
+ if (tsl.status != FDB_TSL_PRE_WRITE) {
+ sector->end_time = tsl.time;
+ }
+ sector->end_idx = tsl.addr.index;
+ sector->empty_idx += LOG_IDX_DATA_SIZE;
+ sector->empty_data -= FDB_WG_ALIGN(tsl.log_len);
+ tsl.addr.index += LOG_IDX_DATA_SIZE;
+ if (sector->remain > LOG_IDX_DATA_SIZE + FDB_WG_ALIGN(tsl.log_len)) {
+ sector->remain -= (LOG_IDX_DATA_SIZE + FDB_WG_ALIGN(tsl.log_len));
+ } else {
+ FDB_INFO("Error: this TSL (0x%08" PRIX32 ") size (%" PRIu32 ") is out of bound.\n", tsl.addr.index, tsl.log_len);
+ sector->remain = 0;
+ result = FDB_READ_ERR;
+ break;
+ }
+ }
+ }
+
+ return result;
+}
+
+static fdb_err_t format_sector(fdb_tsdb_t db, uint32_t addr)
+{
+ fdb_err_t result = FDB_NO_ERR;
+ struct sector_hdr_data sec_hdr;
+
+ FDB_ASSERT(addr % db_sec_size(db) == 0);
+
+ result = _fdb_flash_erase((fdb_db_t)db, addr, db_sec_size(db));
+ if (result == FDB_NO_ERR) {
+ _FDB_WRITE_STATUS(db, addr, sec_hdr.status, FDB_SECTOR_STORE_STATUS_NUM, FDB_SECTOR_STORE_EMPTY, true);
+ /* set the magic */
+ sec_hdr.magic = SECTOR_MAGIC_WORD;
+ FLASH_WRITE(db, addr + SECTOR_MAGIC_OFFSET, &sec_hdr.magic, sizeof(sec_hdr.magic), true);
+ }
+
+ return result;
+}
+
+static void sector_iterator(fdb_tsdb_t db, tsdb_sec_info_t sector, fdb_sector_store_status_t status, void *arg1,
+ void *arg2, bool (*callback)(tsdb_sec_info_t sector, void *arg1, void *arg2), bool traversal)
+{
+ uint32_t sec_addr = sector->addr, traversed_len = 0;
+
+ /* search all sectors */
+ do {
+ read_sector_info(db, sec_addr, sector, false);
+ if (status == FDB_SECTOR_STORE_UNUSED || status == sector->status) {
+ if (traversal) {
+ read_sector_info(db, sec_addr, sector, true);
+ }
+ /* iterator is interrupted when callback return true */
+ if (callback && callback(sector, arg1, arg2)) {
+ return;
+ }
+ }
+ traversed_len += db_sec_size(db);
+ } while ((sec_addr = get_next_sector_addr(db, sector, traversed_len)) != FAILED_ADDR);
+}
+
+static fdb_err_t write_tsl(fdb_tsdb_t db, fdb_blob_t blob, fdb_time_t time)
+{
+ fdb_err_t result = FDB_NO_ERR;
+ struct log_idx_data idx;
+ uint32_t idx_addr = db->cur_sec.empty_idx;
+
+ idx.log_len = blob->size;
+ idx.time = time;
+ idx.log_addr = db->cur_sec.empty_data - FDB_WG_ALIGN(idx.log_len);
+ /* write the status will by write granularity */
+ _FDB_WRITE_STATUS(db, idx_addr, idx.status_table, FDB_TSL_STATUS_NUM, FDB_TSL_PRE_WRITE, false);
+ /* write other index info */
+ FLASH_WRITE(db, idx_addr + LOG_IDX_TS_OFFSET, &idx.time, sizeof(struct log_idx_data) - LOG_IDX_TS_OFFSET, false);
+ /* write blob data */
+ FLASH_WRITE(db, idx.log_addr, blob->buf, blob->size, false);
+ /* write the status will by write granularity */
+ _FDB_WRITE_STATUS(db, idx_addr, idx.status_table, FDB_TSL_STATUS_NUM, FDB_TSL_WRITE, true);
+
+ return result;
+}
+
+static fdb_err_t update_sec_status(fdb_tsdb_t db, tsdb_sec_info_t sector, fdb_blob_t blob, fdb_time_t cur_time)
+{
+ fdb_err_t result = FDB_NO_ERR;
+ uint8_t status[FDB_STORE_STATUS_TABLE_SIZE];
+
+ if (sector->status == FDB_SECTOR_STORE_USING && sector->remain < LOG_IDX_DATA_SIZE + FDB_WG_ALIGN(blob->size)) {
+ uint8_t end_status[TSL_STATUS_TABLE_SIZE];
+ uint32_t end_index = sector->empty_idx - LOG_IDX_DATA_SIZE, new_sec_addr, cur_sec_addr = sector->addr;
+ /* save the end node index and timestamp */
+ if (sector->end_info_stat[0] == FDB_TSL_UNUSED) {
+ _FDB_WRITE_STATUS(db, cur_sec_addr + SECTOR_END0_STATUS_OFFSET, end_status, FDB_TSL_STATUS_NUM, FDB_TSL_PRE_WRITE, false);
+ FLASH_WRITE(db, cur_sec_addr + SECTOR_END0_TIME_OFFSET, (uint32_t * )&db->last_time, sizeof(fdb_time_t), false);
+ FLASH_WRITE(db, cur_sec_addr + SECTOR_END0_IDX_OFFSET, &end_index, sizeof(end_index), false);
+ _FDB_WRITE_STATUS(db, cur_sec_addr + SECTOR_END0_STATUS_OFFSET, end_status, FDB_TSL_STATUS_NUM, FDB_TSL_WRITE, true);
+ } else if (sector->end_info_stat[1] == FDB_TSL_UNUSED) {
+ _FDB_WRITE_STATUS(db, cur_sec_addr + SECTOR_END1_STATUS_OFFSET, end_status, FDB_TSL_STATUS_NUM, FDB_TSL_PRE_WRITE, false);
+ FLASH_WRITE(db, cur_sec_addr + SECTOR_END1_TIME_OFFSET, (uint32_t * )&db->last_time, sizeof(fdb_time_t), false);
+ FLASH_WRITE(db, cur_sec_addr + SECTOR_END1_IDX_OFFSET, &end_index, sizeof(end_index), false);
+ _FDB_WRITE_STATUS(db, cur_sec_addr + SECTOR_END1_STATUS_OFFSET, end_status, FDB_TSL_STATUS_NUM, FDB_TSL_WRITE, true);
+ }
+ /* change current sector to full */
+ _FDB_WRITE_STATUS(db, cur_sec_addr, status, FDB_SECTOR_STORE_STATUS_NUM, FDB_SECTOR_STORE_FULL, true);
+ sector->status = FDB_SECTOR_STORE_FULL;
+ /* calculate next sector address */
+ if (sector->addr + db_sec_size(db) < db_max_size(db)) {
+ new_sec_addr = sector->addr + db_sec_size(db);
+ }
+ else if (db->rollover) {
+ new_sec_addr = 0;
+ } else {
+ /* not rollover */
+ return FDB_SAVED_FULL;
+ }
+ read_sector_info(db, new_sec_addr, &db->cur_sec, false);
+ if (sector->status != FDB_SECTOR_STORE_EMPTY) {
+ /* calculate the oldest sector address */
+ if (new_sec_addr + db_sec_size(db) < db_max_size(db)) {
+ db_oldest_addr(db) = new_sec_addr + db_sec_size(db);
+ } else {
+ db_oldest_addr(db) = 0;
+ }
+ format_sector(db, new_sec_addr);
+ read_sector_info(db, new_sec_addr, &db->cur_sec, false);
+ }
+ } else if (sector->status == FDB_SECTOR_STORE_FULL) {
+ /* database full */
+ return FDB_SAVED_FULL;
+ }
+
+ if (sector->status == FDB_SECTOR_STORE_EMPTY) {
+ /* change the sector to using */
+ sector->status = FDB_SECTOR_STORE_USING;
+ sector->start_time = cur_time;
+ _FDB_WRITE_STATUS(db, sector->addr, status, FDB_SECTOR_STORE_STATUS_NUM, FDB_SECTOR_STORE_USING, true);
+ /* save the start timestamp */
+ FLASH_WRITE(db, sector->addr + SECTOR_START_TIME_OFFSET, (uint32_t *)&cur_time, sizeof(fdb_time_t), true);
+ }
+
+ return result;
+}
+
+static fdb_err_t tsl_append(fdb_tsdb_t db, fdb_blob_t blob, fdb_time_t *timestamp)
+{
+ fdb_err_t result = FDB_NO_ERR;
+ fdb_time_t cur_time = timestamp == NULL ? db->get_time() : *timestamp;
+
+ /* check the append length, MUST less than the db->max_len */
+ if(blob->size > db->max_len)
+ {
+ FDB_INFO("Warning: append length (%" PRIdMAX ") is more than the db->max_len (%" PRIdMAX "). This tsl will be dropped.\n",
+ (intmax_t)blob->size, (intmax_t)(db->max_len));
+ return FDB_WRITE_ERR;
+ }
+
+ /* check the current timestamp, MUST more than the last save timestamp */
+ if (cur_time <= db->last_time) {
+ FDB_INFO("Warning: current timestamp (%" PRIdMAX ") is less than or equal to the last save timestamp (%" PRIdMAX "). This tsl will be dropped.\n",
+ (intmax_t )cur_time, (intmax_t )(db->last_time));
+ return FDB_WRITE_ERR;
+ }
+
+ result = update_sec_status(db, &db->cur_sec, blob, cur_time);
+ if (result != FDB_NO_ERR) {
+ FDB_INFO("Error: update the sector status failed (%d)", result);
+ return result;
+ }
+ /* write the TSL node */
+ result = write_tsl(db, blob, cur_time);
+ if (result != FDB_NO_ERR) {
+ FDB_INFO("Error: write tsl failed (%d)", result);
+ return result;
+ }
+
+ /* recalculate the current using sector info */
+ db->cur_sec.end_idx = db->cur_sec.empty_idx;
+ db->cur_sec.end_time = cur_time;
+ db->cur_sec.empty_idx += LOG_IDX_DATA_SIZE;
+ db->cur_sec.empty_data -= FDB_WG_ALIGN(blob->size);
+ db->cur_sec.remain -= LOG_IDX_DATA_SIZE + FDB_WG_ALIGN(blob->size);
+ db->last_time = cur_time;
+
+ return result;
+}
+
+/**
+ * Append a new log to TSDB.
+ *
+ * @param db database object
+ * @param blob log blob data
+ *
+ * @return result
+ */
+fdb_err_t fdb_tsl_append(fdb_tsdb_t db, fdb_blob_t blob)
+{
+ fdb_err_t result = FDB_NO_ERR;
+
+ if (!db_init_ok(db)) {
+ FDB_INFO("Error: TSL (%s) isn't initialize OK.\n", db_name(db));
+ return FDB_INIT_FAILED;
+ }
+
+ db_lock(db);
+ result = tsl_append(db, blob, NULL);
+ db_unlock(db);
+
+ return result;
+}
+
+/**
+ * Append a new log to TSDB with specific timestamp.
+ *
+ * @param db database object
+ * @param blob log blob data
+ *
+ * @return result
+ */
+fdb_err_t fdb_tsl_append_with_ts(fdb_tsdb_t db, fdb_blob_t blob, fdb_time_t timestamp)
+{
+ fdb_err_t result = FDB_NO_ERR;
+
+ if (!db_init_ok(db)) {
+ FDB_INFO("Error: TSL (%s) isn't initialize OK.\n", db_name(db));
+ return FDB_INIT_FAILED;
+ }
+
+ db_lock(db);
+ result = tsl_append(db, blob, ×tamp);
+ db_unlock(db);
+
+ return result;
+}
+
+/**
+ * The TSDB iterator for each TSL.
+ *
+ * @param db database object
+ * @param cb callback
+ * @param arg callback argument
+ */
+void fdb_tsl_iter(fdb_tsdb_t db, fdb_tsl_cb cb, void *arg)
+{
+ struct tsdb_sec_info sector;
+ uint32_t sec_addr, traversed_len = 0;
+ struct fdb_tsl tsl;
+
+ if (!db_init_ok(db)) {
+ FDB_INFO("Error: TSL (%s) isn't initialize OK.\n", db_name(db));
+ }
+
+ if (cb == NULL) {
+ return;
+ }
+
+ sec_addr = db_oldest_addr(db);
+ db_lock(db);
+ /* search all sectors */
+ do {
+ traversed_len += db_sec_size(db);
+ if (read_sector_info(db, sec_addr, §or, false) != FDB_NO_ERR) {
+ continue;
+ }
+ /* sector has TSL */
+ if (sector.status == FDB_SECTOR_STORE_USING || sector.status == FDB_SECTOR_STORE_FULL) {
+ if (sector.status == FDB_SECTOR_STORE_USING) {
+ /* copy the current using sector status */
+ sector = db->cur_sec;
+ }
+ tsl.addr.index = sector.addr + SECTOR_HDR_DATA_SIZE;
+ /* search all TSL */
+ do {
+ read_tsl(db, &tsl);
+ /* iterator is interrupted when callback return true */
+ if (cb(&tsl, arg)) {
+ db_unlock(db);
+ return;
+ }
+ } while ((tsl.addr.index = get_next_tsl_addr(§or, &tsl)) != FAILED_ADDR);
+ }
+ } while ((sec_addr = get_next_sector_addr(db, §or, traversed_len)) != FAILED_ADDR);
+ db_unlock(db);
+}
+
+/**
+ * The TSDB iterator for each TSL.
+ *
+ * @param db database object
+ * @param cb callback
+ * @param arg callback argument
+ */
+void fdb_tsl_iter_reverse(fdb_tsdb_t db, fdb_tsl_cb cb, void *cb_arg)
+{
+ struct tsdb_sec_info sector;
+ uint32_t sec_addr, traversed_len = 0;
+ struct fdb_tsl tsl;
+
+ if (!db_init_ok(db)) {
+ FDB_INFO("Error: TSL (%s) isn't initialize OK.\n", db_name(db));
+ }
+
+ if (cb == NULL) {
+ return;
+ }
+
+ sec_addr = db->cur_sec.addr;
+ db_lock(db);
+ /* search all sectors */
+ do {
+ traversed_len += db_sec_size(db);
+ if (read_sector_info(db, sec_addr, §or, false) != FDB_NO_ERR) {
+ continue;
+ }
+ /* sector has TSL */
+ if (sector.status == FDB_SECTOR_STORE_USING || sector.status == FDB_SECTOR_STORE_FULL) {
+ if (sector.status == FDB_SECTOR_STORE_USING) {
+ /* copy the current using sector status */
+ sector = db->cur_sec;
+ }
+ tsl.addr.index = sector.end_idx;
+ /* search all TSL */
+ do {
+ read_tsl(db, &tsl);
+ /* iterator is interrupted when callback return true */
+ if (cb(&tsl, cb_arg)) {
+ goto __exit;
+ }
+ } while ((tsl.addr.index = get_last_tsl_addr(§or, &tsl)) != FAILED_ADDR);
+ } else if (sector.status == FDB_SECTOR_STORE_EMPTY || sector.status == FDB_SECTOR_STORE_UNUSED)
+ goto __exit;
+ } while ((sec_addr = get_last_sector_addr(db, §or, traversed_len)) != FAILED_ADDR);
+
+__exit:
+ db_unlock(db);
+}
+
+/*
+ * Found the matched TSL address.
+ */
+static int search_start_tsl_addr(fdb_tsdb_t db, int start, int end, fdb_time_t from, fdb_time_t to)
+{
+ struct fdb_tsl tsl;
+ while (true) {
+ tsl.addr.index = start + FDB_ALIGN((end - start) / 2, LOG_IDX_DATA_SIZE);
+ read_tsl(db, &tsl);
+ if (tsl.time < from) {
+ start = tsl.addr.index + LOG_IDX_DATA_SIZE;
+ } else if (tsl.time > from) {
+ end = tsl.addr.index - LOG_IDX_DATA_SIZE;
+ } else {
+ return tsl.addr.index;
+ }
+
+ if (start > end) {
+ if (from > to) {
+ tsl.addr.index = start;
+ read_tsl(db, &tsl);
+ if (tsl.time > from) {
+ start -= LOG_IDX_DATA_SIZE;
+ }
+ }
+ break;
+ }
+ }
+ return start;
+}
+
+/**
+ * The TSDB iterator for each TSL by timestamp.
+ *
+ * @param db database object
+ * @param from starting timestamp. It will be a reverse iterator when ending timestamp less than starting timestamp
+ * @param to ending timestamp
+ * @param cb callback
+ * @param arg callback argument
+ */
+void fdb_tsl_iter_by_time(fdb_tsdb_t db, fdb_time_t from, fdb_time_t to, fdb_tsl_cb cb, void *cb_arg)
+{
+ struct tsdb_sec_info sector;
+ uint32_t sec_addr, start_addr, traversed_len = 0;
+ struct fdb_tsl tsl;
+ bool found_start_tsl = false;
+
+ uint32_t (*get_sector_addr)(fdb_tsdb_t , tsdb_sec_info_t , uint32_t);
+ uint32_t (*get_tsl_addr)(tsdb_sec_info_t , fdb_tsl_t);
+
+ if (!db_init_ok(db)) {
+ FDB_INFO("Error: TSL (%s) isn't initialize OK.\n", db_name(db));
+ }
+
+ if(from <= to) {
+ start_addr = db_oldest_addr(db);
+ get_sector_addr = get_next_sector_addr;
+ get_tsl_addr = get_next_tsl_addr;
+ } else {
+ start_addr = db->cur_sec.addr;
+ get_sector_addr = get_last_sector_addr;
+ get_tsl_addr = get_last_tsl_addr;
+ }
+
+// FDB_INFO("from %s", ctime((const time_t * )&from));
+// FDB_INFO("to %s", ctime((const time_t * )&to));
+
+ if (cb == NULL) {
+ return;
+ }
+
+ sec_addr = start_addr;
+ db_lock(db);
+ /* search all sectors */
+ do {
+ traversed_len += db_sec_size(db);
+ if (read_sector_info(db, sec_addr, §or, false) != FDB_NO_ERR) {
+ continue;
+ }
+ /* sector has TSL */
+ if ((sector.status == FDB_SECTOR_STORE_USING || sector.status == FDB_SECTOR_STORE_FULL)) {
+ if (sector.status == FDB_SECTOR_STORE_USING) {
+ /* copy the current using sector status */
+ sector = db->cur_sec;
+ }
+ if ((found_start_tsl)
+ || (!found_start_tsl &&
+ ((from <= to && ((sec_addr == start_addr && from <= sector.start_time) || from <= sector.end_time)) ||
+ (from > to && ((sec_addr == start_addr && from >= sector.end_time) || from >= sector.start_time)))
+ )) {
+ uint32_t start = sector.addr + SECTOR_HDR_DATA_SIZE, end = sector.end_idx;
+
+ found_start_tsl = true;
+ /* search the first start TSL address */
+ tsl.addr.index = search_start_tsl_addr(db, start, end, from, to);
+ /* search all TSL */
+ do {
+ read_tsl(db, &tsl);
+ if (tsl.status != FDB_TSL_UNUSED) {
+ if ((from <= to && tsl.time >= from && tsl.time <= to)
+ || (from > to && tsl.time <= from && tsl.time >= to)) {
+ /* iterator is interrupted when callback return true */
+ if (cb(&tsl, cb_arg)) {
+ goto __exit;
+ }
+ } else {
+ goto __exit;
+ }
+ }
+ } while ((tsl.addr.index = get_tsl_addr(§or, &tsl)) != FAILED_ADDR);
+ }
+ } else if (sector.status == FDB_SECTOR_STORE_EMPTY) {
+ goto __exit;
+ }
+ } while ((sec_addr = get_sector_addr(db, §or, traversed_len)) != FAILED_ADDR);
+
+__exit:
+ db_unlock(db);
+}
+
+static bool query_count_cb(fdb_tsl_t tsl, void *arg)
+{
+ struct query_count_args *args = arg;
+
+ if (tsl->status == args->status) {
+ args->count++;
+ }
+
+ return false;
+}
+
+/**
+ * Query some TSL's count by timestamp and status.
+ *
+ * @param db database object
+ * @param from starting timestamp
+ * @param to ending timestamp
+ * @param status status
+ */
+size_t fdb_tsl_query_count(fdb_tsdb_t db, fdb_time_t from, fdb_time_t to, fdb_tsl_status_t status)
+{
+ struct query_count_args arg = { FDB_TSL_UNUSED, 0 };
+
+ arg.status = status;
+
+ if (!db_init_ok(db)) {
+ FDB_INFO("Error: TSL (%s) isn't initialize OK.\n", db_name(db));
+ return 0;
+ }
+
+ fdb_tsl_iter_by_time(db, from, to, query_count_cb, &arg);
+
+ return arg.count;
+
+}
+
+/**
+ * Set the TSL status.
+ *
+ * @param db database object
+ * @param tsl TSL object
+ * @param status status
+ *
+ * @return result
+ */
+fdb_err_t fdb_tsl_set_status(fdb_tsdb_t db, fdb_tsl_t tsl, fdb_tsl_status_t status)
+{
+ fdb_err_t result = FDB_NO_ERR;
+ uint8_t status_table[TSL_STATUS_TABLE_SIZE];
+
+ /* write the status will by write granularity */
+ _FDB_WRITE_STATUS(db, tsl->addr.index, status_table, FDB_TSL_STATUS_NUM, status, true);
+
+ return result;
+}
+
+/**
+ * Convert the TSL object to blob object
+ *
+ * @param tsl TSL object
+ * @param blob blob object
+ *
+ * @return new blob object
+ */
+fdb_blob_t fdb_tsl_to_blob(fdb_tsl_t tsl, fdb_blob_t blob)
+{
+ blob->saved.addr = tsl->addr.log;
+ blob->saved.meta_addr = tsl->addr.index;
+ blob->saved.len = tsl->log_len;
+
+ return blob;
+}
+
+static bool check_sec_hdr_cb(tsdb_sec_info_t sector, void *arg1, void *arg2)
+{
+ struct check_sec_hdr_cb_args *arg = arg1;
+ fdb_tsdb_t db = arg->db;
+
+ if (!sector->check_ok) {
+ FDB_INFO("Sector (0x%08" PRIX32 ") header info is incorrect.\n", sector->addr);
+ (arg->check_failed) = true;
+ return true;
+ } else if (sector->status == FDB_SECTOR_STORE_USING) {
+ if (db->cur_sec.addr == FDB_DATA_UNUSED) {
+ memcpy(&db->cur_sec, sector, sizeof(struct tsdb_sec_info));
+ } else {
+ FDB_INFO("Warning: Sector status is wrong, there are multiple sectors in use.\n");
+ (arg->check_failed) = true;
+ return true;
+ }
+ } else if (sector->status == FDB_SECTOR_STORE_EMPTY) {
+ (arg->empty_num) += 1;
+ arg->empty_addr = sector->addr;
+ if ((arg->empty_num) == 1 && db->cur_sec.addr == FDB_DATA_UNUSED) {
+ memcpy(&db->cur_sec, sector, sizeof(struct tsdb_sec_info));
+ }
+ }
+
+ return false;
+}
+static bool format_all_cb(tsdb_sec_info_t sector, void *arg1, void *arg2)
+{
+ fdb_tsdb_t db = arg1;
+
+ format_sector(db, sector->addr);
+
+ return false;
+}
+
+static void tsl_format_all(fdb_tsdb_t db)
+{
+ struct tsdb_sec_info sector;
+
+ sector.addr = 0;
+ sector_iterator(db, §or, FDB_SECTOR_STORE_UNUSED, db, NULL, format_all_cb, false);
+ db_oldest_addr(db) = 0;
+ db->cur_sec.addr = 0;
+ db->last_time = 0;
+ /* read the current using sector info */
+ read_sector_info(db, db->cur_sec.addr, &db->cur_sec, false);
+
+ FDB_INFO("All sector format finished.\n");
+}
+
+/**
+ * Clean all the data in the TSDB.
+ *
+ * @note It's DANGEROUS. This operation is not reversible.
+ *
+ * @param db database object
+ */
+void fdb_tsl_clean(fdb_tsdb_t db)
+{
+ db_lock(db);
+ tsl_format_all(db);
+ db_unlock(db);
+}
+
+/**
+ * This function will get or set some options of the database
+ *
+ * @param db database object
+ * @param cmd the control command
+ * @param arg the argument
+ */
+void fdb_tsdb_control(fdb_tsdb_t db, int cmd, void *arg)
+{
+ FDB_ASSERT(db);
+
+ switch (cmd) {
+ case FDB_TSDB_CTRL_SET_SEC_SIZE:
+ /* this change MUST before database initialization */
+ FDB_ASSERT(db->parent.init_ok == false);
+ db->parent.sec_size = *(uint32_t *)arg;
+ break;
+ case FDB_TSDB_CTRL_GET_SEC_SIZE:
+ *(uint32_t *)arg = db->parent.sec_size;
+ break;
+ case FDB_TSDB_CTRL_SET_LOCK:
+#if !defined(__ARMCC_VERSION) && defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wpedantic"
+#endif
+ db->parent.lock = (void (*)(fdb_db_t db))arg;
+#if !defined(__ARMCC_VERSION) && defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+ break;
+ case FDB_TSDB_CTRL_SET_UNLOCK:
+#if !defined(__ARMCC_VERSION) && defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wpedantic"
+#endif
+ db->parent.unlock = (void (*)(fdb_db_t db))arg;
+#if !defined(__ARMCC_VERSION) && defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+ break;
+ case FDB_TSDB_CTRL_SET_ROLLOVER:
+ /* this change MUST after database initialized */
+ FDB_ASSERT(db->parent.init_ok == true);
+ db->rollover = *(bool *)arg;
+ break;
+ case FDB_TSDB_CTRL_GET_ROLLOVER:
+ *(bool *)arg = db->rollover;
+ break;
+ case FDB_TSDB_CTRL_GET_LAST_TIME:
+ *(fdb_time_t *)arg = db->last_time;
+ break;
+ case FDB_TSDB_CTRL_SET_FILE_MODE:
+#ifdef FDB_USING_FILE_MODE
+ /* this change MUST before database initialization */
+ FDB_ASSERT(db->parent.init_ok == false);
+ db->parent.file_mode = *(bool *)arg;
+#else
+ FDB_INFO("Error: set file mode Failed. Please defined the FDB_USING_FILE_MODE macro.");
+#endif
+ break;
+ case FDB_TSDB_CTRL_SET_MAX_SIZE:
+#ifdef FDB_USING_FILE_MODE
+ /* this change MUST before database initialization */
+ FDB_ASSERT(db->parent.init_ok == false);
+ db->parent.max_size = *(uint32_t *)arg;
+#endif
+ break;
+ case FDB_TSDB_CTRL_SET_NOT_FORMAT:
+ /* this change MUST before database initialization */
+ FDB_ASSERT(db->parent.init_ok == false);
+ db->parent.not_formatable = *(bool *)arg;
+ break;
+ }
+}
+
+/**
+ * The time series database initialization.
+ *
+ * @param db database object
+ * @param name database name
+ * @param path FAL mode: partition name, file mode: database saved directory path
+ * @param get_time get current time function
+ * @param max_len maximum length of each log
+ * @param user_data user data
+ *
+ * @return result
+ */
+fdb_err_t fdb_tsdb_init(fdb_tsdb_t db, const char *name, const char *path, fdb_get_time get_time, size_t max_len, void *user_data)
+{
+ fdb_err_t result = FDB_NO_ERR;
+ struct tsdb_sec_info sector;
+ struct check_sec_hdr_cb_args check_sec_arg = { db, false, 0, 0};
+
+ FDB_ASSERT(get_time);
+
+ result = _fdb_init_ex((fdb_db_t)db, name, path, FDB_DB_TYPE_TS, user_data);
+ if (result != FDB_NO_ERR) {
+ goto __exit;
+ }
+
+ /* lock the TSDB */
+ db_lock(db);
+
+ db->get_time = get_time;
+ db->max_len = max_len;
+ /* default rollover flag is true */
+ db->rollover = true;
+ db_oldest_addr(db) = FDB_DATA_UNUSED;
+ db->cur_sec.addr = FDB_DATA_UNUSED;
+ /* must less than sector size */
+ FDB_ASSERT(max_len < db_sec_size(db));
+
+ /* check all sector header */
+ sector.addr = 0;
+ sector_iterator(db, §or, FDB_SECTOR_STORE_UNUSED, &check_sec_arg, NULL, check_sec_hdr_cb, true);
+ /* format all sector when check failed */
+ if (check_sec_arg.check_failed) {
+ if (db->parent.not_formatable) {
+ result = FDB_READ_ERR;
+ goto __exit;
+ } else {
+ tsl_format_all(db);
+ }
+ } else {
+ uint32_t latest_addr;
+ if (check_sec_arg.empty_num > 0) {
+ latest_addr = check_sec_arg.empty_addr;
+ } else {
+ if (db->rollover) {
+ latest_addr = db->cur_sec.addr;
+ } else {
+ /* There is no empty sector. */
+ latest_addr = db->cur_sec.addr = db_max_size(db) - db_sec_size(db);
+ }
+ }
+ /* db->cur_sec is the latest sector, and the next is the oldest sector */
+ if (latest_addr + db_sec_size(db) >= db_max_size(db)) {
+ /* db->cur_sec is the the bottom of the database */
+ db_oldest_addr(db) = 0;
+ } else {
+ db_oldest_addr(db) = latest_addr + db_sec_size(db);
+ }
+ }
+ FDB_DEBUG("TSDB (%s) oldest sectors is 0x%08" PRIX32 ", current using sector is 0x%08" PRIX32 ".\n", db_name(db), db_oldest_addr(db),
+ db->cur_sec.addr);
+ /* read the current using sector info */
+ read_sector_info(db, db->cur_sec.addr, &db->cur_sec, true);
+ /* get last save time */
+ if (db->cur_sec.status == FDB_SECTOR_STORE_USING) {
+ db->last_time = db->cur_sec.end_time;
+ } else if (db->cur_sec.status == FDB_SECTOR_STORE_EMPTY && db_oldest_addr(db) != db->cur_sec.addr) {
+ struct tsdb_sec_info sec;
+ uint32_t addr = db->cur_sec.addr;
+
+ if (addr == 0) {
+ addr = db_max_size(db) - db_sec_size(db);
+ } else {
+ addr -= db_sec_size(db);
+ }
+ read_sector_info(db, addr, &sec, false);
+ db->last_time = sec.end_time;
+ }
+
+ /* unlock the TSDB */
+ db_unlock(db);
+
+__exit:
+
+ _fdb_init_finish((fdb_db_t)db, result);
+
+ return result;
+}
+
+/**
+ * The time series database deinitialization.
+ *
+ * @param db database object
+ *
+ * @return result
+ */
+fdb_err_t fdb_tsdb_deinit(fdb_tsdb_t db)
+{
+ _fdb_deinit((fdb_db_t) db);
+
+ return FDB_NO_ERR;
+}
+
+#endif /* defined(FDB_USING_TSDB) */
diff --git a/User/system/lib/flashdb/fdb_utils.c b/User/system/lib/flashdb/fdb_utils.c
new file mode 100644
index 0000000..0776f13
--- /dev/null
+++ b/User/system/lib/flashdb/fdb_utils.c
@@ -0,0 +1,320 @@
+/*
+ * Copyright (c) 2020, Armink,
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/**
+ * @file
+ * @brief utils
+ *
+ * Some utils for this library.
+ */
+
+#include
+#include
+#include
+#include
+
+#define FDB_LOG_TAG "[utils]"
+
+static const uint32_t crc32_table[] =
+{
+ 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
+ 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
+ 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
+ 0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
+ 0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
+ 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
+ 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
+ 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
+ 0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
+ 0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
+ 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190, 0x01db7106,
+ 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
+ 0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
+ 0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
+ 0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
+ 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
+ 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
+ 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
+ 0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
+ 0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
+ 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
+ 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
+ 0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
+ 0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
+ 0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
+ 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
+ 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
+ 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
+ 0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
+ 0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
+ 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
+ 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
+ 0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
+ 0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
+ 0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
+ 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
+ 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
+ 0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
+ 0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
+ 0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
+ 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
+ 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
+ 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
+};
+
+/**
+ * Calculate the CRC32 value of a memory buffer.
+ *
+ * @param crc accumulated CRC32 value, must be 0 on first call
+ * @param buf buffer to calculate CRC32 value for
+ * @param size bytes in buffer
+ *
+ * @return calculated CRC32 value
+ */
+uint32_t fdb_calc_crc32(uint32_t crc, const void *buf, size_t size)
+{
+ const uint8_t *p;
+
+ p = (const uint8_t *)buf;
+ crc = crc ^ ~0U;
+
+ while (size--) {
+ crc = crc32_table[(crc ^ *p++) & 0xFF] ^ (crc >> 8);
+ }
+
+ return crc ^ ~0U;
+}
+
+size_t _fdb_set_status(uint8_t status_table[], size_t status_num, size_t status_index)
+{
+ size_t byte_index = SIZE_MAX;
+ /*
+ * | write garn | status0 | status1 | status2 | status3 |
+ * ------------------------------------------------------------------------------------------------------
+ * | 1bit | 0xFF | 0x7F | 0x3F | 0x1F
+ * ------------------------------------------------------------------------------------------------------
+ * | 8bit | 0xFF FF FF | 0x00 FF FF | 0x00 00 FF | 0x00 00 00
+ * ------------------------------------------------------------------------------------------------------
+ * | 32bit | 0xFFFFFFFF FFFFFFFF | 0x00FFFFFF FFFFFFFF | 0x00FFFFFF 00FFFFFF | 0x00FFFFFF 00FFFFFF
+ * | | 0xFFFFFFFF | 0xFFFFFFFF | 0xFFFFFFFF | 0x00FFFFFF
+ * ------------------------------------------------------------------------------------------------------
+ * | | 0xFFFFFFFF FFFFFFFF | 0x00FFFFFF FFFFFFFF | 0x00FFFFFF FFFFFFFF | 0x00FFFFFF FFFFFFFF
+ * | 64bit | 0xFFFFFFFF FFFFFFFF | 0xFFFFFFFF FFFFFFFF | 0x00FFFFFF FFFFFFFF | 0x00FFFFFF FFFFFFFF
+ * | | 0xFFFFFFFF FFFFFFFF | 0xFFFFFFFF FFFFFFFF | 0xFFFFFFFF FFFFFFFF | 0x00FFFFFF FFFFFFFF
+ */
+ memset(status_table, FDB_BYTE_ERASED, FDB_STATUS_TABLE_SIZE(status_num));
+ if (status_index > 0) {
+#if (FDB_WRITE_GRAN == 1)
+ byte_index = (status_index - 1) / 8;
+#if (FDB_BYTE_ERASED == 0xFF)
+ status_table[byte_index] &= (0x00ff >> (status_index % 8));
+#else
+ status_table[byte_index] |= (0x00ff >> (status_index % 8));
+#endif
+#else
+ byte_index = (status_index - 1) * (FDB_WRITE_GRAN / 8);
+ status_table[byte_index] = FDB_BYTE_WRITTEN;
+#endif /* FDB_WRITE_GRAN == 1 */
+ }
+
+ return byte_index;
+}
+
+size_t _fdb_get_status(uint8_t status_table[], size_t status_num)
+{
+ size_t i = 0, status_num_bak = --status_num;
+
+ while (status_num --) {
+ /* get the first 0 position from end address to start address */
+#if (FDB_WRITE_GRAN == 1)
+ if ((status_table[status_num / 8] & (0x80 >> (status_num % 8))) == 0x00) {
+ break;
+ }
+#else /* (FDB_WRITE_GRAN == 8) || (FDB_WRITE_GRAN == 32) || (FDB_WRITE_GRAN == 64) */
+ if (status_table[status_num * FDB_WRITE_GRAN / 8] == FDB_BYTE_WRITTEN) {
+ break;
+ }
+#endif /* FDB_WRITE_GRAN == 1 */
+ i++;
+ }
+
+ return status_num_bak - i;
+}
+
+fdb_err_t _fdb_write_status(fdb_db_t db, uint32_t addr, uint8_t status_table[], size_t status_num, size_t status_index, bool sync)
+{
+ fdb_err_t result = FDB_NO_ERR;
+ size_t byte_index;
+
+ FDB_ASSERT(status_index < status_num);
+ FDB_ASSERT(status_table);
+
+ /* set the status first */
+ byte_index = _fdb_set_status(status_table, status_num, status_index);
+
+ /* the first status table value is all 1, so no need to write flash */
+ if (byte_index == SIZE_MAX) {
+ return FDB_NO_ERR;
+ }
+#if (FDB_WRITE_GRAN == 1)
+ result = _fdb_flash_write(db, addr + byte_index, (uint32_t *)&status_table[byte_index], 1, sync);
+#else /* (FDB_WRITE_GRAN == 8) || (FDB_WRITE_GRAN == 32) || (FDB_WRITE_GRAN == 64) */
+ /* write the status by write granularity
+ * some flash (like stm32 onchip) NOT supported repeated write before erase */
+ result = _fdb_flash_write(db, addr + byte_index, (uint32_t *) &status_table[byte_index], FDB_WRITE_GRAN / 8, sync);
+#endif /* FDB_WRITE_GRAN == 1 */
+
+ return result;
+}
+
+size_t _fdb_read_status(fdb_db_t db, uint32_t addr, uint8_t status_table[], size_t total_num)
+{
+ FDB_ASSERT(status_table);
+
+ _fdb_flash_read(db, addr, (uint32_t *) status_table, FDB_STATUS_TABLE_SIZE(total_num));
+
+ return _fdb_get_status(status_table, total_num);
+}
+
+/*
+ * find the continue 0xFF flash address to end address
+ */
+uint32_t _fdb_continue_ff_addr(fdb_db_t db, uint32_t start, uint32_t end)
+{
+ uint8_t buf[32], last_data = FDB_BYTE_WRITTEN;
+ size_t i, addr = start, read_size;
+
+ for (; start < end; start += sizeof(buf)) {
+ if (start + sizeof(buf) < end) {
+ read_size = sizeof(buf);
+ } else {
+ read_size = end - start;
+ }
+ _fdb_flash_read(db, start, (uint32_t *) buf, read_size);
+ for (i = 0; i < read_size; i++) {
+ if (last_data != FDB_BYTE_ERASED && buf[i] == FDB_BYTE_ERASED) {
+ addr = start + i;
+ }
+ last_data = buf[i];
+ }
+ }
+
+ if (last_data == FDB_BYTE_ERASED) {
+ return FDB_WG_ALIGN(addr);
+ } else {
+ return end;
+ }
+}
+
+/**
+ * Make a blob object.
+ *
+ * @param blob blob object
+ * @param value_buf value buffer
+ * @param buf_len buffer length
+ *
+ * @return new blob object
+ */
+fdb_blob_t fdb_blob_make(fdb_blob_t blob, const void *value_buf, size_t buf_len)
+{
+ blob->buf = (void *)value_buf;
+ blob->size = buf_len;
+
+ return blob;
+}
+
+/**
+ * Read the blob object in database.
+ *
+ * @param db database object
+ * @param blob blob object
+ *
+ * @return read length
+ */
+size_t fdb_blob_read(fdb_db_t db, fdb_blob_t blob)
+{
+ size_t read_len = blob->size;
+
+ if (read_len > blob->saved.len) {
+ read_len = blob->saved.len;
+ }
+ if (_fdb_flash_read(db, blob->saved.addr, blob->buf, read_len) != FDB_NO_ERR) {
+ read_len = 0;
+ }
+
+ return read_len;
+}
+
+#ifdef FDB_USING_FILE_MODE
+extern fdb_err_t _fdb_file_read(fdb_db_t db, uint32_t addr, void *buf, size_t size);
+extern fdb_err_t _fdb_file_write(fdb_db_t db, uint32_t addr, const void *buf, size_t size, bool sync);
+extern fdb_err_t _fdb_file_erase(fdb_db_t db, uint32_t addr, size_t size);
+#endif /* FDB_USING_FILE_LIBC */
+
+fdb_err_t _fdb_flash_read(fdb_db_t db, uint32_t addr, void *buf, size_t size)
+{
+ fdb_err_t result = FDB_NO_ERR;
+
+ if (db->file_mode) {
+#ifdef FDB_USING_FILE_MODE
+ return _fdb_file_read(db, addr, buf, size);
+#else
+ return FDB_READ_ERR;
+#endif
+ } else {
+#ifdef FDB_USING_FAL_MODE
+ if (fal_partition_read(db->storage.part, addr, (uint8_t *) buf, size) < 0) {
+ result = FDB_READ_ERR;
+ }
+#endif
+ }
+
+ return result;
+}
+
+fdb_err_t _fdb_flash_erase(fdb_db_t db, uint32_t addr, size_t size)
+{
+ fdb_err_t result = FDB_NO_ERR;
+
+ if (db->file_mode) {
+#ifdef FDB_USING_FILE_MODE
+ return _fdb_file_erase(db, addr, size);
+#else
+ return FDB_ERASE_ERR;
+#endif /* FDB_USING_FILE_MODE */
+ } else {
+#ifdef FDB_USING_FAL_MODE
+ if (fal_partition_erase(db->storage.part, addr, size) < 0) {
+ result = FDB_ERASE_ERR;
+ }
+#endif
+ }
+
+ return result;
+}
+
+fdb_err_t _fdb_flash_write(fdb_db_t db, uint32_t addr, const void *buf, size_t size, bool sync)
+{
+ fdb_err_t result = FDB_NO_ERR;
+
+ if (db->file_mode) {
+#ifdef FDB_USING_FILE_MODE
+ return _fdb_file_write(db, addr, buf, size, sync);
+#else
+ return FDB_WRITE_ERR;
+#endif /* FDB_USING_FILE_MODE */
+ } else {
+#ifdef FDB_USING_FAL_MODE
+ if (fal_partition_write(db->storage.part, addr, (uint8_t *)buf, size) < 0)
+ {
+ result = FDB_WRITE_ERR;
+ }
+#endif
+ }
+
+ return result;
+
+}
diff --git a/User/system/lib/flashdb/flashdb.h b/User/system/lib/flashdb/flashdb.h
new file mode 100644
index 0000000..61634fd
--- /dev/null
+++ b/User/system/lib/flashdb/flashdb.h
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2020, Armink,
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/**
+ * @file
+ * @brief Public APIs.
+ */
+
+#ifndef _FLASHDB_H_
+#define _FLASHDB_H_
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+#ifdef FDB_USING_FAL_MODE
+#include
+#endif
+
+#include
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* FlashDB database API */
+fdb_err_t fdb_kvdb_init (fdb_kvdb_t db, const char *name, const char *path, struct fdb_default_kv *default_kv,
+ void *user_data);
+void fdb_kvdb_control(fdb_kvdb_t db, int cmd, void *arg);
+fdb_err_t fdb_kvdb_check(fdb_kvdb_t db);
+fdb_err_t fdb_kvdb_deinit(fdb_kvdb_t db);
+fdb_err_t fdb_tsdb_init (fdb_tsdb_t db, const char *name, const char *path, fdb_get_time get_time, size_t max_len,
+ void *user_data);
+void fdb_tsdb_control(fdb_tsdb_t db, int cmd, void *arg);
+fdb_err_t fdb_tsdb_deinit(fdb_tsdb_t db);
+
+/* blob API */
+fdb_blob_t fdb_blob_make (fdb_blob_t blob, const void *value_buf, size_t buf_len);
+size_t fdb_blob_read (fdb_db_t db, fdb_blob_t blob);
+
+/* Key-Value API like a KV DB */
+fdb_err_t fdb_kv_set (fdb_kvdb_t db, const char *key, const char *value);
+char *fdb_kv_get (fdb_kvdb_t db, const char *key);
+fdb_err_t fdb_kv_set_blob (fdb_kvdb_t db, const char *key, fdb_blob_t blob);
+size_t fdb_kv_get_blob (fdb_kvdb_t db, const char *key, fdb_blob_t blob);
+fdb_err_t fdb_kv_del (fdb_kvdb_t db, const char *key);
+fdb_kv_t fdb_kv_get_obj (fdb_kvdb_t db, const char *key, fdb_kv_t kv);
+fdb_blob_t fdb_kv_to_blob (fdb_kv_t kv, fdb_blob_t blob);
+fdb_err_t fdb_kv_set_default (fdb_kvdb_t db);
+void fdb_kv_print (fdb_kvdb_t db);
+fdb_kv_iterator_t fdb_kv_iterator_init(fdb_kvdb_t db, fdb_kv_iterator_t itr);
+bool fdb_kv_iterate (fdb_kvdb_t db, fdb_kv_iterator_t itr);
+
+/* Time series log API like a TSDB */
+fdb_err_t fdb_tsl_append (fdb_tsdb_t db, fdb_blob_t blob);
+fdb_err_t fdb_tsl_append_with_ts(fdb_tsdb_t db, fdb_blob_t blob, fdb_time_t timestamp);
+void fdb_tsl_iter (fdb_tsdb_t db, fdb_tsl_cb cb, void *cb_arg);
+void fdb_tsl_iter_reverse(fdb_tsdb_t db, fdb_tsl_cb cb, void *cb_arg);
+void fdb_tsl_iter_by_time(fdb_tsdb_t db, fdb_time_t from, fdb_time_t to, fdb_tsl_cb cb, void *cb_arg);
+size_t fdb_tsl_query_count (fdb_tsdb_t db, fdb_time_t from, fdb_time_t to, fdb_tsl_status_t status);
+fdb_err_t fdb_tsl_set_status (fdb_tsdb_t db, fdb_tsl_t tsl, fdb_tsl_status_t status);
+void fdb_tsl_clean (fdb_tsdb_t db);
+fdb_blob_t fdb_tsl_to_blob (fdb_tsl_t tsl, fdb_blob_t blob);
+
+/* fdb_utils.c */
+uint32_t fdb_calc_crc32(uint32_t crc, const void *buf, size_t size);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _FLASHDB_H_ */
diff --git a/User/system/lib/flashdb/readme.md b/User/system/lib/flashdb/readme.md
new file mode 100644
index 0000000..2f5acd3
--- /dev/null
+++ b/User/system/lib/flashdb/readme.md
@@ -0,0 +1,38 @@
+# 移植说明
+
+## 简介
+
+[FlashDB](http://armink.gitee.io/flashdb/#/zh-cn/) 是一款超轻量级的嵌入式数据库,专注于提供嵌入式产品的数据存储方案。FlashDB 不仅支持传统的基于文件系统的数据库模式,而且结合了 Flash 的特性,具有较强的性能及可靠性。并在保证极低的资源占用前提下,尽可能延长 Flash 使用寿命。
+
+
+## 使用场景
+
+如今,物联网产品种类越来越多,运行时产生的数据种类及总量及也在不断变大。FlashDB 提供了多样化的数据存储方案,不仅资源占用小,并且存储容量大,非常适合用于物联网产品。下面是主要应用场景:
+
+* **键值数据库** :
+ * 产品参数存储
+ * 用户配置信息存储
+ * 小文件管理
+* **时序数据库** :
+ * 存储动态产生的结构化数据:如 温湿度传感器采集的环境监测信息,智能手环实时记录的人体健康信息等
+ * 记录运行日志:存储产品历史的运行日志,异常告警的记录等
+
+本项目使用3块EPPROM
+
+
+## 文件移植
+
+项目地址 https://github.com/armink/FlashDB
+
+引入目录中的文件
+
+.\FlashDB\src
+
+.\FlashDB\inc
+
+.\FlashDB\port\fal\src
+
+.\FlashDB\port\fal\inc
+
+
+> fal_cfg.h 这个文件为用户自定义升级的时候不要覆盖
diff --git a/User/lib/flow/README.md b/User/system/lib/flow/README.md
similarity index 100%
rename from User/lib/flow/README.md
rename to User/system/lib/flow/README.md
diff --git a/User/lib/flow/example.c b/User/system/lib/flow/example.c
similarity index 100%
rename from User/lib/flow/example.c
rename to User/system/lib/flow/example.c
diff --git a/User/lib/flow/flow.h b/User/system/lib/flow/flow.h
similarity index 100%
rename from User/lib/flow/flow.h
rename to User/system/lib/flow/flow.h
diff --git a/User/lib/flow/flow_core.c b/User/system/lib/flow/flow_core.c
similarity index 100%
rename from User/lib/flow/flow_core.c
rename to User/system/lib/flow/flow_core.c
diff --git a/User/lib/flow/flow_core.h b/User/system/lib/flow/flow_core.h
similarity index 100%
rename from User/lib/flow/flow_core.h
rename to User/system/lib/flow/flow_core.h
diff --git a/User/lib/flow/flow_def.h b/User/system/lib/flow/flow_def.h
similarity index 100%
rename from User/lib/flow/flow_def.h
rename to User/system/lib/flow/flow_def.h
diff --git a/User/lib/flow/flow_sem.h b/User/system/lib/flow/flow_sem.h
similarity index 100%
rename from User/lib/flow/flow_sem.h
rename to User/system/lib/flow/flow_sem.h
diff --git a/User/lib/inc/aes.h b/User/system/lib/inc/aes.h
similarity index 100%
rename from User/lib/inc/aes.h
rename to User/system/lib/inc/aes.h
diff --git a/User/lib/inc/clist.h b/User/system/lib/inc/clist.h
similarity index 100%
rename from User/lib/inc/clist.h
rename to User/system/lib/inc/clist.h
diff --git a/User/lib/inc/cmac.h b/User/system/lib/inc/cmac.h
similarity index 100%
rename from User/lib/inc/cmac.h
rename to User/system/lib/inc/cmac.h
diff --git a/User/lib/inc/cmd.h b/User/system/lib/inc/cmd.h
similarity index 100%
rename from User/lib/inc/cmd.h
rename to User/system/lib/inc/cmd.h
diff --git a/User/lib/inc/data_analysis.h b/User/system/lib/inc/data_analysis.h
similarity index 100%
rename from User/lib/inc/data_analysis.h
rename to User/system/lib/inc/data_analysis.h
diff --git a/User/lib/inc/data_type_def.h b/User/system/lib/inc/data_type_def.h
similarity index 100%
rename from User/lib/inc/data_type_def.h
rename to User/system/lib/inc/data_type_def.h
diff --git a/User/lib/inc/debug.h b/User/system/lib/inc/debug.h
similarity index 100%
rename from User/lib/inc/debug.h
rename to User/system/lib/inc/debug.h
diff --git a/User/lib/inc/filter.h b/User/system/lib/inc/filter.h
similarity index 100%
rename from User/lib/inc/filter.h
rename to User/system/lib/inc/filter.h
diff --git a/User/lib/inc/fsm.h b/User/system/lib/inc/fsm.h
similarity index 100%
rename from User/lib/inc/fsm.h
rename to User/system/lib/inc/fsm.h
diff --git a/User/lib/inc/lib.h b/User/system/lib/inc/lib.h
similarity index 94%
rename from User/lib/inc/lib.h
rename to User/system/lib/inc/lib.h
index aba352a..724bfaa 100644
--- a/User/lib/inc/lib.h
+++ b/User/system/lib/inc/lib.h
@@ -88,6 +88,16 @@ typedef struct
float32 b;
} linear_func_param_t;
+#define S_CURVE_POINTS 70
+typedef struct
+{
+ float32 start;
+ float32 end;
+ float32 current;
+ float32 t[S_CURVE_POINTS];
+ uint16_t index;
+} s_curve_generator_t;
+
extern void assic_to_str(uint8_t *assic, uint8_t len, uint8_t *str); // ASCII码转字符串
extern void get_cpu_id(uint32_t *id); // 获取CPU ID
extern uint32_t cpu_encrypt(void); // CPU加密
@@ -124,4 +134,7 @@ extern void add_commas(uint32_t num, char *result);
extern linear_func_param_t calculate_linear_regression(const point_t *points, int32_t count); // 计算线性回归
extern float32 get_linearity_value(const point_t *points, int32_t count, linear_func_param_t param); // 获取线性度
-#endif //__LIB_H
+
+void s_curve_generator_init(s_curve_generator_t *gen, float32 start);
+float32 s_curve_generate_point(s_curve_generator_t *gen, float32 target);
+#endif //__LIB_H
diff --git a/User/lib/inc/log.h b/User/system/lib/inc/log.h
similarity index 100%
rename from User/lib/inc/log.h
rename to User/system/lib/inc/log.h
diff --git a/User/lib/inc/malloc.h b/User/system/lib/inc/malloc.h
similarity index 86%
rename from User/lib/inc/malloc.h
rename to User/system/lib/inc/malloc.h
index 3aaab56..9b4b8f8 100644
--- a/User/lib/inc/malloc.h
+++ b/User/system/lib/inc/malloc.h
@@ -15,12 +15,12 @@
// mem1内存参数设定.mem1完全处于内部SRAM里面.(设置内部SARM的内存池和内存表的参数)
#define MEM1_BLOCK_SIZE 8 // 一个内存块大小为32字节
-#define MEM1_MAX_SIZE 4 * 1024 // 最大管理内存 1K (我们这个内存管理系统的内部SRAM可控制的内存大小)
+#define MEM1_MAX_SIZE 25 * 1024 // 最大管理内存 1K (我们这个内存管理系统的内部SRAM可控制的内存大小)
#define MEM1_ALLOC_TABLE_SIZE MEM1_MAX_SIZE / MEM1_BLOCK_SIZE // 内存表大小(有多少块内存块)
// mem2内存参数设定.mem2的内存池处于外部SRAM里面
#define MEM2_BLOCK_SIZE 8 // 一个内存块大小为32字节
-#define MEM2_MAX_SIZE 4 * 1024 // 因为精英版没有外扩内存,故这里设置一个最小值
+#define MEM2_MAX_SIZE 20 * 1024 // 因为精英版没有外扩内存,故这里设置一个最小值
#define MEM2_ALLOC_TABLE_SIZE MEM2_MAX_SIZE / MEM2_BLOCK_SIZE // 内存表大小
// 内存管理控制器结构体
diff --git a/User/lib/inc/mlist.h b/User/system/lib/inc/mlist.h
similarity index 100%
rename from User/lib/inc/mlist.h
rename to User/system/lib/inc/mlist.h
diff --git a/User/lib/inc/osel_arch.h b/User/system/lib/inc/osel_arch.h
similarity index 100%
rename from User/lib/inc/osel_arch.h
rename to User/system/lib/inc/osel_arch.h
diff --git a/User/lib/inc/pbuf.h b/User/system/lib/inc/pbuf.h
similarity index 100%
rename from User/lib/inc/pbuf.h
rename to User/system/lib/inc/pbuf.h
diff --git a/User/lib/inc/sqqueue.h b/User/system/lib/inc/sqqueue.h
similarity index 100%
rename from User/lib/inc/sqqueue.h
rename to User/system/lib/inc/sqqueue.h
diff --git a/User/lib/inc/storage.h b/User/system/lib/inc/storage.h
similarity index 100%
rename from User/lib/inc/storage.h
rename to User/system/lib/inc/storage.h
diff --git a/User/lib/inc/wl_flash.h b/User/system/lib/inc/wl_flash.h
similarity index 100%
rename from User/lib/inc/wl_flash.h
rename to User/system/lib/inc/wl_flash.h
diff --git a/User/system/lib/lcd/font/HZ16x16.c b/User/system/lib/lcd/font/HZ16x16.c
new file mode 100644
index 0000000..5949899
--- /dev/null
+++ b/User/system/lib/lcd/font/HZ16x16.c
@@ -0,0 +1,9511 @@
+/*
+**********************************************************************
+* UcGUI Font
+* Chinese GB2312 library
+* (c) Copyright 19xx-20xx, company name
+*
+*
+* 注:本字体文件由 ucGUI字体生成器v9.0 生成,作者:馋嘴猫(qq:602426967)
+* 字体:宋体,字形:粗体,大小:11,宽:16,高:16,水平偏移:0,垂直偏移:0
+*
+**********************************************************************
+*/
+
+#include "GUI.H"
+
+
+/* char: code:0x0020 */
+static GUI_CONST_STORAGE unsigned char ac0020[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: ! code:0x0021 */
+static GUI_CONST_STORAGE unsigned char ac0021[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ________,________,
+ ___XX___,________,
+ ___XX___,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: " code:0x0022 */
+static GUI_CONST_STORAGE unsigned char ac0022[32] = {
+ ________,________,
+ ___XXXX_,________,
+ __XXXX__,________,
+ __XXXX__,________,
+ _XXXX___,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: # code:0x0023 */
+static GUI_CONST_STORAGE unsigned char ac0023[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ___XX_XX,________,
+ ___XX_XX,________,
+ _XXXXXXX,________,
+ __XX_XX_,________,
+ __XX_XX_,________,
+ __XX_XX_,________,
+ _XXXXXXX,________,
+ __XX_XX_,________,
+ __XX_XX_,________,
+ __XX_XX_,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: $ code:0x0024 */
+static GUI_CONST_STORAGE unsigned char ac0024[32] = {
+ ________,________,
+ ________,________,
+ ____XX__,________,
+ __XXXXX_,________,
+ _XX_XXXX,________,
+ _XX_XXXX,________,
+ __XXXX__,________,
+ ___XXX__,________,
+ ____XXX_,________,
+ ____XXXX,________,
+ _XX_XXXX,________,
+ _XX_XXXX,________,
+ __XXXXX_,________,
+ ____XX__,________,
+ ____XX__,________,
+ ________,________
+};
+
+/* char: % code:0x0025 */
+static GUI_CONST_STORAGE unsigned char ac0025[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ _XX__XX_,________,
+ XXXX_XX_,________,
+ XXXXXX__,________,
+ XXXXXX__,________,
+ XXXXXXX_,________,
+ _XXXXXXX,________,
+ __XXXXXX,________,
+ __XXXXXX,________,
+ _XX_XXXX,________,
+ _XX__XX_,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: & code:0x0026 */
+static GUI_CONST_STORAGE unsigned char ac0026[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ __XXX___,________,
+ _XX_XX__,________,
+ _XX_XX__,________,
+ _XXXX___,________,
+ _XXX_XXX,________,
+ XXXX_XX_,________,
+ XXXX_XX_,________,
+ XX_XXXX_,________,
+ XX__XX_X,X_______,
+ _XXXXXXX,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: ' code:0x0027 */
+static GUI_CONST_STORAGE unsigned char ac0027[32] = {
+ ________,________,
+ _XXX____,________,
+ __XX____,________,
+ __XX____,________,
+ _XX_____,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: ( code:0x0028 */
+static GUI_CONST_STORAGE unsigned char ac0028[32] = {
+ ________,________,
+ ______XX,________,
+ _____XX_,________,
+ ____XX__,________,
+ ____XX__,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ____XX__,________,
+ ____XX__,________,
+ _____XX_,________,
+ ______XX,________,
+ ________,________,
+ ________,________
+};
+
+/* char: ) code:0x0029 */
+static GUI_CONST_STORAGE unsigned char ac0029[32] = {
+ ________,________,
+ XX______,________,
+ _XX_____,________,
+ __XX____,________,
+ __XX____,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ __XX____,________,
+ __XX____,________,
+ _XX_____,________,
+ XX______,________,
+ ________,________,
+ ________,________
+};
+
+/* char: * code:0x002A */
+static GUI_CONST_STORAGE unsigned char ac002A[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ___XX___,________,
+ ___XX___,________,
+ XXXXXXXX,________,
+ __XXXX__,________,
+ __XXXX__,________,
+ XXXXXXXX,________,
+ ___XX___,________,
+ ___XX___,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: + code:0x002B */
+static GUI_CONST_STORAGE unsigned char ac002B[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ _XXXXXXX,X_______,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: , code:0x002C */
+static GUI_CONST_STORAGE unsigned char ac002C[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _XXX____,________,
+ __XX____,________,
+ __XX____,________,
+ _XX_____,________,
+ ________,________
+};
+
+/* char: - code:0x002D */
+static GUI_CONST_STORAGE unsigned char ac002D[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXXX,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: . code:0x002E */
+static GUI_CONST_STORAGE unsigned char ac002E[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _XXX____,________,
+ _XXX____,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: / code:0x002F */
+static GUI_CONST_STORAGE unsigned char ac002F[32] = {
+ ________,________,
+ ______XX,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ ____XX__,________,
+ ____XX__,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ __XX____,________,
+ __XX____,________,
+ _XX_____,________,
+ _XX_____,________,
+ ________,________,
+ ________,________
+};
+
+/* char: 0 code:0x0030 */
+static GUI_CONST_STORAGE unsigned char ac0030[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ___XXX__,________,
+ __XX_XX_,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ __XX_XX_,________,
+ ___XXX__,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: 1 code:0x0031 */
+static GUI_CONST_STORAGE unsigned char ac0031[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ___XX___,________,
+ _XXXX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ _XXXXXX_,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: 2 code:0x0032 */
+static GUI_CONST_STORAGE unsigned char ac0032[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ __XXXXX_,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ ______XX,________,
+ _____XX_,________,
+ ____XX__,________,
+ ___XX___,________,
+ __XX____,________,
+ _XX___XX,________,
+ _XXXXXXX,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: 3 code:0x0033 */
+static GUI_CONST_STORAGE unsigned char ac0033[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ __XXXXX_,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _____XX_,________,
+ ___XXX__,________,
+ _____XX_,________,
+ ______XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ __XXXXX_,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: 4 code:0x0034 */
+static GUI_CONST_STORAGE unsigned char ac0034[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ _____XX_,________,
+ ____XXX_,________,
+ ____XXX_,________,
+ ___XXXX_,________,
+ __XX_XX_,________,
+ _XX__XX_,________,
+ _XXXXXXX,X_______,
+ _____XX_,________,
+ _____XX_,________,
+ ___XXXXX,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: 5 code:0x0035 */
+static GUI_CONST_STORAGE unsigned char ac0035[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ _XXXXXXX,________,
+ _XX_____,________,
+ _XX_____,________,
+ _XXXXXX_,________,
+ _XX___XX,________,
+ ______XX,________,
+ ______XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ __XXXXX_,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: 6 code:0x0036 */
+static GUI_CONST_STORAGE unsigned char ac0036[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ___XXX__,________,
+ __XX_XX_,________,
+ _XX_____,________,
+ _XXXXXX_,________,
+ _XXX__XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ __XX__XX,________,
+ ___XXXX_,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: 7 code:0x0037 */
+static GUI_CONST_STORAGE unsigned char ac0037[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ _XXXXXXX,________,
+ _XX___XX,________,
+ _____XX_,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: 8 code:0x0038 */
+static GUI_CONST_STORAGE unsigned char ac0038[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ __XXXXX_,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ __XXXXX_,________,
+ __XX_XX_,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ __XXXXX_,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: 9 code:0x0039 */
+static GUI_CONST_STORAGE unsigned char ac0039[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ __XXXX__,________,
+ _XX__XX_,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX__XXX,________,
+ __XXXXXX,________,
+ ______XX,________,
+ ______XX,________,
+ __XX_XX_,________,
+ ___XXX__,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: : code:0x003A */
+static GUI_CONST_STORAGE unsigned char ac003A[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ___XXX__,________,
+ ___XXX__,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ___XXX__,________,
+ ___XXX__,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: ; code:0x003B */
+static GUI_CONST_STORAGE unsigned char ac003B[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ___XX___,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ________,________
+};
+
+/* char: < code:0x003C */
+static GUI_CONST_STORAGE unsigned char ac003C[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ _____XX_,________,
+ ____XX__,________,
+ ___XX___,________,
+ __XX____,________,
+ _XX_____,________,
+ _XX_____,________,
+ __XX____,________,
+ ___XX___,________,
+ ____XX__,________,
+ _____XX_,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: = code:0x003D */
+static GUI_CONST_STORAGE unsigned char ac003D[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXXX,________,
+ ________,________,
+ ________,________,
+ XXXXXXXX,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: > code:0x003E */
+static GUI_CONST_STORAGE unsigned char ac003E[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ __XX____,________,
+ ___XX___,________,
+ ____XX__,________,
+ _____XX_,________,
+ ______XX,________,
+ ______XX,________,
+ _____XX_,________,
+ ____XX__,________,
+ ___XX___,________,
+ __XX____,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: ? code:0x003F */
+static GUI_CONST_STORAGE unsigned char ac003F[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ __XXXXX_,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _____XX_,________,
+ ____XX__,________,
+ ____XX__,________,
+ ________,________,
+ ___XXX__,________,
+ ___XXX__,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: @ code:0x0040 */
+static GUI_CONST_STORAGE unsigned char ac0040[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ __XXXX__,________,
+ _XX__XX_,________,
+ XX_XXXXX,________,
+ XXXXXXXX,________,
+ XXXXXXXX,________,
+ XXXXXXXX,________,
+ XXXXXXXX,________,
+ XX_XXXX_,________,
+ _XX___XX,________,
+ __XXXXX_,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: A code:0x0041 */
+static GUI_CONST_STORAGE unsigned char ac0041[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ___XX___,________,
+ ___XX___,________,
+ __XXXX__,________,
+ __XXXX__,________,
+ __XXXX__,________,
+ __XXXX__,________,
+ _XXXXXX_,________,
+ _XX__XX_,________,
+ _XX__XX_,________,
+ XXXXXXXX,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: B code:0x0042 */
+static GUI_CONST_STORAGE unsigned char ac0042[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXX_,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX__XX_,________,
+ _XXXXX__,________,
+ _XX__XX_,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ XXXXXXX_,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: C code:0x0043 */
+static GUI_CONST_STORAGE unsigned char ac0043[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ __XXXXXX,________,
+ _XX___XX,________,
+ XX____XX,________,
+ XX______,________,
+ XX______,________,
+ XX______,________,
+ XX______,________,
+ XX____XX,________,
+ _XX__XX_,________,
+ __XXXX__,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: D code:0x0044 */
+static GUI_CONST_STORAGE unsigned char ac0044[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXX__,________,
+ _XX__XX_,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX__XX_,________,
+ XXXXXX__,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: E code:0x0045 */
+static GUI_CONST_STORAGE unsigned char ac0045[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXX_,________,
+ _XX___XX,________,
+ _XX_XX__,________,
+ _XX_XX__,________,
+ _XXXXX__,________,
+ _XX_XX__,________,
+ _XX_XX__,________,
+ _XX_____,________,
+ _XX___XX,________,
+ XXXXXXX_,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: F code:0x0046 */
+static GUI_CONST_STORAGE unsigned char ac0046[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXX_,________,
+ _XX___XX,________,
+ _XX_XX__,________,
+ _XX_XX__,________,
+ _XXXXX__,________,
+ _XX_XX__,________,
+ _XX_XX__,________,
+ _XX_____,________,
+ _XX_____,________,
+ XXXX____,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: G code:0x0047 */
+static GUI_CONST_STORAGE unsigned char ac0047[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ __XXXXX_,________,
+ _XX__XX_,________,
+ XX___XX_,________,
+ XX______,________,
+ XX______,________,
+ XX______,________,
+ XX__XXXX,________,
+ XX___XX_,________,
+ _XX__XX_,________,
+ __XXXX__,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: H code:0x0048 */
+static GUI_CONST_STORAGE unsigned char ac0048[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXXX,________,
+ _XX__XX_,________,
+ _XX__XX_,________,
+ _XX__XX_,________,
+ _XXXXXX_,________,
+ _XX__XX_,________,
+ _XX__XX_,________,
+ _XX__XX_,________,
+ _XX__XX_,________,
+ XXXXXXXX,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: I code:0x0049 */
+static GUI_CONST_STORAGE unsigned char ac0049[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ _XXXXXX_,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ _XXXXXX_,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: J code:0x004A */
+static GUI_CONST_STORAGE unsigned char ac004A[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ __XXXXXX,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ XX__XX__,________,
+ XXXXX___,________,
+ ________,________
+};
+
+/* char: K code:0x004B */
+static GUI_CONST_STORAGE unsigned char ac004B[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXXX,________,
+ _XX__XX_,________,
+ _XX_XX__,________,
+ _XXXX___,________,
+ _XXXX___,________,
+ _XXXX___,________,
+ _XX_XX__,________,
+ _XX_XX__,________,
+ _XX__XX_,________,
+ XXXXXXXX,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: L code:0x004C */
+static GUI_CONST_STORAGE unsigned char ac004C[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXX____,________,
+ _XX_____,________,
+ _XX_____,________,
+ _XX_____,________,
+ _XX_____,________,
+ _XX_____,________,
+ _XX_____,________,
+ _XX_____,________,
+ _XX___XX,________,
+ XXXXXXXX,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: M code:0x004D */
+static GUI_CONST_STORAGE unsigned char ac004D[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXXX,________,
+ _XXXXXX_,________,
+ _XXXXXX_,________,
+ _XXXXXX_,________,
+ _XXXXXX_,________,
+ _XXXXXX_,________,
+ _XXXXXX_,________,
+ _XXXXXX_,________,
+ _XXXXXX_,________,
+ XXXXXXXX,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: N code:0x004E */
+static GUI_CONST_STORAGE unsigned char ac004E[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXXX,________,
+ _XXX_XX_,________,
+ _XXX_XX_,________,
+ _XXXXXX_,________,
+ _XXXXXX_,________,
+ _XXXXXX_,________,
+ _XX_XXX_,________,
+ _XX_XXX_,________,
+ _XX_XXX_,________,
+ XXXX_XX_,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: O code:0x004F */
+static GUI_CONST_STORAGE unsigned char ac004F[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ __XXXX__,________,
+ _XX__XX_,________,
+ XX____XX,________,
+ XX____XX,________,
+ XX____XX,________,
+ XX____XX,________,
+ XX____XX,________,
+ XX____XX,________,
+ _XX__XX_,________,
+ __XXXX__,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: P code:0x0050 */
+static GUI_CONST_STORAGE unsigned char ac0050[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXX_,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XXXXXX_,________,
+ _XX_____,________,
+ _XX_____,________,
+ _XX_____,________,
+ _XX_____,________,
+ XXXX____,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: Q code:0x0051 */
+static GUI_CONST_STORAGE unsigned char ac0051[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ __XXXX__,________,
+ _XX__XX_,________,
+ XX____XX,________,
+ XX____XX,________,
+ XX____XX,________,
+ XX____XX,________,
+ XX____XX,________,
+ XXXXX_XX,________,
+ _XX_XXX_,________,
+ __XXXX__,________,
+ _____XXX,________,
+ ________,________,
+ ________,________
+};
+
+/* char: R code:0x0052 */
+static GUI_CONST_STORAGE unsigned char ac0052[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXX__,________,
+ _XX__XX_,________,
+ _XX__XX_,________,
+ _XX__XX_,________,
+ _XXXXX__,________,
+ _XXXX___,________,
+ _XX_XX__,________,
+ _XX_XX__,________,
+ _XX__XX_,________,
+ XXXX_XXX,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: S code:0x0053 */
+static GUI_CONST_STORAGE unsigned char ac0053[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ __XXXXXX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX_____,________,
+ __XXX___,________,
+ ____XXX_,________,
+ ______XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XXXXXX_,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: T code:0x0054 */
+static GUI_CONST_STORAGE unsigned char ac0054[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXXX,________,
+ XX_XX_XX,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ __XXXX__,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: U code:0x0055 */
+static GUI_CONST_STORAGE unsigned char ac0055[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXXX,________,
+ _XX__XX_,________,
+ _XX__XX_,________,
+ _XX__XX_,________,
+ _XX__XX_,________,
+ _XX__XX_,________,
+ _XX__XX_,________,
+ _XX__XX_,________,
+ _XX__XX_,________,
+ __XXXX__,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: V code:0x0056 */
+static GUI_CONST_STORAGE unsigned char ac0056[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXXX,________,
+ _XX__XX_,________,
+ _XX__XX_,________,
+ _XX__XX_,________,
+ __XXXX__,________,
+ __XXXX__,________,
+ __XXXX__,________,
+ __XXXX__,________,
+ ___XX___,________,
+ ___XX___,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: W code:0x0057 */
+static GUI_CONST_STORAGE unsigned char ac0057[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXXX,________,
+ _XXXXXX_,________,
+ _XXXXXX_,________,
+ _XXXXXX_,________,
+ _XXXXXX_,________,
+ _XXXXXX_,________,
+ __XXXX__,________,
+ __XXXX__,________,
+ __XXXX__,________,
+ __XXXX__,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: X code:0x0058 */
+static GUI_CONST_STORAGE unsigned char ac0058[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXXX,________,
+ _XX__XX_,________,
+ __XXXX__,________,
+ __XXXX__,________,
+ ___XX___,________,
+ ___XX___,________,
+ __XXXX__,________,
+ __XXXX__,________,
+ _XX__XX_,________,
+ XXXXXXXX,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: Y code:0x0059 */
+static GUI_CONST_STORAGE unsigned char ac0059[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXXX,________,
+ _XX__XX_,________,
+ _XX__XX_,________,
+ __XXXX__,________,
+ __XXXX__,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ __XXXX__,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: Z code:0x005A */
+static GUI_CONST_STORAGE unsigned char ac005A[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ __XXXXXX,________,
+ _XX__XX_,________,
+ _____XX_,________,
+ ____XX__,________,
+ ____XX__,________,
+ ___XX___,________,
+ ___XX___,________,
+ __XX____,________,
+ __XX__XX,________,
+ _XXXXXXX,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: [ code:0x005B */
+static GUI_CONST_STORAGE unsigned char ac005B[32] = {
+ ________,________,
+ ___XXXX_,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XXXX_,________,
+ ________,________,
+ ________,________
+};
+
+/* char: \ code:0x005C */
+static GUI_CONST_STORAGE unsigned char ac005C[32] = {
+ ________,________,
+ ________,________,
+ _XX_____,________,
+ _XX_____,________,
+ __XX____,________,
+ __XX____,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ____XX__,________,
+ ____XX__,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ ______XX,________,
+ ________,________
+};
+
+/* char: ] code:0x005D */
+static GUI_CONST_STORAGE unsigned char ac005D[32] = {
+ ________,________,
+ _XXXXX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ _XXXXX__,________,
+ ________,________,
+ ________,________
+};
+
+/* char: ^ code:0x005E */
+static GUI_CONST_STORAGE unsigned char ac005E[32] = {
+ ________,________,
+ ___XXX__,________,
+ __XX_XX_,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: _ code:0x005F */
+static GUI_CONST_STORAGE unsigned char ac005F[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXXX,________,
+ ________,________
+};
+
+/* char: ` code:0x0060 */
+static GUI_CONST_STORAGE unsigned char ac0060[32] = {
+ _XXX____,________,
+ ___XX___,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: a code:0x0061 */
+static GUI_CONST_STORAGE unsigned char ac0061[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ __XXXX__,________,
+ _XX__XX_,________,
+ ____XXX_,________,
+ __XXXXX_,________,
+ _XX__XX_,________,
+ _XX_XXX_,________,
+ __XXXXXX,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: b code:0x0062 */
+static GUI_CONST_STORAGE unsigned char ac0062[32] = {
+ ________,________,
+ ________,________,
+ XXX_____,________,
+ _XX_____,________,
+ _XX_____,________,
+ _XX_____,________,
+ _XXXXXX_,________,
+ _XXX__XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XXXXXX_,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: c code:0x0063 */
+static GUI_CONST_STORAGE unsigned char ac0063[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ___XXXX_,________,
+ __XX__XX,________,
+ _XX_____,________,
+ _XX_____,________,
+ _XX_____,________,
+ __XX__XX,________,
+ ___XXXX_,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: d code:0x0064 */
+static GUI_CONST_STORAGE unsigned char ac0064[32] = {
+ ________,________,
+ ________,________,
+ _____XXX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ __XXXXXX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX__XXX,________,
+ __XXXXXX,X_______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: e code:0x0065 */
+static GUI_CONST_STORAGE unsigned char ac0065[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ __XXXXX_,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XXXXXXX,________,
+ _XX_____,________,
+ _XX___XX,________,
+ __XXXXX_,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: f code:0x0066 */
+static GUI_CONST_STORAGE unsigned char ac0066[32] = {
+ ________,________,
+ ________,________,
+ ____XXX_,________,
+ ___XX_XX,________,
+ ___XX___,________,
+ ___XX___,________,
+ _XXXXXX_,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ _XXXXXX_,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: g code:0x0067 */
+static GUI_CONST_STORAGE unsigned char ac0067[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ __XXXXXX,________,
+ _XX__XX_,________,
+ _XX__XX_,________,
+ __XXXX__,________,
+ _XX_____,________,
+ __XXXXX_,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ __XXXXX_,________,
+ ________,________
+};
+
+/* char: h code:0x0068 */
+static GUI_CONST_STORAGE unsigned char ac0068[32] = {
+ ________,________,
+ ________,________,
+ XXX_____,________,
+ _XX_____,________,
+ _XX_____,________,
+ _XX_____,________,
+ _XXXXXX_,________,
+ _XXX__XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ XXXX_XXX,X_______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: i code:0x0069 */
+static GUI_CONST_STORAGE unsigned char ac0069[32] = {
+ ________,________,
+ ________,________,
+ __XXX___,________,
+ __XXX___,________,
+ ________,________,
+ ________,________,
+ _XXXX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ _XXXXXX_,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: j code:0x006A */
+static GUI_CONST_STORAGE unsigned char ac006A[32] = {
+ ________,________,
+ ________,________,
+ ____XXX_,________,
+ ____XXX_,________,
+ ________,________,
+ ________,________,
+ ___XXXX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _XX__XX_,________,
+ _XXXXX__,________,
+ ________,________
+};
+
+/* char: k code:0x006B */
+static GUI_CONST_STORAGE unsigned char ac006B[32] = {
+ ________,________,
+ ________,________,
+ XXX_____,________,
+ _XX_____,________,
+ _XX_____,________,
+ _XX_____,________,
+ _XX_XXXX,________,
+ _XX_XX__,________,
+ _XXXX___,________,
+ _XXXXX__,________,
+ _XX_XX__,________,
+ _XX__XX_,________,
+ XXXXXXXX,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: l code:0x006C */
+static GUI_CONST_STORAGE unsigned char ac006C[32] = {
+ ________,________,
+ ________,________,
+ _XXXX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ _XXXXXX_,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: m code:0x006D */
+static GUI_CONST_STORAGE unsigned char ac006D[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXX__,________,
+ _XXXXXX_,________,
+ _XXXXXX_,________,
+ _XXXXXX_,________,
+ _XXXXXX_,________,
+ _XXXXXX_,________,
+ XXXXXXXX,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: n code:0x006E */
+static GUI_CONST_STORAGE unsigned char ac006E[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXX_,________,
+ _XXX__XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ XXXX_XXX,X_______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: o code:0x006F */
+static GUI_CONST_STORAGE unsigned char ac006F[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ___XXX__,________,
+ __XX_XX_,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ __XX_XX_,________,
+ ___XXX__,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: p code:0x0070 */
+static GUI_CONST_STORAGE unsigned char ac0070[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXX_,________,
+ _XXX__XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XXX__XX,________,
+ _XXXXXX_,________,
+ _XX_____,________,
+ XXXX____,________,
+ ________,________
+};
+
+/* char: q code:0x0071 */
+static GUI_CONST_STORAGE unsigned char ac0071[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ __XXXXXX,________,
+ _XX__XXX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX__XXX,________,
+ __XXXXXX,________,
+ ______XX,________,
+ _____XXX,X_______,
+ ________,________
+};
+
+/* char: r code:0x0072 */
+static GUI_CONST_STORAGE unsigned char ac0072[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXXX,________,
+ __XXX_XX,________,
+ __XX____,________,
+ __XX____,________,
+ __XX____,________,
+ __XX____,________,
+ XXXXXX__,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: s code:0x0073 */
+static GUI_CONST_STORAGE unsigned char ac0073[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ __XXXXX_,________,
+ _XX__XX_,________,
+ _XX_____,________,
+ __XXXX__,________,
+ _____XX_,________,
+ _XX__XX_,________,
+ _XXXXX__,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: t code:0x0074 */
+static GUI_CONST_STORAGE unsigned char ac0074[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ___XX___,________,
+ ___XX___,________,
+ _XXXXXX_,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX_XX,________,
+ ____XXX_,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: u code:0x0075 */
+static GUI_CONST_STORAGE unsigned char ac0075[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ XXX__XXX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX___XX,________,
+ _XX__XXX,________,
+ __XXXXXX,X_______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: v code:0x0076 */
+static GUI_CONST_STORAGE unsigned char ac0076[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXXX,________,
+ _XX__XX_,________,
+ _XX__XX_,________,
+ __XXXX__,________,
+ __XXXX__,________,
+ ___XX___,________,
+ ___XX___,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: w code:0x0077 */
+static GUI_CONST_STORAGE unsigned char ac0077[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXXX,________,
+ _XXXXXX_,________,
+ _XXXXXX_,________,
+ _XXXXXX_,________,
+ __XXXX__,________,
+ __XXXX__,________,
+ __XXXX__,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: x code:0x0078 */
+static GUI_CONST_STORAGE unsigned char ac0078[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _XXXXXXX,________,
+ __XX_XX_,________,
+ ___XXX__,________,
+ ___XXX__,________,
+ ___XXX__,________,
+ __XX_XX_,________,
+ _XXXXXXX,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: y code:0x0079 */
+static GUI_CONST_STORAGE unsigned char ac0079[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXX_XXX,X_______,
+ _XX___XX,________,
+ __XX_XX_,________,
+ __XX_XX_,________,
+ ___XXX__,________,
+ ___XXX__,________,
+ ___XX___,________,
+ ___XX___,________,
+ _XXX____,________,
+ ________,________
+};
+
+/* char: z code:0x007A */
+static GUI_CONST_STORAGE unsigned char ac007A[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _XXXXXXX,________,
+ _XX__XX_,________,
+ ____XX__,________,
+ ___XX___,________,
+ ___XX___,________,
+ __XX__XX,________,
+ _XXXXXXX,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: { code:0x007B */
+static GUI_CONST_STORAGE unsigned char ac007B[32] = {
+ ________,________,
+ _____XXX,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ ____XX__,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XXX,________,
+ ________,________,
+ ________,________
+};
+
+/* char: | code:0x007C */
+static GUI_CONST_STORAGE unsigned char ac007C[32] = {
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ________,________
+};
+
+/* char: } code:0x007D */
+static GUI_CONST_STORAGE unsigned char ac007D[32] = {
+ ________,________,
+ _XXX____,________,
+ __XX____,________,
+ __XX____,________,
+ __XX____,________,
+ __XX____,________,
+ __XX____,________,
+ ___XX___,________,
+ __XX____,________,
+ __XX____,________,
+ __XX____,________,
+ __XX____,________,
+ __XX____,________,
+ _XXX____,________,
+ ________,________,
+ ________,________
+};
+
+/* char: ~ code:0x007E */
+static GUI_CONST_STORAGE unsigned char ac007E[32] = {
+ __XX____,________,
+ _XXXXXXX,________,
+ _____XX_,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: code:0x007F */
+static GUI_CONST_STORAGE unsigned char ac007F[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: ~ code:0xA1AB */
+static GUI_CONST_STORAGE unsigned char acA1AB[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ___XXXX_,_____XX_,
+ __XX__XX,XX__XX__,
+ _XX_____,_XXXX___,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+};
+
+/* char: × code:0xA1C1 */
+static GUI_CONST_STORAGE unsigned char acA1C1[32] = {
+ ________,________,
+ ________,________,
+ ___XX___,___XX___,
+ ____XX__,__XX____,
+ _____XX_,_XX_____,
+ ______XX,XX______,
+ _______X,X_______,
+ ______XX,XX______,
+ _____XX_,_XX_____,
+ ____XX__,__XX____,
+ ___XX___,___XX___,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+};
+
+/* char: √ code:0xA1CC */
+static GUI_CONST_STORAGE unsigned char acA1CC[32] = {
+ ________,_____XX_,
+ ________,_____XX_,
+ ________,____XX__,
+ ________,____XX__,
+ ________,___XX___,
+ ________,___XX___,
+ ________,__XX____,
+ ________,_XX_____,
+ ________,_XX_____,
+ ___XX___,XX______,
+ __XXXX_X,X_______,
+ _XX__XXX,X_______,
+ ______XX,________,
+ ________,________,
+ ________,________,
+ ________,________,
+};
+
+/* char: ° code:0xA1E3 */
+static GUI_CONST_STORAGE unsigned char acA1E3[32] = {
+ ________,________,
+ ____XXX_,________,
+ ___XX_XX,________,
+ ___XX_XX,________,
+ ____XXX_,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+};
+
+/* char: ℃ code:0xA1E6 */
+static GUI_CONST_STORAGE unsigned char acA1E6[32] = {
+ __XXX___,________,
+ _XX_XX__,________,
+ _XX_XXXX,XXXXXXX_,
+ __XXXXX_,____XXX_,
+ ____XX__,_____XX_,
+ ____XX__,_____XX_,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,_____XX_,
+ _____XX_,____XX__,
+ ______XX,XXXXX___,
+ ________,________,
+ ________,________,
+ ________,________,
+};
+
+/* char: ○ code:0xA1F0 */
+static GUI_CONST_STORAGE unsigned char acA1F0[32] = {
+ ________,________,
+ ______XX,XXX_____,
+ ____XXX_,__XXX___,
+ ___XX___,____XX__,
+ ___XX___,____XX__,
+ __XX____,_____XX_,
+ __XX____,_____XX_,
+ __XX____,_____XX_,
+ __XX____,_____XX_,
+ ___XX___,____XX__,
+ ___XX___,____XX__,
+ ____XXX_,__XXX___,
+ ______XX,XXX_____,
+ ________,________,
+ ________,________,
+ ________,________,
+};
+
+/* char: → code:0xA1FA */
+static GUI_CONST_STORAGE unsigned char acA1FA[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,_XX_____,
+ ________,_XXXX___,
+ _XXXXXXX,XXXXXXX_,
+ ________,_XXXX___,
+ ________,_XX_____,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+};
+
+/* char: ← code:0xA1FB */
+static GUI_CONST_STORAGE unsigned char acA1FB[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _____XX_,________,
+ ___XXXX_,________,
+ _XXXXXXX,XXXXXXX_,
+ ___XXXX_,________,
+ _____XX_,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+};
+
+/* char: ↑ code:0xA1FC */
+static GUI_CONST_STORAGE unsigned char acA1FC[32] = {
+ _______X,X_______,
+ _______X,X_______,
+ ______XX,XX______,
+ ______XX,XX______,
+ _____XXX,XXX_____,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ ________,________,
+ ________,________,
+};
+
+/* char: ↓ code:0xA1FD */
+static GUI_CONST_STORAGE unsigned char acA1FD[32] = {
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _____XXX,XXX_____,
+ ______XX,XX______,
+ ______XX,XX______,
+ _______X,X_______,
+ _______X,X_______,
+ ________,________,
+ ________,________,
+};
+
+/* char: ℉ code:0xA848 */
+static GUI_CONST_STORAGE unsigned char acA848[32] = {
+ ________,________,
+ __XXXXXX,XXXXXX__,
+ _XX_XXXX,____XX__,
+ _XX_XXXX,________,
+ __XXX_XX,________,
+ ______XX,__XX____,
+ ______XX,XXXX____,
+ ______XX,__XX____,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ _____XXX,X_______,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+};
+
+/* char: 安 code:0xB0B2 */
+static GUI_CONST_STORAGE unsigned char acB0B2[32] = {
+ ______XX,________,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ _XX_____,_____XX_,
+ _XX___XX,_____XX_,
+ ______XX,________,
+ _XXXXXXX,XXXXXXX_,
+ _____XX_,__XX____,
+ ____XX__,__XX____,
+ ___XXXXX,_XX_____,
+ _______X,XX______,
+ ______XX,_XXX____,
+ ____XXX_,___XX___,
+ _XXXX___,____XX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 按 code:0xB0B4 */
+static GUI_CONST_STORAGE unsigned char acB0B4[32] = {
+ ___XX___,_XX_____,
+ ___XX___,__XX____,
+ ___XX_XX,XXXXXXX_,
+ _XXXXXXX,_____XX_,
+ ___XX_XX,_XX__XX_,
+ ___XX___,_XX_____,
+ ___XX_XX,XXXXXXX_,
+ ___XXX__,XX__XX__,
+ _XXXX___,XX__XX__,
+ ___XX__X,XX_XX___,
+ ___XX___,_XXX____,
+ ___XX___,_XXXX___,
+ ___XX___,XX__XX__,
+ _XXXX_XX,X____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 版 code:0xB0E6 */
+static GUI_CONST_STORAGE unsigned char acB0E6[32] = {
+ _____XX_,________,
+ __XX_XX_,____XXX_,
+ __XX_XX_,XXXXX___,
+ __XX_XX_,XX______,
+ __XXXXXX,XX______,
+ __XX____,XXXXXX__,
+ __XX____,XXXXXX__,
+ __XXXXX_,XXXXXX__,
+ __XX_XX_,XXXXXX__,
+ __XX_XX_,XXXXXX__,
+ __XX_XX_,XX_XX___,
+ __XX_XX_,XX_XX___,
+ __XX_XXX,X_XXXX__,
+ _XX__XXX,_XX__XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 薄 code:0xB1A1 */
+static GUI_CONST_STORAGE unsigned char acB1A1[32] = {
+ _____XX_,_XX_____,
+ _XXXXXXX,XXXXXXX_,
+ _____XX_,_XXXX___,
+ ______XX,XXXXXXX_,
+ __XX____,_XX_____,
+ ___XX_XX,XXXXXX__,
+ ____XXXX,_XX_XX__,
+ _XX___XX,XXXXXX__,
+ __XX__XX,_XX_XX__,
+ ____XXXX,XXXXXX__,
+ ___XX_XX,_XX_XX__,
+ ___XXXXX,XXXXXXX_,
+ __XX___X,X__XX___,
+ __XX____,XXXXX___,
+ ________,________,
+ ________,________,
+};
+
+/* char: 保 code:0xB1A3 */
+static GUI_CONST_STORAGE unsigned char acB1A3[32] = {
+ ____XX__,________,
+ ____XXXX,XXXXXX__,
+ ____XXXX,____XX__,
+ ___XX_XX,____XX__,
+ ___XX_XX,XXXXXX__,
+ __XXX___,_XX_____,
+ _XXXX___,_XX_____,
+ ___XXXXX,XXXXXXX_,
+ ___XX___,XXXX____,
+ ___XX__X,XXXXX___,
+ ___XX__X,XXXXX___,
+ ___XX_XX,_XX_XX__,
+ ___XXXX_,_XX__XX_,
+ ___XX___,_XX_____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 饱 code:0xB1A5 */
+static GUI_CONST_STORAGE unsigned char acB1A5[32] = {
+ ___XX___,XX______,
+ ___XX___,XX______,
+ ___XXXXX,XXXXXX__,
+ __XX_XXX,X___XX__,
+ __XXXXXX,____XX__,
+ _XX__XXX,XXXXXX__,
+ ___XX__X,X_XXXX__,
+ ___XX__X,X_XXXX__,
+ ___XX__X,XXXXXX__,
+ ___XX__X,X___XX__,
+ ___XX__X,X_XXX___,
+ ___XXXXX,X____XX_,
+ ___XXX_X,X____XX_,
+ ___XX___,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 报 code:0xB1A8 */
+static GUI_CONST_STORAGE unsigned char acB1A8[32] = {
+ ___XX___,________,
+ ___XX__X,XXXXXX__,
+ ___XX__X,X___XX__,
+ _XXXXXXX,X___XX__,
+ ___XX__X,X_XXXX__,
+ ___XX__X,X_______,
+ ___XXXXX,XXXXXX__,
+ ___XXX_X,XXX_XX__,
+ _XXXX__X,XXX_XX__,
+ ___XX__X,XXXXX___,
+ ___XX__X,X_XX____,
+ ___XX__X,XXXXX___,
+ ___XX__X,XX__XX__,
+ _XXXX__X,X____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 备 code:0xB1B8 */
+static GUI_CONST_STORAGE unsigned char acB1B8[32] = {
+ _____XX_,________,
+ ____XXXX,XXXXX___,
+ ___XXX__,__XX____,
+ __XX_XX_,_XX_____,
+ ______XX,XX______,
+ ____XXX_,_XXX____,
+ _XXXX___,___XXXX_,
+ ___XXXXX,XXXXX___,
+ ___XX__X,X__XX___,
+ ___XX__X,X__XX___,
+ ___XXXXX,XXXXX___,
+ ___XX__X,X__XX___,
+ ___XX__X,X__XX___,
+ ___XXXXX,XXXXX___,
+ ________,________,
+ ________,________,
+};
+
+/* char: 本 code:0xB1BE */
+static GUI_CONST_STORAGE unsigned char acB1BE[32] = {
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ ______XX,XX______,
+ _____XXX,XXX_____,
+ _____XXX,XXX_____,
+ ____XX_X,X_XX____,
+ ___XX__X,X__XX___,
+ __XX___X,X___XX__,
+ _XX_XXXX,XXXX_XX_,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ ________,________,
+ ________,________,
+};
+
+/* char: 比 code:0xB1C8 */
+static GUI_CONST_STORAGE unsigned char acB1C8[32] = {
+ ________,XX______,
+ __XX____,XX______,
+ __XX____,XX______,
+ __XX____,XX__XX__,
+ __XX____,XX_XX___,
+ __XXXXXX,XXXX____,
+ __XX____,XXX_____,
+ __XX____,XX______,
+ __XX____,XX______,
+ __XX____,XX______,
+ __XX_XX_,XX______,
+ __XXXX__,XX___XX_,
+ __XXX___,XX___XX_,
+ __XX____,_XXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 闭 code:0xB1D5 */
+static GUI_CONST_STORAGE unsigned char acB1D5[32] = {
+ __XX____,________,
+ ___XXXXX,XXXXXXX_,
+ ________,_____XX_,
+ __XX____,_XX__XX_,
+ __XX____,_XX__XX_,
+ __XXXXXX,XXXXXXX_,
+ __XX____,XXX__XX_,
+ __XX___X,XXX__XX_,
+ __XX__XX,_XX__XX_,
+ __XX_XX_,_XX__XX_,
+ __XXXX__,_XX__XX_,
+ __XX___X,XXX__XX_,
+ __XX____,_____XX_,
+ __XX____,___XXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 编 code:0xB1E0 */
+static GUI_CONST_STORAGE unsigned char acB1E0[32] = {
+ ___XX___,_XX_____,
+ ___XX___,__XX____,
+ __XX_XXX,XXXXXXX_,
+ __XX_XXX,X____XX_,
+ _XXXXX_X,X____XX_,
+ ____XX_X,XXXXXXX_,
+ ___XX__X,X_______,
+ __XX___X,XXXXXXX_,
+ _XXXXXXX,XXXXXXX_,
+ ______XX,XXXXXXX_,
+ _______X,XXXXXXX_,
+ ____XXXX,XXXXXXX_,
+ _XXXX__X,XXXXXXX_,
+ _______X,X___XXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 变 code:0xB1E4 */
+static GUI_CONST_STORAGE unsigned char acB1E4[32] = {
+ ______XX,________,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ _____XX_,_XX_____,
+ ___XXXX_,_XXXX___,
+ ___XXXX_,_XX_XX__,
+ __XX_XX_,_XX__XX_,
+ _XX_____,_____XX_,
+ ___XXXXX,XXXXX___,
+ ____XX__,__XX____,
+ _____XX_,_XX_____,
+ ______XX,XX______,
+ ____XXX_,_XXX____,
+ _XXXX___,___XXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 表 code:0xB1ED */
+static GUI_CONST_STORAGE unsigned char acB1ED[32] = {
+ _______X,X_______,
+ _______X,X_______,
+ __XXXXXX,XXXXXX__,
+ _______X,X_______,
+ ___XXXXX,XXXXX___,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ ______XX,XX______,
+ _____XX_,XX__XX__,
+ ____XXX_,_XXXX___,
+ ___XXXX_,__XX____,
+ _XXX_XXX,X__XX___,
+ _____XXX,____XXX_,
+ _____XX_,________,
+ ________,________,
+ ________,________,
+};
+
+/* char: 不 code:0xB2BB */
+static GUI_CONST_STORAGE unsigned char acB2BB[32] = {
+ ________,________,
+ _XXXXXXX,XXXXXXX_,
+ ________,XX______,
+ ________,XX______,
+ _______X,X_______,
+ ______XX,X_______,
+ _____XXX,X_XX____,
+ ____XX_X,X__XX___,
+ ___XX__X,X___XX__,
+ __XX___X,X____XX_,
+ _XX____X,X____XX_,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ ________,________,
+ ________,________,
+};
+
+/* char: 擦 code:0xB2C1 */
+static GUI_CONST_STORAGE unsigned char acB2C1[32] = {
+ ___XX___,_XX_____,
+ ___XX_XX,XXXXXXX_,
+ ___XX_XX,_____XX_,
+ _XXXXX_X,X__XX___,
+ ___XX__X,XXXXXXX_,
+ ___XX_XX,_XXXXXX_,
+ ___XX__X,XXXXXXX_,
+ ___XXXXX,XX__XX__,
+ _XXXX__X,XXXXXXX_,
+ ___XX_XX,________,
+ ___XX_XX,XXXXXXX_,
+ ___XX__X,X_XXXX__,
+ ___XX__X,X_XX_XX_,
+ _XXXX_XX,_XXX_XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 参 code:0xB2CE */
+static GUI_CONST_STORAGE unsigned char acB2CE[32] = {
+ _____XX_,________,
+ ____XX__,__XX____,
+ ___XXXXX,XXXXX___,
+ ______XX,___XX___,
+ _XXXXXXX,XXXXXXX_,
+ ____XX__,__XX____,
+ ___XX___,XX_XX___,
+ _XXX__XX,X___XXX_,
+ ___XXXX_,_XX_____,
+ ________,XX______,
+ _____XXX,X__XX___,
+ __XXXX__,_XXX____,
+ ______XX,XX______,
+ _XXXXXX_,________,
+ ________,________,
+ ________,________,
+};
+
+/* char: 操 code:0xB2D9 */
+static GUI_CONST_STORAGE unsigned char acB2D9[32] = {
+ ___XX__X,XXXXX___,
+ ___XX__X,X__XX___,
+ ___XX__X,XXXXX___,
+ _XXXXX__,________,
+ ___XX_XX,XXXXXX__,
+ ___XX_XX,XXXXXX__,
+ ___XX_XX,XXXXXX__,
+ ___XXX__,________,
+ _XXXX___,_XX_____,
+ ___XXXXX,XXXXXXX_,
+ ___XX___,XXXX____,
+ ___XX__X,XXXXX___,
+ ___XXXXX,_XX_XXX_,
+ _XXXX___,_XX_____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 测 code:0xB2E2 */
+static GUI_CONST_STORAGE unsigned char acB2E2[32] = {
+ ________,_____XX_,
+ __XX_XXX,XXX__XX_,
+ ___XXXX_,_XX__XX_,
+ _____XXX,XXXXXXX_,
+ _XX__XXX,XXXXXXX_,
+ __XX_XXX,XXXXXXX_,
+ _____XXX,XXXXXXX_,
+ ___XXXXX,XXXXXXX_,
+ ___XXXXX,XXXXXXX_,
+ __XX___X,X__XXXX_,
+ __XX__XX,XX___XX_,
+ _XX___XX,_XX__XX_,
+ _XX__XX_,_XX__XX_,
+ ____XX__,___XXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 差 code:0xB2EE */
+static GUI_CONST_STORAGE unsigned char acB2EE[32] = {
+ ____XX__,__XX____,
+ _____XX_,_XX_____,
+ __XXXXXX,XXXXXX__,
+ _______X,X_______,
+ ___XXXXX,XXXXX___,
+ ______XX,________,
+ _XXXXXXX,XXXXXXX_,
+ _____XX_,________,
+ ____XX__,________,
+ ___XXXXX,XXXXX___,
+ __XX____,XX______,
+ _XX_____,XX______,
+ ________,XX______,
+ ___XXXXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 常 code:0xB3A3 */
+static GUI_CONST_STORAGE unsigned char acB3A3[32] = {
+ _______X,X_______,
+ ___XX__X,X__XX___,
+ ____XX_X,X_XX____,
+ _XXXXXXX,XXXXXXX_,
+ _XX_____,_____XX_,
+ ____XXXX,XXXX____,
+ ____XX__,__XX____,
+ ____XXXX,XXXX____,
+ _______X,X_______,
+ __XXXXXX,XXXXXX__,
+ __XX___X,X___XX__,
+ __XX___X,X___XX__,
+ __XX___X,X_XXXX__,
+ _______X,X_______,
+ ________,________,
+ ________,________,
+};
+
+/* char: 长 code:0xB3A4 */
+static GUI_CONST_STORAGE unsigned char acB3A4[32] = {
+ ____XX__,___XX___,
+ ____XX__,__XX____,
+ ____XX__,_XX_____,
+ ____XX__,XX______,
+ ____XX_X,X_______,
+ ____XX__,________,
+ _XXXXXXX,XXXXXXX_,
+ ____XX_X,X_______,
+ ____XX__,XX______,
+ ____XX__,_XX_____,
+ ____XX__,__XX____,
+ ____XXXX,___XX___,
+ ____XXX_,____XXX_,
+ ____XX__,________,
+ ________,________,
+ ________,________,
+};
+
+/* char: 厂 code:0xB3A7 */
+static GUI_CONST_STORAGE unsigned char acB3A7[32] = {
+ ________,________,
+ ___XXXXX,XXXXXXX_,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,________,
+ __XX____,________,
+ __XX____,________,
+ _XX_____,________,
+ ________,________,
+ ________,________,
+};
+
+/* char: 称 code:0xB3C6 */
+static GUI_CONST_STORAGE unsigned char acB3C6[32] = {
+ ________,XX______,
+ ____XXX_,XX______,
+ _XXXX___,XX______,
+ ___XX___,XXXXXXX_,
+ ___XX__X,X____XX_,
+ _XXXXXXX,____XX__,
+ ___XX___,__XX____,
+ ___XXX__,__XX____,
+ __XXXXXX,X_XXXX__,
+ __XXX__X,X_XX_XX_,
+ _XXXX_XX,__XX_XX_,
+ ___XX___,__XX____,
+ ___XX___,__XX____,
+ ___XX___,XXXX____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 成 code:0xB3C9 */
+static GUI_CONST_STORAGE unsigned char acB3C9[32] = {
+ ________,_XXXX___,
+ ________,_XX_XX__,
+ ________,_XX_____,
+ __XXXXXX,XXXXXXX_,
+ __XX____,_XX_____,
+ __XX____,_XX_XX__,
+ __XXXXXX,_XX_XX__,
+ __XX__XX,_XX_XX__,
+ __XX__XX,_XXXX___,
+ __XX__XX,_XXXX___,
+ __XX__XX,__XX_XX_,
+ __XXXXX_,_XXXXXX_,
+ __XX____,XX__XXX_,
+ _XX____X,X____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 程 code:0xB3CC */
+static GUI_CONST_STORAGE unsigned char acB3CC[32] = {
+ ________,________,
+ ____XXXX,XXXXXX__,
+ _XXXX__X,X___XX__,
+ ___XX__X,X___XX__,
+ ___XX__X,XXXXXX__,
+ _XXXXXX_,________,
+ ___XX___,________,
+ ___XXX_X,XXXXXX__,
+ __XXXXX_,_XX_____,
+ __XXX___,_XX_____,
+ _XXXX__X,XXXXXX__,
+ ___XX___,_XX_____,
+ ___XX___,_XX_____,
+ ___XX_XX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 出 code:0xB3F6 */
+static GUI_CONST_STORAGE unsigned char acB3F6[32] = {
+ _______X,X_______,
+ __XX___X,X___XX__,
+ __XX___X,X___XX__,
+ __XX___X,X___XX__,
+ __XX___X,X___XX__,
+ __XXXXXX,XXXXXX__,
+ _______X,X_______,
+ _______X,X_______,
+ _XX____X,X____XX_,
+ _XX____X,X____XX_,
+ _XX____X,X____XX_,
+ _XX____X,X____XX_,
+ _XXXXXXX,XXXXXXX_,
+ ________,_____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 储 code:0xB4A2 */
+static GUI_CONST_STORAGE unsigned char acB4A2[32] = {
+ ____XX__,__XX____,
+ ____XXX_,__XX_XX_,
+ ____XXXX,_XXXXXX_,
+ ___XX_XX,__XXXX__,
+ ___XX___,XXXXXXX_,
+ __XXXXXX,__XX____,
+ _XXXX_XX,_XXXXX__,
+ ___XX_XX,XXX_XX__,
+ ___XX_XX,XXX_XX__,
+ ___XX_XX,_XXXXX__,
+ ___XX_XX,_XX_XX__,
+ ___XX_XX,XXX_XX__,
+ ___XX_XX,_XXXXX__,
+ ___XX___,_XX_XX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 传 code:0xB4AB */
+static GUI_CONST_STORAGE unsigned char acB4AB[32] = {
+ ____XX__,_XX_____,
+ ____XX__,_XX_____,
+ ____XXXX,XXXXXX__,
+ ___XX___,_XX_____,
+ ___XX___,XX______,
+ __XXXXXX,XXXXXXX_,
+ _XXXX___,XX______,
+ ___XX__X,X_______,
+ ___XX_XX,XXXXXX__,
+ ___XX___,____XX__,
+ ___XX___,___XX___,
+ ___XX___,XXXX____,
+ ___XX___,_XX_____,
+ ___XX___,__XX____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 磁 code:0xB4C5 */
+static GUI_CONST_STORAGE unsigned char acB4C5[32] = {
+ _______X,X___XX__,
+ ________,XX_XX___,
+ _XXXXXXX,XXXXXXX_,
+ ___XX___,________,
+ ___XX__X,X___XX__,
+ __XX___X,X___XX__,
+ __XXXXXX,___XX___,
+ _XXXXXXX,XX_XXXX_,
+ __XXXXXX,XXXXXXX_,
+ __XXXX_X,X___XX__,
+ __XXXX_X,X___XX__,
+ __XXXXXX,XX_XXXX_,
+ __XXXXXX,XXXXXXX_,
+ ________,XX___XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 次 code:0xB4CE */
+static GUI_CONST_STORAGE unsigned char acB4CE[32] = {
+ _______X,X_______,
+ __XX___X,X_______,
+ ___XX__X,X_______,
+ ___XX__X,XXXXXXX_,
+ ______XX,_____XX_,
+ ______XX,____XX__,
+ _____XX_,_XX_____,
+ ___XX___,_XX_____,
+ ___XX___,_XX_____,
+ __XX____,XXXX____,
+ __XX____,XXXX____,
+ _XX____X,X__XX___,
+ _XX___XX,____XX__,
+ _____XX_,_____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 存 code:0xB4E6 */
+static GUI_CONST_STORAGE unsigned char acB4E6[32] = {
+ ______XX,________,
+ ______XX,________,
+ _XXXXXXX,XXXXXXX_,
+ _____XX_,________,
+ ____XX__,________,
+ ____XX_X,XXXXXX__,
+ ___XXX__,___XX___,
+ __XXXX__,__XX____,
+ _XX_XX__,__XX____,
+ ____XXXX,XXXXXXX_,
+ ____XX__,__XX____,
+ ____XX__,__XX____,
+ ____XX__,__XX____,
+ ____XX__,XXXX____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 大 code:0xB4F3 */
+static GUI_CONST_STORAGE unsigned char acB4F3[32] = {
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ _______X,X_______,
+ ______XX,XX______,
+ ______XX,XX______,
+ ______XX,XX______,
+ _____XX_,_XX_____,
+ _____XX_,_XX_____,
+ ____XX__,__XX____,
+ ___XX___,___XX___,
+ _XXX____,____XXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 带 code:0xB4F8 */
+static GUI_CONST_STORAGE unsigned char acB4F8[32] = {
+ ____XX_X,X_XX____,
+ ____XX_X,X_XX____,
+ _XXXXXXX,XXXXXXX_,
+ ____XX_X,X_XX____,
+ ________,________,
+ _XXXXXXX,XXXXXXX_,
+ _XX____X,X____XX_,
+ _______X,X_______,
+ ___XXXXX,XXXXX___,
+ ___XX__X,X__XX___,
+ ___XX__X,X__XX___,
+ ___XX__X,X__XX___,
+ ___XX__X,XXXXX___,
+ _______X,X_______,
+ ________,________,
+ ________,________,
+};
+
+/* char: 待 code:0xB4FD */
+static GUI_CONST_STORAGE unsigned char acB4FD[32] = {
+ ____XX__,_XX_____,
+ ___XX___,_XX_____,
+ __XX__XX,XXXXXX__,
+ _XX_XX__,_XX_____,
+ ____XX__,_XX_____,
+ ___XXXXX,XXXXXXX_,
+ __XXX___,___XX___,
+ _XXXX___,___XX___,
+ ___XXXXX,XXXXXXX_,
+ ___XX___,___XX___,
+ ___XX_XX,___XX___,
+ ___XX__X,X__XX___,
+ ___XX___,___XX___,
+ ___XX___,_XXXX___,
+ ________,________,
+ ________,________,
+};
+
+/* char: 单 code:0xB5A5 */
+static GUI_CONST_STORAGE unsigned char acB5A5[32] = {
+ ____XX__,__XX____,
+ _____XX_,_XX_____,
+ ___XXXXX,XXXXX___,
+ ___XX__X,X__XX___,
+ ___XX__X,X__XX___,
+ ___XXXXX,XXXXX___,
+ ___XX__X,X__XX___,
+ ___XX__X,X__XX___,
+ ___XXXXX,XXXXX___,
+ _______X,X_______,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ _______X,X_______,
+ _______X,X_______,
+ ________,________,
+ ________,________,
+};
+
+/* char: 弹 code:0xB5AF */
+static GUI_CONST_STORAGE unsigned char acB5AF[32] = {
+ _______X,X__XX___,
+ _XXXXX__,XXXX____,
+ ____XXXX,XXXXXX__,
+ ____XXXX,_XX_XX__,
+ _XXXXXXX,_XX_XX__,
+ _XX___XX,XXXXXX__,
+ _XX___XX,_XX_XX__,
+ _XX___XX,_XX_XX__,
+ _XXXXXXX,XXXXXX__,
+ ____XX__,_XX_____,
+ ____XX__,_XX_____,
+ ____XXXX,XXXXXXX_,
+ ____XX__,_XX_____,
+ __XXX___,_XX_____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 当 code:0xB5B1 */
+static GUI_CONST_STORAGE unsigned char acB5B1[32] = {
+ _______X,X_______,
+ __XX___X,X___XX__,
+ ___XX__X,X__XX___,
+ ____XX_X,X_XX____,
+ _XXXXXXX,XXXXXX__,
+ ________,____XX__,
+ ________,____XX__,
+ ________,____XX__,
+ __XXXXXX,XXXXXX__,
+ ________,____XX__,
+ ________,____XX__,
+ ________,____XX__,
+ _XXXXXXX,XXXXXX__,
+ ________,____XX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 的 code:0xB5C4 */
+static GUI_CONST_STORAGE unsigned char acB5C4[32] = {
+ ____XX__,_XX_____,
+ ____XX__,_XX_____,
+ ___XX___,_XXXXXX_,
+ __XXXXXX,XX___XX_,
+ __XX__XX,X____XX_,
+ __XX__XX,_____XX_,
+ __XX__XX,_XX__XX_,
+ __XXXXXX,__XX_XX_,
+ __XX__XX,__XX_XX_,
+ __XX__XX,_____XX_,
+ __XX__XX,_____XX_,
+ __XX__XX,_____XX_,
+ __XXXXXX,_____XX_,
+ __XX__XX,___XXX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 低 code:0xB5CD */
+static GUI_CONST_STORAGE unsigned char acB5CD[32] = {
+ ____XX__,________,
+ ____XX__,__XXXX__,
+ ____XXXX,XXXX____,
+ ___XX_XX,__XX____,
+ ___XX_XX,__XX____,
+ __XXX_XX,__XX____,
+ _XXXX_XX,XXXXXXX_,
+ ___XX_XX,__XX____,
+ ___XX_XX,__XX____,
+ ___XX_XX,__XX____,
+ ___XX_XX,XX_XX___,
+ ___XX_XX,X__XXXX_,
+ ___XX_XX,_XX_XXX_,
+ ___XX___,__XX_XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 地 code:0xB5D8 */
+static GUI_CONST_STORAGE unsigned char acB5D8[32] = {
+ ___XX___,_XX_____,
+ ___XX___,_XX_____,
+ ___XX_XX,_XX_XX__,
+ ___XX_XX,_XXXXX__,
+ _XXXXXXX,XXXXXX__,
+ ___XXXXX,XXX_XX__,
+ ___XX_XX,_XX_XX__,
+ ___XX_XX,_XX_XX__,
+ ___XX_XX,_XX_XX__,
+ ___XX_XX,_XXXXX__,
+ ___XXXXX,_XX_____,
+ _XXX__XX,_____XX_,
+ ______XX,_____XX_,
+ _______X,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 点 code:0xB5E3 */
+static GUI_CONST_STORAGE unsigned char acB5E3[32] = {
+ ______XX,________,
+ ______XX,________,
+ ______XX,XXXXXX__,
+ ______XX,________,
+ ______XX,________,
+ ___XXXXX,XXXXX___,
+ ___XX___,___XX___,
+ ___XX___,___XX___,
+ ___XX___,___XX___,
+ ___XXXXX,XXXXX___,
+ ________,________,
+ __XX_XX_,XX__XX__,
+ __XX__XX,_XX__XX_,
+ _XX___XX,_XX__XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 电 code:0xB5E7 */
+static GUI_CONST_STORAGE unsigned char acB5E7[32] = {
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ __XXXXXX,XXXXXX__,
+ __XX___X,X___XX__,
+ __XX___X,X___XX__,
+ __XXXXXX,XXXXXX__,
+ __XX___X,X___XX__,
+ __XX___X,X___XX__,
+ __XXXXXX,XXXXXX__,
+ __XX___X,X_______,
+ _______X,X____XX_,
+ _______X,X____XX_,
+ ________,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 定 code:0xB6A8 */
+static GUI_CONST_STORAGE unsigned char acB6A8[32] = {
+ ______XX,________,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ _XX_____,_____XX_,
+ ________,________,
+ ___XXXXX,XXXXX___,
+ _______X,X_______,
+ _______X,X_______,
+ ___XX__X,X_______,
+ ___XX__X,XXXXX___,
+ ___XX__X,X_______,
+ ___XX__X,X_______,
+ __XXXX_X,X_______,
+ _XX__XXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 动 code:0xB6AF */
+static GUI_CONST_STORAGE unsigned char acB6AF[32] = {
+ ________,_XX_____,
+ __XXXXX_,_XX_____,
+ ________,_XX_____,
+ _______X,XXXXXXX_,
+ ________,_XX__XX_,
+ _XXXXXXX,_XX__XX_,
+ ___XX___,_XX__XX_,
+ ___XX___,_XX__XX_,
+ __XX_XX_,_XX__XX_,
+ __XX__XX,_XX__XX_,
+ _XXXXXXX,XX___XX_,
+ ______XX,XX___XX_,
+ _______X,X____XX_,
+ ______XX,___XXX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 度 code:0xB6C8 */
+static GUI_CONST_STORAGE unsigned char acB6C8[32] = {
+ _______X,X_______,
+ ________,XX______,
+ ___XXXXX,XXXXXXX_,
+ ___XX_XX,___XX___,
+ ___XXXXX,XXXXXXX_,
+ ___XX_XX,___XX___,
+ ___XX_XX,XXXXX___,
+ ___XX___,________,
+ ___XXXXX,XXXXXX__,
+ ___XX_XX,___XX___,
+ ___XX__X,X_XX____,
+ __XX____,XXX_____,
+ __XX__XX,X_XXX___,
+ _XX_XXX_,____XXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 短 code:0xB6CC */
+static GUI_CONST_STORAGE unsigned char acB6CC[32] = {
+ __XX____,________,
+ __XX___X,XXXXXX__,
+ __XXXXX_,________,
+ _XXXX___,________,
+ ___XX__X,XXXXXX__,
+ ___XX__X,X___XX__,
+ ___XX__X,X___XX__,
+ _XXXXXXX,X___XX__,
+ ___XX__X,XXXXXX__,
+ ___XX___,________,
+ __XXXX_X,X___XX__,
+ __XX_XX_,XX_XX___,
+ __XX_XX_,________,
+ _XX___XX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 断 code:0xB6CF */
+static GUI_CONST_STORAGE unsigned char acB6CF[32] = {
+ ____XX__,___XXX__,
+ _XX_XX__,XXXX____,
+ _XXXXXXX,XX______,
+ _XXXXXX_,XX______,
+ _XX_XX__,XX______,
+ _XXXXXXX,XXXXXXX_,
+ _XX_XX__,XX_XX___,
+ _XXXXXX_,XX_XX___,
+ _XXXXXXX,XX_XX___,
+ _XX_XXXX,XX_XX___,
+ _XX_XX__,XX_XX___,
+ _XX_XX__,XX_XX___,
+ _XX____X,X__XX___,
+ _XXXXXXX,___XX___,
+ ________,________,
+ ________,________,
+};
+
+/* char: 阀 code:0xB7A7 */
+static GUI_CONST_STORAGE unsigned char acB7A7[32] = {
+ ___XX___,________,
+ ____XXXX,XXXXXXX_,
+ ________,_____XX_,
+ __XX__XX,XXXX_XX_,
+ __XX__XX,XX_XXXX_,
+ __XX_XX_,XXXXXXX_,
+ __XXXXXX,XXX__XX_,
+ __XXXXX_,XXXX_XX_,
+ __XX_XX_,XXXX_XX_,
+ __XX_XX_,_XXXXXX_,
+ __XX_XX_,_XXXXXX_,
+ __XX_XX_,XXXXXXX_,
+ __XX_XXX,X__XXXX_,
+ __XX____,____XXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 法 code:0xB7A8 */
+static GUI_CONST_STORAGE unsigned char acB7A8[32] = {
+ ________,_XX_____,
+ __XX____,_XX_____,
+ ___XX___,_XX_____,
+ ______XX,XXXXXX__,
+ _XX_____,_XX_____,
+ __XX____,_XX_____,
+ ________,_XX_____,
+ ___XXXXX,XXXXXXX_,
+ ___XX___,XX______,
+ __XX____,XX______,
+ __XX___X,X__XX___,
+ _XX___XX,____XX__,
+ _XX__XXX,XXXXXXX_,
+ ________,_____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 反 code:0xB7B4 */
+static GUI_CONST_STORAGE unsigned char acB7B4[32] = {
+ ________,_XXXXX__,
+ ___XXXXX,XX______,
+ ___XX___,________,
+ ___XX___,________,
+ ___XXXXX,XXXXX___,
+ ___XXXX_,___XX___,
+ ___XXXX_,___XX___,
+ ___XX_XX,__XX____,
+ ___XX_XX,__XX____,
+ ___XX__X,XXX_____,
+ __XX____,XX______,
+ __XX___X,XXX_____,
+ _XX__XXX,__XXX___,
+ ___XXX__,____XXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 返 code:0xB7B5 */
+static GUI_CONST_STORAGE unsigned char acB7B5[32] = {
+ ________,__XXXX__,
+ __XX__XX,XXX_____,
+ ___XX_XX,________,
+ ___XX_XX,________,
+ ______XX,XXXXXX__,
+ ______XX,____XX__,
+ _XXXX_XX,XX_XX___,
+ ___XX_XX,_XXXX___,
+ ___XX_XX,__XX____,
+ ___XX_XX,_XXXX___,
+ ___XXXX_,XX__XX__,
+ ___XX__X,X___XX__,
+ __XXXX__,________,
+ _XX__XXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 范 code:0xB7B6 */
+static GUI_CONST_STORAGE unsigned char acB7B6[32] = {
+ ____XX__,__XX____,
+ ____XX__,__XX____,
+ _XXXXXXX,XXXXXXX_,
+ ____XX__,__XX____,
+ ___XX___,________,
+ ____XX_X,XXXXXX__,
+ _______X,X___XX__,
+ __XX___X,X___XX__,
+ ___XX__X,X___XX__,
+ _______X,X_XXX___,
+ _____XXX,X_______,
+ ____XX_X,X____XX_,
+ ___XX__X,X____XX_,
+ __XX____,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 方 code:0xB7BD */
+static GUI_CONST_STORAGE unsigned char acB7BD[32] = {
+ ______XX,________,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XXX,XXXXX___,
+ _____XX_,___XX___,
+ _____XX_,___XX___,
+ ____XX__,___XX___,
+ ____XX__,___XX___,
+ ___XX___,___XX___,
+ __XX____,___XX___,
+ _XX_____,_XXX____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 放 code:0xB7C5 */
+static GUI_CONST_STORAGE unsigned char acB7C5[32] = {
+ ___XX___,_XX_____,
+ ____XX__,_XX_____,
+ ________,_XX_____,
+ _XXXXXXX,_XXXXXX_,
+ ___XX___,XX__XX__,
+ ___XX__X,XXX_XX__,
+ ___XXXXX,_XX_XX__,
+ ___XX_XX,_XX_XX__,
+ ___XX_XX,_XXXX___,
+ ___XX_XX,_XXXX___,
+ ___XX_XX,__XX____,
+ __XX__XX,_XXXX___,
+ __XX__XX,XX__XX__,
+ _XX_XXXX,X____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 非 code:0xB7C7 */
+static GUI_CONST_STORAGE unsigned char acB7C7[32] = {
+ _____XX_,_XX_____,
+ _____XX_,_XX_____,
+ _XXXXXX_,_XXXXXX_,
+ _____XX_,_XX_____,
+ _____XX_,_XX_____,
+ _____XX_,_XX_____,
+ __XXXXX_,_XXXXX__,
+ _____XX_,_XX_____,
+ _____XX_,_XX_____,
+ _____XX_,_XX_____,
+ _XXXXXX_,_XXXXXX_,
+ _____XX_,_XX_____,
+ _____XX_,_XX_____,
+ _____XX_,_XX_____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 分 code:0xB7D6 */
+static GUI_CONST_STORAGE unsigned char acB7D6[32] = {
+ _____XX_,_XX_____,
+ _____XX_,_XX_____,
+ ____XX__,__XX____,
+ ____XX__,__XX____,
+ ___XX___,___XX___,
+ __XX____,____XX__,
+ _XXXXXXX,XXXX_XX_,
+ _____XX_,__XX____,
+ _____XX_,__XX____,
+ _____XX_,__XX____,
+ ____XX__,__XX____,
+ ___XX___,__XX____,
+ __XX____,__XX____,
+ _XX_____,XXX_____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 服 code:0xB7FE */
+static GUI_CONST_STORAGE unsigned char acB7FE[32] = {
+ ________,________,
+ __XXXXXX,XXXXXX__,
+ __XX_XXX,X___XX__,
+ __XX_XXX,X___XX__,
+ __XX_XXX,X_XXXX__,
+ __XXXXXX,X_______,
+ __XX_XXX,XXXXXX__,
+ __XX_XXX,XXX_XX__,
+ __XXXXXX,XXX_XX__,
+ __XX_XXX,XXXXX___,
+ __XX_XXX,X_XX____,
+ __XX_XXX,XXXXX___,
+ __XX_XXX,XX__XX__,
+ _XX_XXXX,X____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 复 code:0xB8B4 */
+static GUI_CONST_STORAGE unsigned char acB8B4[32] = {
+ ____XX__,________,
+ ____XXXX,XXXXXXX_,
+ ___XX___,________,
+ __XXXXXX,XXXXX___,
+ _XX_XX__,___XX___,
+ ____XXXX,XXXXX___,
+ ____XX__,___XX___,
+ ____XXXX,XXXXX___,
+ _____XX_,________,
+ ____XXXX,XXXXX___,
+ __XXXXX_,_XXX____,
+ ______XX,XX______,
+ ____XXX_,_XXX____,
+ _XXXX___,___XXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 感 code:0xB8D0 */
+static GUI_CONST_STORAGE unsigned char acB8D0[32] = {
+ ________,_XX_XX__,
+ __XXXXXX,XXXXXXX_,
+ __XX____,_XX_____,
+ __XXXXXX,XXX_XX__,
+ __XX____,_XX_XX__,
+ __XXXXXX,XXXXX___,
+ __XXXX_X,X_XX____,
+ __XXXXXX,XXXXXXX_,
+ __XX____,XX__XXX_,
+ _XX____X,X____XX_,
+ ______XX,________,
+ __XXXX_X,X___XX__,
+ __XXXX__,__XX_XX_,
+ _XX__XXX,XXXX_XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 缸 code:0xB8D7 */
+static GUI_CONST_STORAGE unsigned char acB8D7[32] = {
+ ___XX___,________,
+ ___XX___,________,
+ ___XXXXX,XXXXXX__,
+ __XXXX__,__XX____,
+ _XX_XX__,__XX____,
+ ____XX__,__XX____,
+ _XXXXXXX,X_XX____,
+ ____XX__,__XX____,
+ ____XX__,__XX____,
+ __XXXXXX,__XX____,
+ __XXXXXX,__XX____,
+ __XXXXXX,__XX____,
+ __XXXXXX,__XX____,
+ __XXX_XX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 高 code:0xB8DF */
+static GUI_CONST_STORAGE unsigned char acB8DF[32] = {
+ ______XX,________,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ ________,________,
+ ____XXXX,XXXX____,
+ ____XX__,__XX____,
+ ____XXXX,XXXX____,
+ ________,________,
+ __XXXXXX,XXXXXX__,
+ __XX____,____XX__,
+ __XX_XXX,XXX_XX__,
+ __XX_XX_,_XX_XX__,
+ __XX_XXX,XXX_XX__,
+ __XX____,___XXX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 割 code:0xB8EE */
+static GUI_CONST_STORAGE unsigned char acB8EE[32] = {
+ ____XX__,_____XX_,
+ _____XX_,_____XX_,
+ _XXXXXXX,XXX__XX_,
+ _XX__XX_,_XXXXXX_,
+ __XXXXXX,XX_XXXX_,
+ _____XX_,___XXXX_,
+ __XXXXXX,XX_XXXX_,
+ _____XX_,___XXXX_,
+ _XXXXXXX,XXXXXXX_,
+ _____XX_,___XXXX_,
+ __XXXXXX,XX___XX_,
+ __XX____,XX___XX_,
+ __XXXXXX,XX___XX_,
+ __XX____,XX_XXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 个 code:0xB8F6 */
+static GUI_CONST_STORAGE unsigned char acB8F6[32] = {
+ _______X,X_______,
+ _______X,X_______,
+ ______XX,XX______,
+ _____XX_,_XX_____,
+ ____XX__,__XX____,
+ ___XX__X,X__XX___,
+ _XXX___X,X___XXX_,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ ________,________,
+ ________,________,
+};
+
+/* char: 更 code:0xB8FC */
+static GUI_CONST_STORAGE unsigned char acB8FC[32] = {
+ ________,________,
+ _XXXXXXX,XXXXXXX_,
+ _______X,X_______,
+ __XXXXXX,XXXXXX__,
+ __XX___X,X___XX__,
+ __XXXXXX,XXXXXX__,
+ __XX___X,X___XX__,
+ __XX___X,X___XX__,
+ __XXXXXX,XXXXXX__,
+ ___XX__X,X_______,
+ ____XXXX,________,
+ _____XXX,________,
+ ___XXX_X,XXX_____,
+ _XXX____,__XXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 工 code:0xB9A4 */
+static GUI_CONST_STORAGE unsigned char acB9A4[32] = {
+ ________,________,
+ __XXXXXX,XXXXXX__,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+ ________,________,
+};
+
+/* char: 功 code:0xB9A6 */
+static GUI_CONST_STORAGE unsigned char acB9A6[32] = {
+ ________,XX______,
+ ________,XX______,
+ _XXXXXX_,XX______,
+ ___XX__X,XXXXXX__,
+ ___XX___,XX__XX__,
+ ___XX___,XX__XX__,
+ ___XX___,XX__XX__,
+ ___XX___,XX__XX__,
+ ___XX___,XX__XX__,
+ ___XXXX_,XX__XX__,
+ _XXX___X,X___XX__,
+ _______X,X___XX__,
+ ______XX,____XX__,
+ _____XX_,__XXX___,
+ ________,________,
+ ________,________,
+};
+
+/* char: 公 code:0xB9AB */
+static GUI_CONST_STORAGE unsigned char acB9AB[32] = {
+ ________,XX______,
+ _____XX_,XX______,
+ _____XX_,_XX_____,
+ ____XX__,_XX_____,
+ ____XX__,__XX____,
+ ___XX___,___XX___,
+ __XX__XX,____XX__,
+ _XX___XX,_____XX_,
+ _____XX_,________,
+ _____XX_,XX______,
+ ____XX__,_XX_____,
+ ___XX___,__XX____,
+ __XXXXXX,XXXXX___,
+ ________,___XX___,
+ ________,________,
+ ________,________,
+};
+
+/* char: 构 code:0xB9B9 */
+static GUI_CONST_STORAGE unsigned char acB9B9[32] = {
+ ___XX___,XX______,
+ ___XX___,XX______,
+ ___XX___,XXXXXXX_,
+ _XXXXXXX,X____XX_,
+ ___XX_XX,_____XX_,
+ ___XX___,_XX__XX_,
+ __XXXX__,_XX__XX_,
+ __XXXXX_,XX___XX_,
+ _XXXX___,XXXX_XX_,
+ ___XX__X,XXXXXXX_,
+ ___XX___,___XXXX_,
+ ___XX___,_____XX_,
+ ___XX___,_____XX_,
+ ___XX___,___XXX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 故 code:0xB9CA */
+static GUI_CONST_STORAGE unsigned char acB9CA[32] = {
+ ____XX__,_XX_____,
+ ____XX__,_XX_____,
+ ____XX__,_XX_____,
+ _XXXXXXX,_XXXXXX_,
+ ____XX__,XX__XX__,
+ ____XX_X,XXX_XX__,
+ ____XX__,_XX_XX__,
+ __XXXXXX,_XX_XX__,
+ __XX__XX,_XXXX___,
+ __XX__XX,_XXXX___,
+ __XX__XX,__XX____,
+ __XXXXXX,_XXXX___,
+ __XX____,XX__XX__,
+ _______X,X____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 固 code:0xB9CC */
+static GUI_CONST_STORAGE unsigned char acB9CC[32] = {
+ __XXXXXX,XXXXXXX_,
+ __XX___X,X____XX_,
+ __XX___X,X____XX_,
+ __XXXXXX,XXXXXXX_,
+ __XX___X,X____XX_,
+ __XX___X,X____XX_,
+ __XXXXXX,XXXX_XX_,
+ __XXXX__,__XX_XX_,
+ __XXXX__,__XX_XX_,
+ __XXXXXX,XXXX_XX_,
+ __XX____,_____XX_,
+ __XX____,_____XX_,
+ __XXXXXX,XXXXXXX_,
+ __XX____,_____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 关 code:0xB9D8 */
+static GUI_CONST_STORAGE unsigned char acB9D8[32] = {
+ ____XX__,__XX____,
+ _____XX_,__XX____,
+ _____XX_,_XX_____,
+ __XXXXXX,XXXXXX__,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ ______XX,XX______,
+ ______XX,XX______,
+ _____XX_,_XX_____,
+ ____XX__,__XX____,
+ ___XX___,___XX___,
+ _XXX____,____XXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 过 code:0xB9FD */
+static GUI_CONST_STORAGE unsigned char acB9FD[32] = {
+ ________,___XX___,
+ __XX____,___XX___,
+ ___XX___,___XX___,
+ ___XXXXX,XXXXXXX_,
+ ________,___XX___,
+ ______XX,___XX___,
+ _XXXX__X,X__XX___,
+ ___XX__X,X__XX___,
+ ___XX___,___XX___,
+ ___XX___,___XX___,
+ ___XX___,___XX___,
+ ___XX___,_XXXX___,
+ __XXXX__,________,
+ _XX__XXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 耗 code:0xBAC4 */
+static GUI_CONST_STORAGE unsigned char acBAC4[32] = {
+ ____XX__,___XXX__,
+ ____XX__,XXXX____,
+ ____XX__,_XX_____,
+ _XXXXXXX,_XX_____,
+ ____XX__,_XXXXX__,
+ __XXXXXX,XXXX____,
+ ____XX__,_XX_____,
+ _XXXXXXX,_XX_____,
+ ___XXX__,_XXXXXX_,
+ ___XXXXX,XXXX____,
+ __XXXXXX,_XX_____,
+ __XXXX__,_XX__XX_,
+ _XX_XX__,_XX__XX_,
+ ____XX__,__XXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 号 code:0xBAC5 */
+static GUI_CONST_STORAGE unsigned char acBAC5[32] = {
+ ___XXXXX,XXXXX___,
+ ___XX___,___XX___,
+ ___XX___,___XX___,
+ ___XXXXX,XXXXX___,
+ ________,________,
+ ________,________,
+ _XXXXXXX,XXXXXXX_,
+ _____XX_,________,
+ ____XX__,________,
+ ___XXXXX,XXXXX___,
+ ________,___XX___,
+ ________,___XX___,
+ ________,___XX___,
+ ________,_XXX____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 和 code:0xBACD */
+static GUI_CONST_STORAGE unsigned char acBACD[32] = {
+ _____XXX,________,
+ __XXXX__,________,
+ ____XX__,XXXXXXX_,
+ ____XX__,XX___XX_,
+ _XXXXXXX,XX___XX_,
+ ____XX__,XX___XX_,
+ ___XXX__,XX___XX_,
+ ___XXXX_,XX___XX_,
+ __XXXXXX,XX___XX_,
+ __XXXX__,XX___XX_,
+ _XX_XX__,XXXXXXX_,
+ ____XX__,XX___XX_,
+ ____XX__,________,
+ ____XX__,________,
+ ________,________,
+ ________,________,
+};
+
+/* char: 恒 code:0xBAE3 */
+static GUI_CONST_STORAGE unsigned char acBAE3[32] = {
+ ___XX___,________,
+ ___XX_XX,XXXXXXX_,
+ ___XX___,________,
+ ___XXX__,________,
+ _XXXXXXX,XXXXXX__,
+ _XXXX__X,X___XX__,
+ _XXXX__X,X___XX__,
+ ___XX__X,XXXXXX__,
+ ___XX__X,X___XX__,
+ ___XX__X,X___XX__,
+ ___XX__X,XXXXXX__,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX_XX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 护 code:0xBBA4 */
+static GUI_CONST_STORAGE unsigned char acBBA4[32] = {
+ ___XX___,_XX_____,
+ ___XX___,__XX____,
+ ___XX__X,XXXXXXX_,
+ _XXXXXXX,X____XX_,
+ ___XX__X,X____XX_,
+ ___XX__X,X____XX_,
+ ___XXXXX,XXXXXXX_,
+ ___XXX_X,X____XX_,
+ _XXXX__X,X_______,
+ ___XX__X,X_______,
+ ___XX__X,X_______,
+ ___XX_XX,________,
+ ___XX_XX,________,
+ _XXXXXX_,________,
+ ________,________,
+ ________,________,
+};
+
+/* char: 欢 code:0xBBB6 */
+static GUI_CONST_STORAGE unsigned char acBBB6[32] = {
+ ________,_XX_____,
+ ________,_XX_____,
+ __XXXXXX,_XX_____,
+ ______XX,XXXXXXX_,
+ ______XX,XX___XX_,
+ __XX_XXX,X_XXXX__,
+ ___XXXX_,__XX____,
+ ____XX__,__XX____,
+ ____XXX_,__XX____,
+ ___XXXX_,__XX____,
+ ___XX_XX,_XXXX___,
+ __XX__XX,_XXXX___,
+ _XX_____,XX__XX__,
+ _______X,X____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 环 code:0xBBB7 */
+static GUI_CONST_STORAGE unsigned char acBBB7[32] = {
+ ________,________,
+ ______XX,XXXXXXX_,
+ _XXXXXX_,__XX____,
+ ___XX___,__XX____,
+ ___XX___,_XX_____,
+ ___XX___,_XX_____,
+ _XXXXXX_,XXXXX___,
+ ___XX__X,XXX_XX__,
+ ___XX_XX,_XX__XX_,
+ ___XX___,_XX__XX_,
+ ___XXXX_,_XX_____,
+ _XXXX___,_XX_____,
+ ________,_XX_____,
+ ________,_XX_____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 换 code:0xBBBB */
+static GUI_CONST_STORAGE unsigned char acBBBB[32] = {
+ ___XX__X,X_______,
+ ___XX__X,X_______,
+ ___XX__X,XXXXX___,
+ _XXXXXXX,___XX___,
+ ___XXXX_,__XX____,
+ ___XX_XX,XXXXXX__,
+ ___XX_XX,_XX_XX__,
+ ___XXXXX,_XX_XX__,
+ _XXXX_XX,_XX_XX__,
+ ___XXXXX,XXXXXXX_,
+ ___XX___,XXXX____,
+ ___XX__X,X__XX___,
+ ___XX_XX,____XX__,
+ _XXXXXX_,_____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 簧 code:0xBBC9 */
+static GUI_CONST_STORAGE unsigned char acBBC9[32] = {
+ ___XX___,_XX_____,
+ __XXXXXX,XXXXXXX_,
+ _XX__XX_,XX_XX___,
+ _____XX_,_XX_____,
+ ___XXXXX,XXXXX___,
+ _____XX_,_XX_____,
+ _XXXXXXX,XXXXXXX_,
+ _______X,X_______,
+ ___XXXXX,XXXXX___,
+ ___XX__X,X__XX___,
+ ___XXXXX,XXXXX___,
+ ___XX__X,X__XX___,
+ ___XXXXX,XXXXX___,
+ ____XX__,__XX____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 恢 code:0xBBD6 */
+static GUI_CONST_STORAGE unsigned char acBBD6[32] = {
+ ___XX___,_XX_____,
+ ___XX___,_XX_____,
+ ___XX___,_XX_____,
+ ___XXXXX,XXXXXXX_,
+ _XXXXXX_,XX______,
+ _XXXX__X,X_XX____,
+ _XXXX__X,X_XX_XX_,
+ ___XX_XX,XXXX_XX_,
+ ___XXXX_,XXXXXX__,
+ ___XX__X,XXXXX___,
+ ___XX___,_XXXX___,
+ ___XX___,XX__XX__,
+ ___XX__X,X___XX__,
+ ___XX_XX,_____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 回 code:0xBBD8 */
+static GUI_CONST_STORAGE unsigned char acBBD8[32] = {
+ ________,________,
+ __XXXXXX,XXXXXXX_,
+ __XX____,_____XX_,
+ __XX____,_____XX_,
+ __XX_XXX,XXXX_XX_,
+ __XX_XX_,__XX_XX_,
+ __XX_XX_,__XX_XX_,
+ __XX_XX_,__XX_XX_,
+ __XX_XX_,__XX_XX_,
+ __XX_XXX,XXXX_XX_,
+ __XX____,_____XX_,
+ __XX____,_____XX_,
+ __XXXXXX,XXXXXXX_,
+ __XX____,_____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 基 code:0xBBF9 */
+static GUI_CONST_STORAGE unsigned char acBBF9[32] = {
+ ____XX__,__XX____,
+ __XXXXXX,XXXXXX__,
+ ____XX__,__XX____,
+ ____XXXX,XXXX____,
+ ____XX__,__XX____,
+ ____XXXX,XXXX____,
+ ____XX__,__XX____,
+ _XXXXXXX,XXXXXXX_,
+ ___XX___,___XX___,
+ __XX___X,X___XX__,
+ _XX_XXXX,XXXX_XX_,
+ _______X,X_______,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 机 code:0xBBFA */
+static GUI_CONST_STORAGE unsigned char acBBFA[32] = {
+ ___XX___,________,
+ ___XX__X,XXXXX___,
+ ___XX__X,X__XX___,
+ _XXXXXXX,X__XX___,
+ ___XX__X,X__XX___,
+ ___XX__X,X__XX___,
+ __XXXX_X,X__XX___,
+ __XXXXXX,X__XX___,
+ _XXXX__X,X__XX___,
+ ___XX__X,X__XX___,
+ ___XX__X,X__XX___,
+ ___XX_XX,___XXXX_,
+ ___XX_XX,___XXXX_,
+ ___XXXX_,____XXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 积 code:0xBBFD */
+static GUI_CONST_STORAGE unsigned char acBBFD[32] = {
+ ________,________,
+ ____XXXX,XXXXXX__,
+ _XXXX__X,X___XX__,
+ ___XX__X,X___XX__,
+ ___XX__X,X___XX__,
+ _XXXXXXX,X___XX__,
+ ___XX__X,X___XX__,
+ ___XXX_X,XXXXXX__,
+ __XXXXX_,________,
+ __XXX___,________,
+ _XXXX___,XX_XX___,
+ ___XX___,XX__XX__,
+ ___XX__X,X____XX_,
+ ___XX_XX,_____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 辑 code:0xBCAD */
+static GUI_CONST_STORAGE unsigned char acBCAD[32] = {
+ ___XX___,________,
+ ___XX__X,XXXXXX__,
+ _XXXXXXX,X___XX__,
+ __XX___X,XXXXXX__,
+ __XX____,________,
+ _XXXX_XX,XXXXXXX_,
+ _XXXXXXX,X___XX__,
+ ___XX__X,XXXXXX__,
+ ___XX__X,X___XX__,
+ ___XXXXX,XXXXXX__,
+ _XXXX__X,X___XX__,
+ ___XX__X,X_XXXXX_,
+ ___XX_XX,XXX_XX__,
+ ___XX___,____XX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 技 code:0xBCBC */
+static GUI_CONST_STORAGE unsigned char acBCBC[32] = {
+ ___XX___,_XX_____,
+ ___XX___,_XX_____,
+ ___XX___,_XX_____,
+ _XXXXXXX,XXXXXX__,
+ ___XX___,_XX_____,
+ ___XX___,_XX_____,
+ ___XX_XX,XXXXX___,
+ ___XXX_X,X__XX___,
+ _XXXX__X,X__XX___,
+ ___XX___,XXXX____,
+ ___XX___,_XX_____,
+ ___XX___,XXXX____,
+ ___XX__X,X__XX___,
+ _XXXXXXX,____XXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 计 code:0xBCC6 */
+static GUI_CONST_STORAGE unsigned char acBCC6[32] = {
+ __XX____,_XX_____,
+ ___XX___,_XX_____,
+ ___XX___,_XX_____,
+ ________,_XX_____,
+ ________,_XX_____,
+ _XXXXXXX,XXXXXXX_,
+ ___XX___,_XX_____,
+ ___XX___,_XX_____,
+ ___XX___,_XX_____,
+ ___XX___,_XX_____,
+ ___XXXX_,_XX_____,
+ ___XXX__,_XX_____,
+ ___XX___,_XX_____,
+ ________,_XX_____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 记 code:0xBCC7 */
+static GUI_CONST_STORAGE unsigned char acBCC7[32] = {
+ __XX____,________,
+ ___XX_XX,XXXXXX__,
+ ___XX___,____XX__,
+ ________,____XX__,
+ ________,____XX__,
+ _XXXX___,____XX__,
+ ___XX_XX,XXXXXX__,
+ ___XX_XX,________,
+ ___XX_XX,________,
+ ___XX_XX,________,
+ ___XXXXX,________,
+ ___XXXXX,_____XX_,
+ ___XX_XX,_____XX_,
+ _______X,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 加 code:0xBCD3 */
+static GUI_CONST_STORAGE unsigned char acBCD3[32] = {
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ _XXXXXXX,XXXXXXX_,
+ ____XX_X,XXX__XX_,
+ ____XX_X,XXX__XX_,
+ ____XX_X,XXX__XX_,
+ ____XX_X,XXX__XX_,
+ ___XX__X,XXX__XX_,
+ ___XX__X,XXX__XX_,
+ ___XX__X,XXX__XX_,
+ __XX___X,XXXXXXX_,
+ __XX___X,XXX__XX_,
+ _XX__XXX,________,
+ ________,________,
+ ________,________,
+};
+
+/* char: 间 code:0xBCE4 */
+static GUI_CONST_STORAGE unsigned char acBCE4[32] = {
+ ___XX___,________,
+ ____XXXX,XXXXXXX_,
+ ____XX__,_____XX_,
+ __XX____,_____XX_,
+ __XX_XXX,XXXX_XX_,
+ __XX_XX_,__XX_XX_,
+ __XX_XX_,__XX_XX_,
+ __XX_XXX,XXXX_XX_,
+ __XX_XX_,__XX_XX_,
+ __XX_XX_,__XX_XX_,
+ __XX_XXX,XXXX_XX_,
+ __XX____,_____XX_,
+ __XX____,_____XX_,
+ __XX____,___XXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 减 code:0xBCF5 */
+static GUI_CONST_STORAGE unsigned char acBCF5[32] = {
+ ________,___XXXX_,
+ __XX____,___XX___,
+ ___XXXXX,XXXXXXX_,
+ ___XXXX_,___XX___,
+ _____XX_,___XX___,
+ _____XXX,XXXXX___,
+ _____XX_,___XXXX_,
+ ___XXXXX,XXXXXXX_,
+ ___XXXXX,XXXXXX__,
+ __XX_XXX,XXXXXX__,
+ __XX_XXX,XXXXXXX_,
+ _XX__XX_,__XXXXX_,
+ _XX__XX_,_XX_XXX_,
+ ____XX__,XX___XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 件 code:0xBCFE */
+static GUI_CONST_STORAGE unsigned char acBCFE[32] = {
+ ____XX__,_XX_____,
+ ____XXXX,_XX_____,
+ ___XX_XX,_XX_____,
+ ___XX_XX,XXXXXX__,
+ __XXXXX_,_XX_____,
+ _XXXX___,_XX_____,
+ ___XX___,_XX_____,
+ ___XX___,_XX_____,
+ ___XXXXX,XXXXXXX_,
+ ___XX___,_XX_____,
+ ___XX___,_XX_____,
+ ___XX___,_XX_____,
+ ___XX___,_XX_____,
+ ___XX___,_XX_____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 江 code:0xBDAD */
+static GUI_CONST_STORAGE unsigned char acBDAD[32] = {
+ ________,________,
+ __XX____,________,
+ ___XX_XX,XXXXXX__,
+ ____XX__,_XX_____,
+ ________,_XX_____,
+ _XX_____,_XX_____,
+ __XX____,_XX_____,
+ ________,_XX_____,
+ ____XX__,_XX_____,
+ ____XX__,_XX_____,
+ ___XX___,_XX_____,
+ ___XX___,_XX_____,
+ __XX____,_XX_____,
+ __XX_XXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 角 code:0xBDC7 */
+static GUI_CONST_STORAGE unsigned char acBDC7[32] = {
+ _____XX_,________,
+ ____XXXX,XXXX____,
+ ___XX___,_XX_____,
+ __XX____,XX______,
+ _XXXXXXX,XXXXXX__,
+ ___XX__X,X___XX__,
+ ___XX__X,X___XX__,
+ ___XXXXX,XXXXXX__,
+ ___XX__X,X___XX__,
+ ___XX__X,X___XX__,
+ ___XXXXX,XXXXXX__,
+ __XX___X,X___XX__,
+ __XX___X,X___XX__,
+ _XX_____,__XXXX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 进 code:0xBDF8 */
+static GUI_CONST_STORAGE unsigned char acBDF8[32] = {
+ _______X,X__XX___,
+ __XX___X,X__XX___,
+ ___XX__X,X__XX___,
+ ___XXXXX,XXXXXXX_,
+ _______X,X__XX___,
+ _______X,X__XX___,
+ _XXXX__X,X__XX___,
+ ___XXXXX,XXXXXXX_,
+ ___XX__X,X__XX___,
+ ___XX__X,X__XX___,
+ ___XX__X,X__XX___,
+ ___XX_XX,___XX___,
+ __XXXX__,________,
+ _XX__XXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 尽 code:0xBEA1 */
+static GUI_CONST_STORAGE unsigned char acBEA1[32] = {
+ ________,________,
+ ___XXXXX,XXXXXX__,
+ ___XX___,____XX__,
+ ___XX___,____XX__,
+ ___XXXXX,XXXXXX__,
+ ___XX___,XX______,
+ ___XX___,_XX_____,
+ __XX____,__XX____,
+ __XX_XXX,___XX___,
+ _XX____X,XX__XXX_,
+ ________,________,
+ ____XXXX,________,
+ _______X,XX______,
+ ________,_XXX____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 警 code:0xBEAF */
+static GUI_CONST_STORAGE unsigned char acBEAF[32] = {
+ ___XX_XX,__XX____,
+ __XXXXXX,XXXXXXX_,
+ ___XX_XX,XX__XX__,
+ __XXXXXX,XXX_XX__,
+ _XXXXXXX,X_XXX___,
+ ___XXXXX,XXX_XXX_,
+ ______XX,X_______,
+ _XXXXXXX,XXXXXXX_,
+ ________,________,
+ ___XXXXX,XXXXX___,
+ ________,________,
+ ___XXXXX,XXXXX___,
+ ___XX___,___XX___,
+ ___XXXXX,XXXXX___,
+ ________,________,
+ ________,________,
+};
+
+/* char: 境 code:0xBEB3 */
+static GUI_CONST_STORAGE unsigned char acBEB3[32] = {
+ ___XX___,_XX_____,
+ ___XX_XX,XXXXXX__,
+ ___XX__X,X__XX___,
+ ___XX___,XXXX____,
+ _XXXXXXX,XXXXXXX_,
+ ___XX___,________,
+ ___XX_XX,XXXXXX__,
+ ___XX_XX,____XX__,
+ ___XX_XX,XXXXXX__,
+ ___XX_XX,____XX__,
+ ___XXXXX,XXXXXX__,
+ _XXX____,XXXX____,
+ _______X,X_XX_XX_,
+ _____XXX,___XXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 据 code:0xBEDD */
+static GUI_CONST_STORAGE unsigned char acBEDD[32] = {
+ ___XX___,________,
+ ___XX_XX,XXXXXX__,
+ ___XX_XX,____XX__,
+ _XXXXXXX,____XX__,
+ ___XX_XX,XXXXXX__,
+ ___XX_XX,__XX____,
+ ___XX_XX,__XX____,
+ ___XXXXX,XXXXXXX_,
+ _XXXX_XX,__XX____,
+ ___XX_XX,__XX____,
+ ___XX_XX,XXXXXX__,
+ ___XXXX_,XX__XX__,
+ ___XXXX_,XX__XX__,
+ _XXXXX__,XXXXXX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 巨 code:0xBEDE */
+static GUI_CONST_STORAGE unsigned char acBEDE[32] = {
+ ________,________,
+ __XXXXXX,XXXXXX__,
+ __XX____,________,
+ __XX____,________,
+ __XX____,________,
+ __XXXXXX,XXXXX___,
+ __XX____,___XX___,
+ __XX____,___XX___,
+ __XX____,___XX___,
+ __XXXXXX,XXXXX___,
+ __XX____,________,
+ __XX____,________,
+ __XX____,________,
+ __XXXXXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 开 code:0xBFAA */
+static GUI_CONST_STORAGE unsigned char acBFAA[32] = {
+ __XXXXXX,XXXXXX__,
+ ____XX__,__XX____,
+ ____XX__,__XX____,
+ ____XX__,__XX____,
+ ____XX__,__XX____,
+ ____XX__,__XX____,
+ _XXXXXXX,XXXXXXX_,
+ ____XX__,__XX____,
+ ____XX__,__XX____,
+ ____XX__,__XX____,
+ ___XX___,__XX____,
+ ___XX___,__XX____,
+ __XX____,__XX____,
+ _XX_____,__XX____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 可 code:0xBFC9 */
+static GUI_CONST_STORAGE unsigned char acBFC9[32] = {
+ ________,________,
+ _XXXXXXX,XXXXXXX_,
+ ________,___XX___,
+ ________,___XX___,
+ ___XXXXX,XX_XX___,
+ ___XX___,XX_XX___,
+ ___XX___,XX_XX___,
+ ___XX___,XX_XX___,
+ ___XX___,XX_XX___,
+ ___XXXXX,XX_XX___,
+ ___XX___,___XX___,
+ ________,___XX___,
+ ________,___XX___,
+ ________,_XXXX___,
+ ________,________,
+ ________,________,
+};
+
+/* char: 空 code:0xBFD5 */
+static GUI_CONST_STORAGE unsigned char acBFD5[32] = {
+ ______XX,________,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ _XX__XX_,_XX__XX_,
+ _XX_XX__,__XX_XX_,
+ ___XX___,___XX___,
+ ________,________,
+ ___XXXXX,XXXXX___,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 控 code:0xBFD8 */
+static GUI_CONST_STORAGE unsigned char acBFD8[32] = {
+ ___XX___,XX______,
+ ___XX___,_XX_____,
+ ___XX_XX,XXXXXXX_,
+ _XXXXXXX,_____XX_,
+ ___XX___,XX_XX___,
+ ___XX__X,X___XX__,
+ ___XX_XX,_____XX_,
+ ___XXX__,________,
+ _XXXX__X,XXXXXX__,
+ ___XX___,_XX_____,
+ ___XX___,_XX_____,
+ ___XX___,_XX_____,
+ ___XX___,_XX_____,
+ _XXXX_XX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 跨 code:0xBFE7 */
+static GUI_CONST_STORAGE unsigned char acBFE7[32] = {
+ ________,_XX_____,
+ _XXXXX__,_XX_____,
+ _XX_XXXX,XXXXXXX_,
+ _XX_XX__,XX_XX___,
+ _XX_XX_X,X___XX__,
+ _XXXXXXX,XXXXXXX_,
+ ___XX___,________,
+ _XXXX_XX,XXXXXXX_,
+ _XXXXX_X,X_______,
+ _XXXX__X,XXXXXX__,
+ _XXXX___,____XX__,
+ _XXXXX__,____XX__,
+ _XXX____,____XX__,
+ ________,__XXX___,
+ ________,________,
+ ________,________,
+};
+
+/* char: 块 code:0xBFE9 */
+static GUI_CONST_STORAGE unsigned char acBFE9[32] = {
+ ___XX___,XX______,
+ ___XX___,XX______,
+ ___XX_XX,XXXXXX__,
+ ___XX___,XX__XX__,
+ _XXXXXX_,XX__XX__,
+ ___XX___,XX__XX__,
+ ___XX___,XX__XX__,
+ ___XXXXX,XXXXXXX_,
+ ___XX___,XXXX____,
+ ___XXXX_,XXXX____,
+ _XXXX__X,X__XX___,
+ _______X,X__XX___,
+ ______XX,____XX__,
+ _____XX_,_____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 蓝 code:0xC0B6 */
+static GUI_CONST_STORAGE unsigned char acC0B6[32] = {
+ ____XX__,__XX____,
+ _XXXXXXX,XXXXXXX_,
+ ____XX__,__XX____,
+ ________,________,
+ _____XX_,XX______,
+ __XX_XX_,XXXXXX__,
+ __XX_XXX,X_XX____,
+ __XX_XXX,___XX___,
+ _____XX_,____XX__,
+ ___XXXXX,XXXXX___,
+ ___XX_XX,XX_XX___,
+ ___XX_XX,XX_XX___,
+ ___XX_XX,XX_XX___,
+ _XXXXXXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 累 code:0xC0DB */
+static GUI_CONST_STORAGE unsigned char acC0DB[32] = {
+ __XXXXXX,XXXXXX__,
+ __XX___X,X___XX__,
+ __XXXXXX,XXXXXX__,
+ __XX___X,X___XX__,
+ __XXXXXX,XXXXXX__,
+ _____XX_,________,
+ ____XX__,_XX_____,
+ ___XXXXX,XX______,
+ ______XX,___XX___,
+ __XXXXXX,XXXXXX__,
+ _______X,X___XX__,
+ ___XX__X,X_XX____,
+ __XX___X,X__XX___,
+ _XX__XXX,X___XX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 类 code:0xC0E0 */
+static GUI_CONST_STORAGE unsigned char acC0E0[32] = {
+ _______X,X_______,
+ ___XX__X,X__XX___,
+ ____XX_X,X_XX____,
+ _XXXXXXX,XXXXXXX_,
+ _____XXX,XXX_____,
+ ____XX_X,X_XX____,
+ ___XX__X,X__XX___,
+ _XXX____,____XX__,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ ______XX,XX______,
+ _____XX_,_XX_____,
+ ___XXX__,__XXX___,
+ _XXX____,____XXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 离 code:0xC0EB */
+static GUI_CONST_STORAGE unsigned char acC0EB[32] = {
+ ______XX,________,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ ________,________,
+ ___XXXX_,_XXXX___,
+ ___XX_XX,XX_XX___,
+ ___XXXX_,_XXXX___,
+ ___XXXXX,XXXXX___,
+ _______X,X_______,
+ __XXXXXX,XXXXXX__,
+ __XX_XX_,_XX_XX__,
+ __XXXXXX,XXXXXX__,
+ __XX____,____XX__,
+ __XX____,__XXXX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 例 code:0xC0FD */
+static GUI_CONST_STORAGE unsigned char acC0FD[32] = {
+ ____XX__,_____XX_,
+ ____XXXX,XXXX_XX_,
+ ___XX__X,X____XX_,
+ ___XX__X,X__XXXX_,
+ __XXX__X,XXXXXXX_,
+ _XXXX_XX,_XXXXXX_,
+ ___XX_XX,_XXXXXX_,
+ ___XX_XX,_XXXXXX_,
+ ___XXXXX,XXXXXXX_,
+ ___XX___,XX_XXXX_,
+ ___XX___,XX___XX_,
+ ___XX__X,X____XX_,
+ ___XX_XX,_____XX_,
+ ___XXXX_,___XXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 力 code:0xC1A6 */
+static GUI_CONST_STORAGE unsigned char acC1A6[32] = {
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ _XXXXXXX,XXXXXX__,
+ ______XX,____XX__,
+ _____XX_,____XX__,
+ _____XX_,____XX__,
+ _____XX_,____XX__,
+ ____XX__,____XX__,
+ ____XX__,____XX__,
+ ___XX___,____XX__,
+ __XX____,___XX___,
+ _XX_____,_XXX____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 量 code:0xC1BF */
+static GUI_CONST_STORAGE unsigned char acC1BF[32] = {
+ ___XXXXX,XXXXX___,
+ ___XX_XX,___XX___,
+ ___XX__X,X__XX___,
+ ___XXXXX,XXXXX___,
+ ________,________,
+ _XXXXXXX,XXXXXXX_,
+ ___XX__X,X__XX___,
+ ___XXXXX,XXXXX___,
+ ___XX__X,X__XX___,
+ ___XXXXX,XXXXX___,
+ _______X,X_______,
+ __XXXXXX,XXXXXX__,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 列 code:0xC1D0 */
+static GUI_CONST_STORAGE unsigned char acC1D0[32] = {
+ ________,_____XX_,
+ __XXXXXX,X____XX_,
+ ____XX__,_____XX_,
+ ____XX__,__XX_XX_,
+ ____XXXX,X_XX_XX_,
+ ___XX__X,X_XX_XX_,
+ ___XX__X,X_XX_XX_,
+ __XXXX_X,X_XX_XX_,
+ _XX__XXX,__XX_XX_,
+ ______XX,__XX_XX_,
+ _____XX_,_____XX_,
+ ____XX__,_____XX_,
+ ___XX___,_____XX_,
+ __XX____,___XXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 零 code:0xC1E3 */
+static GUI_CONST_STORAGE unsigned char acC1E3[32] = {
+ ___XXXXX,XXXXX___,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ _XX____X,X____XX_,
+ _XXXXXXX,XXXXXXX_,
+ _______X,X_______,
+ ___XXXXX,XXXXX___,
+ _____XXX,XXX_____,
+ ___XXX__,__XXX___,
+ _XXX___X,X___XXX_,
+ ____XXXX,XXXX____,
+ ________,_XX_____,
+ ____XXXX,XX______,
+ _______X,XX______,
+ ________,________,
+ ________,________,
+};
+
+/* char: 流 code:0xC1F7 */
+static GUI_CONST_STORAGE unsigned char acC1F7[32] = {
+ ________,_XX_____,
+ __XX____,__XX____,
+ ___XX_XX,XXXXXXX_,
+ ____XX__,_XX_____,
+ ________,XX_XX___,
+ _XX____X,X___XX__,
+ __XX__XX,XXXXXXX_,
+ ____XX__,_____XX_,
+ ____XX_X,XXXXX___,
+ ___XX__X,XXXXX___,
+ ___XX__X,XXXXX___,
+ __XX___X,XXXXX___,
+ __XX__XX,_XXXXXX_,
+ _____XX_,____XXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 路 code:0xC2B7 */
+static GUI_CONST_STORAGE unsigned char acC2B7[32] = {
+ ________,_XX_____,
+ __XXXXX_,_XX_____,
+ __XX_XX_,_XXXXX__,
+ __XX_XX_,XX__XX__,
+ __XX_XXX,XXXXX___,
+ __XXXXX_,__XX____,
+ ____XX__,_XXXX___,
+ __XXXX_X,XX__XXX_,
+ __XXXXXX,________,
+ __XXXX__,XXXXXX__,
+ __XXXX__,XX__XX__,
+ __XXXXXX,XX__XX__,
+ _XXXX___,XXXXXX__,
+ ________,XX__XX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 录 code:0xC2BC */
+static GUI_CONST_STORAGE unsigned char acC2BC[32] = {
+ ________,________,
+ __XXXXXX,XXXXX___,
+ ________,___XX___,
+ ___XXXXX,XXXXX___,
+ ________,___XX___,
+ _XXXXXXX,XXXXXXX_,
+ _______X,X_______,
+ ___XX__X,X__XX___,
+ ____XX_X,XXXX____,
+ _____XXX,XXX_____,
+ ____XX_X,X_XX____,
+ ___XX__X,X__XX___,
+ _XXX___X,X___XXX_,
+ _____XXX,X_______,
+ ________,________,
+ ________,________,
+};
+
+/* char: 率 code:0xC2CA */
+static GUI_CONST_STORAGE unsigned char acC2CA[32] = {
+ ______XX,________,
+ _______X,X_______,
+ __XXXXXX,XXXXXX__,
+ _______X,X_______,
+ _XX___XX,_XX__XX_,
+ __XX_XXX,XX__XX__,
+ ___XX__X,X__XX___,
+ __XX__XX,_XX_XX__,
+ _XX__XXX,XXXX_XX_,
+ _______X,X_XX____,
+ _XXXXXXX,XXXXXXX_,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ ________,________,
+ ________,________,
+};
+
+/* char: 满 code:0xC2FA */
+static GUI_CONST_STORAGE unsigned char acC2FA[32] = {
+ _______X,X__XX___,
+ __XX_XXX,XXXXXXX_,
+ ___XX__X,X__XX___,
+ ________,________,
+ _XX__XXX,XXXXXXX_,
+ __XX___X,X__XX___,
+ _______X,X__XX___,
+ ___XXXXX,XXXXXXX_,
+ ___XXXXX,X__XXXX_,
+ __XX_XXX,X__XXXX_,
+ __XX_XXX,XXXXXXX_,
+ _XX__XX_,_____XX_,
+ _XX__XX_,_____XX_,
+ _____XX_,___XXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 门 code:0xC3C5 */
+static GUI_CONST_STORAGE unsigned char acC3C5[32] = {
+ ___XX___,________,
+ ____XXXX,XXXXXXX_,
+ ____XX__,_____XX_,
+ __XX____,_____XX_,
+ __XX____,_____XX_,
+ __XX____,_____XX_,
+ __XX____,_____XX_,
+ __XX____,_____XX_,
+ __XX____,_____XX_,
+ __XX____,_____XX_,
+ __XX____,_____XX_,
+ __XX____,_____XX_,
+ __XX____,_____XX_,
+ __XX____,___XXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 面 code:0xC3E6 */
+static GUI_CONST_STORAGE unsigned char acC3E6[32] = {
+ _XXXXXXX,XXXXXXX_,
+ _______X,X_______,
+ ______XX,________,
+ __XXXXXX,XXXXXX__,
+ __XX_XX_,_XX_XX__,
+ __XX_XX_,_XX_XX__,
+ __XX_XXX,XXX_XX__,
+ __XX_XX_,_XX_XX__,
+ __XX_XX_,_XX_XX__,
+ __XX_XXX,XXX_XX__,
+ __XX_XX_,_XX_XX__,
+ __XX_XX_,_XX_XX__,
+ __XXXXXX,XXXXXX__,
+ __XX____,____XX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 名 code:0xC3FB */
+static GUI_CONST_STORAGE unsigned char acC3FB[32] = {
+ ______XX,________,
+ ______XX,________,
+ _____XXX,XXXXXX__,
+ ____XX__,___XX___,
+ __XXXXX_,__XX____,
+ ______XX,_XX_____,
+ _______X,XX______,
+ _____XXX,________,
+ ___XXXXX,XXXXXX__,
+ _XXXXX__,____XX__,
+ ____XX__,____XX__,
+ ____XX__,____XX__,
+ ____XXXX,XXXXXX__,
+ ____XX__,____XX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 模 code:0xC4A3 */
+static GUI_CONST_STORAGE unsigned char acC4A3[32] = {
+ ___XX__X,X__XX___,
+ ___XX__X,X__XX___,
+ ___XX_XX,XXXXXXX_,
+ _XXXXX_X,X__XX___,
+ ___XX_XX,XXXXXX__,
+ ___XX_XX,____XX__,
+ __XXXXXX,XXXXXX__,
+ __XXXXXX,____XX__,
+ _XXXX_XX,XXXXXX__,
+ ___XX___,_XX_____,
+ ___XXXXX,XXXXXXX_,
+ ___XX___,XXXX____,
+ ___XX__X,X__XX___,
+ ___XXXXX,____XXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 膜 code:0xC4A4 */
+static GUI_CONST_STORAGE unsigned char acC4A4[32] = {
+ ________,_XXXX___,
+ __XXXXX_,_XXXX___,
+ __XX_XXX,XXXXXXX_,
+ __XX_XX_,_XXXX___,
+ __XX_XX_,XXXXXX__,
+ __XXXXX_,XX__XX__,
+ __XX_XX_,XXXXXX__,
+ __XX_XX_,XX__XX__,
+ __XXXXX_,XXXXXX__,
+ __XX_XX_,__XX____,
+ __XX_XXX,XXXXXXX_,
+ __XX_XX_,_XXXX___,
+ __XX_XX_,XX__XX__,
+ _XX_XXXX,X____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 摩 code:0xC4A6 */
+static GUI_CONST_STORAGE unsigned char acC4A6[32] = {
+ _______X,X_______,
+ __XXXXXX,XXXXXXX_,
+ __XX_XX_,__XX____,
+ __XXXXXX,XXXXXX__,
+ __XX_XX_,_XXXX___,
+ __XXXXXX,XXXXXXX_,
+ __XXXXX_,__XX____,
+ __XX_XXX,XXXXX___,
+ __XX____,XX______,
+ __XX_XXX,XXXXX___,
+ __XX____,XX______,
+ __XXXXXX,XXXXXXX_,
+ __XX____,XX______,
+ _XX___XX,XX______,
+ ________,________,
+ ________,________,
+};
+
+/* char: 内 code:0xC4DA */
+static GUI_CONST_STORAGE unsigned char acC4DA[32] = {
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ __XXXXXX,XXXXXXX_,
+ __XX___X,X____XX_,
+ __XX___X,X____XX_,
+ __XX__XX,XX___XX_,
+ __XX_XX_,_XX__XX_,
+ __XXXX__,__XX_XX_,
+ __XXX___,___XXXX_,
+ __XX____,_____XX_,
+ __XX____,_____XX_,
+ __XX____,_____XX_,
+ __XX____,___XXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 能 code:0xC4DC */
+static GUI_CONST_STORAGE unsigned char acC4DC[32] = {
+ ____XX__,_XX_____,
+ ___XX___,_XX_XXX_,
+ __XX__XX,_XXXX___,
+ _XXXXXXX,XXX__XX_,
+ _______X,XXX__XX_,
+ ________,__XXXXX_,
+ __XXXXXX,________,
+ __XX__XX,_XX__XX_,
+ __XXXXXX,_XX_XX__,
+ __XX__XX,_XXXX___,
+ __XXXXXX,_XX_____,
+ __XX__XX,_XX__XX_,
+ __XX__XX,_XX__XX_,
+ __XX_XXX,__XXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 拟 code:0xC4E2 */
+static GUI_CONST_STORAGE unsigned char acC4E2[32] = {
+ ___XX___,___XX___,
+ ___XX___,XX_XX___,
+ ___XX_XX,_XXXX___,
+ _XXXXXXX,_XXXX___,
+ ___XX_XX,_XXXX___,
+ ___XX_XX,___XX___,
+ ___XX_XX,___XX___,
+ ___XXXXX,___XX___,
+ _XXXX_XX,___XX___,
+ ___XX_XX,XXXXXX__,
+ ___XX_XX,X_XXXX__,
+ ___XX_XX,_XX__XX_,
+ ___XX___,XX___XX_,
+ _XXXX__X,X____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 配 code:0xC5E4 */
+static GUI_CONST_STORAGE unsigned char acC5E4[32] = {
+ ________,________,
+ _XXXXXXX,XXXXXX__,
+ ___XXXX_,____XX__,
+ ___XXXX_,____XX__,
+ _XXXXXXX,X___XX__,
+ _XXXXXXX,X___XX__,
+ _XXXXXXX,XXXXXX__,
+ _XXX__XX,XXX_____,
+ _XX____X,XXX_____,
+ _XXXXXXX,XXX_____,
+ _XX____X,XXX_____,
+ _XX____X,XXX__XX_,
+ _XXXXXXX,XXX__XX_,
+ _XX____X,X_XXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 偏 code:0xC6AB */
+static GUI_CONST_STORAGE unsigned char acC6AB[32] = {
+ ____XX__,XX______,
+ ____XX__,_XX_____,
+ ____XXXX,XXXXXX__,
+ ___XX_XX,____XX__,
+ ___XX_XX,____XX__,
+ __XXX_XX,XXXXXX__,
+ _XXXX_XX,________,
+ ___XX_XX,XXXXXX__,
+ ___XXXXX,XXXXXX__,
+ ___XXXXX,XXXXXX__,
+ ___XXXXX,XXXXXX__,
+ ___XX_XX,XXXXXX__,
+ ___XX_XX,XXXXXX__,
+ ___XX_XX,___XXX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 频 code:0xC6B5 */
+static GUI_CONST_STORAGE unsigned char acC6B5[32] = {
+ ____XX__,________,
+ ____XX_X,XXXXXXX_,
+ __XXXXXX,__XX____,
+ __XXXX__,_XX_____,
+ __XXXX__,XXXXXX__,
+ _XXXXXXX,XX__XX__,
+ ________,XXXXXX__,
+ ____XX__,XXXXXX__,
+ __XXXXXX,XXXXXX__,
+ _XX_XXXX,XXXXXX__,
+ _____XX_,XXXXXX__,
+ ____XX__,_XXXX___,
+ ___XX___,XX__XX__,
+ _XXX___X,X___XX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 平 code:0xC6BD */
+static GUI_CONST_STORAGE unsigned char acC6BD[32] = {
+ __XXXXXX,XXXXXX__,
+ _______X,X_______,
+ _______X,X_______,
+ ___XX__X,X__XX___,
+ ____XX_X,X__XX___,
+ ____XX_X,X_XX____,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ ________,________,
+ ________,________,
+};
+
+/* char: 启 code:0xC6F4 */
+static GUI_CONST_STORAGE unsigned char acC6F4[32] = {
+ ______XX,________,
+ _______X,X_______,
+ ___XXXXX,XXXXXX__,
+ ___XX___,____XX__,
+ ___XX___,____XX__,
+ ___XXXXX,XXXXXX__,
+ ___XX___,________,
+ ___XX___,________,
+ ___XXXXX,XXXXXX__,
+ ___XXXX_,____XX__,
+ __XX_XX_,____XX__,
+ __XX_XX_,____XX__,
+ _XX__XXX,XXXXXX__,
+ _____XX_,____XX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 器 code:0xC6F7 */
+static GUI_CONST_STORAGE unsigned char acC6F7[32] = {
+ __XXXXXX,XXXXXX__,
+ __XX__XX,XX__XX__,
+ __XX__XX,XX__XX__,
+ __XXXXXX,XXXXXX__,
+ ________,__XX____,
+ _______X,X__XX___,
+ _XXXXXXX,XXXXXXX_,
+ _____XX_,_XX_____,
+ ___XXX__,__XXX___,
+ _XXX____,____XXX_,
+ __XXXXXX,XXXXXX__,
+ __XX__XX,XX__XX__,
+ __XX__XX,XX__XX__,
+ __XXXXXX,XXXXXX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 气 code:0xC6F8 */
+static GUI_CONST_STORAGE unsigned char acC6F8[32] = {
+ ___XX___,________,
+ ___XX___,________,
+ ___XXXXX,XXXXXXX_,
+ __XX____,________,
+ _XX_XXXX,XXXXX___,
+ ________,________,
+ __XXXXXX,XXXXX___,
+ ________,___XX___,
+ ________,___XX___,
+ ________,___XX___,
+ ________,___XX___,
+ ________,___XXXX_,
+ ________,____XXX_,
+ ________,_____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 前 code:0xC7B0 */
+static GUI_CONST_STORAGE unsigned char acC7B0[32] = {
+ ___XX___,___XX___,
+ ____XX__,__XX____,
+ _XXXXXXX,XXXXXXX_,
+ ________,________,
+ __XXXXXX,X___XX__,
+ __XX___X,XXX_XX__,
+ __XX___X,XXX_XX__,
+ __XXXXXX,XXX_XX__,
+ __XX___X,XXX_XX__,
+ __XX___X,XXX_XX__,
+ __XXXXXX,XXX_XX__,
+ __XX___X,X___XX__,
+ __XX___X,X___XX__,
+ __XX_XXX,X_XXXX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 切 code:0xC7D0 */
+static GUI_CONST_STORAGE unsigned char acC7D0[32] = {
+ ___XX___,________,
+ ___XX__X,XXXXXXX_,
+ ___XX___,_XX__XX_,
+ ___XX___,_XX__XX_,
+ ___XXXXX,_XX__XX_,
+ _XXXX___,_XX__XX_,
+ ___XX___,_XX__XX_,
+ ___XX___,_XX__XX_,
+ ___XX_XX,_XX__XX_,
+ ___XXXX_,XX___XX_,
+ ___XXX__,XX___XX_,
+ ___XX__X,X____XX_,
+ ______XX,_____XX_,
+ _____XX_,___XXX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 区 code:0xC7F8 */
+static GUI_CONST_STORAGE unsigned char acC7F8[32] = {
+ __XXXXXX,XXXXXXX_,
+ __XX____,________,
+ __XX____,___XX___,
+ __XXXX__,___XX___,
+ __XX_XX_,__XX____,
+ __XX__XX,__XX____,
+ __XX___X,XXX_____,
+ __XX____,XX______,
+ __XX___X,XXX_____,
+ __XX__XX,__XX____,
+ __XX_XX_,___XX___,
+ __XXXX__,___XX___,
+ __XX____,________,
+ __XXXXXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 驱 code:0xC7FD */
+static GUI_CONST_STORAGE unsigned char acC7FD[32] = {
+ ________,________,
+ _XXXXXX_,XXXXXXX_,
+ _____XX_,XX______,
+ __XX_XX_,XX______,
+ __XX_XX_,XXX_XX__,
+ __XX_XX_,XXXXXX__,
+ __XX_XX_,XXXXXX__,
+ __XXXXXX,XX_XX___,
+ ______XX,XX_XX___,
+ ______XX,XXXXXX__,
+ ___XXXXX,XXXXXX__,
+ _XXX__XX,XXX_XX__,
+ ______XX,XX______,
+ ____XXX_,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 取 code:0xC8A1 */
+static GUI_CONST_STORAGE unsigned char acC8A1[32] = {
+ ________,________,
+ _XXXXXXX,________,
+ __XX_XXX,XXXXXX__,
+ __XX_XX_,XX__XX__,
+ __XXXXX_,XX__XX__,
+ __XX_XX_,XX__XX__,
+ __XX_XX_,XX__XX__,
+ __XXXXX_,_XXXX___,
+ __XX_XX_,_XXXX___,
+ __XX_XXX,X_XX____,
+ _XXXXXX_,__XX____,
+ _____XX_,_XXXX___,
+ _____XX_,XX__XX__,
+ _____XXX,X____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 全 code:0xC8AB */
+static GUI_CONST_STORAGE unsigned char acC8AB[32] = {
+ _______X,X_______,
+ _______X,X_______,
+ ______XX,XX______,
+ _____XX_,_XX_____,
+ ____XX__,__XX____,
+ ___XX___,___XX___,
+ _XXXXXXX,XXXXXXX_,
+ _______X,X_______,
+ _______X,X_______,
+ ____XXXX,XXXX____,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 确 code:0xC8B7 */
+static GUI_CONST_STORAGE unsigned char acC8B7[32] = {
+ ________,XX______,
+ ________,XXXXXX__,
+ _XXXXXXX,X___XX__,
+ ___XX_XX,___XX___,
+ ___XX__X,XXXXXXX_,
+ __XX___X,X_XX_XX_,
+ __XXXXXX,X_XX_XX_,
+ _XXX_XXX,XXXXXXX_,
+ __XX_XXX,X_XX_XX_,
+ __XX_XXX,X_XX_XX_,
+ __XX_XXX,XXXXXXX_,
+ __XXXXXX,X_XX_XX_,
+ __XX___X,X_XX_XX_,
+ ______XX,____XXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 认 code:0xC8CF */
+static GUI_CONST_STORAGE unsigned char acC8CF[32] = {
+ __XX____,_XX_____,
+ ___XX___,_XX_____,
+ ___XX___,_XX_____,
+ ________,_XX_____,
+ _XXXX___,_XX_____,
+ ___XX___,_XX_____,
+ ___XX___,_XX_____,
+ ___XX___,XXXX____,
+ ___XX___,XXXX____,
+ ___XXXX_,XXXX____,
+ ___XXX_X,X__XX___,
+ ___XX__X,X__XX___,
+ ______XX,____XX__,
+ _____XX_,_____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 入 code:0xC8EB */
+static GUI_CONST_STORAGE unsigned char acC8EB[32] = {
+ _____XX_,________,
+ ______XX,________,
+ ______XX,________,
+ _______X,X_______,
+ _______X,X_______,
+ ______XX,XX______,
+ ______XX,XX______,
+ _____XX_,_XX_____,
+ _____XX_,_XX_____,
+ ____XX__,__XX____,
+ ____XX__,__XX____,
+ ___XX___,___XX___,
+ __XX____,____XX__,
+ _XX_____,_____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 软 code:0xC8ED */
+static GUI_CONST_STORAGE unsigned char acC8ED[32] = {
+ ____XX__,_XX_____,
+ ____XX__,_XX_____,
+ _XXXXXXX,_XX_____,
+ ___XX___,_XXXXXX_,
+ __XXXX__,XX___XX_,
+ __XXXX__,XX__XX__,
+ _XXXXXXX,X_XX____,
+ ____XX__,__XX____,
+ ____XX__,__XX____,
+ ____XXXX,__XX____,
+ _XXXXX__,_XXXX___,
+ ____XX__,_XXXX___,
+ ____XX__,XX__XX__,
+ ____XX_X,X____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 商 code:0xC9CC */
+static GUI_CONST_STORAGE unsigned char acC9CC[32] = {
+ ______XX,________,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ ____XX__,__XX____,
+ _____XX_,_XX_____,
+ __XXXXXX,XXXXXX__,
+ __XX_XX_,_XX_XX__,
+ __XXXX__,__XXXX__,
+ __XXXXXX,XXXXXX__,
+ __XX_XX_,_XX_XX__,
+ __XX_XX_,_XX_XX__,
+ __XX_XXX,XXX_XX__,
+ __XX____,____XX__,
+ __XX____,__XXXX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 上 code:0xC9CF */
+static GUI_CONST_STORAGE unsigned char acC9CF[32] = {
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,XXXXXX__,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 少 code:0xC9D9 */
+static GUI_CONST_STORAGE unsigned char acC9D9[32] = {
+ _______X,X_______,
+ _______X,X_______,
+ ____XX_X,X_XX____,
+ ____XX_X,X__XX___,
+ ___XX__X,X___XX__,
+ __XX___X,X____XX_,
+ _XX____X,X____XX_,
+ _______X,X__XX___,
+ _______X,X_XX____,
+ ________,_XX_____,
+ ________,XX______,
+ ______XX,X_______,
+ ____XXX_,________,
+ _XXXX___,________,
+ ________,________,
+ ________,________,
+};
+
+/* char: 设 code:0xC9E8 */
+static GUI_CONST_STORAGE unsigned char acC9E8[32] = {
+ __XX____,________,
+ ___XX__X,XXXXX___,
+ ___XX__X,X__XX___,
+ _______X,X__XX___,
+ _______X,X__XX___,
+ _XXXX_XX,____XXX_,
+ ___XXXX_,________,
+ ___XX_XX,XXXXXX__,
+ ___XX__X,X___XX__,
+ ___XX__X,X__XX___,
+ ___XXXX_,XXXX____,
+ ___XXX__,_XX_____,
+ ___XX__X,XXXXX___,
+ _____XXX,____XXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 湿 code:0xCAAA */
+static GUI_CONST_STORAGE unsigned char acCAAA[32] = {
+ ________,________,
+ __XX_XXX,XXXXXX__,
+ ___XXXX_,____XX__,
+ _____XX_,____XX__,
+ _XX__XXX,XXXXXX__,
+ __XX_XX_,____XX__,
+ _____XX_,____XX__,
+ ___XXXXX,XXXXXX__,
+ ___XX__X,X_XX____,
+ __XXXX_X,X_XX_XX_,
+ __XX_XXX,X_XXXX__,
+ _XX___XX,X_XXX___,
+ _XX____X,X_XX____,
+ ____XXXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 石 code:0xCAAF */
+static GUI_CONST_STORAGE unsigned char acCAAF[32] = {
+ ________,________,
+ _XXXXXXX,XXXXXXX_,
+ ______XX,________,
+ ______XX,________,
+ _____XX_,________,
+ ____XX__,________,
+ ___XXXXX,XXXXXX__,
+ __XXXX__,____XX__,
+ _XX_XX__,____XX__,
+ ____XX__,____XX__,
+ ____XX__,____XX__,
+ ____XX__,____XX__,
+ ____XXXX,XXXXXX__,
+ ____XX__,____XX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 时 code:0xCAB1 */
+static GUI_CONST_STORAGE unsigned char acCAB1[32] = {
+ ________,___XX___,
+ ________,___XX___,
+ _XXXXX__,___XX___,
+ _XX_XXXX,XXXXXXX_,
+ _XX_XX__,___XX___,
+ _XX_XX__,___XX___,
+ _XXXXX_X,X__XX___,
+ _XX_XX__,XX_XX___,
+ _XX_XX__,XX_XX___,
+ _XX_XX__,___XX___,
+ _XXXXX__,___XX___,
+ _XX_XX__,___XX___,
+ ________,___XX___,
+ ________,_XXXX___,
+ ________,________,
+ ________,________,
+};
+
+/* char: 实 code:0xCAB5 */
+static GUI_CONST_STORAGE unsigned char acCAB5[32] = {
+ ______XX,________,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ _XX_____,_____XX_,
+ _____XX_,_XX_____,
+ ______XX,_XX_____,
+ ___XX___,_XX_____,
+ ____XX__,_XX_____,
+ ________,XX______,
+ _XXXXXXX,XXXXXXX_,
+ _______X,XXX_____,
+ ______XX,__XX____,
+ ____XXX_,___XX___,
+ __XXX___,____XX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 使 code:0xCAB9 */
+static GUI_CONST_STORAGE unsigned char acCAB9[32] = {
+ ____XX__,_XX_____,
+ ____XX__,_XX_____,
+ ___XXXXX,XXXXXXX_,
+ ___XX___,_XX_____,
+ __XXXXXX,XXXXXXX_,
+ _XXXXXX_,_XX__XX_,
+ ___XXXX_,_XX__XX_,
+ ___XXXXX,XXXXXXX_,
+ ___XX_XX,_XX_____,
+ ___XX__X,XXX_____,
+ ___XX___,XX______,
+ ___XX__X,XXX_____,
+ ___XX_XX,__XXX___,
+ ___XXXX_,____XXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 式 code:0xCABD */
+static GUI_CONST_STORAGE unsigned char acCABD[32] = {
+ ________,_XXXX___,
+ ________,_XX_XX__,
+ ________,_XX_____,
+ _XXXXXXX,XXXXXXX_,
+ ________,_XX_____,
+ ________,_XX_____,
+ __XXXXXX,_XX_____,
+ ____XX__,_XX_____,
+ ____XX__,_XX_____,
+ ____XX__,__XX____,
+ ____XX__,__XX_XX_,
+ ____XXXX,X__XXXX_,
+ _XXXXX__,____XXX_,
+ ________,_____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 示 code:0xCABE */
+static GUI_CONST_STORAGE unsigned char acCABE[32] = {
+ ________,________,
+ ___XXXXX,XXXXX___,
+ ________,________,
+ ________,________,
+ ________,________,
+ _XXXXXXX,XXXXXXX_,
+ _______X,X_______,
+ ____XX_X,X_XX____,
+ ____XX_X,X__XX___,
+ ___XX__X,X___XX__,
+ __XX___X,X____XX_,
+ _XX____X,X____XX_,
+ _______X,X_______,
+ _____XXX,X_______,
+ ________,________,
+ ________,________,
+};
+
+/* char: 试 code:0xCAD4 */
+static GUI_CONST_STORAGE unsigned char acCAD4[32] = {
+ __XX____,__XXXX__,
+ ___XX___,__XX_XX_,
+ ___XX___,__XX____,
+ _____XXX,XXXXXXX_,
+ ________,__XX____,
+ _XXXX___,__XX____,
+ ___XX_XX,XXXX____,
+ ___XX__X,X_XX____,
+ ___XX__X,X_XX____,
+ ___XX__X,X__XX___,
+ ___XXXXX,X__XXXX_,
+ ___XXX_X,XXXXXXX_,
+ ___XXXXX,X___XXX_,
+ ________,_____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 手 code:0xCAD6 */
+static GUI_CONST_STORAGE unsigned char acCAD6[32] = {
+ ________,_XXXXX__,
+ __XXXXXX,XX______,
+ _______X,X_______,
+ _______X,X_______,
+ __XXXXXX,XXXXXX__,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _____XXX,X_______,
+ ________,________,
+ ________,________,
+};
+
+/* char: 首 code:0xCAD7 */
+static GUI_CONST_STORAGE unsigned char acCAD7[32] = {
+ ___XX___,___XX___,
+ ____XX__,__XX____,
+ _XXXXXXX,XXXXXXX_,
+ ______XX,________,
+ _____XX_,________,
+ ___XXXXX,XXXXX___,
+ ___XX___,___XX___,
+ ___XXXXX,XXXXX___,
+ ___XX___,___XX___,
+ ___XXXXX,XXXXX___,
+ ___XX___,___XX___,
+ ___XX___,___XX___,
+ ___XXXXX,XXXXX___,
+ ___XX___,___XX___,
+ ________,________,
+ ________,________,
+};
+
+/* char: 输 code:0xCAE4 */
+static GUI_CONST_STORAGE unsigned char acCAE4[32] = {
+ __XX____,_XX_____,
+ __XX____,XXXX____,
+ _XXXXX_X,X__XX___,
+ __XX__XX,____XX__,
+ _XX__XXX,XXXXXXX_,
+ _XXXX___,________,
+ _XXXXXXX,XXX__XX_,
+ ___XX_XX,_XXXXXX_,
+ ___XX_XX,XXXXXXX_,
+ ___XXXXX,_XXXXXX_,
+ _XXXX_XX,XXXXXXX_,
+ ___XX_XX,_XXXXXX_,
+ ___XX_XX,_XX__XX_,
+ ___XX_XX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 术 code:0xCAF5 */
+static GUI_CONST_STORAGE unsigned char acCAF5[32] = {
+ _______X,X_______,
+ _______X,X_XX____,
+ _______X,X__XX___,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ ______XX,XX______,
+ _____XXX,XXX_____,
+ _____XXX,XXX_____,
+ ____XX_X,X_XX____,
+ ___XX__X,X__XX___,
+ __XX___X,X___XX__,
+ _XX____X,X____XX_,
+ _______X,X_______,
+ _______X,X_______,
+ ________,________,
+ ________,________,
+};
+
+/* char: 数 code:0xCAFD */
+static GUI_CONST_STORAGE unsigned char acCAFD[32] = {
+ ____XX__,__XX____,
+ _XX_XX_X,X_XX____,
+ __XXXXXX,__XX____,
+ _XXXXXXX,X_XXXXX_,
+ ___XXXX_,_XX_XX__,
+ __XXXXXX,_XX_XX__,
+ _XX_XX_X,XXXXXX__,
+ ___XX___,__XXXX__,
+ _XXXXXXX,__XXXX__,
+ ___XX_XX,__XXXX__,
+ __XXX_XX,___XX___,
+ ____XXX_,___XX___,
+ ___XXXXX,__XXXX__,
+ _XXX___X,XXX__XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 双 code:0xCBAB */
+static GUI_CONST_STORAGE unsigned char acCBAB[32] = {
+ ________,________,
+ _XXXXXXX,XXXXXX__,
+ ______XX,XX__XX__,
+ ______XX,XX__XX__,
+ __XX__XX,XX__XX__,
+ ___XXXX_,XX__XX__,
+ ___XXXX_,_XXXX___,
+ ____XX__,_XXXX___,
+ ____XX__,__XX____,
+ ___XXXX_,__XX____,
+ ___XXXX_,_XXXX___,
+ __XX_XX_,XX_XX___,
+ __XX___X,X___XX__,
+ _XX___XX,_____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 司 code:0xCBBE */
+static GUI_CONST_STORAGE unsigned char acCBBE[32] = {
+ __XXXXXX,XXXXXX__,
+ ________,____XX__,
+ ________,____XX__,
+ _XXXXXXX,XXXXXX__,
+ ________,____XX__,
+ ________,____XX__,
+ __XXXXXX,XXX_XX__,
+ __XX____,_XX_XX__,
+ __XX____,_XX_XX__,
+ __XX____,_XX_XX__,
+ __XXXXXX,XXX_XX__,
+ __XX____,____XX__,
+ ________,____XX__,
+ ________,__XXXX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 死 code:0xCBC0 */
+static GUI_CONST_STORAGE unsigned char acCBC0[32] = {
+ ________,________,
+ _XXXXXXX,XXXXXXX_,
+ ___XX___,XX______,
+ ___XX___,XX______,
+ ___XXXXX,XX______,
+ __XX__XX,XX__XX__,
+ __XX__XX,XX_XX___,
+ _XXXX_XX,XXXX____,
+ ____XXX_,XXX_____,
+ _____XX_,XX______,
+ ____XX__,XX______,
+ ___XX___,XX___XX_,
+ __XX____,XX___XX_,
+ _XX_____,_XXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 苏 code:0xCBD5 */
+static GUI_CONST_STORAGE unsigned char acCBD5[32] = {
+ ____XX__,__XX____,
+ ____XX__,__XX____,
+ _XXXXXXX,XXXXXXX_,
+ ____XX__,__XX____,
+ ______XX,________,
+ ______XX,________,
+ __XXXXXX,XXXX____,
+ ______XX,__XX____,
+ __XX__XX,__XXXX__,
+ __XX_XX_,__XX_XX_,
+ _XX__XX_,__XX_XX_,
+ ____XX__,__XX____,
+ ___XX___,__XX____,
+ __XX____,XXX_____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 速 code:0xCBD9 */
+static GUI_CONST_STORAGE unsigned char acCBD9[32] = {
+ ________,_XX_____,
+ __XX____,_XX_____,
+ ___XXXXX,XXXXXXX_,
+ ___XX___,_XX_____,
+ ______XX,XXXXXX__,
+ ______XX,_XX_XX__,
+ _XXXX_XX,_XX_XX__,
+ ___XX_XX,XXXXXX__,
+ ___XX___,XXXX____,
+ ___XX__X,XXXXX___,
+ ___XX_XX,_XX_XX__,
+ ___XXXX_,_XX__XX_,
+ __XXXX__,_XX_____,
+ _XX__XXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 算 code:0xCBE3 */
+static GUI_CONST_STORAGE unsigned char acCBE3[32] = {
+ ___XX___,_XX_____,
+ __XXXXXX,XXXXXXX_,
+ _XX__XX_,XX_XX___,
+ ___XXXXX,XXXXX___,
+ ___XX___,___XX___,
+ ___XXXXX,XXXXX___,
+ ___XX___,___XX___,
+ ___XXXXX,XXXXX___,
+ ___XX___,___XX___,
+ ___XXXXX,XXXXX___,
+ _____XX_,_XX_____,
+ _XXXXXXX,XXXXXXX_,
+ ____XX__,_XX_____,
+ ___XX___,_XX_____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 所 code:0xCBF9 */
+static GUI_CONST_STORAGE unsigned char acCBF9[32] = {
+ _____XXX,___XXX__,
+ __XXXX__,XXXX____,
+ __XX____,XX______,
+ __XX____,XX______,
+ __XXXXXX,XX______,
+ __XX__XX,XXXXXXX_,
+ __XX__XX,XX_XX___,
+ __XX__XX,XX_XX___,
+ __XXXXXX,XX_XX___,
+ __XX____,XX_XX___,
+ __XX____,XX_XX___,
+ __XX____,XX_XX___,
+ __XX___X,X__XX___,
+ _XX___XX,___XX___,
+ ________,________,
+ ________,________,
+};
+
+/* char: 态 code:0xCCAC */
+static GUI_CONST_STORAGE unsigned char acCCAC[32] = {
+ _______X,X_______,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ _______X,X_______,
+ ______XX,XX______,
+ _____XX_,_XX_____,
+ ___XXXXX,__XXX___,
+ _XXX___X,X___XXX_,
+ ________,________,
+ _______X,X_______,
+ ____XX__,XX__XX__,
+ __XXXX__,XX___XX_,
+ __XXXX__,__XX_XX_,
+ _XX__XXX,XXXX____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 条 code:0xCCF5 */
+static GUI_CONST_STORAGE unsigned char acCCF5[32] = {
+ ____XX__,________,
+ ____XXXX,XXXXX___,
+ ___XXX__,__XX____,
+ __XX_XX_,_XX_____,
+ ______XX,XX______,
+ ____XXX_,_XXX____,
+ _XXXX__X,X__XXXX_,
+ _______X,X_______,
+ __XXXXXX,XXXXXX__,
+ _______X,X_______,
+ ____XX_X,X_XX____,
+ ___XX__X,X__XX___,
+ __XX___X,X___XX__,
+ _____XXX,X_______,
+ ________,________,
+ ________,________,
+};
+
+/* char: 停 code:0xCDA3 */
+static GUI_CONST_STORAGE unsigned char acCDA3[32] = {
+ ____XX__,_XX_____,
+ ____XXXX,XXXXXXX_,
+ ____XX__,________,
+ ___XX_XX,XXXXXX__,
+ ___XX_XX,____XX__,
+ __XXX_XX,XXXXXX__,
+ _XXXX___,________,
+ ___XXXXX,XXXXXXX_,
+ ___XXXX_,_____XX_,
+ ___XX_XX,XXXXXX__,
+ ___XX___,__XX____,
+ ___XX___,__XX____,
+ ___XX___,__XX____,
+ ___XX___,XXXX____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 通 code:0xCDA8 */
+static GUI_CONST_STORAGE unsigned char acCDA8[32] = {
+ __XX__XX,XXXXXX__,
+ ___XX___,XX_XX___,
+ ___XX___,_XXX____,
+ ______XX,XXXXXX__,
+ ______XX,_XX_XX__,
+ _XXXX_XX,_XX_XX__,
+ ___XX_XX,XXXXXX__,
+ ___XX_XX,_XX_XX__,
+ ___XX_XX,_XX_XX__,
+ ___XX_XX,XXXXXX__,
+ ___XX_XX,_XX_XX__,
+ ___XX_XX,_XXXXX__,
+ __XXXX__,________,
+ _XX__XXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 投 code:0xCDB6 */
+static GUI_CONST_STORAGE unsigned char acCDB6[32] = {
+ ___XX___,________,
+ ___XX__X,XXXXX___,
+ ___XX__X,X__XX___,
+ _XXXXXXX,X__XX___,
+ ___XX__X,X__XX___,
+ ___XX_XX,____XXX_,
+ ___XXXX_,________,
+ ___XXXXX,XXXXXX__,
+ _XXXX__X,X___XX__,
+ ___XX__X,X__XX___,
+ ___XX___,XXXX____,
+ ___XX___,_XX_____,
+ ___XX__X,XXXXX___,
+ _XXXXXXX,____XXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 图 code:0xCDBC */
+static GUI_CONST_STORAGE unsigned char acCDBC[32] = {
+ __XXXXXX,XXXXXXX_,
+ __XX____,_____XX_,
+ __XX__XX,_____XX_,
+ __XX__XX,XXXX_XX_,
+ __XX_XX_,__XX_XX_,
+ __XXXXXX,_XX__XX_,
+ __XX___X,XX___XX_,
+ __XX_XXX,_XXX_XX_,
+ __XXXX_X,XX_XXXX_,
+ __XX____,_XX__XX_,
+ __XX_XXX,_____XX_,
+ __XX___X,XX___XX_,
+ __XX____,_XX__XX_,
+ __XXXXXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 外 code:0xCDE2 */
+static GUI_CONST_STORAGE unsigned char acCDE2[32] = {
+ ___XX___,_XX_____,
+ ___XX___,_XX_____,
+ ___XX___,_XX_____,
+ ___XXXXX,_XX_____,
+ __XX__XX,_XXX____,
+ __XX__XX,_XXXX___,
+ _XXXX_XX,_XX_XX__,
+ ____XXX_,_XX__XX_,
+ _____XX_,_XX__XX_,
+ ____XX__,_XX_____,
+ ____XX__,_XX_____,
+ ___XX___,_XX_____,
+ __XX____,_XX_____,
+ _XX_____,_XX_____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 微 code:0xCEA2 */
+static GUI_CONST_STORAGE unsigned char acCEA2[32] = {
+ ___XX_XX,__XX____,
+ ___XXXXX,XXXX____,
+ __XXXXXX,XXXX____,
+ _XX_XXXX,XXXXXXX_,
+ ___XX___,_XX_XX__,
+ ___XX___,__XXXX__,
+ __XXXXXX,XXXXXX__,
+ _XXX____,__XXXX__,
+ __XX_XXX,X_XXXX__,
+ __XX_XXX,X__XX___,
+ __XX_XXX,X__XX___,
+ __XX_XXX,XXXXXX__,
+ __XX_XXX,X_XXXX__,
+ __XXXX__,_XX__XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 围 code:0xCEA7 */
+static GUI_CONST_STORAGE unsigned char acCEA7[32] = {
+ __XXXXXX,XXXXXXX_,
+ __XX___X,X____XX_,
+ __XX___X,X____XX_,
+ __XXXXXX,XXXXXXX_,
+ __XX___X,X____XX_,
+ __XX_XXX,XXXX_XX_,
+ __XX___X,X____XX_,
+ __XXXXXX,XXXXXXX_,
+ __XX___X,X__XXXX_,
+ __XX___X,X__XXXX_,
+ __XX___X,XXXX_XX_,
+ __XX___X,X____XX_,
+ __XXXXXX,XXXXXXX_,
+ __XX____,_____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 为 code:0xCEAA */
+static GUI_CONST_STORAGE unsigned char acCEAA[32] = {
+ ______XX,________,
+ ___XX_XX,________,
+ ____XXXX,________,
+ ______XX,________,
+ _XXXXXXX,XXXXXX__,
+ ______XX,____XX__,
+ _____XX_,____XX__,
+ _____XX_,XX__XX__,
+ _____XX_,_XX_XX__,
+ ____XX__,_XX_XX__,
+ ____XX__,____XX__,
+ ___XX___,____XX__,
+ __XX____,___XX___,
+ _XX_____,_XXX____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 未 code:0xCEB4 */
+static GUI_CONST_STORAGE unsigned char acCEB4[32] = {
+ _______X,X_______,
+ _______X,X_______,
+ __XXXXXX,XXXXXX__,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ ______XX,XX______,
+ _____XXX,XXX_____,
+ ____XX_X,X_XX____,
+ ___XX__X,X__XX___,
+ _XXX___X,X___XXX_,
+ _______X,X_______,
+ _______X,X_______,
+ ________,________,
+ ________,________,
+};
+
+/* char: 位 code:0xCEBB */
+static GUI_CONST_STORAGE unsigned char acCEBB[32] = {
+ ____XX__,XX______,
+ ____XX__,_XX_____,
+ ____XX__,_XX_____,
+ ___XX_XX,XXXXXX__,
+ ___XX___,________,
+ __XXX___,___XX___,
+ _XXXX_XX,___XX___,
+ ___XX_XX,___XX___,
+ ___XX__X,X__XX___,
+ ___XX__X,X_XX____,
+ ___XX__X,X_XX____,
+ ___XX___,__XX____,
+ ___XX___,_XX_____,
+ ___XXXXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 温 code:0xCEC2 */
+static GUI_CONST_STORAGE unsigned char acCEC2[32] = {
+ ______XX,XXXXX___,
+ __XX__XX,___XX___,
+ ___XX_XX,___XX___,
+ ______XX,XXXXX___,
+ _XX___XX,___XX___,
+ __XX__XX,___XX___,
+ ______XX,XXXXX___,
+ ___XX___,________,
+ ___XXXXX,XXXXXX__,
+ __XX_XXX,X_XXXX__,
+ __XX_XXX,X_XXXX__,
+ _XX__XXX,X_XXXX__,
+ _XX__XXX,X_XXXX__,
+ ____XXXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 文 code:0xCEC4 */
+static GUI_CONST_STORAGE unsigned char acCEC4[32] = {
+ ______XX,________,
+ _______X,X_______,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ ____XX__,__XX____,
+ ____XX__,__XX____,
+ _____XX_,_XX_____,
+ _____XX_,_XX_____,
+ ______XX,XX______,
+ _______X,X_______,
+ ______XX,XX______,
+ _____XX_,_XX_____,
+ ___XXX__,__XXX___,
+ _XXX____,____XXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 务 code:0xCEF1 */
+static GUI_CONST_STORAGE unsigned char acCEF1[32] = {
+ _____XX_,________,
+ ____XXXX,XXXXX___,
+ ___XXX__,__XX____,
+ __XX_XX_,_XX_____,
+ ______XX,XX______,
+ ____XXX_,_XXX____,
+ _XXXX___,___XXXX_,
+ ______XX,________,
+ __XXXXXX,XXXXX___,
+ ______XX,___XX___,
+ _____XX_,___XX___,
+ ____XX__,___XX___,
+ ___XX___,___XX___,
+ __XX____,_XXX____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 息 code:0xCFA2 */
+static GUI_CONST_STORAGE unsigned char acCFA2[32] = {
+ ______XX,________,
+ _____XX_,________,
+ ___XXXXX,XXXXX___,
+ ___XX___,___XX___,
+ ___XXXXX,XXXXX___,
+ ___XX___,___XX___,
+ ___XXXXX,XXXXX___,
+ ___XX___,___XX___,
+ ___XXXXX,XXXXX___,
+ _______X,X_______,
+ ____XX__,XX__XX__,
+ __XXXX__,XX___XX_,
+ __XXXX__,__XX_XX_,
+ _XX__XXX,XXXX____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 系 code:0xCFB5 */
+static GUI_CONST_STORAGE unsigned char acCFB5[32] = {
+ ________,XXXXX___,
+ __XXXXXX,X_______,
+ ______XX,________,
+ _____XX_,__XX____,
+ ____XX__,_XX_____,
+ ___XXXXX,XX______,
+ ______XX,__XX____,
+ ____XXX_,___XX___,
+ __XXXXXX,XXXXXX__,
+ _______X,X___XX__,
+ ____XX_X,X_XX____,
+ ___XX__X,X__XX___,
+ __XX___X,X___XX__,
+ _____XXX,X_______,
+ ________,________,
+ ________,________,
+};
+
+/* char: 下 code:0xCFC2 */
+static GUI_CONST_STORAGE unsigned char acCFC2[32] = {
+ ________,________,
+ _XXXXXXX,XXXXXXX_,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,_XX_____,
+ ______XX,__XX____,
+ ______XX,___XX___,
+ ______XX,___XX___,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ________,________,
+ ________,________,
+};
+
+/* char: 显 code:0xCFD4 */
+static GUI_CONST_STORAGE unsigned char acCFD4[32] = {
+ ___XXXXX,XXXXX___,
+ ___XX___,___XX___,
+ ___XX___,___XX___,
+ ___XXXXX,XXXXX___,
+ ___XX___,___XX___,
+ ___XX___,___XX___,
+ ___XXXXX,XXXXX___,
+ _____XX_,_XX_____,
+ __XX_XX_,_XX_XX__,
+ ___XXXX_,_XX_XX__,
+ ___XXXX_,_XXXX___,
+ _____XX_,_XX_____,
+ _____XX_,_XX_____,
+ _XXXXXXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 限 code:0xCFDE */
+static GUI_CONST_STORAGE unsigned char acCFDE[32] = {
+ ________,________,
+ __XXXXXX,XXXXXX__,
+ __XX_XXX,X___XX__,
+ __XX_XXX,X___XX__,
+ __XXXX_X,XXXXXX__,
+ __XXXX_X,X___XX__,
+ __XX_XXX,X___XX__,
+ __XX_XXX,XXXXXX__,
+ __XX_XXX,X_XX_XX_,
+ __XX_XXX,X_XXXX__,
+ __XXXX_X,X__XX___,
+ __XX___X,XXXXX___,
+ __XX___X,XX__XX__,
+ __XX___X,X____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 线 code:0xCFDF */
+static GUI_CONST_STORAGE unsigned char acCFDF[32] = {
+ ___XX___,_XXXX___,
+ ___XX___,_XX_XX__,
+ __XX_XX_,_XX_____,
+ __XX_XX_,_XXXXX__,
+ _XXXXX_X,XXX_____,
+ ____XX__,_XX_____,
+ ___XX___,_XXXXXX_,
+ __XX___X,XXXX____,
+ _XXXXXX_,_XX_XX__,
+ ________,_XXXX___,
+ ________,__XX_XX_,
+ ____XXX_,_XXXXXX_,
+ _XXXX__X,XX__XXX_,
+ ________,_____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 相 code:0xCFE0 */
+static GUI_CONST_STORAGE unsigned char acCFE0[32] = {
+ ____XX__,________,
+ ____XX__,XXXXXXX_,
+ ____XX__,XX___XX_,
+ _XXXXXXX,XX___XX_,
+ ____XX__,XX___XX_,
+ ___XXX__,XXXXXXX_,
+ ___XXXX_,XX___XX_,
+ __XXXXXX,XX___XX_,
+ __XXXX__,XXXXXXX_,
+ _XX_XX__,XX___XX_,
+ ____XX__,XX___XX_,
+ ____XX__,XX___XX_,
+ ____XX__,XXXXXXX_,
+ ____XX__,XX___XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 项 code:0xCFEE */
+static GUI_CONST_STORAGE unsigned char acCFEE[32] = {
+ ________,________,
+ ______XX,XXXXXXX_,
+ _XXXXX__,_XX_____,
+ ___XX___,XX______,
+ ___XX_XX,XXXXXX__,
+ ___XX_XX,____XX__,
+ ___XX_XX,_XX_XX__,
+ ___XX_XX,_XX_XX__,
+ ___XX_XX,_XX_XX__,
+ ___XXXXX,XX__XX__,
+ _XXX____,XXXX____,
+ _______X,X__XX___,
+ ______XX,____XX__,
+ _____XX_,____XX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 向 code:0xCFF2 */
+static GUI_CONST_STORAGE unsigned char acCFF2[32] = {
+ ______XX,________,
+ _____XX_,________,
+ __XXXXXX,XXXXXXX_,
+ __XX____,_____XX_,
+ __XX____,_____XX_,
+ __XX_XXX,XXXX_XX_,
+ __XX_XX_,__XX_XX_,
+ __XX_XX_,__XX_XX_,
+ __XX_XX_,__XX_XX_,
+ __XX_XXX,XXXX_XX_,
+ __XX____,_____XX_,
+ __XX____,_____XX_,
+ __XX____,_____XX_,
+ __XX____,___XXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 消 code:0xCFFB */
+static GUI_CONST_STORAGE unsigned char acCFFB[32] = {
+ ________,_XX_____,
+ __XX__XX,_XX_XX__,
+ ___XX__X,XXXXX___,
+ ____XX__,_XX_____,
+ ______XX,XXXXXX__,
+ _XX___XX,____XX__,
+ __XX__XX,____XX__,
+ ____XXXX,XXXXXX__,
+ ____XXXX,____XX__,
+ ___XX_XX,____XX__,
+ ___XX_XX,XXXXXX__,
+ __XX__XX,____XX__,
+ __XX__XX,____XX__,
+ ______XX,__XXXX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 小 code:0xD0A1 */
+static GUI_CONST_STORAGE unsigned char acD0A1[32] = {
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ ____XX_X,X_XX____,
+ ____XX_X,X__XX___,
+ ___XX__X,X___XX__,
+ __XX___X,X____XX_,
+ _XX____X,X____XX_,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _____XXX,X_______,
+ ________,________,
+ ________,________,
+};
+
+/* char: 校 code:0xD0A3 */
+static GUI_CONST_STORAGE unsigned char acD0A3[32] = {
+ ____XX__,_XX_____,
+ ____XX__,__XX____,
+ ____XX_X,XXXXXXX_,
+ _XXXXXXX,________,
+ ____XX__,_XXXX___,
+ ___XXX__,XX__XX__,
+ ___XXXXX,X____XX_,
+ __XXXXXX,XX__XX__,
+ __XXXX__,XX__XX__,
+ _XX_XX__,_XXXX___,
+ ____XX__,__XX____,
+ ____XX__,_XXXX___,
+ ____XX__,XX__XX__,
+ ____XX_X,X____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 写 code:0xD0B4 */
+static GUI_CONST_STORAGE unsigned char acD0B4[32] = {
+ ________,________,
+ _XXXXXXX,XXXXXXX_,
+ _XX_____,_____XX_,
+ ____XX__,________,
+ ____XXXX,XXXXX___,
+ ____XX__,________,
+ ___XX___,________,
+ ___XXXXX,XXXXXX__,
+ ________,____XX__,
+ ________,____XX__,
+ _XXXXXXX,XXXXXX__,
+ ________,____XX__,
+ ________,____XX__,
+ ________,__XXX___,
+ ________,________,
+ ________,________,
+};
+
+/* char: 新 code:0xD0C2 */
+static GUI_CONST_STORAGE unsigned char acD0C2[32] = {
+ ___XX___,____XXX_,
+ ____XX__,_XXXX___,
+ _XXXXXXX,XXX_____,
+ __XX__XX,_XX_____,
+ ___XXXX_,_XX_____,
+ _XXXXXXX,XXXXXXX_,
+ ________,_XX_XX__,
+ ____XX__,_XX_XX__,
+ _XXXXXXX,XXX_XX__,
+ ____XX__,_XX_XX__,
+ __XXXXXX,_XX_XX__,
+ _XX_XX_X,XXX_XX__,
+ ____XX__,XX__XX__,
+ __XXXX_X,X___XX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 信 code:0xD0C5 */
+static GUI_CONST_STORAGE unsigned char acD0C5[32] = {
+ ____XX__,XX______,
+ ____XX__,_XX_____,
+ ___XXXXX,XXXXXXX_,
+ ___XX___,________,
+ __XXX_XX,XXXXXX__,
+ _XXXX___,________,
+ ___XX_XX,XXXXXX__,
+ ___XX___,________,
+ ___XX_XX,XXXXXX__,
+ ___XX_XX,____XX__,
+ ___XX_XX,____XX__,
+ ___XX_XX,____XX__,
+ ___XX_XX,XXXXXX__,
+ ___XX_XX,____XX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 型 code:0xD0CD */
+static GUI_CONST_STORAGE unsigned char acD0CD[32] = {
+ ________,____XX__,
+ __XXXXXX,XXX_XX__,
+ ___XX_XX,_XX_XX__,
+ ___XX_XX,_XX_XX__,
+ _XXXXXXX,XXX_XX__,
+ ___XX_XX,_XX_XX__,
+ ___XX_XX,____XX__,
+ __XX__XX,____XX__,
+ _XX____X,X_XXXX__,
+ _______X,X_______,
+ __XXXXXX,XXXXXX__,
+ _______X,X_______,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 行 code:0xD0D0 */
+static GUI_CONST_STORAGE unsigned char acD0D0[32] = {
+ ____XX__,________,
+ ___XX__X,XXXXXX__,
+ __XX____,________,
+ _XX_XX__,________,
+ ____XX__,________,
+ ___XX_XX,XXXXXXX_,
+ __XXX___,__XX____,
+ _XXXX___,__XX____,
+ ___XX___,__XX____,
+ ___XX___,__XX____,
+ ___XX___,__XX____,
+ ___XX___,__XX____,
+ ___XX___,__XX____,
+ ___XX___,XXXX____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 序 code:0xD0F2 */
+static GUI_CONST_STORAGE unsigned char acD0F2[32] = {
+ _______X,X_______,
+ ________,XX______,
+ ___XXXXX,XXXXXXX_,
+ ___XX___,________,
+ ___XXXXX,XXXXXX__,
+ ___XX___,___XX___,
+ ___XX__X,X_XX____,
+ ___XX___,XXX_____,
+ ___XXXXX,XXXXXXX_,
+ ___XX___,_XX__XX_,
+ ___XX___,_XX_XX__,
+ __XX____,_XX_____,
+ __XX____,_XX_____,
+ _XX____X,XXX_____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 选 code:0xD1A1 */
+static GUI_CONST_STORAGE unsigned char acD1A1[32] = {
+ ________,_XX_____,
+ __XX__XX,_XX_____,
+ ___XX_XX,_XX_____,
+ ___XX_XX,XXXXXX__,
+ _____XX_,_XX_____,
+ ________,_XX_____,
+ _XXXXXXX,XXXXXXX_,
+ ___XX___,XXXX____,
+ ___XX___,XXXX____,
+ ___XX__X,X_XX____,
+ ___XX_XX,__XX_XX_,
+ ___XXXX_,___XXXX_,
+ __XXXX__,________,
+ _XX__XXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 讯 code:0xD1B6 */
+static GUI_CONST_STORAGE unsigned char acD1B6[32] = {
+ __XX____,________,
+ ___XXXXX,XXXXX___,
+ ___XX__X,X__XX___,
+ _______X,X__XX___,
+ _______X,X__XX___,
+ _XXXX__X,X__XX___,
+ ___XXXXX,XXXXX___,
+ ___XX__X,X__XX___,
+ ___XX__X,X__XX___,
+ ___XX__X,X__XXXX_,
+ ___XXXXX,X__XXXX_,
+ ___XXX_X,X__XXXX_,
+ ___XX__X,X___XXX_,
+ _______X,X____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 压 code:0xD1B9 */
+static GUI_CONST_STORAGE unsigned char acD1B9[32] = {
+ ________,________,
+ ___XXXXX,XXXXXXX_,
+ ___XX___,________,
+ ___XX___,XX______,
+ ___XX___,XX______,
+ ___XX___,XX______,
+ ___XXXXX,XXXXXX__,
+ ___XX___,XX______,
+ ___XX___,XX______,
+ ___XX___,XX_XX___,
+ ___XX___,XX__XX__,
+ __XX____,XX__XX__,
+ __XX____,XX______,
+ _XX_XXXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 牙 code:0xD1C0 */
+static GUI_CONST_STORAGE unsigned char acD1C0[32] = {
+ ________,________,
+ __XXXXXX,XXXXXX__,
+ ________,__XX____,
+ ____XX__,__XX____,
+ ____XX__,__XX____,
+ ___XX___,__XX____,
+ ___XXXXX,XXXXXXX_,
+ ________,XXXX____,
+ _______X,X_XX____,
+ ______XX,__XX____,
+ _____XX_,__XX____,
+ ___XXX__,__XX____,
+ _XXX____,__XX____,
+ ________,XXXX____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 言 code:0xD1D4 */
+static GUI_CONST_STORAGE unsigned char acD1D4[32] = {
+ ______XX,________,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ ________,________,
+ ___XXXXX,XXXXX___,
+ ________,________,
+ ___XXXXX,XXXXX___,
+ ________,________,
+ ___XXXXX,XXXXX___,
+ ___XX___,___XX___,
+ ___XX___,___XX___,
+ ___XX___,___XX___,
+ ___XXXXX,XXXXX___,
+ ___XX___,___XX___,
+ ________,________,
+ ________,________,
+};
+
+/* char: 要 code:0xD2AA */
+static GUI_CONST_STORAGE unsigned char acD2AA[32] = {
+ _XXXXXXX,XXXXXXX_,
+ _____XX_,_XX_____,
+ _____XX_,_XX_____,
+ __XXXXXX,XXXXXX__,
+ __XX_XX_,_XX_XX__,
+ __XX_XX_,_XX_XX__,
+ __XXXXXX,XXXXXX__,
+ ______XX,________,
+ _XXXXXXX,XXXXXXX_,
+ _____XX_,__XX____,
+ ____XXX_,_XX_____,
+ ______XX,XX______,
+ ____XXX_,_XXXX___,
+ _XXXX___,____XX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 页 code:0xD2B3 */
+static GUI_CONST_STORAGE unsigned char acD2B3[32] = {
+ ________,________,
+ _XXXXXXX,XXXXXXX_,
+ _______X,X_______,
+ ______XX,________,
+ __XXXXXX,XXXXXX__,
+ __XX____,____XX__,
+ __XX___X,X___XX__,
+ __XX___X,X___XX__,
+ __XX___X,X___XX__,
+ __XX___X,X___XX__,
+ __XX__XX,____XX__,
+ _____XX_,XXXX____,
+ ___XXX__,___XXX__,
+ _XXX____,_____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 一 code:0xD2BB */
+static GUI_CONST_STORAGE unsigned char acD2BB[32] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _XXXXXXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+};
+
+/* char: 移 code:0xD2C6 */
+static GUI_CONST_STORAGE unsigned char acD2C6[32] = {
+ ________,_XX_____,
+ ____XXX_,_XX_____,
+ _XXXX___,XXXXX___,
+ ___XX__X,X__XX___,
+ ___XX_XX,XXXX____,
+ _XXXXXX_,_XX_____,
+ ___XX___,XX_XX___,
+ ___XXXXX,X_XX____,
+ __XXXXX_,_XXXXXX_,
+ __XXX___,XX__XX__,
+ _XXXX_XX,XXXXX___,
+ ___XX___,__XX____,
+ ___XX___,XXX_____,
+ ___XX_XX,X_______,
+ ________,________,
+ ________,________,
+};
+
+/* char: 仪 code:0xD2C7 */
+static GUI_CONST_STORAGE unsigned char acD2C7[32] = {
+ ____XX__,XX______,
+ ____XX__,_XX_____,
+ ____XX__,_XX_XX__,
+ ___XX_XX,____XX__,
+ ___XX_XX,____XX__,
+ __XXX__X,X__XX___,
+ _XXXX__X,X__XX___,
+ ___XX___,XXXX____,
+ ___XX___,XXXX____,
+ ___XX___,_XX_____,
+ ___XX___,XXXX____,
+ ___XX__X,X__XX___,
+ ___XX_XX,____XX__,
+ ___XXXX_,_____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 已 code:0xD2D1 */
+static GUI_CONST_STORAGE unsigned char acD2D1[32] = {
+ ________,________,
+ __XXXXXX,XXXXXX__,
+ ________,____XX__,
+ ________,____XX__,
+ __XX____,____XX__,
+ __XX____,____XX__,
+ __XXXXXX,XXXXXX__,
+ __XX____,________,
+ __XX____,________,
+ __XX____,________,
+ __XX____,________,
+ __XX____,_____XX_,
+ __XX____,_____XX_,
+ ___XXXXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 益 code:0xD2E6 */
+static GUI_CONST_STORAGE unsigned char acD2E6[32] = {
+ ___XX___,___XX___,
+ ____XX__,__XX____,
+ ________,________,
+ _XXXXXXX,XXXXXXX_,
+ ________,________,
+ ____XX__,__XX____,
+ ___XX___,___XX___,
+ __XX____,____XX__,
+ ___XXXXX,XXXXX___,
+ ___XX_XX,XX_XX___,
+ ___XX_XX,XX_XX___,
+ ___XX_XX,XX_XX___,
+ ___XX_XX,XX_XX___,
+ _XXXXXXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 英 code:0xD3A2 */
+static GUI_CONST_STORAGE unsigned char acD3A2[32] = {
+ _____XX_,_XX_____,
+ _____XX_,_XX_____,
+ _XXXXXXX,XXXXXXX_,
+ _____XX_,_XX_____,
+ _______X,X_______,
+ ___XXXXX,XXXXX___,
+ ___XX__X,X__XX___,
+ ___XX__X,X__XX___,
+ ___XX__X,X__XX___,
+ _XXXXXXX,XXXXXXX_,
+ ______XX,XX______,
+ _____XX_,_XX_____,
+ ___XXX__,__XXX___,
+ _XXX____,____XXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 迎 code:0xD3AD */
+static GUI_CONST_STORAGE unsigned char acD3AD[32] = {
+ ________,________,
+ __XX___X,X_______,
+ ___XXXXX,_XXXXXX_,
+ ___XXXX_,_XX__XX_,
+ _____XX_,_XX__XX_,
+ _____XX_,_XX__XX_,
+ _XXXXXX_,_XX__XX_,
+ ___XXXX_,_XX__XX_,
+ ___XXXXX,XXX__XX_,
+ ___XXXXX,_XXXXXX_,
+ ___XXXX_,_XX_____,
+ ___XX___,_XX_____,
+ __XXXX__,_XX_____,
+ _XX__XXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 硬 code:0xD3B2 */
+static GUI_CONST_STORAGE unsigned char acD3B2[32] = {
+ ________,________,
+ _XXXXXXX,XXXXXXX_,
+ ___XX___,__XX____,
+ ___XX__X,XXXXXXX_,
+ __XX___X,X_XX_XX_,
+ __XXXXXX,X_XX_XX_,
+ _XXX_XXX,XXXXXXX_,
+ __XX_XXX,X_XX_XX_,
+ __XX_XXX,X_XX_XX_,
+ __XX_XXX,XXXXXXX_,
+ __XXXXX_,XXXX____,
+ __XX_XX_,_XX_____,
+ ________,XXXXX___,
+ ______XX,X___XXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 用 code:0xD3C3 */
+static GUI_CONST_STORAGE unsigned char acD3C3[32] = {
+ ________,________,
+ ___XXXXX,XXXXXXX_,
+ ___XX___,XX___XX_,
+ ___XX___,XX___XX_,
+ ___XX___,XX___XX_,
+ ___XXXXX,XXXXXXX_,
+ ___XX___,XX___XX_,
+ ___XX___,XX___XX_,
+ ___XXXXX,XXXXXXX_,
+ ___XX___,XX___XX_,
+ ___XX___,XX___XX_,
+ __XX____,XX___XX_,
+ __XX____,XX___XX_,
+ _XX_____,___XXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 有 code:0xD3D0 */
+static GUI_CONST_STORAGE unsigned char acD3D0[32] = {
+ ______XX,________,
+ ______XX,________,
+ _XXXXXXX,XXXXXXX_,
+ _____XX_,________,
+ ____XXXX,XXXXX___,
+ ___XXX__,___XX___,
+ __XXXX__,___XX___,
+ _XX_XXXX,XXXXX___,
+ ____XX__,___XX___,
+ ____XX__,___XX___,
+ ____XXXX,XXXXX___,
+ ____XX__,___XX___,
+ ____XX__,___XX___,
+ ____XX__,_XXXX___,
+ ________,________,
+ ________,________,
+};
+
+/* char: 语 code:0xD3EF */
+static GUI_CONST_STORAGE unsigned char acD3EF[32] = {
+ __XX_XXX,XXXXXXX_,
+ ___XX___,XX______,
+ ___XX___,XX______,
+ ______XX,XXXXXX__,
+ _______X,X___XX__,
+ _XXXX__X,X___XX__,
+ ___XXXXX,XXXXXXX_,
+ ___XX___,________,
+ ___XX___,________,
+ ___XX_XX,XXXXXX__,
+ ___XXXXX,____XX__,
+ ___XXXXX,____XX__,
+ ___XX_XX,XXXXXX__,
+ ______XX,____XX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 域 code:0xD3F2 */
+static GUI_CONST_STORAGE unsigned char acD3F2[32] = {
+ ___XX___,__XX____,
+ ___XX___,__XXXX__,
+ ___XX___,__XX_XX_,
+ ___XX_XX,XXXXXXX_,
+ _XXXXX__,__XX____,
+ ___XX_XX,XXXX_XX_,
+ ___XX_XX,XXXX_XX_,
+ ___XX_XX,XXXX_XX_,
+ ___XX_XX,XXXXXX__,
+ ___XX___,__XXXX__,
+ ___XXX__,XX_XXXX_,
+ _XXX__XX,X_XXXXX_,
+ ________,_XX_XXX_,
+ ________,XX___XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 源 code:0xD4B4 */
+static GUI_CONST_STORAGE unsigned char acD4B4[32] = {
+ ________,________,
+ __XX__XX,XXXXXXX_,
+ ___XX_XX,__XX____,
+ ____XXXX,_XX_____,
+ ______XX,XXXXXX__,
+ _XX___XX,XX__XX__,
+ __XX__XX,XXXXXX__,
+ ____XXXX,XX__XX__,
+ ____XXXX,XXXXXX__,
+ ___XX_XX,__XX____,
+ ___XX_XX,XXXXXX__,
+ __XX_XX_,XXXX_XX_,
+ __XX_XXX,X_XX_XX_,
+ ____XX__,_XXX____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 运 code:0xD4CB */
+static GUI_CONST_STORAGE unsigned char acD4CB[32] = {
+ ________,________,
+ __XX__XX,XXXXX___,
+ ___XX___,________,
+ ___XX___,________,
+ ________,________,
+ _____XXX,XXXXXXX_,
+ _XXXX___,XX______,
+ ___XX___,XX______,
+ ___XX__X,X_XX____,
+ ___XX_XX,___XX___,
+ ___XXXXX,XXXXXX__,
+ ___XX___,____XX__,
+ __XXXX__,________,
+ _XX__XXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 在 code:0xD4DA */
+static GUI_CONST_STORAGE unsigned char acD4DA[32] = {
+ ______XX,________,
+ ______XX,________,
+ _XXXXXXX,XXXXXXX_,
+ _____XX_,________,
+ ____XX__,_XX_____,
+ ____XX__,_XX_____,
+ ___XXX__,_XX_____,
+ __XXXXXX,XXXXXX__,
+ _XX_XX__,_XX_____,
+ ____XX__,_XX_____,
+ ____XX__,_XX_____,
+ ____XX__,_XX_____,
+ ____XXXX,XXXXXXX_,
+ ____XX__,________,
+ ________,________,
+ ________,________,
+};
+
+/* char: 造 code:0xD4EC */
+static GUI_CONST_STORAGE unsigned char acD4EC[32] = {
+ ________,_XX_____,
+ __XX__XX,_XX_____,
+ ___XX_XX,XXXXXX__,
+ ___XXXX_,_XX_____,
+ ________,_XX_____,
+ _____XXX,XXXXXXX_,
+ _XXXX___,________,
+ ___XX___,________,
+ ___XX_XX,XXXXXX__,
+ ___XX_XX,____XX__,
+ ___XX_XX,____XX__,
+ ___XX_XX,XXXXXX__,
+ __XXXX__,________,
+ _XX__XXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 择 code:0xD4F1 */
+static GUI_CONST_STORAGE unsigned char acD4F1[32] = {
+ ___XX___,________,
+ ___XX_XX,XXXXXX__,
+ ___XX__X,X__XX___,
+ _XXXXXX_,XXXX____,
+ ___XX___,_XX_____,
+ ___XX___,XXXXX___,
+ ___XX_XX,X___XXX_,
+ ___XXX__,_XX_____,
+ _XXXX__X,XXXXX___,
+ ___XX___,_XX_____,
+ ___XX___,_XX_____,
+ ___XXXXX,XXXXXXX_,
+ ___XX___,_XX_____,
+ _XXXX___,_XX_____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 增 code:0xD4F6 */
+static GUI_CONST_STORAGE unsigned char acD4F6[32] = {
+ ___XX_XX,____XX__,
+ ___XX__X,X__XX___,
+ ___XXXXX,XXXXXXX_,
+ ___XXXX_,_XX__XX_,
+ _XXXXXXX,XXXXXXX_,
+ ___XXXX_,_XX__XX_,
+ ___XXXXX,XXXXXXX_,
+ ___XX___,________,
+ ___XX_XX,XXXXXX__,
+ ___XX_XX,____XX__,
+ ___XXXXX,XXXXXX__,
+ _XXX__XX,____XX__,
+ ______XX,XXXXXX__,
+ ______XX,____XX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 障 code:0xD5CF */
+static GUI_CONST_STORAGE unsigned char acD5CF[32] = {
+ ________,_XX_____,
+ _XXXXXXX,XXXXXX__,
+ _XX_XX_X,X__XX___,
+ _XX_XXXX,XXXXXXX_,
+ _XXXX___,________,
+ _XXXX_XX,XXXXXX__,
+ _XX_XXXX,____XX__,
+ _XX_XXXX,XXXXXX__,
+ _XX_XXXX,____XX__,
+ _XX_XXXX,XXXXXX__,
+ _XXXX___,_XX_____,
+ _XX__XXX,XXXXXXX_,
+ _XX_____,_XX_____,
+ _XX_____,_XX_____,
+ ________,________,
+ ________,________,
+};
+
+/* char: 诊 code:0xD5EF */
+static GUI_CONST_STORAGE unsigned char acD5EF[32] = {
+ __XX____,_XX_____,
+ ___XX___,_XX_____,
+ ___XX___,XXXX____,
+ _______X,X__XX___,
+ _____XXX,_XX_XXX_,
+ _XXXX___,XX______,
+ ___XX__X,X_______,
+ ___XX_XX,__XX____,
+ ___XX___,_XX_____,
+ ___XX___,XX__XX__,
+ ___XX_XX,X__XX___,
+ ___XXX__,__XX____,
+ ___XX___,XXX_____,
+ ______XX,X_______,
+ ________,________,
+ ________,________,
+};
+
+/* char: 整 code:0xD5FB */
+static GUI_CONST_STORAGE unsigned char acD5FB[32] = {
+ ____XX__,_XX_____,
+ _XXXXXXX,XXX_____,
+ ____XX__,_XXXXXX_,
+ __XXXXXX,XX__XX__,
+ __XXXXXX,XXXXX___,
+ __XXXXXX,__XX____,
+ ___XXXX_,_XXXX___,
+ __XXXXXX,XX__XXX_,
+ _XX_XX__,________,
+ __XXXXXX,XXXXXX__,
+ _______X,X_______,
+ ____XX_X,XXXXX___,
+ ____XX_X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 正 code:0xD5FD */
+static GUI_CONST_STORAGE unsigned char acD5FD[32] = {
+ ________,________,
+ __XXXXXX,XXXXXX__,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ ___XX__X,X_______,
+ ___XX__X,X_______,
+ ___XX__X,XXXXX___,
+ ___XX__X,X_______,
+ ___XX__X,X_______,
+ ___XX__X,X_______,
+ ___XX__X,X_______,
+ ___XX__X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 知 code:0xD6AA */
+static GUI_CONST_STORAGE unsigned char acD6AA[32] = {
+ ___XX___,________,
+ ___XX___,________,
+ ___XX___,_XXXXXX_,
+ __XXXXXX,_XX__XX_,
+ __XXXX__,_XX__XX_,
+ _XX_XX__,_XX__XX_,
+ ____XX__,_XX__XX_,
+ _XXXXXXX,XXX__XX_,
+ ____XX__,_XX__XX_,
+ ____XX__,_XX__XX_,
+ ___XXXX_,_XX__XX_,
+ ___XX_XX,_XXXXXX_,
+ __XX__XX,_XX__XX_,
+ _XX_____,________,
+ ________,________,
+ ________,________,
+};
+
+/* char: 直 code:0xD6B1 */
+static GUI_CONST_STORAGE unsigned char acD6B1[32] = {
+ _______X,X_______,
+ _______X,X_______,
+ __XXXXXX,XXXXXX__,
+ _______X,X_______,
+ ___XXXXX,XXXXX___,
+ ___XX___,___XX___,
+ ___XXXXX,XXXXX___,
+ ___XX___,___XX___,
+ ___XXXXX,XXXXX___,
+ ___XX___,___XX___,
+ ___XXXXX,XXXXX___,
+ ___XX___,___XX___,
+ ___XX___,___XX___,
+ _XXXXXXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 执 code:0xD6B4 */
+static GUI_CONST_STORAGE unsigned char acD6B4[32] = {
+ ___XX___,XX______,
+ ___XX___,XX______,
+ ___XX___,XX______,
+ _XXXXXXX,XXXXX___,
+ ___XX___,XX_XX___,
+ ___XX___,XX_XX___,
+ ___XX_XX,XX_XX___,
+ ___XXX_X,XX_XX___,
+ _XXXX___,XX_XX___,
+ ___XX___,XX_XX___,
+ ___XX__X,XXXXX___,
+ ___XX__X,XXXXXXX_,
+ ___XX_XX,____XXX_,
+ _XXXXXX_,_____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 址 code:0xD6B7 */
+static GUI_CONST_STORAGE unsigned char acD6B7[32] = {
+ ___XX___,__XX____,
+ ___XX___,__XX____,
+ ___XX___,__XX____,
+ ___XX___,__XX____,
+ _XXXXXXX,X_XX____,
+ ___XX__X,X_XXXXX_,
+ ___XX__X,X_XX____,
+ ___XX__X,X_XX____,
+ ___XX__X,X_XX____,
+ ___XX__X,X_XX____,
+ ___XXXXX,X_XX____,
+ _XXXX__X,X_XX____,
+ _______X,X_XX____,
+ _____XXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 指 code:0xD6B8 */
+static GUI_CONST_STORAGE unsigned char acD6B8[32] = {
+ ___XX__X,X_______,
+ ___XX__X,X__XXX__,
+ ___XX__X,XXXX____,
+ _XXXXXXX,X____XX_,
+ ___XX__X,X____XX_,
+ ___XX___,XXXXXXX_,
+ ___XXXX_,________,
+ ___XXX_X,XXXXXX__,
+ _XXXX__X,X___XX__,
+ ___XX__X,X___XX__,
+ ___XX__X,XXXXXX__,
+ ___XX__X,X___XX__,
+ ___XX__X,X___XX__,
+ _XXXX__X,XXXXXX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 置 code:0xD6C3 */
+static GUI_CONST_STORAGE unsigned char acD6C3[32] = {
+ __XXXXXX,XXXXXX__,
+ __XX_XX_,_XX_XX__,
+ __XX_XX_,_XX_XX__,
+ __XXXXXX,XXXXXX__,
+ _______X,X_______,
+ __XXXXXX,XXXXXX__,
+ _______X,X_______,
+ ___XXXXX,XXXXX___,
+ ___XX___,___XX___,
+ ___XX___,___XX___,
+ ___XX__X,X__XX___,
+ ___XX__X,X__XX___,
+ ___XX__X,X__XX___,
+ _XXXXXXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 制 code:0xD6C6 */
+static GUI_CONST_STORAGE unsigned char acD6C6[32] = {
+ _____XX_,____XX__,
+ __XX_XX_,____XX__,
+ __XXXXXX,XXXXXX__,
+ _XX__XX_,__XXXX__,
+ _____XX_,__XXXX__,
+ _XXXXXXX,XXXXXX__,
+ _____XX_,__XXXX__,
+ _____XX_,__XXXX__,
+ __XXXXXX,XXXXXX__,
+ __XX_XX_,XXXXXX__,
+ __XX_XX_,XX__XX__,
+ __XX_XX_,XX__XX__,
+ __XX_XXX,XX__XX__,
+ _____XX_,__XXXX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 智 code:0xD6C7 */
+static GUI_CONST_STORAGE unsigned char acD6C7[32] = {
+ __XX____,________,
+ __XXXXXX,XXXXXX__,
+ _XX_XX__,XX__XX__,
+ ____XX__,XX__XX__,
+ _XXXXXXX,XX__XX__,
+ ___XXXX_,XX__XX__,
+ __XX__XX,XXXXXX__,
+ _XX_____,________,
+ ___XXXXX,XXXXX___,
+ ___XX___,___XX___,
+ ___XXXXX,XXXXX___,
+ ___XX___,___XX___,
+ ___XXXXX,XXXXX___,
+ ___XX___,___XX___,
+ ________,________,
+ ________,________,
+};
+
+/* char: 中 code:0xD6D0 */
+static GUI_CONST_STORAGE unsigned char acD6D0[32] = {
+ _______X,X_______,
+ _______X,X_______,
+ __XXXXXX,XXXXXX__,
+ __XX___X,X___XX__,
+ __XX___X,X___XX__,
+ __XX___X,X___XX__,
+ __XX___X,X___XX__,
+ __XX___X,X___XX__,
+ __XXXXXX,XXXXXX__,
+ __XX___X,X___XX__,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ ________,________,
+ ________,________,
+};
+
+/* char: 重 code:0xD6D8 */
+static GUI_CONST_STORAGE unsigned char acD6D8[32] = {
+ ________,XXXXXX__,
+ __XXXXXX,X_______,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ _______X,X_______,
+ ___XXXXX,XXXXX___,
+ ___XX__X,X__XX___,
+ ___XXXXX,XXXXX___,
+ ___XX__X,X__XX___,
+ ___XXXXX,XXXXX___,
+ _______X,X_______,
+ __XXXXXX,XXXXXX__,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 主 code:0xD6F7 */
+static GUI_CONST_STORAGE unsigned char acD6F7[32] = {
+ ______XX,________,
+ _______X,X_______,
+ __XXXXXX,XXXXXX__,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ ___XXXXX,XXXXX___,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 装 code:0xD7B0 */
+static GUI_CONST_STORAGE unsigned char acD7B0[32] = {
+ ____XX__,_XX_____,
+ _XX_XX__,_XX_____,
+ __XXXXXX,XXXXXXX_,
+ ____XX__,_XX_____,
+ ___XXX__,_XX_____,
+ _XXXXX_X,XXXXXX__,
+ ____XXXX,________,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ _____XXX,X__XX___,
+ ____XXX_,XXXX____,
+ ___XXXX_,_XX_____,
+ _XXX_XXX,X_XXX___,
+ _____XXX,____XXX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 状 code:0xD7B4 */
+static GUI_CONST_STORAGE unsigned char acD7B4[32] = {
+ ____XX__,_XX_____,
+ ____XX__,_XXXX___,
+ _XX_XX__,_XX_XX__,
+ __XXXX__,_XX_____,
+ __XXXXXX,XXXXXXX_,
+ ____XX__,_XX_____,
+ ____XX__,_XX_____,
+ ___XXX__,XXXX____,
+ __XXXX__,XXXX____,
+ _XX_XX__,XXXX____,
+ ____XX_X,X__XX___,
+ ____XX_X,X__XX___,
+ ____XXXX,____XX__,
+ ____XXX_,_____XX_,
+ ________,________,
+ ________,________,
+};
+
+/* char: 准 code:0xD7BC */
+static GUI_CONST_STORAGE unsigned char acD7BC[32] = {
+ _______X,X_XX____,
+ __XX___X,X__XX___,
+ ___XX_XX,________,
+ ___XX_XX,XXXXXXX_,
+ _____XXX,__XX____,
+ ____XXXX,__XX____,
+ ______XX,XXXXXX__,
+ ___XX_XX,__XX____,
+ ___XX_XX,__XX____,
+ __XX__XX,XXXXXX__,
+ __XX__XX,__XX____,
+ _XX___XX,__XX____,
+ _XX___XX,XXXXXXX_,
+ ______XX,________,
+ ________,________,
+ ________,________,
+};
+
+/* char: 自 code:0xD7D4 */
+static GUI_CONST_STORAGE unsigned char acD7D4[32] = {
+ ______XX,________,
+ _____XX_,________,
+ __XXXXXX,XXXXXX__,
+ __XX____,____XX__,
+ __XX____,____XX__,
+ __XXXXXX,XXXXXX__,
+ __XX____,____XX__,
+ __XX____,____XX__,
+ __XXXXXX,XXXXXX__,
+ __XX____,____XX__,
+ __XX____,____XX__,
+ __XX____,____XX__,
+ __XXXXXX,XXXXXX__,
+ __XX____,____XX__,
+ ________,________,
+ ________,________,
+};
+
+/* char: 字 code:0xD7D6 */
+static GUI_CONST_STORAGE unsigned char acD7D6[32] = {
+ ______XX,________,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ _XX_____,_____XX_,
+ _XX_____,_____XX_,
+ ___XXXXX,XXXX____,
+ ________,_XX_____,
+ ________,XX______,
+ _______X,X_______,
+ _XXXXXXX,XXXXXXX_,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _____XXX,X_______,
+ ________,________,
+ ________,________,
+};
+
+/* char: 作 code:0xD7F7 */
+static GUI_CONST_STORAGE unsigned char acD7F7[32] = {
+ ____XX_X,X_______,
+ ____XX_X,X_______,
+ ____XX_X,XXXXXXX_,
+ ___XX_XX,XX______,
+ ___XX_XX,XX______,
+ __XXXXX_,XX______,
+ _XXXX___,XXXXXX__,
+ ___XX___,XX______,
+ ___XX___,XX______,
+ ___XX___,XX______,
+ ___XX___,XXXXXXX_,
+ ___XX___,XX______,
+ ___XX___,XX______,
+ ___XX___,XX______,
+ ________,________,
+ ________,________,
+};
+
+static GUI_CONST_STORAGE GUI_CHARINFO Cinfo[359] = {
+ { 6, 6, 2, (unsigned char *)&ac0020 }, /*0: */
+ { 5, 5, 2, (unsigned char *)&ac0021 }, /*1: !*/
+ { 7, 7, 2, (unsigned char *)&ac0022 }, /*2: "*/
+ { 8, 8, 2, (unsigned char *)&ac0023 }, /*3: #*/
+ { 8, 8, 2, (unsigned char *)&ac0024 }, /*4: $*/
+ { 8, 8, 2, (unsigned char *)&ac0025 }, /*5: %*/
+ { 9, 9, 2, (unsigned char *)&ac0026 }, /*6: &*/
+ { 4, 4, 2, (unsigned char *)&ac0027 }, /*7: '*/
+ { 8, 8, 2, (unsigned char *)&ac0028 }, /*8: (*/
+ { 5, 5, 2, (unsigned char *)&ac0029 }, /*9: )*/
+ { 8, 8, 2, (unsigned char *)&ac002A }, /*10: **/
+ { 9, 9, 2, (unsigned char *)&ac002B }, /*11: +*/
+ { 4, 4, 2, (unsigned char *)&ac002C }, /*12: ,*/
+ { 8, 8, 2, (unsigned char *)&ac002D }, /*13: -*/
+ { 4, 4, 2, (unsigned char *)&ac002E }, /*14: .*/
+ { 8, 8, 2, (unsigned char *)&ac002F }, /*15: /*/
+ { 8, 8, 2, (unsigned char *)&ac0030 }, /*16: 0*/
+ { 7, 7, 2, (unsigned char *)&ac0031 }, /*17: 1*/
+ { 8, 8, 2, (unsigned char *)&ac0032 }, /*18: 2*/
+ { 8, 8, 2, (unsigned char *)&ac0033 }, /*19: 3*/
+ { 9, 9, 2, (unsigned char *)&ac0034 }, /*20: 4*/
+ { 8, 8, 2, (unsigned char *)&ac0035 }, /*21: 5*/
+ { 8, 8, 2, (unsigned char *)&ac0036 }, /*22: 6*/
+ { 8, 8, 2, (unsigned char *)&ac0037 }, /*23: 7*/
+ { 8, 8, 2, (unsigned char *)&ac0038 }, /*24: 8*/
+ { 8, 8, 2, (unsigned char *)&ac0039 }, /*25: 9*/
+ { 6, 6, 2, (unsigned char *)&ac003A }, /*26: :*/
+ { 5, 5, 2, (unsigned char *)&ac003B }, /*27: ;*/
+ { 7, 7, 2, (unsigned char *)&ac003C }, /*28: <*/
+ { 8, 8, 2, (unsigned char *)&ac003D }, /*29: =*/
+ { 8, 8, 2, (unsigned char *)&ac003E }, /*30: >*/
+ { 8, 8, 2, (unsigned char *)&ac003F }, /*31: ?*/
+ { 8, 8, 2, (unsigned char *)&ac0040 }, /*32: @*/
+ { 8, 8, 2, (unsigned char *)&ac0041 }, /*33: A*/
+ { 8, 8, 2, (unsigned char *)&ac0042 }, /*34: B*/
+ { 8, 8, 2, (unsigned char *)&ac0043 }, /*35: C*/
+ { 8, 8, 2, (unsigned char *)&ac0044 }, /*36: D*/
+ { 8, 8, 2, (unsigned char *)&ac0045 }, /*37: E*/
+ { 8, 8, 2, (unsigned char *)&ac0046 }, /*38: F*/
+ { 8, 8, 2, (unsigned char *)&ac0047 }, /*39: G*/
+ { 8, 8, 2, (unsigned char *)&ac0048 }, /*40: H*/
+ { 7, 7, 2, (unsigned char *)&ac0049 }, /*41: I*/
+ { 8, 8, 2, (unsigned char *)&ac004A }, /*42: J*/
+ { 8, 8, 2, (unsigned char *)&ac004B }, /*43: K*/
+ { 8, 8, 2, (unsigned char *)&ac004C }, /*44: L*/
+ { 8, 8, 2, (unsigned char *)&ac004D }, /*45: M*/
+ { 8, 8, 2, (unsigned char *)&ac004E }, /*46: N*/
+ { 8, 8, 2, (unsigned char *)&ac004F }, /*47: O*/
+ { 8, 8, 2, (unsigned char *)&ac0050 }, /*48: P*/
+ { 8, 8, 2, (unsigned char *)&ac0051 }, /*49: Q*/
+ { 8, 8, 2, (unsigned char *)&ac0052 }, /*50: R*/
+ { 8, 8, 2, (unsigned char *)&ac0053 }, /*51: S*/
+ { 8, 8, 2, (unsigned char *)&ac0054 }, /*52: T*/
+ { 8, 8, 2, (unsigned char *)&ac0055 }, /*53: U*/
+ { 8, 8, 2, (unsigned char *)&ac0056 }, /*54: V*/
+ { 8, 8, 2, (unsigned char *)&ac0057 }, /*55: W*/
+ { 8, 8, 2, (unsigned char *)&ac0058 }, /*56: X*/
+ { 8, 8, 2, (unsigned char *)&ac0059 }, /*57: Y*/
+ { 8, 8, 2, (unsigned char *)&ac005A }, /*58: Z*/
+ { 7, 7, 2, (unsigned char *)&ac005B }, /*59: [*/
+ { 8, 8, 2, (unsigned char *)&ac005C }, /*60: \*/
+ { 6, 6, 2, (unsigned char *)&ac005D }, /*61: ]*/
+ { 7, 7, 2, (unsigned char *)&ac005E }, /*62: ^*/
+ { 8, 8, 2, (unsigned char *)&ac005F }, /*63: _*/
+ { 5, 5, 2, (unsigned char *)&ac0060 }, /*64: `*/
+ { 8, 8, 2, (unsigned char *)&ac0061 }, /*65: a*/
+ { 8, 8, 2, (unsigned char *)&ac0062 }, /*66: b*/
+ { 8, 8, 2, (unsigned char *)&ac0063 }, /*67: c*/
+ { 9, 9, 2, (unsigned char *)&ac0064 }, /*68: d*/
+ { 8, 8, 2, (unsigned char *)&ac0065 }, /*69: e*/
+ { 8, 8, 2, (unsigned char *)&ac0066 }, /*70: f*/
+ { 8, 8, 2, (unsigned char *)&ac0067 }, /*71: g*/
+ { 9, 9, 2, (unsigned char *)&ac0068 }, /*72: h*/
+ { 7, 7, 2, (unsigned char *)&ac0069 }, /*73: i*/
+ { 7, 7, 2, (unsigned char *)&ac006A }, /*74: j*/
+ { 8, 8, 2, (unsigned char *)&ac006B }, /*75: k*/
+ { 7, 7, 2, (unsigned char *)&ac006C }, /*76: l*/
+ { 8, 8, 2, (unsigned char *)&ac006D }, /*77: m*/
+ { 9, 9, 2, (unsigned char *)&ac006E }, /*78: n*/
+ { 8, 8, 2, (unsigned char *)&ac006F }, /*79: o*/
+ { 8, 8, 2, (unsigned char *)&ac0070 }, /*80: p*/
+ { 9, 9, 2, (unsigned char *)&ac0071 }, /*81: q*/
+ { 8, 8, 2, (unsigned char *)&ac0072 }, /*82: r*/
+ { 7, 7, 2, (unsigned char *)&ac0073 }, /*83: s*/
+ { 8, 8, 2, (unsigned char *)&ac0074 }, /*84: t*/
+ { 9, 9, 2, (unsigned char *)&ac0075 }, /*85: u*/
+ { 8, 8, 2, (unsigned char *)&ac0076 }, /*86: v*/
+ { 8, 8, 2, (unsigned char *)&ac0077 }, /*87: w*/
+ { 8, 8, 2, (unsigned char *)&ac0078 }, /*88: x*/
+ { 9, 9, 2, (unsigned char *)&ac0079 }, /*89: y*/
+ { 8, 8, 2, (unsigned char *)&ac007A }, /*90: z*/
+ { 8, 8, 2, (unsigned char *)&ac007B }, /*91: {*/
+ { 6, 6, 2, (unsigned char *)&ac007C }, /*92: |*/
+ { 5, 5, 2, (unsigned char *)&ac007D }, /*93: }*/
+ { 8, 8, 2, (unsigned char *)&ac007E }, /*94: ~*/
+ { 6, 6, 2, (unsigned char *)&ac007F }, /*95: */
+ { 15, 15, 2, (unsigned char *)&acA1AB }, /*96: ~*/
+ { 13, 13, 2, (unsigned char *)&acA1C1 }, /*97: ×*/
+ { 15, 15, 2, (unsigned char *)&acA1CC }, /*98: √*/
+ { 8, 8, 2, (unsigned char *)&acA1E3 }, /*99: °*/
+ { 15, 15, 2, (unsigned char *)&acA1E6 }, /*100: ℃*/
+ { 15, 15, 2, (unsigned char *)&acA1F0 }, /*101: ○*/
+ { 15, 15, 2, (unsigned char *)&acA1FA }, /*102: →*/
+ { 15, 15, 2, (unsigned char *)&acA1FB }, /*103: ←*/
+ { 11, 11, 2, (unsigned char *)&acA1FC }, /*104: ↑*/
+ { 11, 11, 2, (unsigned char *)&acA1FD }, /*105: ↓*/
+ { 14, 14, 2, (unsigned char *)&acA848 }, /*106: ℉*/
+ { 15, 15, 2, (unsigned char *)&acB0B2 }, /*107: 安*/
+ { 15, 15, 2, (unsigned char *)&acB0B4 }, /*108: 按*/
+ { 15, 15, 2, (unsigned char *)&acB0E6 }, /*109: 版*/
+ { 15, 15, 2, (unsigned char *)&acB1A1 }, /*110: 薄*/
+ { 15, 15, 2, (unsigned char *)&acB1A3 }, /*111: 保*/
+ { 15, 15, 2, (unsigned char *)&acB1A5 }, /*112: 饱*/
+ { 15, 15, 2, (unsigned char *)&acB1A8 }, /*113: 报*/
+ { 15, 15, 2, (unsigned char *)&acB1B8 }, /*114: 备*/
+ { 15, 15, 2, (unsigned char *)&acB1BE }, /*115: 本*/
+ { 15, 15, 2, (unsigned char *)&acB1C8 }, /*116: 比*/
+ { 15, 15, 2, (unsigned char *)&acB1D5 }, /*117: 闭*/
+ { 15, 15, 2, (unsigned char *)&acB1E0 }, /*118: 编*/
+ { 15, 15, 2, (unsigned char *)&acB1E4 }, /*119: 变*/
+ { 15, 15, 2, (unsigned char *)&acB1ED }, /*120: 表*/
+ { 15, 15, 2, (unsigned char *)&acB2BB }, /*121: 不*/
+ { 15, 15, 2, (unsigned char *)&acB2C1 }, /*122: 擦*/
+ { 15, 15, 2, (unsigned char *)&acB2CE }, /*123: 参*/
+ { 15, 15, 2, (unsigned char *)&acB2D9 }, /*124: 操*/
+ { 15, 15, 2, (unsigned char *)&acB2E2 }, /*125: 测*/
+ { 15, 15, 2, (unsigned char *)&acB2EE }, /*126: 差*/
+ { 15, 15, 2, (unsigned char *)&acB3A3 }, /*127: 常*/
+ { 15, 15, 2, (unsigned char *)&acB3A4 }, /*128: 长*/
+ { 15, 15, 2, (unsigned char *)&acB3A7 }, /*129: 厂*/
+ { 15, 15, 2, (unsigned char *)&acB3C6 }, /*130: 称*/
+ { 15, 15, 2, (unsigned char *)&acB3C9 }, /*131: 成*/
+ { 15, 15, 2, (unsigned char *)&acB3CC }, /*132: 程*/
+ { 15, 15, 2, (unsigned char *)&acB3F6 }, /*133: 出*/
+ { 15, 15, 2, (unsigned char *)&acB4A2 }, /*134: 储*/
+ { 15, 15, 2, (unsigned char *)&acB4AB }, /*135: 传*/
+ { 15, 15, 2, (unsigned char *)&acB4C5 }, /*136: 磁*/
+ { 15, 15, 2, (unsigned char *)&acB4CE }, /*137: 次*/
+ { 15, 15, 2, (unsigned char *)&acB4E6 }, /*138: 存*/
+ { 15, 15, 2, (unsigned char *)&acB4F3 }, /*139: 大*/
+ { 15, 15, 2, (unsigned char *)&acB4F8 }, /*140: 带*/
+ { 15, 15, 2, (unsigned char *)&acB4FD }, /*141: 待*/
+ { 15, 15, 2, (unsigned char *)&acB5A5 }, /*142: 单*/
+ { 15, 15, 2, (unsigned char *)&acB5AF }, /*143: 弹*/
+ { 14, 14, 2, (unsigned char *)&acB5B1 }, /*144: 当*/
+ { 15, 15, 2, (unsigned char *)&acB5C4 }, /*145: 的*/
+ { 15, 15, 2, (unsigned char *)&acB5CD }, /*146: 低*/
+ { 15, 15, 2, (unsigned char *)&acB5D8 }, /*147: 地*/
+ { 15, 15, 2, (unsigned char *)&acB5E3 }, /*148: 点*/
+ { 15, 15, 2, (unsigned char *)&acB5E7 }, /*149: 电*/
+ { 15, 15, 2, (unsigned char *)&acB6A8 }, /*150: 定*/
+ { 15, 15, 2, (unsigned char *)&acB6AF }, /*151: 动*/
+ { 15, 15, 2, (unsigned char *)&acB6C8 }, /*152: 度*/
+ { 15, 15, 2, (unsigned char *)&acB6CC }, /*153: 短*/
+ { 15, 15, 2, (unsigned char *)&acB6CF }, /*154: 断*/
+ { 15, 15, 2, (unsigned char *)&acB7A7 }, /*155: 阀*/
+ { 15, 15, 2, (unsigned char *)&acB7A8 }, /*156: 法*/
+ { 15, 15, 2, (unsigned char *)&acB7B4 }, /*157: 反*/
+ { 15, 15, 2, (unsigned char *)&acB7B5 }, /*158: 返*/
+ { 15, 15, 2, (unsigned char *)&acB7B6 }, /*159: 范*/
+ { 15, 15, 2, (unsigned char *)&acB7BD }, /*160: 方*/
+ { 15, 15, 2, (unsigned char *)&acB7C5 }, /*161: 放*/
+ { 15, 15, 2, (unsigned char *)&acB7C7 }, /*162: 非*/
+ { 15, 15, 2, (unsigned char *)&acB7D6 }, /*163: 分*/
+ { 15, 15, 2, (unsigned char *)&acB7FE }, /*164: 服*/
+ { 15, 15, 2, (unsigned char *)&acB8B4 }, /*165: 复*/
+ { 15, 15, 2, (unsigned char *)&acB8D0 }, /*166: 感*/
+ { 15, 15, 2, (unsigned char *)&acB8D7 }, /*167: 缸*/
+ { 15, 15, 2, (unsigned char *)&acB8DF }, /*168: 高*/
+ { 15, 15, 2, (unsigned char *)&acB8EE }, /*169: 割*/
+ { 15, 15, 2, (unsigned char *)&acB8F6 }, /*170: 个*/
+ { 15, 15, 2, (unsigned char *)&acB8FC }, /*171: 更*/
+ { 15, 15, 2, (unsigned char *)&acB9A4 }, /*172: 工*/
+ { 14, 14, 2, (unsigned char *)&acB9A6 }, /*173: 功*/
+ { 15, 15, 2, (unsigned char *)&acB9AB }, /*174: 公*/
+ { 15, 15, 2, (unsigned char *)&acB9B9 }, /*175: 构*/
+ { 15, 15, 2, (unsigned char *)&acB9CA }, /*176: 故*/
+ { 15, 15, 2, (unsigned char *)&acB9CC }, /*177: 固*/
+ { 15, 15, 2, (unsigned char *)&acB9D8 }, /*178: 关*/
+ { 15, 15, 2, (unsigned char *)&acB9FD }, /*179: 过*/
+ { 15, 15, 2, (unsigned char *)&acBAC4 }, /*180: 耗*/
+ { 15, 15, 2, (unsigned char *)&acBAC5 }, /*181: 号*/
+ { 15, 15, 2, (unsigned char *)&acBACD }, /*182: 和*/
+ { 15, 15, 2, (unsigned char *)&acBAE3 }, /*183: 恒*/
+ { 15, 15, 2, (unsigned char *)&acBBA4 }, /*184: 护*/
+ { 15, 15, 2, (unsigned char *)&acBBB6 }, /*185: 欢*/
+ { 15, 15, 2, (unsigned char *)&acBBB7 }, /*186: 环*/
+ { 15, 15, 2, (unsigned char *)&acBBBB }, /*187: 换*/
+ { 15, 15, 2, (unsigned char *)&acBBC9 }, /*188: 簧*/
+ { 15, 15, 2, (unsigned char *)&acBBD6 }, /*189: 恢*/
+ { 15, 15, 2, (unsigned char *)&acBBD8 }, /*190: 回*/
+ { 15, 15, 2, (unsigned char *)&acBBF9 }, /*191: 基*/
+ { 15, 15, 2, (unsigned char *)&acBBFA }, /*192: 机*/
+ { 15, 15, 2, (unsigned char *)&acBBFD }, /*193: 积*/
+ { 15, 15, 2, (unsigned char *)&acBCAD }, /*194: 辑*/
+ { 15, 15, 2, (unsigned char *)&acBCBC }, /*195: 技*/
+ { 15, 15, 2, (unsigned char *)&acBCC6 }, /*196: 计*/
+ { 15, 15, 2, (unsigned char *)&acBCC7 }, /*197: 记*/
+ { 15, 15, 2, (unsigned char *)&acBCD3 }, /*198: 加*/
+ { 15, 15, 2, (unsigned char *)&acBCE4 }, /*199: 间*/
+ { 15, 15, 2, (unsigned char *)&acBCF5 }, /*200: 减*/
+ { 15, 15, 2, (unsigned char *)&acBCFE }, /*201: 件*/
+ { 15, 15, 2, (unsigned char *)&acBDAD }, /*202: 江*/
+ { 14, 14, 2, (unsigned char *)&acBDC7 }, /*203: 角*/
+ { 15, 15, 2, (unsigned char *)&acBDF8 }, /*204: 进*/
+ { 15, 15, 2, (unsigned char *)&acBEA1 }, /*205: 尽*/
+ { 15, 15, 2, (unsigned char *)&acBEAF }, /*206: 警*/
+ { 15, 15, 2, (unsigned char *)&acBEB3 }, /*207: 境*/
+ { 15, 15, 2, (unsigned char *)&acBEDD }, /*208: 据*/
+ { 15, 15, 2, (unsigned char *)&acBEDE }, /*209: 巨*/
+ { 15, 15, 2, (unsigned char *)&acBFAA }, /*210: 开*/
+ { 15, 15, 2, (unsigned char *)&acBFC9 }, /*211: 可*/
+ { 15, 15, 2, (unsigned char *)&acBFD5 }, /*212: 空*/
+ { 15, 15, 2, (unsigned char *)&acBFD8 }, /*213: 控*/
+ { 15, 15, 2, (unsigned char *)&acBFE7 }, /*214: 跨*/
+ { 15, 15, 2, (unsigned char *)&acBFE9 }, /*215: 块*/
+ { 15, 15, 2, (unsigned char *)&acC0B6 }, /*216: 蓝*/
+ { 14, 14, 2, (unsigned char *)&acC0DB }, /*217: 累*/
+ { 15, 15, 2, (unsigned char *)&acC0E0 }, /*218: 类*/
+ { 15, 15, 2, (unsigned char *)&acC0EB }, /*219: 离*/
+ { 15, 15, 2, (unsigned char *)&acC0FD }, /*220: 例*/
+ { 14, 14, 2, (unsigned char *)&acC1A6 }, /*221: 力*/
+ { 15, 15, 2, (unsigned char *)&acC1BF }, /*222: 量*/
+ { 15, 15, 2, (unsigned char *)&acC1D0 }, /*223: 列*/
+ { 15, 15, 2, (unsigned char *)&acC1E3 }, /*224: 零*/
+ { 15, 15, 2, (unsigned char *)&acC1F7 }, /*225: 流*/
+ { 15, 15, 2, (unsigned char *)&acC2B7 }, /*226: 路*/
+ { 15, 15, 2, (unsigned char *)&acC2BC }, /*227: 录*/
+ { 15, 15, 2, (unsigned char *)&acC2CA }, /*228: 率*/
+ { 15, 15, 2, (unsigned char *)&acC2FA }, /*229: 满*/
+ { 15, 15, 2, (unsigned char *)&acC3C5 }, /*230: 门*/
+ { 15, 15, 2, (unsigned char *)&acC3E6 }, /*231: 面*/
+ { 14, 14, 2, (unsigned char *)&acC3FB }, /*232: 名*/
+ { 15, 15, 2, (unsigned char *)&acC4A3 }, /*233: 模*/
+ { 15, 15, 2, (unsigned char *)&acC4A4 }, /*234: 膜*/
+ { 15, 15, 2, (unsigned char *)&acC4A6 }, /*235: 摩*/
+ { 15, 15, 2, (unsigned char *)&acC4DA }, /*236: 内*/
+ { 15, 15, 2, (unsigned char *)&acC4DC }, /*237: 能*/
+ { 15, 15, 2, (unsigned char *)&acC4E2 }, /*238: 拟*/
+ { 15, 15, 2, (unsigned char *)&acC5E4 }, /*239: 配*/
+ { 14, 14, 2, (unsigned char *)&acC6AB }, /*240: 偏*/
+ { 15, 15, 2, (unsigned char *)&acC6B5 }, /*241: 频*/
+ { 15, 15, 2, (unsigned char *)&acC6BD }, /*242: 平*/
+ { 14, 14, 2, (unsigned char *)&acC6F4 }, /*243: 启*/
+ { 15, 15, 2, (unsigned char *)&acC6F7 }, /*244: 器*/
+ { 15, 15, 2, (unsigned char *)&acC6F8 }, /*245: 气*/
+ { 15, 15, 2, (unsigned char *)&acC7B0 }, /*246: 前*/
+ { 15, 15, 2, (unsigned char *)&acC7D0 }, /*247: 切*/
+ { 15, 15, 2, (unsigned char *)&acC7F8 }, /*248: 区*/
+ { 15, 15, 2, (unsigned char *)&acC7FD }, /*249: 驱*/
+ { 15, 15, 2, (unsigned char *)&acC8A1 }, /*250: 取*/
+ { 15, 15, 2, (unsigned char *)&acC8AB }, /*251: 全*/
+ { 15, 15, 2, (unsigned char *)&acC8B7 }, /*252: 确*/
+ { 15, 15, 2, (unsigned char *)&acC8CF }, /*253: 认*/
+ { 15, 15, 2, (unsigned char *)&acC8EB }, /*254: 入*/
+ { 15, 15, 2, (unsigned char *)&acC8ED }, /*255: 软*/
+ { 15, 15, 2, (unsigned char *)&acC9CC }, /*256: 商*/
+ { 15, 15, 2, (unsigned char *)&acC9CF }, /*257: 上*/
+ { 15, 15, 2, (unsigned char *)&acC9D9 }, /*258: 少*/
+ { 15, 15, 2, (unsigned char *)&acC9E8 }, /*259: 设*/
+ { 15, 15, 2, (unsigned char *)&acCAAA }, /*260: 湿*/
+ { 15, 15, 2, (unsigned char *)&acCAAF }, /*261: 石*/
+ { 15, 15, 2, (unsigned char *)&acCAB1 }, /*262: 时*/
+ { 15, 15, 2, (unsigned char *)&acCAB5 }, /*263: 实*/
+ { 15, 15, 2, (unsigned char *)&acCAB9 }, /*264: 使*/
+ { 15, 15, 2, (unsigned char *)&acCABD }, /*265: 式*/
+ { 15, 15, 2, (unsigned char *)&acCABE }, /*266: 示*/
+ { 15, 15, 2, (unsigned char *)&acCAD4 }, /*267: 试*/
+ { 15, 15, 2, (unsigned char *)&acCAD6 }, /*268: 手*/
+ { 15, 15, 2, (unsigned char *)&acCAD7 }, /*269: 首*/
+ { 15, 15, 2, (unsigned char *)&acCAE4 }, /*270: 输*/
+ { 15, 15, 2, (unsigned char *)&acCAF5 }, /*271: 术*/
+ { 15, 15, 2, (unsigned char *)&acCAFD }, /*272: 数*/
+ { 15, 15, 2, (unsigned char *)&acCBAB }, /*273: 双*/
+ { 14, 14, 2, (unsigned char *)&acCBBE }, /*274: 司*/
+ { 15, 15, 2, (unsigned char *)&acCBC0 }, /*275: 死*/
+ { 15, 15, 2, (unsigned char *)&acCBD5 }, /*276: 苏*/
+ { 15, 15, 2, (unsigned char *)&acCBD9 }, /*277: 速*/
+ { 15, 15, 2, (unsigned char *)&acCBE3 }, /*278: 算*/
+ { 15, 15, 2, (unsigned char *)&acCBF9 }, /*279: 所*/
+ { 15, 15, 2, (unsigned char *)&acCCAC }, /*280: 态*/
+ { 15, 15, 2, (unsigned char *)&acCCF5 }, /*281: 条*/
+ { 15, 15, 2, (unsigned char *)&acCDA3 }, /*282: 停*/
+ { 15, 15, 2, (unsigned char *)&acCDA8 }, /*283: 通*/
+ { 15, 15, 2, (unsigned char *)&acCDB6 }, /*284: 投*/
+ { 15, 15, 2, (unsigned char *)&acCDBC }, /*285: 图*/
+ { 15, 15, 2, (unsigned char *)&acCDE2 }, /*286: 外*/
+ { 15, 15, 2, (unsigned char *)&acCEA2 }, /*287: 微*/
+ { 15, 15, 2, (unsigned char *)&acCEA7 }, /*288: 围*/
+ { 14, 14, 2, (unsigned char *)&acCEAA }, /*289: 为*/
+ { 15, 15, 2, (unsigned char *)&acCEB4 }, /*290: 未*/
+ { 15, 15, 2, (unsigned char *)&acCEBB }, /*291: 位*/
+ { 15, 15, 2, (unsigned char *)&acCEC2 }, /*292: 温*/
+ { 15, 15, 2, (unsigned char *)&acCEC4 }, /*293: 文*/
+ { 15, 15, 2, (unsigned char *)&acCEF1 }, /*294: 务*/
+ { 15, 15, 2, (unsigned char *)&acCFA2 }, /*295: 息*/
+ { 14, 14, 2, (unsigned char *)&acCFB5 }, /*296: 系*/
+ { 15, 15, 2, (unsigned char *)&acCFC2 }, /*297: 下*/
+ { 15, 15, 2, (unsigned char *)&acCFD4 }, /*298: 显*/
+ { 15, 15, 2, (unsigned char *)&acCFDE }, /*299: 限*/
+ { 15, 15, 2, (unsigned char *)&acCFDF }, /*300: 线*/
+ { 15, 15, 2, (unsigned char *)&acCFE0 }, /*301: 相*/
+ { 15, 15, 2, (unsigned char *)&acCFEE }, /*302: 项*/
+ { 15, 15, 2, (unsigned char *)&acCFF2 }, /*303: 向*/
+ { 14, 14, 2, (unsigned char *)&acCFFB }, /*304: 消*/
+ { 15, 15, 2, (unsigned char *)&acD0A1 }, /*305: 小*/
+ { 15, 15, 2, (unsigned char *)&acD0A3 }, /*306: 校*/
+ { 15, 15, 2, (unsigned char *)&acD0B4 }, /*307: 写*/
+ { 15, 15, 2, (unsigned char *)&acD0C2 }, /*308: 新*/
+ { 15, 15, 2, (unsigned char *)&acD0C5 }, /*309: 信*/
+ { 15, 15, 2, (unsigned char *)&acD0CD }, /*310: 型*/
+ { 15, 15, 2, (unsigned char *)&acD0D0 }, /*311: 行*/
+ { 15, 15, 2, (unsigned char *)&acD0F2 }, /*312: 序*/
+ { 15, 15, 2, (unsigned char *)&acD1A1 }, /*313: 选*/
+ { 15, 15, 2, (unsigned char *)&acD1B6 }, /*314: 讯*/
+ { 15, 15, 2, (unsigned char *)&acD1B9 }, /*315: 压*/
+ { 15, 15, 2, (unsigned char *)&acD1C0 }, /*316: 牙*/
+ { 15, 15, 2, (unsigned char *)&acD1D4 }, /*317: 言*/
+ { 15, 15, 2, (unsigned char *)&acD2AA }, /*318: 要*/
+ { 15, 15, 2, (unsigned char *)&acD2B3 }, /*319: 页*/
+ { 15, 15, 2, (unsigned char *)&acD2BB }, /*320: 一*/
+ { 15, 15, 2, (unsigned char *)&acD2C6 }, /*321: 移*/
+ { 15, 15, 2, (unsigned char *)&acD2C7 }, /*322: 仪*/
+ { 15, 15, 2, (unsigned char *)&acD2D1 }, /*323: 已*/
+ { 15, 15, 2, (unsigned char *)&acD2E6 }, /*324: 益*/
+ { 15, 15, 2, (unsigned char *)&acD3A2 }, /*325: 英*/
+ { 15, 15, 2, (unsigned char *)&acD3AD }, /*326: 迎*/
+ { 15, 15, 2, (unsigned char *)&acD3B2 }, /*327: 硬*/
+ { 15, 15, 2, (unsigned char *)&acD3C3 }, /*328: 用*/
+ { 15, 15, 2, (unsigned char *)&acD3D0 }, /*329: 有*/
+ { 15, 15, 2, (unsigned char *)&acD3EF }, /*330: 语*/
+ { 15, 15, 2, (unsigned char *)&acD3F2 }, /*331: 域*/
+ { 15, 15, 2, (unsigned char *)&acD4B4 }, /*332: 源*/
+ { 15, 15, 2, (unsigned char *)&acD4CB }, /*333: 运*/
+ { 15, 15, 2, (unsigned char *)&acD4DA }, /*334: 在*/
+ { 15, 15, 2, (unsigned char *)&acD4EC }, /*335: 造*/
+ { 15, 15, 2, (unsigned char *)&acD4F1 }, /*336: 择*/
+ { 15, 15, 2, (unsigned char *)&acD4F6 }, /*337: 增*/
+ { 15, 15, 2, (unsigned char *)&acD5CF }, /*338: 障*/
+ { 15, 15, 2, (unsigned char *)&acD5EF }, /*339: 诊*/
+ { 15, 15, 2, (unsigned char *)&acD5FB }, /*340: 整*/
+ { 15, 15, 2, (unsigned char *)&acD5FD }, /*341: 正*/
+ { 15, 15, 2, (unsigned char *)&acD6AA }, /*342: 知*/
+ { 15, 15, 2, (unsigned char *)&acD6B1 }, /*343: 直*/
+ { 15, 15, 2, (unsigned char *)&acD6B4 }, /*344: 执*/
+ { 15, 15, 2, (unsigned char *)&acD6B7 }, /*345: 址*/
+ { 15, 15, 2, (unsigned char *)&acD6B8 }, /*346: 指*/
+ { 15, 15, 2, (unsigned char *)&acD6C3 }, /*347: 置*/
+ { 14, 14, 2, (unsigned char *)&acD6C6 }, /*348: 制*/
+ { 14, 14, 2, (unsigned char *)&acD6C7 }, /*349: 智*/
+ { 14, 14, 2, (unsigned char *)&acD6D0 }, /*350: 中*/
+ { 15, 15, 2, (unsigned char *)&acD6D8 }, /*351: 重*/
+ { 15, 15, 2, (unsigned char *)&acD6F7 }, /*352: 主*/
+ { 15, 15, 2, (unsigned char *)&acD7B0 }, /*353: 装*/
+ { 15, 15, 2, (unsigned char *)&acD7B4 }, /*354: 状*/
+ { 15, 15, 2, (unsigned char *)&acD7BC }, /*355: 准*/
+ { 14, 14, 2, (unsigned char *)&acD7D4 }, /*356: 自*/
+ { 15, 15, 2, (unsigned char *)&acD7D6 }, /*357: 字*/
+ { 15, 15, 2, (unsigned char *)&acD7F7 }, /*358: 作*/
+};
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop243 = {
+ 0xD7F7, /*start :作*/
+ 0xD7F7, /*end :作, len=1*/
+ &Cinfo[ 358 ],
+ (void*)0
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop242 = {
+ 0xD7D6, /*start :字*/
+ 0xD7D6, /*end :字, len=1*/
+ &Cinfo[ 357 ],
+ &Prop243
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop241 = {
+ 0xD7D4, /*start :自*/
+ 0xD7D4, /*end :自, len=1*/
+ &Cinfo[ 356 ],
+ &Prop242
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop240 = {
+ 0xD7BC, /*start :准*/
+ 0xD7BC, /*end :准, len=1*/
+ &Cinfo[ 355 ],
+ &Prop241
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop239 = {
+ 0xD7B4, /*start :状*/
+ 0xD7B4, /*end :状, len=1*/
+ &Cinfo[ 354 ],
+ &Prop240
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop238 = {
+ 0xD7B0, /*start :装*/
+ 0xD7B0, /*end :装, len=1*/
+ &Cinfo[ 353 ],
+ &Prop239
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop237 = {
+ 0xD6F7, /*start :主*/
+ 0xD6F7, /*end :主, len=1*/
+ &Cinfo[ 352 ],
+ &Prop238
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop236 = {
+ 0xD6D8, /*start :重*/
+ 0xD6D8, /*end :重, len=1*/
+ &Cinfo[ 351 ],
+ &Prop237
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop235 = {
+ 0xD6D0, /*start :中*/
+ 0xD6D0, /*end :中, len=1*/
+ &Cinfo[ 350 ],
+ &Prop236
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop234 = {
+ 0xD6C6, /*start :制*/
+ 0xD6C7, /*end :智, len=2*/
+ &Cinfo[ 348 ],
+ &Prop235
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop233 = {
+ 0xD6C3, /*start :置*/
+ 0xD6C3, /*end :置, len=1*/
+ &Cinfo[ 347 ],
+ &Prop234
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop232 = {
+ 0xD6B7, /*start :址*/
+ 0xD6B8, /*end :指, len=2*/
+ &Cinfo[ 345 ],
+ &Prop233
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop231 = {
+ 0xD6B4, /*start :执*/
+ 0xD6B4, /*end :执, len=1*/
+ &Cinfo[ 344 ],
+ &Prop232
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop230 = {
+ 0xD6B1, /*start :直*/
+ 0xD6B1, /*end :直, len=1*/
+ &Cinfo[ 343 ],
+ &Prop231
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop229 = {
+ 0xD6AA, /*start :知*/
+ 0xD6AA, /*end :知, len=1*/
+ &Cinfo[ 342 ],
+ &Prop230
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop228 = {
+ 0xD5FD, /*start :正*/
+ 0xD5FD, /*end :正, len=1*/
+ &Cinfo[ 341 ],
+ &Prop229
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop227 = {
+ 0xD5FB, /*start :整*/
+ 0xD5FB, /*end :整, len=1*/
+ &Cinfo[ 340 ],
+ &Prop228
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop226 = {
+ 0xD5EF, /*start :诊*/
+ 0xD5EF, /*end :诊, len=1*/
+ &Cinfo[ 339 ],
+ &Prop227
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop225 = {
+ 0xD5CF, /*start :障*/
+ 0xD5CF, /*end :障, len=1*/
+ &Cinfo[ 338 ],
+ &Prop226
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop224 = {
+ 0xD4F6, /*start :增*/
+ 0xD4F6, /*end :增, len=1*/
+ &Cinfo[ 337 ],
+ &Prop225
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop223 = {
+ 0xD4F1, /*start :择*/
+ 0xD4F1, /*end :择, len=1*/
+ &Cinfo[ 336 ],
+ &Prop224
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop222 = {
+ 0xD4EC, /*start :造*/
+ 0xD4EC, /*end :造, len=1*/
+ &Cinfo[ 335 ],
+ &Prop223
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop221 = {
+ 0xD4DA, /*start :在*/
+ 0xD4DA, /*end :在, len=1*/
+ &Cinfo[ 334 ],
+ &Prop222
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop220 = {
+ 0xD4CB, /*start :运*/
+ 0xD4CB, /*end :运, len=1*/
+ &Cinfo[ 333 ],
+ &Prop221
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop219 = {
+ 0xD4B4, /*start :源*/
+ 0xD4B4, /*end :源, len=1*/
+ &Cinfo[ 332 ],
+ &Prop220
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop218 = {
+ 0xD3F2, /*start :域*/
+ 0xD3F2, /*end :域, len=1*/
+ &Cinfo[ 331 ],
+ &Prop219
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop217 = {
+ 0xD3EF, /*start :语*/
+ 0xD3EF, /*end :语, len=1*/
+ &Cinfo[ 330 ],
+ &Prop218
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop216 = {
+ 0xD3D0, /*start :有*/
+ 0xD3D0, /*end :有, len=1*/
+ &Cinfo[ 329 ],
+ &Prop217
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop215 = {
+ 0xD3C3, /*start :用*/
+ 0xD3C3, /*end :用, len=1*/
+ &Cinfo[ 328 ],
+ &Prop216
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop214 = {
+ 0xD3B2, /*start :硬*/
+ 0xD3B2, /*end :硬, len=1*/
+ &Cinfo[ 327 ],
+ &Prop215
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop213 = {
+ 0xD3AD, /*start :迎*/
+ 0xD3AD, /*end :迎, len=1*/
+ &Cinfo[ 326 ],
+ &Prop214
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop212 = {
+ 0xD3A2, /*start :英*/
+ 0xD3A2, /*end :英, len=1*/
+ &Cinfo[ 325 ],
+ &Prop213
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop211 = {
+ 0xD2E6, /*start :益*/
+ 0xD2E6, /*end :益, len=1*/
+ &Cinfo[ 324 ],
+ &Prop212
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop210 = {
+ 0xD2D1, /*start :已*/
+ 0xD2D1, /*end :已, len=1*/
+ &Cinfo[ 323 ],
+ &Prop211
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop209 = {
+ 0xD2C6, /*start :移*/
+ 0xD2C7, /*end :仪, len=2*/
+ &Cinfo[ 321 ],
+ &Prop210
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop208 = {
+ 0xD2BB, /*start :一*/
+ 0xD2BB, /*end :一, len=1*/
+ &Cinfo[ 320 ],
+ &Prop209
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop207 = {
+ 0xD2B3, /*start :页*/
+ 0xD2B3, /*end :页, len=1*/
+ &Cinfo[ 319 ],
+ &Prop208
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop206 = {
+ 0xD2AA, /*start :要*/
+ 0xD2AA, /*end :要, len=1*/
+ &Cinfo[ 318 ],
+ &Prop207
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop205 = {
+ 0xD1D4, /*start :言*/
+ 0xD1D4, /*end :言, len=1*/
+ &Cinfo[ 317 ],
+ &Prop206
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop204 = {
+ 0xD1C0, /*start :牙*/
+ 0xD1C0, /*end :牙, len=1*/
+ &Cinfo[ 316 ],
+ &Prop205
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop203 = {
+ 0xD1B9, /*start :压*/
+ 0xD1B9, /*end :压, len=1*/
+ &Cinfo[ 315 ],
+ &Prop204
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop202 = {
+ 0xD1B6, /*start :讯*/
+ 0xD1B6, /*end :讯, len=1*/
+ &Cinfo[ 314 ],
+ &Prop203
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop201 = {
+ 0xD1A1, /*start :选*/
+ 0xD1A1, /*end :选, len=1*/
+ &Cinfo[ 313 ],
+ &Prop202
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop200 = {
+ 0xD0F2, /*start :序*/
+ 0xD0F2, /*end :序, len=1*/
+ &Cinfo[ 312 ],
+ &Prop201
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop199 = {
+ 0xD0D0, /*start :行*/
+ 0xD0D0, /*end :行, len=1*/
+ &Cinfo[ 311 ],
+ &Prop200
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop198 = {
+ 0xD0CD, /*start :型*/
+ 0xD0CD, /*end :型, len=1*/
+ &Cinfo[ 310 ],
+ &Prop199
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop197 = {
+ 0xD0C5, /*start :信*/
+ 0xD0C5, /*end :信, len=1*/
+ &Cinfo[ 309 ],
+ &Prop198
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop196 = {
+ 0xD0C2, /*start :新*/
+ 0xD0C2, /*end :新, len=1*/
+ &Cinfo[ 308 ],
+ &Prop197
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop195 = {
+ 0xD0B4, /*start :写*/
+ 0xD0B4, /*end :写, len=1*/
+ &Cinfo[ 307 ],
+ &Prop196
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop194 = {
+ 0xD0A3, /*start :校*/
+ 0xD0A3, /*end :校, len=1*/
+ &Cinfo[ 306 ],
+ &Prop195
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop193 = {
+ 0xD0A1, /*start :小*/
+ 0xD0A1, /*end :小, len=1*/
+ &Cinfo[ 305 ],
+ &Prop194
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop192 = {
+ 0xCFFB, /*start :消*/
+ 0xCFFB, /*end :消, len=1*/
+ &Cinfo[ 304 ],
+ &Prop193
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop191 = {
+ 0xCFF2, /*start :向*/
+ 0xCFF2, /*end :向, len=1*/
+ &Cinfo[ 303 ],
+ &Prop192
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop190 = {
+ 0xCFEE, /*start :项*/
+ 0xCFEE, /*end :项, len=1*/
+ &Cinfo[ 302 ],
+ &Prop191
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop189 = {
+ 0xCFDE, /*start :限*/
+ 0xCFE0, /*end :相, len=3*/
+ &Cinfo[ 299 ],
+ &Prop190
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop188 = {
+ 0xCFD4, /*start :显*/
+ 0xCFD4, /*end :显, len=1*/
+ &Cinfo[ 298 ],
+ &Prop189
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop187 = {
+ 0xCFC2, /*start :下*/
+ 0xCFC2, /*end :下, len=1*/
+ &Cinfo[ 297 ],
+ &Prop188
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop186 = {
+ 0xCFB5, /*start :系*/
+ 0xCFB5, /*end :系, len=1*/
+ &Cinfo[ 296 ],
+ &Prop187
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop185 = {
+ 0xCFA2, /*start :息*/
+ 0xCFA2, /*end :息, len=1*/
+ &Cinfo[ 295 ],
+ &Prop186
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop184 = {
+ 0xCEF1, /*start :务*/
+ 0xCEF1, /*end :务, len=1*/
+ &Cinfo[ 294 ],
+ &Prop185
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop183 = {
+ 0xCEC4, /*start :文*/
+ 0xCEC4, /*end :文, len=1*/
+ &Cinfo[ 293 ],
+ &Prop184
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop182 = {
+ 0xCEC2, /*start :温*/
+ 0xCEC2, /*end :温, len=1*/
+ &Cinfo[ 292 ],
+ &Prop183
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop181 = {
+ 0xCEBB, /*start :位*/
+ 0xCEBB, /*end :位, len=1*/
+ &Cinfo[ 291 ],
+ &Prop182
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop180 = {
+ 0xCEB4, /*start :未*/
+ 0xCEB4, /*end :未, len=1*/
+ &Cinfo[ 290 ],
+ &Prop181
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop179 = {
+ 0xCEAA, /*start :为*/
+ 0xCEAA, /*end :为, len=1*/
+ &Cinfo[ 289 ],
+ &Prop180
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop178 = {
+ 0xCEA7, /*start :围*/
+ 0xCEA7, /*end :围, len=1*/
+ &Cinfo[ 288 ],
+ &Prop179
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop177 = {
+ 0xCEA2, /*start :微*/
+ 0xCEA2, /*end :微, len=1*/
+ &Cinfo[ 287 ],
+ &Prop178
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop176 = {
+ 0xCDE2, /*start :外*/
+ 0xCDE2, /*end :外, len=1*/
+ &Cinfo[ 286 ],
+ &Prop177
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop175 = {
+ 0xCDBC, /*start :图*/
+ 0xCDBC, /*end :图, len=1*/
+ &Cinfo[ 285 ],
+ &Prop176
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop174 = {
+ 0xCDB6, /*start :投*/
+ 0xCDB6, /*end :投, len=1*/
+ &Cinfo[ 284 ],
+ &Prop175
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop173 = {
+ 0xCDA8, /*start :通*/
+ 0xCDA8, /*end :通, len=1*/
+ &Cinfo[ 283 ],
+ &Prop174
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop172 = {
+ 0xCDA3, /*start :停*/
+ 0xCDA3, /*end :停, len=1*/
+ &Cinfo[ 282 ],
+ &Prop173
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop171 = {
+ 0xCCF5, /*start :条*/
+ 0xCCF5, /*end :条, len=1*/
+ &Cinfo[ 281 ],
+ &Prop172
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop170 = {
+ 0xCCAC, /*start :态*/
+ 0xCCAC, /*end :态, len=1*/
+ &Cinfo[ 280 ],
+ &Prop171
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop169 = {
+ 0xCBF9, /*start :所*/
+ 0xCBF9, /*end :所, len=1*/
+ &Cinfo[ 279 ],
+ &Prop170
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop168 = {
+ 0xCBE3, /*start :算*/
+ 0xCBE3, /*end :算, len=1*/
+ &Cinfo[ 278 ],
+ &Prop169
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop167 = {
+ 0xCBD9, /*start :速*/
+ 0xCBD9, /*end :速, len=1*/
+ &Cinfo[ 277 ],
+ &Prop168
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop166 = {
+ 0xCBD5, /*start :苏*/
+ 0xCBD5, /*end :苏, len=1*/
+ &Cinfo[ 276 ],
+ &Prop167
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop165 = {
+ 0xCBC0, /*start :死*/
+ 0xCBC0, /*end :死, len=1*/
+ &Cinfo[ 275 ],
+ &Prop166
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop164 = {
+ 0xCBBE, /*start :司*/
+ 0xCBBE, /*end :司, len=1*/
+ &Cinfo[ 274 ],
+ &Prop165
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop163 = {
+ 0xCBAB, /*start :双*/
+ 0xCBAB, /*end :双, len=1*/
+ &Cinfo[ 273 ],
+ &Prop164
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop162 = {
+ 0xCAFD, /*start :数*/
+ 0xCAFD, /*end :数, len=1*/
+ &Cinfo[ 272 ],
+ &Prop163
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop161 = {
+ 0xCAF5, /*start :术*/
+ 0xCAF5, /*end :术, len=1*/
+ &Cinfo[ 271 ],
+ &Prop162
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop160 = {
+ 0xCAE4, /*start :输*/
+ 0xCAE4, /*end :输, len=1*/
+ &Cinfo[ 270 ],
+ &Prop161
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop159 = {
+ 0xCAD6, /*start :手*/
+ 0xCAD7, /*end :首, len=2*/
+ &Cinfo[ 268 ],
+ &Prop160
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop158 = {
+ 0xCAD4, /*start :试*/
+ 0xCAD4, /*end :试, len=1*/
+ &Cinfo[ 267 ],
+ &Prop159
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop157 = {
+ 0xCABD, /*start :式*/
+ 0xCABE, /*end :示, len=2*/
+ &Cinfo[ 265 ],
+ &Prop158
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop156 = {
+ 0xCAB9, /*start :使*/
+ 0xCAB9, /*end :使, len=1*/
+ &Cinfo[ 264 ],
+ &Prop157
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop155 = {
+ 0xCAB5, /*start :实*/
+ 0xCAB5, /*end :实, len=1*/
+ &Cinfo[ 263 ],
+ &Prop156
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop154 = {
+ 0xCAB1, /*start :时*/
+ 0xCAB1, /*end :时, len=1*/
+ &Cinfo[ 262 ],
+ &Prop155
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop153 = {
+ 0xCAAF, /*start :石*/
+ 0xCAAF, /*end :石, len=1*/
+ &Cinfo[ 261 ],
+ &Prop154
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop152 = {
+ 0xCAAA, /*start :湿*/
+ 0xCAAA, /*end :湿, len=1*/
+ &Cinfo[ 260 ],
+ &Prop153
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop151 = {
+ 0xC9E8, /*start :设*/
+ 0xC9E8, /*end :设, len=1*/
+ &Cinfo[ 259 ],
+ &Prop152
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop150 = {
+ 0xC9D9, /*start :少*/
+ 0xC9D9, /*end :少, len=1*/
+ &Cinfo[ 258 ],
+ &Prop151
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop149 = {
+ 0xC9CF, /*start :上*/
+ 0xC9CF, /*end :上, len=1*/
+ &Cinfo[ 257 ],
+ &Prop150
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop148 = {
+ 0xC9CC, /*start :商*/
+ 0xC9CC, /*end :商, len=1*/
+ &Cinfo[ 256 ],
+ &Prop149
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop147 = {
+ 0xC8ED, /*start :软*/
+ 0xC8ED, /*end :软, len=1*/
+ &Cinfo[ 255 ],
+ &Prop148
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop146 = {
+ 0xC8EB, /*start :入*/
+ 0xC8EB, /*end :入, len=1*/
+ &Cinfo[ 254 ],
+ &Prop147
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop145 = {
+ 0xC8CF, /*start :认*/
+ 0xC8CF, /*end :认, len=1*/
+ &Cinfo[ 253 ],
+ &Prop146
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop144 = {
+ 0xC8B7, /*start :确*/
+ 0xC8B7, /*end :确, len=1*/
+ &Cinfo[ 252 ],
+ &Prop145
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop143 = {
+ 0xC8AB, /*start :全*/
+ 0xC8AB, /*end :全, len=1*/
+ &Cinfo[ 251 ],
+ &Prop144
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop142 = {
+ 0xC8A1, /*start :取*/
+ 0xC8A1, /*end :取, len=1*/
+ &Cinfo[ 250 ],
+ &Prop143
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop141 = {
+ 0xC7FD, /*start :驱*/
+ 0xC7FD, /*end :驱, len=1*/
+ &Cinfo[ 249 ],
+ &Prop142
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop140 = {
+ 0xC7F8, /*start :区*/
+ 0xC7F8, /*end :区, len=1*/
+ &Cinfo[ 248 ],
+ &Prop141
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop139 = {
+ 0xC7D0, /*start :切*/
+ 0xC7D0, /*end :切, len=1*/
+ &Cinfo[ 247 ],
+ &Prop140
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop138 = {
+ 0xC7B0, /*start :前*/
+ 0xC7B0, /*end :前, len=1*/
+ &Cinfo[ 246 ],
+ &Prop139
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop137 = {
+ 0xC6F7, /*start :器*/
+ 0xC6F8, /*end :气, len=2*/
+ &Cinfo[ 244 ],
+ &Prop138
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop136 = {
+ 0xC6F4, /*start :启*/
+ 0xC6F4, /*end :启, len=1*/
+ &Cinfo[ 243 ],
+ &Prop137
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop135 = {
+ 0xC6BD, /*start :平*/
+ 0xC6BD, /*end :平, len=1*/
+ &Cinfo[ 242 ],
+ &Prop136
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop134 = {
+ 0xC6B5, /*start :频*/
+ 0xC6B5, /*end :频, len=1*/
+ &Cinfo[ 241 ],
+ &Prop135
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop133 = {
+ 0xC6AB, /*start :偏*/
+ 0xC6AB, /*end :偏, len=1*/
+ &Cinfo[ 240 ],
+ &Prop134
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop132 = {
+ 0xC5E4, /*start :配*/
+ 0xC5E4, /*end :配, len=1*/
+ &Cinfo[ 239 ],
+ &Prop133
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop131 = {
+ 0xC4E2, /*start :拟*/
+ 0xC4E2, /*end :拟, len=1*/
+ &Cinfo[ 238 ],
+ &Prop132
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop130 = {
+ 0xC4DC, /*start :能*/
+ 0xC4DC, /*end :能, len=1*/
+ &Cinfo[ 237 ],
+ &Prop131
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop129 = {
+ 0xC4DA, /*start :内*/
+ 0xC4DA, /*end :内, len=1*/
+ &Cinfo[ 236 ],
+ &Prop130
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop128 = {
+ 0xC4A6, /*start :摩*/
+ 0xC4A6, /*end :摩, len=1*/
+ &Cinfo[ 235 ],
+ &Prop129
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop127 = {
+ 0xC4A3, /*start :模*/
+ 0xC4A4, /*end :膜, len=2*/
+ &Cinfo[ 233 ],
+ &Prop128
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop126 = {
+ 0xC3FB, /*start :名*/
+ 0xC3FB, /*end :名, len=1*/
+ &Cinfo[ 232 ],
+ &Prop127
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop125 = {
+ 0xC3E6, /*start :面*/
+ 0xC3E6, /*end :面, len=1*/
+ &Cinfo[ 231 ],
+ &Prop126
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop124 = {
+ 0xC3C5, /*start :门*/
+ 0xC3C5, /*end :门, len=1*/
+ &Cinfo[ 230 ],
+ &Prop125
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop123 = {
+ 0xC2FA, /*start :满*/
+ 0xC2FA, /*end :满, len=1*/
+ &Cinfo[ 229 ],
+ &Prop124
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop122 = {
+ 0xC2CA, /*start :率*/
+ 0xC2CA, /*end :率, len=1*/
+ &Cinfo[ 228 ],
+ &Prop123
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop121 = {
+ 0xC2BC, /*start :录*/
+ 0xC2BC, /*end :录, len=1*/
+ &Cinfo[ 227 ],
+ &Prop122
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop120 = {
+ 0xC2B7, /*start :路*/
+ 0xC2B7, /*end :路, len=1*/
+ &Cinfo[ 226 ],
+ &Prop121
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop119 = {
+ 0xC1F7, /*start :流*/
+ 0xC1F7, /*end :流, len=1*/
+ &Cinfo[ 225 ],
+ &Prop120
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop118 = {
+ 0xC1E3, /*start :零*/
+ 0xC1E3, /*end :零, len=1*/
+ &Cinfo[ 224 ],
+ &Prop119
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop117 = {
+ 0xC1D0, /*start :列*/
+ 0xC1D0, /*end :列, len=1*/
+ &Cinfo[ 223 ],
+ &Prop118
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop116 = {
+ 0xC1BF, /*start :量*/
+ 0xC1BF, /*end :量, len=1*/
+ &Cinfo[ 222 ],
+ &Prop117
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop115 = {
+ 0xC1A6, /*start :力*/
+ 0xC1A6, /*end :力, len=1*/
+ &Cinfo[ 221 ],
+ &Prop116
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop114 = {
+ 0xC0FD, /*start :例*/
+ 0xC0FD, /*end :例, len=1*/
+ &Cinfo[ 220 ],
+ &Prop115
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop113 = {
+ 0xC0EB, /*start :离*/
+ 0xC0EB, /*end :离, len=1*/
+ &Cinfo[ 219 ],
+ &Prop114
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop112 = {
+ 0xC0E0, /*start :类*/
+ 0xC0E0, /*end :类, len=1*/
+ &Cinfo[ 218 ],
+ &Prop113
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop111 = {
+ 0xC0DB, /*start :累*/
+ 0xC0DB, /*end :累, len=1*/
+ &Cinfo[ 217 ],
+ &Prop112
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop110 = {
+ 0xC0B6, /*start :蓝*/
+ 0xC0B6, /*end :蓝, len=1*/
+ &Cinfo[ 216 ],
+ &Prop111
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop109 = {
+ 0xBFE9, /*start :块*/
+ 0xBFE9, /*end :块, len=1*/
+ &Cinfo[ 215 ],
+ &Prop110
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop108 = {
+ 0xBFE7, /*start :跨*/
+ 0xBFE7, /*end :跨, len=1*/
+ &Cinfo[ 214 ],
+ &Prop109
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop107 = {
+ 0xBFD8, /*start :控*/
+ 0xBFD8, /*end :控, len=1*/
+ &Cinfo[ 213 ],
+ &Prop108
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop106 = {
+ 0xBFD5, /*start :空*/
+ 0xBFD5, /*end :空, len=1*/
+ &Cinfo[ 212 ],
+ &Prop107
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop105 = {
+ 0xBFC9, /*start :可*/
+ 0xBFC9, /*end :可, len=1*/
+ &Cinfo[ 211 ],
+ &Prop106
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop104 = {
+ 0xBFAA, /*start :开*/
+ 0xBFAA, /*end :开, len=1*/
+ &Cinfo[ 210 ],
+ &Prop105
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop103 = {
+ 0xBEDD, /*start :据*/
+ 0xBEDE, /*end :巨, len=2*/
+ &Cinfo[ 208 ],
+ &Prop104
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop102 = {
+ 0xBEB3, /*start :境*/
+ 0xBEB3, /*end :境, len=1*/
+ &Cinfo[ 207 ],
+ &Prop103
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop101 = {
+ 0xBEAF, /*start :警*/
+ 0xBEAF, /*end :警, len=1*/
+ &Cinfo[ 206 ],
+ &Prop102
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop100 = {
+ 0xBEA1, /*start :尽*/
+ 0xBEA1, /*end :尽, len=1*/
+ &Cinfo[ 205 ],
+ &Prop101
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop99 = {
+ 0xBDF8, /*start :进*/
+ 0xBDF8, /*end :进, len=1*/
+ &Cinfo[ 204 ],
+ &Prop100
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop98 = {
+ 0xBDC7, /*start :角*/
+ 0xBDC7, /*end :角, len=1*/
+ &Cinfo[ 203 ],
+ &Prop99
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop97 = {
+ 0xBDAD, /*start :江*/
+ 0xBDAD, /*end :江, len=1*/
+ &Cinfo[ 202 ],
+ &Prop98
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop96 = {
+ 0xBCFE, /*start :件*/
+ 0xBCFE, /*end :件, len=1*/
+ &Cinfo[ 201 ],
+ &Prop97
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop95 = {
+ 0xBCF5, /*start :减*/
+ 0xBCF5, /*end :减, len=1*/
+ &Cinfo[ 200 ],
+ &Prop96
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop94 = {
+ 0xBCE4, /*start :间*/
+ 0xBCE4, /*end :间, len=1*/
+ &Cinfo[ 199 ],
+ &Prop95
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop93 = {
+ 0xBCD3, /*start :加*/
+ 0xBCD3, /*end :加, len=1*/
+ &Cinfo[ 198 ],
+ &Prop94
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop92 = {
+ 0xBCC6, /*start :计*/
+ 0xBCC7, /*end :记, len=2*/
+ &Cinfo[ 196 ],
+ &Prop93
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop91 = {
+ 0xBCBC, /*start :技*/
+ 0xBCBC, /*end :技, len=1*/
+ &Cinfo[ 195 ],
+ &Prop92
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop90 = {
+ 0xBCAD, /*start :辑*/
+ 0xBCAD, /*end :辑, len=1*/
+ &Cinfo[ 194 ],
+ &Prop91
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop89 = {
+ 0xBBFD, /*start :积*/
+ 0xBBFD, /*end :积, len=1*/
+ &Cinfo[ 193 ],
+ &Prop90
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop88 = {
+ 0xBBF9, /*start :基*/
+ 0xBBFA, /*end :机, len=2*/
+ &Cinfo[ 191 ],
+ &Prop89
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop87 = {
+ 0xBBD8, /*start :回*/
+ 0xBBD8, /*end :回, len=1*/
+ &Cinfo[ 190 ],
+ &Prop88
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop86 = {
+ 0xBBD6, /*start :恢*/
+ 0xBBD6, /*end :恢, len=1*/
+ &Cinfo[ 189 ],
+ &Prop87
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop85 = {
+ 0xBBC9, /*start :簧*/
+ 0xBBC9, /*end :簧, len=1*/
+ &Cinfo[ 188 ],
+ &Prop86
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop84 = {
+ 0xBBBB, /*start :换*/
+ 0xBBBB, /*end :换, len=1*/
+ &Cinfo[ 187 ],
+ &Prop85
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop83 = {
+ 0xBBB6, /*start :欢*/
+ 0xBBB7, /*end :环, len=2*/
+ &Cinfo[ 185 ],
+ &Prop84
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop82 = {
+ 0xBBA4, /*start :护*/
+ 0xBBA4, /*end :护, len=1*/
+ &Cinfo[ 184 ],
+ &Prop83
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop81 = {
+ 0xBAE3, /*start :恒*/
+ 0xBAE3, /*end :恒, len=1*/
+ &Cinfo[ 183 ],
+ &Prop82
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop80 = {
+ 0xBACD, /*start :和*/
+ 0xBACD, /*end :和, len=1*/
+ &Cinfo[ 182 ],
+ &Prop81
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop79 = {
+ 0xBAC4, /*start :耗*/
+ 0xBAC5, /*end :号, len=2*/
+ &Cinfo[ 180 ],
+ &Prop80
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop78 = {
+ 0xB9FD, /*start :过*/
+ 0xB9FD, /*end :过, len=1*/
+ &Cinfo[ 179 ],
+ &Prop79
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop77 = {
+ 0xB9D8, /*start :关*/
+ 0xB9D8, /*end :关, len=1*/
+ &Cinfo[ 178 ],
+ &Prop78
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop76 = {
+ 0xB9CC, /*start :固*/
+ 0xB9CC, /*end :固, len=1*/
+ &Cinfo[ 177 ],
+ &Prop77
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop75 = {
+ 0xB9CA, /*start :故*/
+ 0xB9CA, /*end :故, len=1*/
+ &Cinfo[ 176 ],
+ &Prop76
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop74 = {
+ 0xB9B9, /*start :构*/
+ 0xB9B9, /*end :构, len=1*/
+ &Cinfo[ 175 ],
+ &Prop75
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop73 = {
+ 0xB9AB, /*start :公*/
+ 0xB9AB, /*end :公, len=1*/
+ &Cinfo[ 174 ],
+ &Prop74
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop72 = {
+ 0xB9A6, /*start :功*/
+ 0xB9A6, /*end :功, len=1*/
+ &Cinfo[ 173 ],
+ &Prop73
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop71 = {
+ 0xB9A4, /*start :工*/
+ 0xB9A4, /*end :工, len=1*/
+ &Cinfo[ 172 ],
+ &Prop72
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop70 = {
+ 0xB8FC, /*start :更*/
+ 0xB8FC, /*end :更, len=1*/
+ &Cinfo[ 171 ],
+ &Prop71
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop69 = {
+ 0xB8F6, /*start :个*/
+ 0xB8F6, /*end :个, len=1*/
+ &Cinfo[ 170 ],
+ &Prop70
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop68 = {
+ 0xB8EE, /*start :割*/
+ 0xB8EE, /*end :割, len=1*/
+ &Cinfo[ 169 ],
+ &Prop69
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop67 = {
+ 0xB8DF, /*start :高*/
+ 0xB8DF, /*end :高, len=1*/
+ &Cinfo[ 168 ],
+ &Prop68
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop66 = {
+ 0xB8D7, /*start :缸*/
+ 0xB8D7, /*end :缸, len=1*/
+ &Cinfo[ 167 ],
+ &Prop67
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop65 = {
+ 0xB8D0, /*start :感*/
+ 0xB8D0, /*end :感, len=1*/
+ &Cinfo[ 166 ],
+ &Prop66
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop64 = {
+ 0xB8B4, /*start :复*/
+ 0xB8B4, /*end :复, len=1*/
+ &Cinfo[ 165 ],
+ &Prop65
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop63 = {
+ 0xB7FE, /*start :服*/
+ 0xB7FE, /*end :服, len=1*/
+ &Cinfo[ 164 ],
+ &Prop64
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop62 = {
+ 0xB7D6, /*start :分*/
+ 0xB7D6, /*end :分, len=1*/
+ &Cinfo[ 163 ],
+ &Prop63
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop61 = {
+ 0xB7C7, /*start :非*/
+ 0xB7C7, /*end :非, len=1*/
+ &Cinfo[ 162 ],
+ &Prop62
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop60 = {
+ 0xB7C5, /*start :放*/
+ 0xB7C5, /*end :放, len=1*/
+ &Cinfo[ 161 ],
+ &Prop61
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop59 = {
+ 0xB7BD, /*start :方*/
+ 0xB7BD, /*end :方, len=1*/
+ &Cinfo[ 160 ],
+ &Prop60
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop58 = {
+ 0xB7B4, /*start :反*/
+ 0xB7B6, /*end :范, len=3*/
+ &Cinfo[ 157 ],
+ &Prop59
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop57 = {
+ 0xB7A7, /*start :阀*/
+ 0xB7A8, /*end :法, len=2*/
+ &Cinfo[ 155 ],
+ &Prop58
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop56 = {
+ 0xB6CF, /*start :断*/
+ 0xB6CF, /*end :断, len=1*/
+ &Cinfo[ 154 ],
+ &Prop57
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop55 = {
+ 0xB6CC, /*start :短*/
+ 0xB6CC, /*end :短, len=1*/
+ &Cinfo[ 153 ],
+ &Prop56
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop54 = {
+ 0xB6C8, /*start :度*/
+ 0xB6C8, /*end :度, len=1*/
+ &Cinfo[ 152 ],
+ &Prop55
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop53 = {
+ 0xB6AF, /*start :动*/
+ 0xB6AF, /*end :动, len=1*/
+ &Cinfo[ 151 ],
+ &Prop54
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop52 = {
+ 0xB6A8, /*start :定*/
+ 0xB6A8, /*end :定, len=1*/
+ &Cinfo[ 150 ],
+ &Prop53
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop51 = {
+ 0xB5E7, /*start :电*/
+ 0xB5E7, /*end :电, len=1*/
+ &Cinfo[ 149 ],
+ &Prop52
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop50 = {
+ 0xB5E3, /*start :点*/
+ 0xB5E3, /*end :点, len=1*/
+ &Cinfo[ 148 ],
+ &Prop51
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop49 = {
+ 0xB5D8, /*start :地*/
+ 0xB5D8, /*end :地, len=1*/
+ &Cinfo[ 147 ],
+ &Prop50
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop48 = {
+ 0xB5CD, /*start :低*/
+ 0xB5CD, /*end :低, len=1*/
+ &Cinfo[ 146 ],
+ &Prop49
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop47 = {
+ 0xB5C4, /*start :的*/
+ 0xB5C4, /*end :的, len=1*/
+ &Cinfo[ 145 ],
+ &Prop48
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop46 = {
+ 0xB5B1, /*start :当*/
+ 0xB5B1, /*end :当, len=1*/
+ &Cinfo[ 144 ],
+ &Prop47
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop45 = {
+ 0xB5AF, /*start :弹*/
+ 0xB5AF, /*end :弹, len=1*/
+ &Cinfo[ 143 ],
+ &Prop46
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop44 = {
+ 0xB5A5, /*start :单*/
+ 0xB5A5, /*end :单, len=1*/
+ &Cinfo[ 142 ],
+ &Prop45
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop43 = {
+ 0xB4FD, /*start :待*/
+ 0xB4FD, /*end :待, len=1*/
+ &Cinfo[ 141 ],
+ &Prop44
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop42 = {
+ 0xB4F8, /*start :带*/
+ 0xB4F8, /*end :带, len=1*/
+ &Cinfo[ 140 ],
+ &Prop43
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop41 = {
+ 0xB4F3, /*start :大*/
+ 0xB4F3, /*end :大, len=1*/
+ &Cinfo[ 139 ],
+ &Prop42
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop40 = {
+ 0xB4E6, /*start :存*/
+ 0xB4E6, /*end :存, len=1*/
+ &Cinfo[ 138 ],
+ &Prop41
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop39 = {
+ 0xB4CE, /*start :次*/
+ 0xB4CE, /*end :次, len=1*/
+ &Cinfo[ 137 ],
+ &Prop40
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop38 = {
+ 0xB4C5, /*start :磁*/
+ 0xB4C5, /*end :磁, len=1*/
+ &Cinfo[ 136 ],
+ &Prop39
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop37 = {
+ 0xB4AB, /*start :传*/
+ 0xB4AB, /*end :传, len=1*/
+ &Cinfo[ 135 ],
+ &Prop38
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop36 = {
+ 0xB4A2, /*start :储*/
+ 0xB4A2, /*end :储, len=1*/
+ &Cinfo[ 134 ],
+ &Prop37
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop35 = {
+ 0xB3F6, /*start :出*/
+ 0xB3F6, /*end :出, len=1*/
+ &Cinfo[ 133 ],
+ &Prop36
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop34 = {
+ 0xB3CC, /*start :程*/
+ 0xB3CC, /*end :程, len=1*/
+ &Cinfo[ 132 ],
+ &Prop35
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop33 = {
+ 0xB3C9, /*start :成*/
+ 0xB3C9, /*end :成, len=1*/
+ &Cinfo[ 131 ],
+ &Prop34
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop32 = {
+ 0xB3C6, /*start :称*/
+ 0xB3C6, /*end :称, len=1*/
+ &Cinfo[ 130 ],
+ &Prop33
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop31 = {
+ 0xB3A7, /*start :厂*/
+ 0xB3A7, /*end :厂, len=1*/
+ &Cinfo[ 129 ],
+ &Prop32
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop30 = {
+ 0xB3A3, /*start :常*/
+ 0xB3A4, /*end :长, len=2*/
+ &Cinfo[ 127 ],
+ &Prop31
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop29 = {
+ 0xB2EE, /*start :差*/
+ 0xB2EE, /*end :差, len=1*/
+ &Cinfo[ 126 ],
+ &Prop30
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop28 = {
+ 0xB2E2, /*start :测*/
+ 0xB2E2, /*end :测, len=1*/
+ &Cinfo[ 125 ],
+ &Prop29
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop27 = {
+ 0xB2D9, /*start :操*/
+ 0xB2D9, /*end :操, len=1*/
+ &Cinfo[ 124 ],
+ &Prop28
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop26 = {
+ 0xB2CE, /*start :参*/
+ 0xB2CE, /*end :参, len=1*/
+ &Cinfo[ 123 ],
+ &Prop27
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop25 = {
+ 0xB2C1, /*start :擦*/
+ 0xB2C1, /*end :擦, len=1*/
+ &Cinfo[ 122 ],
+ &Prop26
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop24 = {
+ 0xB2BB, /*start :不*/
+ 0xB2BB, /*end :不, len=1*/
+ &Cinfo[ 121 ],
+ &Prop25
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop23 = {
+ 0xB1ED, /*start :表*/
+ 0xB1ED, /*end :表, len=1*/
+ &Cinfo[ 120 ],
+ &Prop24
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop22 = {
+ 0xB1E4, /*start :变*/
+ 0xB1E4, /*end :变, len=1*/
+ &Cinfo[ 119 ],
+ &Prop23
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop21 = {
+ 0xB1E0, /*start :编*/
+ 0xB1E0, /*end :编, len=1*/
+ &Cinfo[ 118 ],
+ &Prop22
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop20 = {
+ 0xB1D5, /*start :闭*/
+ 0xB1D5, /*end :闭, len=1*/
+ &Cinfo[ 117 ],
+ &Prop21
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop19 = {
+ 0xB1C8, /*start :比*/
+ 0xB1C8, /*end :比, len=1*/
+ &Cinfo[ 116 ],
+ &Prop20
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop18 = {
+ 0xB1BE, /*start :本*/
+ 0xB1BE, /*end :本, len=1*/
+ &Cinfo[ 115 ],
+ &Prop19
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop17 = {
+ 0xB1B8, /*start :备*/
+ 0xB1B8, /*end :备, len=1*/
+ &Cinfo[ 114 ],
+ &Prop18
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop16 = {
+ 0xB1A8, /*start :报*/
+ 0xB1A8, /*end :报, len=1*/
+ &Cinfo[ 113 ],
+ &Prop17
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop15 = {
+ 0xB1A5, /*start :饱*/
+ 0xB1A5, /*end :饱, len=1*/
+ &Cinfo[ 112 ],
+ &Prop16
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop14 = {
+ 0xB1A3, /*start :保*/
+ 0xB1A3, /*end :保, len=1*/
+ &Cinfo[ 111 ],
+ &Prop15
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop13 = {
+ 0xB1A1, /*start :薄*/
+ 0xB1A1, /*end :薄, len=1*/
+ &Cinfo[ 110 ],
+ &Prop14
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop12 = {
+ 0xB0E6, /*start :版*/
+ 0xB0E6, /*end :版, len=1*/
+ &Cinfo[ 109 ],
+ &Prop13
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop11 = {
+ 0xB0B4, /*start :按*/
+ 0xB0B4, /*end :按, len=1*/
+ &Cinfo[ 108 ],
+ &Prop12
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop10 = {
+ 0xB0B2, /*start :安*/
+ 0xB0B2, /*end :安, len=1*/
+ &Cinfo[ 107 ],
+ &Prop11
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop9 = {
+ 0xA848, /*start :℉*/
+ 0xA848, /*end :℉, len=1*/
+ &Cinfo[ 106 ],
+ &Prop10
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop8 = {
+ 0xA1FA, /*start :→*/
+ 0xA1FD, /*end :↓, len=4*/
+ &Cinfo[ 102 ],
+ &Prop9
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop7 = {
+ 0xA1F0, /*start :○*/
+ 0xA1F0, /*end :○, len=1*/
+ &Cinfo[ 101 ],
+ &Prop8
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop6 = {
+ 0xA1E6, /*start :℃*/
+ 0xA1E6, /*end :℃, len=1*/
+ &Cinfo[ 100 ],
+ &Prop7
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop5 = {
+ 0xA1E3, /*start :°*/
+ 0xA1E3, /*end :°, len=1*/
+ &Cinfo[ 99 ],
+ &Prop6
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop4 = {
+ 0xA1CC, /*start :√*/
+ 0xA1CC, /*end :√, len=1*/
+ &Cinfo[ 98 ],
+ &Prop5
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop3 = {
+ 0xA1C1, /*start :×*/
+ 0xA1C1, /*end :×, len=1*/
+ &Cinfo[ 97 ],
+ &Prop4
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop2 = {
+ 0xA1AB, /*start :~*/
+ 0xA1AB, /*end :~, len=1*/
+ &Cinfo[ 96 ],
+ &Prop3
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop1 = {
+ 0x0020, /*start : */
+ 0x007F, /*end :, len=96*/
+ &Cinfo[ 0 ],
+ &Prop2
+};
+
+
+GUI_CONST_STORAGE GUI_FONT GUI_FontHZ16x16 = {
+ GUI_FONTTYPE_PROP_SJIS,
+ 16, /* height of font */
+ 16, /* space of font y */
+ 1,
+ 1,
+ &Prop1
+};
+
diff --git a/User/system/lib/lcd/font/HZ18x18.c b/User/system/lib/lcd/font/HZ18x18.c
new file mode 100644
index 0000000..a7e0b6c
--- /dev/null
+++ b/User/system/lib/lcd/font/HZ18x18.c
@@ -0,0 +1,374 @@
+/*
+**********************************************************************
+* UcGUI Font
+* Chinese GB2312 library
+* (c) Copyright 19xx-20xx, company name
+*
+*
+* 注:本字体文件由 ucGUI字体生成器v9.0 生成,作者:馋嘴猫(qq:602426967)
+*
+**********************************************************************
+*/
+
+#include "GUI.H"
+
+
+/* char: code:0x0031 */
+static GUI_CONST_STORAGE unsigned char ac0031[54] = {
+ _____XX_,_____X__,________,
+ _____XX_,___XXXXX,________,
+ _XXX_XX_,__XX___X,X_______,
+ __XX____,_XX_____,X_______,
+ ___X____,XX______,XX______,
+ XXX_____,X_______,X_______,
+ XXX_____,_______X,X_______,
+ ________,______XX,________,
+ ____XX__,_____XX_,________,
+ ___XX___,____XX__,________,
+ __XX____,________,________,
+ _XX_____,_______X,XX______,
+ XX______,_X_____X,XX______,
+ XX______,XX____X_,________,
+ XX_____X,X_____XX,________,
+ _XX___XX,___XX_XX,X_______,
+ __XXXXX_,___XX___,________,
+ ___XXX__,___XX___,________
+};
+
+/* char: code:0x0032 */
+static GUI_CONST_STORAGE unsigned char ac0032[54] = {
+ ________,____XXX_,________,
+ ________,___XXXXX,________,
+ ________,__XX___X,X_______,
+ ________,_XX_____,XX______,
+ _______X,XX______,XX______,
+ _______X,X_______,XX______,
+ ______XX,______XX,X_______,
+ ______XX,_XX__XXX,________,
+ ____X_XX,_XXXXXX_,________,
+ ___XXXXX,X_XX_X__,________,
+ __XXX__X,X_XX____,________,
+ _XXX____,__XX____,________,
+ XX______,_XX_____,________,
+ XX______,XXX_____,________,
+ XX_____X,X_______,________,
+ _XX___XX,________,________,
+ __XXXXX_,________,________,
+ ___XXX__,________,________
+};
+
+/* char: code:0x0033 */
+static GUI_CONST_STORAGE unsigned char ac0033[54] = {
+ ________,___XXXX_,________,
+ ________,__XXXXXX,X_______,
+ ________,_XXX__XX,XX______,
+ ________,_XXX____,XX______,
+ ________,_XX_____,XX______,
+ ________,_XX_____,XX______,
+ ________,_XX_____,XX______,
+ ________,________,________,
+ XXXXXXXX,XXXXX___,________,
+ XXXXXXXX,XXXXX___,________,
+ XXXXXXXX,XXXXX___,________,
+ XXXXXXXX,XXXXX___,________,
+ XXXXXXXX,XXXXX___,________,
+ XXXXXXXX,XXXXX___,________,
+ XXXXXXXX,XXXXX___,________,
+ XXXXXXXX,XXXXX___,________,
+ _XXXXXXX,XXXX____,________,
+ ________,________,________
+};
+
+/* char: code:0x0034 */
+static GUI_CONST_STORAGE unsigned char ac0034[54] = {
+ _______X,XXX_____,________,
+ ______XX,XXXX____,________,
+ _____XXX,__XXX___,________,
+ _____XX_,___XX___,________,
+ ____XXX_,___XX___,________,
+ ____XXX_,___XX___,________,
+ ____XXX_,___XX___,________,
+ ________,________,________,
+ __XXXXXX,XXXXXXXX,________,
+ __XXXXXX,XXXXXXXX,________,
+ __XXXXXX,XXXXXXXX,________,
+ __XXXXXX,XXXXXXXX,________,
+ __XXXXXX,XXXXXXXX,________,
+ __XXXXXX,XXXXXXXX,________,
+ __XXXXXX,XXXXXXXX,________,
+ __XXXXXX,XXXXXXXX,________,
+ ___XXXXX,XXXXXXX_,________,
+ ________,________,________
+};
+
+/* char: code:0x0035 */
+static GUI_CONST_STORAGE unsigned char ac0035[54] = {
+ ________,________,________,
+ ________,________,________,
+ _____XXX,XXXXX___,________,
+ ____XX__,____XX__,________,
+ ___XX___,____XXX_,________,
+ __XX____,___XX_XX,________,
+ __X_____,__XXX__X,________,
+ __X_____,_XXX___X,________,
+ __X_____,XXX____X,________,
+ __X____X,XX_____X,________,
+ __X___XX,X______X,________,
+ __X__XXX,_______X,________,
+ ___XXXX_,______XX,________,
+ ___XX___,_____XX_,________,
+ ____XX__,____XX__,________,
+ ______XX,XXXXX___,________,
+ ________,________,________,
+ ________,________,________
+};
+
+/* char: code:0x0036 */
+static GUI_CONST_STORAGE unsigned char ac0036[54] = {
+ ________,XX______,________,
+ ________,XXX_____,________,
+ ________,XXXX____,________,
+ ________,XXXXX___,________,
+ ____XX__,XX_XXX__,________,
+ _____XX_,XX_XXX__,________,
+ _____XXX,XXXXX___,________,
+ ______XX,XXXX____,________,
+ ________,XXX_____,________,
+ ________,XXX_____,________,
+ _______X,XXXX____,________,
+ _____XXX,XX_XX___,________,
+ _____XX_,XX__XX__,________,
+ ____XX__,XX_XXX__,________,
+ ________,XXXXX___,________,
+ ________,XXXX____,________,
+ ________,XXX_____,________,
+ ________,XX______,________
+};
+
+/* char: code:0x0037 */
+static GUI_CONST_STORAGE unsigned char ac0037[54] = {
+ ________,_______X,________,
+ ________,______XX,________,
+ ________,____XXXX,________,
+ ________,__XXXXXX,________,
+ ________,_XXXXXXX,________,
+ _______X,XXXXXXXX,________,
+ ______XX,XXXXXXXX,________,
+ ____XXXX,XXXXXXXX,________,
+ ___XXXXX,XXXXXXXX,________,
+ ___XXXXX,XXXXXXXX,________,
+ _____XXX,XXXXXXXX,________,
+ ______XX,XXXXXXXX,________,
+ _______X,XXXXXXXX,________,
+ ________,_XXXXXXX,________,
+ ________,___XXXXX,________,
+ ________,____XXXX,________,
+ ________,______XX,________,
+ ________,_______X,________
+};
+
+/* char: code:0x0061 */
+static GUI_CONST_STORAGE unsigned char ac0061[54] = {
+ ________,________,________,
+ _______X,XXX_____,________,
+ ______XX,XXX_____,________,
+ ______XX,XXXX____,________,
+ ______XX,_XXX____,________,
+ _____XXX,__XX____,________,
+ _____XXX,__XXX___,________,
+ ____XXX_,__XXX___,________,
+ ____XXX_,___XXX__,________,
+ ____XX__,___XXX__,________,
+ ___XXX__,____XX__,________,
+ ___XXXXX,XXXXXXX_,________,
+ __XXXXXX,XXXXXXX_,________,
+ __XXX___,_____XX_,________,
+ __XXX___,_____XXX,________,
+ _XXX____,_____XXX,________,
+ _XXX____,______XX,X_______,
+ ________,________,________
+};
+
+/* char: code:0x0066 */
+static GUI_CONST_STORAGE unsigned char ac0066[54] = {
+ ________,________,________,
+ __XXXXXX,XXXXXXXX,X_______,
+ __XXXXXX,XXXXXXXX,X_______,
+ __XXXX__,________,________,
+ __XXXX__,________,________,
+ __XXXX__,________,________,
+ __XXXX__,________,________,
+ __XXXX__,________,________,
+ __XXXXXX,XXXXXXXX,________,
+ __XXXXXX,XXXXXXXX,________,
+ __XXXX__,________,________,
+ __XXXX__,________,________,
+ __XXXX__,________,________,
+ __XXXX__,________,________,
+ __XXXX__,________,________,
+ __XXXX__,________,________,
+ __XXXX__,________,________,
+ ________,________,________
+};
+
+/* char: code:0x006D */
+static GUI_CONST_STORAGE unsigned char ac006D[54] = {
+ ________,________,________,
+ _XXXX___,______XX,X_______,
+ _XXXX___,_____XXX,X_______,
+ _XXXXX__,_____XXX,X_______,
+ _XX_XX__,____XXXX,X_______,
+ _XXXXX__,____XX_X,X_______,
+ _XXXXXX_,____XX_X,X_______,
+ _XXX_XX_,___XX__X,X_______,
+ _XXX_XX_,___XX__X,X_______,
+ _XXX__XX,___XX__X,X_______,
+ _XXX__XX,__XX___X,X_______,
+ _XXX__XX,__XX___X,X_______,
+ _XXX___X,X_XX___X,X_______,
+ _XXX___X,XXX____X,X_______,
+ _XXX___X,XXX____X,X_______,
+ _XXX____,XXX____X,X_______,
+ _XXX____,XX_____X,X_______,
+ ________,________,________
+};
+
+/* char: code:0x0073 */
+static GUI_CONST_STORAGE unsigned char ac0073[54] = {
+ ________,________,________,
+ _____XXX,XXXXX___,________,
+ ___XXXXX,XXXXXXX_,________,
+ __XXXX__,___XXXXX,________,
+ __XXXX__,____XXXX,________,
+ __XXXX__,________,________,
+ __XXXX__,________,________,
+ ___XXXXX,X_______,________,
+ ____XXXX,XXXXX___,________,
+ _______X,XXXXXXX_,________,
+ ________,___XXXXX,________,
+ ________,_____XXX,X_______,
+ ____X___,_____XXX,X_______,
+ _XXXX___,_____XXX,X_______,
+ __XXXX__,____XXXX,________,
+ ___XXXXX,XXXXXXX_,________,
+ _____XXX,XXXXX___,________,
+ ________,________,________
+};
+
+/* char: code:0x0074 */
+static GUI_CONST_STORAGE unsigned char ac0074[54] = {
+ ________,________,________,
+ _XXXXXXX,XXXXXXXX,X_______,
+ _XXXXXXX,XXXXXXXX,X_______,
+ _______X,XXX_____,________,
+ _______X,XXX_____,________,
+ _______X,XXX_____,________,
+ _______X,XXX_____,________,
+ _______X,XXX_____,________,
+ _______X,XXX_____,________,
+ _______X,XXX_____,________,
+ _______X,XXX_____,________,
+ _______X,XXX_____,________,
+ _______X,XXX_____,________,
+ _______X,XXX_____,________,
+ _______X,XXX_____,________,
+ _______X,XXX_____,________,
+ _______X,XXX_____,________,
+ ________,________,________
+};
+
+/* char: code:0x0077 */
+static GUI_CONST_STORAGE unsigned char ac0077[54] = {
+ ________,________,________,
+ _XX_____,XX_____X,X_______,
+ _XX_____,XX_____X,X_______,
+ _XX____X,XX_____X,X_______,
+ _XX____X,XXX___XX,X_______,
+ _XX____X,XXX___XX,________,
+ __XX___X,_XX___XX,________,
+ __XX__XX,__X___XX,________,
+ __XX__XX,__X___XX,________,
+ __XX__XX,__XX__XX,________,
+ __XX__XX,__XX_XX_,________,
+ ___XX_X_,__XX_XX_,________,
+ ___XXXX_,___X_XX_,________,
+ ___XXXX_,___X_XX_,________,
+ ___XXXX_,___XXX__,________,
+ ___XXX__,___XXX__,________,
+ ____XX__,___XXX__,________,
+ ________,________,________
+};
+
+static GUI_CONST_STORAGE GUI_CHARINFO Cinfo[13] = {
+ { 18, 18, 3, (unsigned char *)&ac0031 }, /*0: */
+ { 18, 18, 3, (unsigned char *)&ac0032 }, /*1: */
+ { 18, 18, 3, (unsigned char *)&ac0033 }, /*2: */
+ { 16, 16, 3, (unsigned char *)&ac0034 }, /*3: */
+ { 16, 16, 3, (unsigned char *)&ac0035 }, /*4: */
+ { 14, 14, 3, (unsigned char *)&ac0036 }, /*5: */
+ { 16, 16, 3, (unsigned char *)&ac0037 }, /*6: */
+ { 17, 17, 3, (unsigned char *)&ac0061 }, /*7: */
+ { 17, 17, 3, (unsigned char *)&ac0066 }, /*8: */
+ { 17, 17, 3, (unsigned char *)&ac006D }, /*9: */
+ { 17, 17, 3, (unsigned char *)&ac0073 }, /*10: */
+ { 17, 17, 3, (unsigned char *)&ac0074 }, /*11: */
+ { 17, 17, 3, (unsigned char *)&ac0077 }, /*12: */
+};
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop6 = {
+ 0x0077, /*start :*/
+ 0x0077, /*end :, len=1*/
+ &Cinfo[ 12 ],
+ (void*)0
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop5 = {
+ 0x0073, /*start :*/
+ 0x0074, /*end :, len=2*/
+ &Cinfo[ 10 ],
+ &Prop6
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop4 = {
+ 0x006D, /*start :*/
+ 0x006D, /*end :, len=1*/
+ &Cinfo[ 9 ],
+ &Prop5
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop3 = {
+ 0x0066, /*start :*/
+ 0x0066, /*end :, len=1*/
+ &Cinfo[ 8 ],
+ &Prop4
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop2 = {
+ 0x0061, /*start :*/
+ 0x0061, /*end :, len=1*/
+ &Cinfo[ 7 ],
+ &Prop3
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop1 = {
+ 0x0031, /*start :*/
+ 0x0037, /*end :, len=7*/
+ &Cinfo[ 0 ],
+ &Prop2
+};
+
+
+GUI_CONST_STORAGE GUI_FONT GUI_FontHZ18x18 = {
+ GUI_FONTTYPE_PROP_SJIS,
+ 18, /* height of font */
+ 18, /* space of font y */
+ 1,
+ 1,
+ &Prop1
+};
+
diff --git a/User/system/lib/lcd/font/HZ20x20.c b/User/system/lib/lcd/font/HZ20x20.c
new file mode 100644
index 0000000..12ed338
--- /dev/null
+++ b/User/system/lib/lcd/font/HZ20x20.c
@@ -0,0 +1,198 @@
+/*
+**********************************************************************
+* UcGUI Font
+* Chinese GB2312 library
+* (c) Copyright 19xx-20xx, company name
+*
+*
+* 注:本字体文件由 ucGUI字体生成器v9.0 生成,作者:馋嘴猫(qq:602426967)
+*
+**********************************************************************
+*/
+
+#include "GUI.H"
+
+/* char: code:0x0030 */
+static GUI_CONST_STORAGE unsigned char ac0030[60] = {
+ ________, ________, ________,
+ _______X, XXXXX___, ________,
+ _____XXX, ____XXX_, ________,
+ ____XX__, ______XX, ________,
+ ___XX___, _______X, X_______,
+ __XX__X_, _____X__, XX______,
+ __X__XXX, ____XXX_, _X______,
+ _XX___XX, X__XXX__, _XX_____,
+ _X_____X, XXXXX___, _XX_____,
+ _X______, XXXX____, __X_____,
+ _X______, XXXX____, __X_____,
+ _X_____X, XXXXX___, _XX_____,
+ _XX___XX, X__XXX__, _XX_____,
+ __X__XXX, ____XXX_, _X______,
+ __XX__X_, _____X__, XX______,
+ ___XX___, _______X, X_______,
+ ____XX__, ______XX, ________,
+ _____XXX, X__XXXX_, ________,
+ _______X, XXXXX___, ________,
+ ________, ________, ________};
+
+/* char: code:0x0031 */
+static GUI_CONST_STORAGE unsigned char ac0031[60] = {
+ _______X, XXXXX___, ________,
+ _____XXX, XXXXXXX_, ________,
+ ___XXX__, ______XX, X_______,
+ __XXX___, _______X, XX______,
+ __XX____, ________, XX______,
+ _XX____X, XXXXX___, _XX_____,
+ _X_____X, X__XX___, __X_____,
+ XX____XX, ____XX__, __XX____,
+ XX______, ____XX__, __XX____,
+ XX______, ___XX___, __XX____,
+ XX______, __XX____, __XX____,
+ XX______, _XX_____, __XX____,
+ XX______, _XX_____, __XX____,
+ _X______, ________, _XX_____,
+ _XX_____, _XX_____, _XX_____,
+ __XX____, _XX_____, XX______,
+ __XXX___, _X_____X, X_______,
+ ___XXX__, ______XX, ________,
+ _____XXX, XXXXXXX_, ________,
+ _______X, XXXXX___, ________};
+
+/* char: code:0x0032 */
+static GUI_CONST_STORAGE unsigned char ac0032[60] = {
+ _____XXX, XX______, ________,
+ ____XXXX, XXX_____, ________,
+ _____XX_, __XX____, ________,
+ ______XX, ___XX___, ________,
+ _X_____X, ____XX__, ________,
+ XXX____X, X___XX__, ________,
+ XXXX___X, X____X__, ________,
+ XX_XXXXX, _____X__, ________,
+ XX___X__, ____XX__, ________,
+ XX______, ____XX__, ________,
+ _XX_____, _____XX_, ________,
+ __XX____, ______XX, ________,
+ ___XXX__, XX_____X, X_______,
+ ____XXXX, XXX_____, XX______,
+ ________, __XX____, _XX_____,
+ ________, ___XX___, __XX____,
+ ________, ____XX__, __XX____,
+ ________, _____XX_, __XX____,
+ ________, ______XX, XXX_____,
+ ________, _______X, XX______};
+
+/* char: code:0x0033 */
+static GUI_CONST_STORAGE unsigned char ac0033[60] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, XX______,
+ ________, _______X, XXX_____,
+ ________, ______XX, XX______,
+ ________, _____XXX, X_______,
+ __XX____, ____XXXX, ________,
+ __XXX___, ___XXXX_, ________,
+ ___XXX__, __XXXX__, ________,
+ ____XXX_, _XXXX___, ________,
+ _____XXX, XXXX____, ________,
+ ______XX, XXX_____, ________,
+ _______X, XX______, ________,
+ ________, X_______, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: code:0x0034 */
+static GUI_CONST_STORAGE unsigned char ac0034[60] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, _______X, ________,
+ ___X____, _X____X_, X_______,
+ __X_X___, X_X__X__, ________,
+ ___X____, _X____X_, X_______,
+ ________, _______X, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: code:0x0035 */
+static GUI_CONST_STORAGE unsigned char ac0035[60] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ___X____, ________, ________,
+ __X_XX__, _X_____X, ________,
+ _____X__, X_X___X_, X_______,
+ __X_XX__, _X_____X, ________,
+ ___X____, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: code:0x0036 */
+static GUI_CONST_STORAGE unsigned char ac0036[60] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, _X______, ________,
+ ___X____, X_X____X, ________,
+ __X_X__X, ___X__X_, X_______,
+ ___X____, X_X____X, ________,
+ ________, _X______, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+static GUI_CONST_STORAGE GUI_CHARINFO Cinfo[7] = {
+ {19, 19, 3, (unsigned char *)&ac0030}, /*0: */
+ {20, 20, 3, (unsigned char *)&ac0031}, /*1: */
+ {20, 20, 3, (unsigned char *)&ac0032}, /*2: */
+ {19, 19, 3, (unsigned char *)&ac0033}, /*3: */
+ {17, 17, 3, (unsigned char *)&ac0034}, /*4: */
+ {17, 17, 3, (unsigned char *)&ac0035}, /*5: */
+ {17, 17, 3, (unsigned char *)&ac0036}, /*6: */
+};
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop1 = {
+ 0x0030, /*start :*/
+ 0x0036, /*end :, len=7*/
+ &Cinfo[0],
+ (void *)0};
+
+GUI_CONST_STORAGE GUI_FONT GUI_FontHZ20x20 = {
+ GUI_FONTTYPE_PROP_SJIS,
+ 20, /* height of font */
+ 20, /* space of font y */
+ 1,
+ 1,
+ &Prop1};
diff --git a/User/system/lib/lcd/font/HZ24x24.c b/User/system/lib/lcd/font/HZ24x24.c
new file mode 100644
index 0000000..34e92e5
--- /dev/null
+++ b/User/system/lib/lcd/font/HZ24x24.c
@@ -0,0 +1,8317 @@
+/*
+**********************************************************************
+* UcGUI Font
+* Chinese GB2312 library
+* (c) Copyright 19xx-20xx, company name
+*
+*
+* 注:本字体文件由 ucGUI字体生成器v9.0 生成,作者:馋嘴猫(qq:602426967)
+* 字体:宋体,字形:粗体,大小:18,宽:24,高:24,水平偏移:0,垂直偏移:0
+*
+**********************************************************************
+*/
+
+#include "GUI.H"
+
+
+/* char: code:0x0020 */
+static GUI_CONST_STORAGE unsigned char ac0020[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: ! code:0x0021 */
+static GUI_CONST_STORAGE unsigned char ac0021[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ ______XX,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: " code:0x0022 */
+static GUI_CONST_STORAGE unsigned char ac0022[48] = {
+ ________,________,
+ ________,________,
+ _____XXX,_XXX____,
+ _____XXX,_XXX____,
+ ____XXX_,XXX_____,
+ ___XXX_X,XX______,
+ ___XX__X,X_______,
+ __XX__XX,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: # code:0x0023 */
+static GUI_CONST_STORAGE unsigned char ac0023[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ____XX__,_XX_____,
+ ____XX__,_XX_____,
+ ____XX__,_XX_____,
+ ____XX__,_XX_____,
+ _XXXXXXX,XXXX____,
+ _XXXXXXX,XXXX____,
+ ___XX___,_XX_____,
+ ___XX___,XX______,
+ ___XX___,XX______,
+ ___XX___,XX______,
+ ___XX___,XX______,
+ _XXXXXXX,XXXX____,
+ _XXXXXXX,XXXX____,
+ __XX____,XX______,
+ __XX____,XX______,
+ __XX____,XX______,
+ __XX____,XX______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: $ code:0x0024 */
+static GUI_CONST_STORAGE unsigned char ac0024[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ______XX,________,
+ ______XX,________,
+ ____XXXX,XX______,
+ ___XXXXX,XXX_____,
+ __XXX_XX,XXX_____,
+ __XXX_XX,XXX_____,
+ __XXX_XX,________,
+ ___XXXXX,________,
+ ____XXXX,________,
+ _____XXX,X_______,
+ ______XX,XX______,
+ ______XX,XX______,
+ ______XX,XXX_____,
+ __XXX_XX,XXX_____,
+ __XXXXXX,XXX_____,
+ __XXX_XX,XXX_____,
+ ___XX_XX,XX______,
+ ____XXXX,X_______,
+ ______XX,________,
+ ______XX,________,
+ ________,________
+};
+
+/* char: % code:0x0025 */
+static GUI_CONST_STORAGE unsigned char ac0025[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _XXXX___,XX______,
+ _XXXX___,XX______,
+ XX__XX_X,X_______,
+ XX__XX_X,X_______,
+ XX__XX_X,X_______,
+ XX__XXXX,________,
+ XX__XXXX,________,
+ _XXXXXX_,________,
+ _XXXXXXX,XXX_____,
+ _____XXX,XXX_____,
+ ____XXXX,__XX____,
+ ____XXXX,__XX____,
+ ___XX_XX,__XX____,
+ ___XX_XX,__XX____,
+ ___XX_XX,__XX____,
+ __XX___X,XXX_____,
+ __XX___X,XXX_____,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: & code:0x0026 */
+static GUI_CONST_STORAGE unsigned char ac0026[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ___XXXX_,________,
+ __XXXXXX,________,
+ __XXXXXX,________,
+ __XXXXXX,________,
+ __XXXXXX,________,
+ __XXXXXX,________,
+ __XXXXX_,________,
+ ___XXX_X,XXXX____,
+ __XXXX__,XX______,
+ _XXXXX__,XX______,
+ XXX_XXX_,XX______,
+ XXX_XXX_,XX______,
+ XXX__XXX,XX______,
+ XXX__XXX,X_______,
+ XXX___XX,X__XX___,
+ _XXX__XX,XX_XX___,
+ __XXXXX_,XXXX____,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: ' code:0x0027 */
+static GUI_CONST_STORAGE unsigned char ac0027[48] = {
+ ________,________,
+ ________,________,
+ __XXX___,________,
+ __XXXX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ___XX___,________,
+ __XX____,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: ( code:0x0028 */
+static GUI_CONST_STORAGE unsigned char ac0028[48] = {
+ ________,________,
+ ________,________,
+ ________,__XX____,
+ ________,_XX_____,
+ ________,XX______,
+ _______X,X_______,
+ _______X,X_______,
+ ______XX,________,
+ ______XX,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ ______XX,________,
+ ______XX,________,
+ _______X,X_______,
+ _______X,X_______,
+ ________,XX______,
+ ________,_XX_____,
+ ________,__XX____,
+ ________,________
+};
+
+/* char: ) code:0x0029 */
+static GUI_CONST_STORAGE unsigned char ac0029[48] = {
+ ________,________,
+ ________,________,
+ _XX_____,________,
+ __XX____,________,
+ ___XX___,________,
+ ____XX__,________,
+ ____XX__,________,
+ _____XX_,________,
+ _____XX_,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ _____XX_,________,
+ _____XX_,________,
+ ____XX__,________,
+ ____XX__,________,
+ ___XX___,________,
+ __XX____,________,
+ _XX_____,________,
+ ________,________
+};
+
+/* char: * code:0x002A */
+static GUI_CONST_STORAGE unsigned char ac002A[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ______XX,________,
+ ______XX,X_______,
+ ______XX,________,
+ _XXX__XX,__XXX___,
+ _XXXX_XX,XXXXX___,
+ ____XXXX,XX______,
+ ____XXXX,XX______,
+ _XXXXXXX,XXXXX___,
+ _XXX__XX,__XXX___,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: + code:0x002B */
+static GUI_CONST_STORAGE unsigned char ac002B[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ _XXXXXXX,XXXXX___,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: , code:0x002C */
+static GUI_CONST_STORAGE unsigned char ac002C[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ __XXX___,________,
+ __XXXX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ___XX___,________,
+ __XX____,________
+};
+
+/* char: - code:0x002D */
+static GUI_CONST_STORAGE unsigned char ac002D[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _XXXXXXX,XXXX____,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: . code:0x002E */
+static GUI_CONST_STORAGE unsigned char ac002E[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ __XXXX__,________,
+ __XXXX__,________,
+ __XXXX__,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: / code:0x002F */
+static GUI_CONST_STORAGE unsigned char ac002F[48] = {
+ ________,________,
+ ________,________,
+ ________,__XX____,
+ ________,_XXX____,
+ ________,_XX_____,
+ ________,XXX_____,
+ ________,XX______,
+ ________,XX______,
+ _______X,X_______,
+ _______X,X_______,
+ ______XX,________,
+ ______XX,________,
+ _____XXX,________,
+ _____XX_,________,
+ _____XX_,________,
+ ____XX__,________,
+ ____XX__,________,
+ ___XX___,________,
+ ___XX___,________,
+ __XXX___,________,
+ __XX____,________,
+ _XXX____,________,
+ _XX_____,________,
+ ________,________
+};
+
+/* char: 0 code:0x0030 */
+static GUI_CONST_STORAGE unsigned char ac0030[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ____XXXX,X_______,
+ ___XXX_X,XX______,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ ___XXX_X,XX______,
+ ____XXXX,X_______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: 1 code:0x0031 */
+static GUI_CONST_STORAGE unsigned char ac0031[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ______XX,________,
+ __XXXXXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ __XXXXXX,XXX_____,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: 2 code:0x0032 */
+static GUI_CONST_STORAGE unsigned char ac0032[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ___XXXXX,X_______,
+ __XX___X,XX______,
+ _XX_____,XXX_____,
+ _XXX____,XXX_____,
+ _XXX____,XXX_____,
+ ________,XXX_____,
+ ________,XX______,
+ _______X,XX______,
+ ______XX,X_______,
+ _____XXX,________,
+ _____XX_,________,
+ ____XX__,________,
+ ___XX___,_XX_____,
+ __XX____,_XX_____,
+ _XXX____,_XX_____,
+ _XXXXXXX,XXX_____,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: 3 code:0x0033 */
+static GUI_CONST_STORAGE unsigned char ac0033[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ___XXXXX,________,
+ _XXX__XX,X_______,
+ _XXX___X,XX______,
+ _XXX___X,XX______,
+ _______X,XX______,
+ _______X,XX______,
+ ______XX,X_______,
+ ____XXXX,________,
+ _______X,XX______,
+ ________,XX______,
+ ________,XXX_____,
+ ________,XXX_____,
+ _XXX____,XXX_____,
+ _XXX____,XXX_____,
+ _XXX___X,XX______,
+ ___XXXXX,X_______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: 4 code:0x0034 */
+static GUI_CONST_STORAGE unsigned char ac0034[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _______X,XX______,
+ _______X,XX______,
+ ______XX,XX______,
+ _____XXX,XX______,
+ _____XXX,XX______,
+ ____XX_X,XX______,
+ ___XX__X,XX______,
+ ___XX__X,XX______,
+ __XX___X,XX______,
+ _XX____X,XX______,
+ _XXXXXXX,XXXXX___,
+ _______X,XX______,
+ _______X,XX______,
+ _______X,XX______,
+ _______X,XX______,
+ _____XXX,XXXX____,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: 5 code:0x0035 */
+static GUI_CONST_STORAGE unsigned char ac0035[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ __XXXXXX,XXX_____,
+ __XX____,________,
+ __XX____,________,
+ __XX____,________,
+ __XX____,________,
+ __XX____,________,
+ __XXXXXX,X_______,
+ __XXX__X,XX______,
+ __XX____,XXX_____,
+ ________,XXX_____,
+ ________,XXX_____,
+ _XXX____,XXX_____,
+ _XXX____,XXX_____,
+ _XX____X,XX______,
+ __XX___X,XX______,
+ ___XXXXX,X_______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: 6 code:0x0036 */
+static GUI_CONST_STORAGE unsigned char ac0036[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _____XXX,XX______,
+ ___XXX__,XXX_____,
+ __XXX___,XXX_____,
+ __XXX___,________,
+ __XX____,________,
+ _XXX____,________,
+ _XXX_XXX,XX______,
+ _XXXXX__,XXX_____,
+ _XXXX___,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ __XX____,_XXX____,
+ __XXX___,_XX_____,
+ ___XXX__,XXX_____,
+ ____XXXX,X_______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: 7 code:0x0037 */
+static GUI_CONST_STORAGE unsigned char ac0037[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ___XXXXX,XXXX____,
+ __XXX___,_XXX____,
+ __XX____,_XX_____,
+ __XX____,XX______,
+ ________,XX______,
+ ________,XX______,
+ _______X,X_______,
+ _______X,X_______,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: 8 code:0x0038 */
+static GUI_CONST_STORAGE unsigned char ac0038[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ___XXXXX,XX______,
+ __XXX___,XXX_____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ __XXX___,_XX_____,
+ __XXXX__,XXX_____,
+ ____XXXX,X_______,
+ ___XX_XX,XX______,
+ __XXX___,XXX_____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ __XXX___,XXX_____,
+ ____XXXX,XX______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: 9 code:0x0039 */
+static GUI_CONST_STORAGE unsigned char ac0039[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ____XXXX,X_______,
+ __XXX___,XX______,
+ __XXX___,XXX_____,
+ _XXX____,_XX_____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,XXXX____,
+ __XXX__X,XXXX____,
+ ___XXXXX,_XXX____,
+ ________,_XXX____,
+ ________,XXX_____,
+ ________,XXX_____,
+ __XXX___,XX______,
+ __XXX__X,XX______,
+ ___XXXXX,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: : code:0x003A */
+static GUI_CONST_STORAGE unsigned char ac003A[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _____XXX,X_______,
+ _____XXX,X_______,
+ _____XXX,X_______,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _____XXX,X_______,
+ _____XXX,X_______,
+ _____XXX,X_______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: ; code:0x003B */
+static GUI_CONST_STORAGE unsigned char ac003B[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _____XXX,________,
+ _____XXX,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _____XXX,________,
+ _____XXX,________,
+ ______XX,________,
+ _____XX_,________,
+ _____XX_,________
+};
+
+/* char: < code:0x003C */
+static GUI_CONST_STORAGE unsigned char ac003C[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,__XX____,
+ ________,_XX_____,
+ ________,XX______,
+ _______X,X_______,
+ ______XX,________,
+ _____XX_,________,
+ ____XX__,________,
+ ___XX___,________,
+ __XX____,________,
+ ___XX___,________,
+ ____XX__,________,
+ _____XX_,________,
+ ______XX,________,
+ _______X,X_______,
+ ________,XX______,
+ ________,_XX_____,
+ ________,__XX____,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: = code:0x003D */
+static GUI_CONST_STORAGE unsigned char ac003D[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _XXXXXXX,XXXX____,
+ ________,________,
+ ________,________,
+ ________,________,
+ _XXXXXXX,XXXX____,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: > code:0x003E */
+static GUI_CONST_STORAGE unsigned char ac003E[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ __XX____,________,
+ ___XX___,________,
+ ____XX__,________,
+ _____XX_,________,
+ ______XX,________,
+ _______X,X_______,
+ ________,XX______,
+ ________,_XX_____,
+ ________,__XX____,
+ ________,_XX_____,
+ ________,XX______,
+ _______X,X_______,
+ ______XX,________,
+ _____XX_,________,
+ ____XX__,________,
+ ___XX___,________,
+ __XX____,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: ? code:0x003F */
+static GUI_CONST_STORAGE unsigned char ac003F[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _____XXX,XXX_____,
+ ___XXX__,_XXX____,
+ __XX____,__XXX___,
+ __XX____,__XXX___,
+ __XXX___,__XXX___,
+ __XXX___,__XXX___,
+ ________,XXXX____,
+ _______X,XX______,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ________,________,
+ ________,________,
+ _____XXX,X_______,
+ _____XXX,X_______,
+ _____XXX,X_______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: @ code:0x0040 */
+static GUI_CONST_STORAGE unsigned char ac0040[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _____XXX,X_______,
+ ___XXX__,XXX_____,
+ __XXX___,_XX_____,
+ __XXX_XX,XXXX____,
+ __XX_XXX,XXXX____,
+ _XXX_XXX,XXXX____,
+ _XXX_XXX,XXXX____,
+ _XXXXXXX,X_XX____,
+ _XXXXXXX,X_XX____,
+ _XXXXXXX,X_XX____,
+ _XXXXXXX,X_XX____,
+ _XXXXXXX,XXX_____,
+ __XX_XXX,XX______,
+ __XXX___,__XX____,
+ __XXX___,_XX_____,
+ ___XXX__,XXX_____,
+ ____XXXX,X_______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: A code:0x0041 */
+static GUI_CONST_STORAGE unsigned char ac0041[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _____XXX,________,
+ _____XXX,________,
+ ____XXXX,________,
+ ____XXXX,X_______,
+ ____XX_X,X_______,
+ ____XX_X,X_______,
+ ___XX__X,X_______,
+ ___XX__X,XX______,
+ ___XX___,XX______,
+ ___XXXXX,XX______,
+ __XX____,XXX_____,
+ __XX____,XXX_____,
+ __XX____,_XX_____,
+ _XX_____,_XX_____,
+ _XX_____,_XXX____,
+ XXXXX___,XXXXX___,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: B code:0x0042 */
+static GUI_CONST_STORAGE unsigned char ac0042[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _XXXXXXX,X_______,
+ __XXX__X,XXX_____,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ __XXX__X,XX______,
+ __XXXXXX,X_______,
+ __XXX___,XXX_____,
+ __XXX___,_XX_____,
+ __XXX___,_XXX____,
+ __XXX___,_XXX____,
+ __XXX___,_XXX____,
+ __XXX___,_XXX____,
+ __XXX___,XXX_____,
+ _XXXXXXX,XX______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: C code:0x0043 */
+static GUI_CONST_STORAGE unsigned char ac0043[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _____XXX,XXX_____,
+ ___XXX__,XXX_____,
+ __XXX___,_XXX____,
+ __XXX___,__XX____,
+ __XX____,__XX____,
+ _XXX____,________,
+ _XXX____,________,
+ _XXX____,________,
+ _XXX____,________,
+ _XXX____,________,
+ _XXX____,________,
+ _XXX____,__XX____,
+ __XXX___,__XX____,
+ __XXX___,_XX_____,
+ ___XXX__,XXX_____,
+ ____XXXX,X_______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: D code:0x0044 */
+static GUI_CONST_STORAGE unsigned char ac0044[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXXX,________,
+ __XXX__X,XX______,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ __XXX___,_XXX____,
+ __XXX___,_XXX____,
+ __XXX___,_XXX____,
+ __XXX___,_XXX____,
+ __XXX___,_XXX____,
+ __XXX___,_XXX____,
+ __XXX___,_XXX____,
+ __XXX___,_XXX____,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ __XXX__X,XX______,
+ XXXXXXXX,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: E code:0x0045 */
+static GUI_CONST_STORAGE unsigned char ac0045[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXXX,XXX_____,
+ _XXX____,XXX_____,
+ _XXX____,__XX____,
+ _XXX____,__XX____,
+ _XXX____,________,
+ _XXX___X,X_______,
+ _XXX___X,X_______,
+ _XXXXXXX,X_______,
+ _XXX___X,X_______,
+ _XXX___X,X_______,
+ _XXX___X,X_______,
+ _XXX____,________,
+ _XXX____,__XX____,
+ _XXX____,__XX____,
+ _XXX____,_XX_____,
+ XXXXXXXX,XXX_____,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: F code:0x0046 */
+static GUI_CONST_STORAGE unsigned char ac0046[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXXX,XXX_____,
+ _XXX____,XXX_____,
+ _XXX____,__XX____,
+ _XXX____,__XX____,
+ _XXX____,________,
+ _XXX___X,X_______,
+ _XXX___X,X_______,
+ _XXXXXXX,X_______,
+ _XXX___X,X_______,
+ _XXX___X,X_______,
+ _XXX___X,X_______,
+ _XXX____,________,
+ _XXX____,________,
+ _XXX____,________,
+ _XXX____,________,
+ XXXXXX__,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: G code:0x0047 */
+static GUI_CONST_STORAGE unsigned char ac0047[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ____XXXX,X_______,
+ ___XXX__,XX______,
+ __XXX___,_XX_____,
+ __XXX___,_XX_____,
+ __XX____,_XX_____,
+ _XXX____,________,
+ _XXX____,________,
+ _XXX____,________,
+ _XXX____,________,
+ _XXX__XX,XXXXX___,
+ _XXX____,XXX_____,
+ _XXX____,XXX_____,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ ___XXX__,XXX_____,
+ ____XXXX,X_______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: H code:0x0048 */
+static GUI_CONST_STORAGE unsigned char ac0048[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXX___,XXXXX___,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXXXXXX,XXXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ XXXXX___,XXXXX___,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: I code:0x0049 */
+static GUI_CONST_STORAGE unsigned char ac0049[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ __XXXXXX,XXX_____,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ __XXXXXX,XXX_____,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: J code:0x004A */
+static GUI_CONST_STORAGE unsigned char ac004A[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ___XXXXX,XXXX____,
+ ______XX,X_______,
+ ______XX,X_______,
+ ______XX,X_______,
+ ______XX,X_______,
+ ______XX,X_______,
+ ______XX,X_______,
+ ______XX,X_______,
+ ______XX,X_______,
+ ______XX,X_______,
+ ______XX,X_______,
+ ______XX,X_______,
+ ______XX,X_______,
+ ______XX,X_______,
+ ______XX,X_______,
+ ______XX,X_______,
+ _XXX__XX,X_______,
+ _XXX_XXX,________,
+ __XXXXX_,________
+};
+
+/* char: K code:0x004B */
+static GUI_CONST_STORAGE unsigned char ac004B[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXX_XX,XXX_____,
+ _XXX___X,XX______,
+ _XXX__XX,X_______,
+ _XXX__XX,________,
+ _XXX_XX_,________,
+ _XXXXX__,________,
+ _XXXXXX_,________,
+ _XXXXXX_,________,
+ _XXXXXXX,________,
+ _XXX__XX,________,
+ _XXX__XX,X_______,
+ _XXX___X,X_______,
+ _XXX___X,XX______,
+ _XXX____,XX______,
+ _XXX____,XXX_____,
+ XXXXX__X,XXXX____,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: L code:0x004C */
+static GUI_CONST_STORAGE unsigned char ac004C[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXX__,________,
+ _XXX____,________,
+ _XXX____,________,
+ _XXX____,________,
+ _XXX____,________,
+ _XXX____,________,
+ _XXX____,________,
+ _XXX____,________,
+ _XXX____,________,
+ _XXX____,________,
+ _XXX____,________,
+ _XXX____,________,
+ _XXX____,__XX____,
+ _XXX____,__XX____,
+ _XXX____,_XX_____,
+ XXXXXXXX,XXX_____,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: M code:0x004D */
+static GUI_CONST_STORAGE unsigned char ac004D[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXX____,XXXX____,
+ _XXX___X,XXX_____,
+ _XXX___X,XXX_____,
+ _XXXX__X,XXX_____,
+ _XXXX__X,XXX_____,
+ _XXXX_XX,XXX_____,
+ _XXXX_XX,XXX_____,
+ _XXXX_XX,XXX_____,
+ _XXXXXXX,XXX_____,
+ _XXXXXXX,XXX_____,
+ _XXXXXX_,XXX_____,
+ _XX_XXX_,XXX_____,
+ _XX_XXX_,XXX_____,
+ _XX_XXX_,XXX_____,
+ _XX_XX__,XXX_____,
+ XXXX___X,XXXX____,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: N code:0x004E */
+static GUI_CONST_STORAGE unsigned char ac004E[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _XXXX__X,XXXXX___,
+ __XXX___,_XX_____,
+ __XXXX__,_XX_____,
+ __XXXX__,_XX_____,
+ __XXXXX_,_XX_____,
+ __XXXXX_,_XX_____,
+ __XX_XXX,_XX_____,
+ __XX_XXX,_XX_____,
+ __XX__XX,_XX_____,
+ __XX__XX,XXX_____,
+ __XX___X,XXX_____,
+ __XX___X,XXX_____,
+ __XX___X,XXX_____,
+ __XX____,XXX_____,
+ __XX____,XXX_____,
+ XXXXXX__,_XX_____,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: O code:0x004F */
+static GUI_CONST_STORAGE unsigned char ac004F[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ____XXXX,X_______,
+ ___XXX_X,XX______,
+ __XXX___,XXX_____,
+ __XXX___,_XX_____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ __XXX___,_XX_____,
+ __XXX___,XXX_____,
+ ___XXX_X,XX______,
+ ____XXXX,X_______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: P code:0x0050 */
+static GUI_CONST_STORAGE unsigned char ac0050[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXXX,X_______,
+ _XXX____,XXX_____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX___X,XXX_____,
+ _XXXXXXX,X_______,
+ _XXX____,________,
+ _XXX____,________,
+ _XXX____,________,
+ _XXX____,________,
+ _XXX____,________,
+ _XXX____,________,
+ XXXXXX__,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: Q code:0x0051 */
+static GUI_CONST_STORAGE unsigned char ac0051[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ____XXXX,X_______,
+ ___XXX_X,XX______,
+ __XXX___,XXX_____,
+ __XXX___,_XX_____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXXXXXX,_XXX____,
+ __XXX_XX,_XX_____,
+ __XXX_XX,XXX_____,
+ ___XXX_X,XX______,
+ ____XXXX,X_______,
+ _______X,XXXX____,
+ ________,XXX_____,
+ ________,________
+};
+
+/* char: R code:0x0052 */
+static GUI_CONST_STORAGE unsigned char ac0052[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXXX,XX______,
+ _XXX____,XXX_____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,XXX_____,
+ _XXXXXXX,X_______,
+ _XXX__XX,________,
+ _XXX__XX,X_______,
+ _XXX___X,X_______,
+ _XXX___X,XX______,
+ _XXX____,XXX_____,
+ _XXX____,XXX_____,
+ _XXX____,_XXX____,
+ XXXXX___,_XXXX___,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: S code:0x0053 */
+static GUI_CONST_STORAGE unsigned char ac0053[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ___XXXXX,XXX_____,
+ __XXX___,XXX_____,
+ _XXX____,_XX_____,
+ _XXX____,_XX_____,
+ _XXX____,________,
+ _XXXX___,________,
+ __XXXXX_,________,
+ ___XXXXX,X_______,
+ _____XXX,XXX_____,
+ _______X,XXX_____,
+ ________,XXXX____,
+ _XX_____,_XXX____,
+ _XX_____,_XXX____,
+ _XXX____,_XXX____,
+ __XXX___,XXX_____,
+ ____XXXX,XX______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: T code:0x0054 */
+static GUI_CONST_STORAGE unsigned char ac0054[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _XXXXXXX,XXXX____,
+ _XX__XXX,__XX____,
+ XX___XXX,___XX___,
+ XX___XXX,___XX___,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ ___XXXXX,XX______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: U code:0x0055 */
+static GUI_CONST_STORAGE unsigned char ac0055[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _XXXXX__,XXXX____,
+ __XXX___,_XX_____,
+ __XXX___,_XX_____,
+ __XXX___,_XX_____,
+ __XXX___,_XX_____,
+ __XXX___,_XX_____,
+ __XXX___,_XX_____,
+ __XXX___,_XX_____,
+ __XXX___,_XX_____,
+ __XXX___,_XX_____,
+ __XXX___,_XX_____,
+ __XXX___,_XX_____,
+ __XXX___,_XX_____,
+ __XXX___,_XX_____,
+ ___XXX__,XX______,
+ ____XXXX,X_______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: V code:0x0056 */
+static GUI_CONST_STORAGE unsigned char ac0056[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXX___,XXXX____,
+ _XXX____,_XX_____,
+ __XX____,XX______,
+ __XX____,XX______,
+ __XXX___,XX______,
+ __XXX___,XX______,
+ ___XX__X,X_______,
+ ___XX__X,X_______,
+ ___XXX_X,X_______,
+ ___XXX_X,X_______,
+ ____XXXX,________,
+ ____XXXX,________,
+ ____XXXX,________,
+ ____XXX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: W code:0x0057 */
+static GUI_CONST_STORAGE unsigned char ac0057[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXXX,XXXXX___,
+ _XX__XXX,__XX____,
+ _XX___XX,__XX____,
+ _XXX__XX,__XX____,
+ _XXX__XX,__XX____,
+ __XX_XXX,_XX_____,
+ __XX_XXX,_XX_____,
+ __XX_XXX,XXX_____,
+ __XX_XXX,XXX_____,
+ __XXXX_X,XXX_____,
+ __XXXX_X,XX______,
+ ___XXX_X,XX______,
+ ___XXX_X,XX______,
+ ___XX__X,XX______,
+ ___XX__X,X_______,
+ ___XX__X,X_______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: X code:0x0058 */
+static GUI_CONST_STORAGE unsigned char ac0058[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _XXXXX_X,XXXX____,
+ __XXX___,XX______,
+ ___XX___,XX______,
+ ___XXX__,XX______,
+ ____XX_X,X_______,
+ ____XXXX,X_______,
+ _____XXX,________,
+ _____XX_,________,
+ _____XXX,________,
+ _____XXX,________,
+ ____XXXX,X_______,
+ ____XX_X,X_______,
+ ___XX__X,XX______,
+ ___XX___,XX______,
+ __XX____,XXX_____,
+ _XXXX__X,XXXX____,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: Y code:0x0059 */
+static GUI_CONST_STORAGE unsigned char ac0059[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXX___,XXXXX___,
+ _XXX____,__XX____,
+ __XX____,_XX_____,
+ __XXX___,_XX_____,
+ ___XX___,XX______,
+ ___XXX__,XX______,
+ ___XXXXX,X_______,
+ ____XXXX,X_______,
+ ____XXXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ ___XXXXX,XX______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: Z code:0x005A */
+static GUI_CONST_STORAGE unsigned char ac005A[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ __XXXXXX,XXXX____,
+ __XXX___,_XX_____,
+ _XXX____,XXX_____,
+ _XX_____,XX______,
+ _______X,XX______,
+ _______X,X_______,
+ ______XX,________,
+ ______XX,________,
+ _____XX_,________,
+ _____XX_,________,
+ ____XX__,________,
+ ___XXX__,________,
+ ___XX___,__XX____,
+ __XXX___,__XX____,
+ __XX____,_XX_____,
+ _XXXXXXX,XXX_____,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: [ code:0x005B */
+static GUI_CONST_STORAGE unsigned char ac005B[48] = {
+ ________,________,
+ ________,________,
+ _____XXX,XXX_____,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XX_,________,
+ _____XXX,XXX_____,
+ ________,________
+};
+
+/* char: \ code:0x005C */
+static GUI_CONST_STORAGE unsigned char ac005C[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ __XX____,________,
+ __XX____,________,
+ ___XX___,________,
+ ___XX___,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ _____XX_,________,
+ _____XX_,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ ________,XX______,
+ ________,XX______,
+ ________,_XX_____,
+ ________,_XX_____,
+ ________,_XX_____,
+ ________,__XX____
+};
+
+/* char: ] code:0x005D */
+static GUI_CONST_STORAGE unsigned char ac005D[48] = {
+ ________,________,
+ ________,________,
+ __XXXXXX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ __XXXXXX,________,
+ ________,________
+};
+
+/* char: ^ code:0x005E */
+static GUI_CONST_STORAGE unsigned char ac005E[48] = {
+ ________,________,
+ _____XXX,________,
+ ____XX_X,X_______,
+ ___XX___,XX______,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: _ code:0x005F */
+static GUI_CONST_STORAGE unsigned char ac005F[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXXX,XXXXX___
+};
+
+/* char: ` code:0x0060 */
+static GUI_CONST_STORAGE unsigned char ac0060[48] = {
+ ________,________,
+ ________,________,
+ ___XXX__,________,
+ _____XXX,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: a code:0x0061 */
+static GUI_CONST_STORAGE unsigned char ac0061[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ____XXXX,XX______,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ ________,XXX_____,
+ _____XXX,XXX_____,
+ __XXXX__,XXX_____,
+ _XXXX___,XXX_____,
+ _XXX____,XXX_____,
+ _XXX____,XXX_____,
+ _XXXX__X,XXXXX___,
+ __XXXXXX,_XXXX___,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: b code:0x0062 */
+static GUI_CONST_STORAGE unsigned char ac0062[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ___XX___,________,
+ _XXXX___,________,
+ __XXX___,________,
+ __XXX___,________,
+ __XXX___,________,
+ __XXX___,________,
+ __XXX_XX,XX______,
+ __XXXXX_,XXX_____,
+ __XXXX__,_XXX____,
+ __XXX___,_XXX____,
+ __XXX___,_XXX____,
+ __XXX___,_XXX____,
+ __XXX___,_XXX____,
+ __XXX___,_XXX____,
+ __XXX___,_XX_____,
+ __XXXX__,XXX_____,
+ __XX_XXX,XX______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: c code:0x0063 */
+static GUI_CONST_STORAGE unsigned char ac0063[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ____XXXX,X_______,
+ __XXX__X,XX______,
+ __XXX__X,XX______,
+ _XXX___X,XX______,
+ _XXX____,________,
+ _XXX____,________,
+ _XXX____,________,
+ _XXX____,_XX_____,
+ __XXX___,_XX_____,
+ __XXX___,XX______,
+ ____XXXX,X_______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: d code:0x0064 */
+static GUI_CONST_STORAGE unsigned char ac0064[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,_XX_____,
+ ______XX,XXX_____,
+ ________,XXX_____,
+ ________,XXX_____,
+ ________,XXX_____,
+ ________,XXX_____,
+ ___XXXXX,XXX_____,
+ __XXX__X,XXX_____,
+ __XXX___,XXX_____,
+ _XXX____,XXX_____,
+ _XXX____,XXX_____,
+ _XXX____,XXX_____,
+ _XXX____,XXX_____,
+ _XXX____,XXX_____,
+ __XX____,XXX_____,
+ __XXX__X,XXXX____,
+ ___XXXXX,XX______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: e code:0x0065 */
+static GUI_CONST_STORAGE unsigned char ac0065[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _____XXX,XX______,
+ ___XXX__,XXX_____,
+ ___XX___,_XX_____,
+ __XXX___,_XXX____,
+ __XXX___,_XXX____,
+ __XXXXXX,XXXX____,
+ __XXX___,________,
+ __XXX___,________,
+ ___XXX__,__XX____,
+ ___XXX__,_XX_____,
+ _____XXX,XX______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: f code:0x0066 */
+static GUI_CONST_STORAGE unsigned char ac0066[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ______XX,XXX_____,
+ _____XXX,_XXX____,
+ ____XXX_,_XXX____,
+ ____XXX_,________,
+ ____XXX_,________,
+ _XXXXXXX,XX______,
+ ____XXX_,________,
+ ____XXX_,________,
+ ____XXX_,________,
+ ____XXX_,________,
+ ____XXX_,________,
+ ____XXX_,________,
+ ____XXX_,________,
+ ____XXX_,________,
+ ____XXX_,________,
+ __XXXXXX,XX______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: g code:0x0067 */
+static GUI_CONST_STORAGE unsigned char ac0067[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ____XXXX,XXXX____,
+ ___XXXXX,XXXX____,
+ __XXX__X,XX______,
+ __XXX__X,XX______,
+ __XXX__X,XX______,
+ ___XXX_X,XX______,
+ ___XXXXX,X_______,
+ __XXX___,________,
+ __XXXXXX,X_______,
+ __XXX_XX,XXX_____,
+ _XXX____,XXX_____,
+ _XXX____,XXX_____,
+ _XXXX__X,XXX_____,
+ ___XXXXX,X_______
+};
+
+/* char: h code:0x0068 */
+static GUI_CONST_STORAGE unsigned char ac0068[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ___XX___,________,
+ _XXXX___,________,
+ __XXX___,________,
+ __XXX___,________,
+ __XXX___,________,
+ __XXX___,________,
+ __XXXXXX,XX______,
+ __XXXX__,XXX_____,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ _XXXXX_X,XXXX____,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: i code:0x0069 */
+static GUI_CONST_STORAGE unsigned char ac0069[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _____XXX,________,
+ _____XXX,________,
+ ________,________,
+ ________,________,
+ ______XX,________,
+ __XXXXXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ __XXXXXX,XXX_____,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: j code:0x006A */
+static GUI_CONST_STORAGE unsigned char ac006A[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ______XX,XX______,
+ ______XX,XX______,
+ ________,________,
+ ________,________,
+ ________,XX______,
+ ____XXXX,XX______,
+ _______X,XX______,
+ _______X,XX______,
+ _______X,XX______,
+ _______X,XX______,
+ _______X,XX______,
+ _______X,XX______,
+ _______X,XX______,
+ _______X,XX______,
+ _______X,XX______,
+ _______X,XX______,
+ _______X,XX______,
+ __XXX_XX,X_______,
+ __XXXXXX,________
+};
+
+/* char: k code:0x006B */
+static GUI_CONST_STORAGE unsigned char ac006B[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ___XX___,________,
+ _XXXX___,________,
+ __XXX___,________,
+ __XXX___,________,
+ __XXX___,________,
+ __XXX___,________,
+ __XXX__X,XXX_____,
+ __XXX__X,X_______,
+ __XXX__X,X_______,
+ __XXX_XX,________,
+ __XXXXXX,________,
+ __XXXXXX,________,
+ __XXX__X,X_______,
+ __XXX__X,XX______,
+ __XXX___,XX______,
+ __XXX___,XXX_____,
+ _XXXXX_X,XXXX____,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: l code:0x006C */
+static GUI_CONST_STORAGE unsigned char ac006C[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ______XX,________,
+ __XXXXXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ __XXXXXX,XXX_____,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: m code:0x006D */
+static GUI_CONST_STORAGE unsigned char ac006D[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXX_,XXXX____,
+ _XXXXXXX,XXXX____,
+ _XXX_XXX,_XXX____,
+ _XXX_XXX,_XXX____,
+ _XXX_XXX,_XXX____,
+ _XXX_XXX,_XXX____,
+ _XXX_XXX,_XXX____,
+ _XXX_XXX,_XXX____,
+ _XXX_XXX,_XXX____,
+ _XXX_XXX,_XXX____,
+ XXXXXXXX,XXXXX___,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: n code:0x006E */
+static GUI_CONST_STORAGE unsigned char ac006E[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _XXXXXXX,XX______,
+ __XXXX__,XXX_____,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ _XXXXX_X,XXXX____,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: o code:0x006F */
+static GUI_CONST_STORAGE unsigned char ac006F[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ____XXXX,X_______,
+ ___XXX_X,XX______,
+ __XXX___,XXX_____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ _XXX____,_XXX____,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ ____XXXX,X_______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: p code:0x0070 */
+static GUI_CONST_STORAGE unsigned char ac0070[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _XXXXXXX,XX______,
+ __XXXX__,XXX_____,
+ __XXX___,_XXX____,
+ __XXX___,_XXX____,
+ __XXX___,_XXX____,
+ __XXX___,_XXX____,
+ __XXX___,_XXX____,
+ __XXX___,_XXX____,
+ __XXX___,XXX_____,
+ __XXXX__,XXX_____,
+ __XXXXXX,XX______,
+ __XXX___,________,
+ __XXX___,________,
+ _XXXXXX_,________
+};
+
+/* char: q code:0x0071 */
+static GUI_CONST_STORAGE unsigned char ac0071[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ___XXXXX,_XX_____,
+ __XXX__X,XXX_____,
+ __XXX___,XXX_____,
+ _XXX____,XXX_____,
+ _XXX____,XXX_____,
+ _XXX____,XXX_____,
+ _XXX____,XXX_____,
+ _XXX____,XXX_____,
+ __XX____,XXX_____,
+ __XXX__X,XXX_____,
+ ___XXXXX,XXX_____,
+ ________,XXX_____,
+ ________,XXX_____,
+ ______XX,XXXX____
+};
+
+/* char: r code:0x0072 */
+static GUI_CONST_STORAGE unsigned char ac0072[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXX_X,XXX_____,
+ ___XXXXX,_XXX____,
+ ___XXXX_,_XXX____,
+ ___XXX__,________,
+ ___XXX__,________,
+ ___XXX__,________,
+ ___XXX__,________,
+ ___XXX__,________,
+ ___XXX__,________,
+ ___XXX__,________,
+ XXXXXXXX,X_______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: s code:0x0073 */
+static GUI_CONST_STORAGE unsigned char ac0073[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ____XXXX,XXX_____,
+ __XXXX__,XXX_____,
+ __XXX___,_XX_____,
+ __XXX___,_XX_____,
+ ___XXXX_,________,
+ ____XXXX,X_______,
+ ______XX,XXX_____,
+ __XX____,XXX_____,
+ __XX____,XXX_____,
+ __XXX__X,XXX_____,
+ __XXXXXX,XX______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: t code:0x0074 */
+static GUI_CONST_STORAGE unsigned char ac0074[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _____XX_,________,
+ _____XX_,________,
+ ____XXX_,________,
+ ____XXX_,________,
+ _XXXXXXX,XX______,
+ ____XXX_,________,
+ ____XXX_,________,
+ ____XXX_,________,
+ ____XXX_,________,
+ ____XXX_,________,
+ ____XXX_,________,
+ ____XXX_,________,
+ ____XXX_,_XX_____,
+ ____XXX_,_XX_____,
+ _____XXX,XX______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: u code:0x0075 */
+static GUI_CONST_STORAGE unsigned char ac0075[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ___XX___,_XX_____,
+ _XXXX__X,XXX_____,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ __XXX___,XXX_____,
+ __XXXX_X,XXXX____,
+ ___XXXXX,XX______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: v code:0x0076 */
+static GUI_CONST_STORAGE unsigned char ac0076[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _XXXXX__,XXXX____,
+ __XXX___,_XX_____,
+ ___XX___,XX______,
+ ___XX___,XX______,
+ ___XXX__,XX______,
+ ____XX_X,X_______,
+ ____XXXX,X_______,
+ ____XXXX,X_______,
+ _____XXX,________,
+ _____XXX,________,
+ _____XX_,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: w code:0x0077 */
+static GUI_CONST_STORAGE unsigned char ac0077[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ XXXXXXXX,XXXXX___,
+ _XX__XXX,__XX____,
+ _XXX__XX,__XX____,
+ __XX_XXX,_XX_____,
+ __XX_XXX,_XX_____,
+ __XXXXXX,XXX_____,
+ __XXXX_X,XX______,
+ ___XXX_X,XX______,
+ ___XXX_X,XX______,
+ ___XXX_X,XX______,
+ ___XX___,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: x code:0x0078 */
+static GUI_CONST_STORAGE unsigned char ac0078[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ __XXXXXX,XXXX____,
+ ___XXX__,XX______,
+ ____XX__,XX______,
+ ____XXXX,X_______,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,X_______,
+ ____XX_X,X_______,
+ ___XX___,XX______,
+ ___XX___,XXX_____,
+ _XXXXX_X,XXXX____,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: y code:0x0079 */
+static GUI_CONST_STORAGE unsigned char ac0079[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ _XXXXX_X,XXXX____,
+ ___XX___,XX______,
+ ___XX___,XX______,
+ ___XX___,XX______,
+ ____XX_X,X_______,
+ ____XX_X,X_______,
+ ____XXXX,X_______,
+ _____XXX,________,
+ _____XXX,________,
+ _____XXX,________,
+ _____XX_,________,
+ _____XX_,________,
+ __XX_XX_,________,
+ __XXXX__,________
+};
+
+/* char: z code:0x007A */
+static GUI_CONST_STORAGE unsigned char ac007A[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ __XXXXXX,XX______,
+ __XX___X,XX______,
+ __XX__XX,X_______,
+ __XX__XX,________,
+ _____XXX,________,
+ _____XX_,________,
+ ____XXX_,________,
+ ___XXX__,_XX_____,
+ ___XX___,_XX_____,
+ __XXX___,XXX_____,
+ __XXXXXX,XX______,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: { code:0x007B */
+static GUI_CONST_STORAGE unsigned char ac007B[48] = {
+ ________,________,
+ ________,________,
+ ________,XXX_____,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ ______XX,________,
+ _____XX_,________,
+ ______XX,________,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ _______X,X_______,
+ ________,XXX_____,
+ ________,________
+};
+
+/* char: | code:0x007C */
+static GUI_CONST_STORAGE unsigned char ac007C[48] = {
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________,
+ ______XX,________
+};
+
+/* char: } code:0x007D */
+static GUI_CONST_STORAGE unsigned char ac007D[48] = {
+ ________,________,
+ ________,________,
+ __XXX___,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ _____XX_,________,
+ ______XX,________,
+ _____XX_,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ ____XX__,________,
+ __XXX___,________,
+ ________,________
+};
+
+/* char: ~ code:0x007E */
+static GUI_CONST_STORAGE unsigned char ac007E[48] = {
+ ________,________,
+ __XXXX__,________,
+ _XX__XX_,__XX____,
+ _XX___XX,X_XX____,
+ _______X,XXX_____,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: code:0x007F */
+static GUI_CONST_STORAGE unsigned char ac007F[48] = {
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________,
+ ________,________
+};
+
+/* char: 。 code:0xA1A3 */
+static GUI_CONST_STORAGE unsigned char acA1A3[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ____XXXX,________,________,
+ ___XX__X,X_______,________,
+ ___XX__X,X_______,________,
+ ___XX__X,X_______,________,
+ ____XXXX,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+};
+
+/* char: ° code:0xA1E3 */
+static GUI_CONST_STORAGE unsigned char acA1E3[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ _____XXX,________,________,
+ ____XX_X,X_______,________,
+ ___XX___,XX______,________,
+ ___XX___,XX______,________,
+ ___XX__X,X_______,________,
+ ____XXXX,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+};
+
+/* char: ℃ code:0xA1E6 */
+static GUI_CONST_STORAGE unsigned char acA1E6[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ____XXX_,________,________,
+ ___XX_XX,___XXXXX,XX______,
+ ___XX_XX,__XXX___,_XXXXX__,
+ ___XX_XX,_XXX____,___XXX__,
+ ____XXX_,XXX_____,___XXX__,
+ ________,XX______,____XX__,
+ _______X,XX______,____XX__,
+ _______X,XX______,________,
+ _______X,XX______,________,
+ _______X,XX______,________,
+ _______X,XX______,________,
+ _______X,XX______,________,
+ ________,XX______,________,
+ ________,XXX_____,________,
+ ________,XXX_____,___XX___,
+ ________,_XXX____,__XX____,
+ ________,__XXXX__,XXX_____,
+ ________,____XXXX,X_______,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+};
+
+/* char: , code:0xA3AC */
+static GUI_CONST_STORAGE unsigned char acA3AC[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ____XXX_,________,________,
+ ___XXXX_,________,________,
+ ___XXXX_,________,________,
+ ____XXX_,________,________,
+ ____XX__,________,________,
+ ____XX__,________,________,
+ ___XX___,________,________,
+ ________,________,________,
+ ________,________,________,
+};
+
+/* char: ℉ code:0xA848 */
+static GUI_CONST_STORAGE unsigned char acA848[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ___XXXXX,XXXXXXXX,XXXXX___,
+ __XX_XXX,__XX____,__XXX___,
+ __XX__XX,__XX____,___XX___,
+ __XX_XX_,__XX____,________,
+ ___XXX__,__XX____,________,
+ ________,__XX____,XX______,
+ ________,__XX____,XX______,
+ ________,__XXXXXX,XX______,
+ ________,__XX___X,XX______,
+ ________,__XX____,XX______,
+ ________,__XX____,________,
+ ________,__XX____,________,
+ ________,__XX____,________,
+ ________,__XX____,________,
+ ________,__XX____,________,
+ ________,__XX____,________,
+ ________,XXXXXX__,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+};
+
+/* char: 败 code:0xB0DC */
+static GUI_CONST_STORAGE unsigned char acB0DC[72] = {
+ ________,________,________,
+ ________,______XX,________,
+ ________,______XX,X_______,
+ __XXXXXX,XXXX__XX,________,
+ __XXX___,_XX__XXX,________,
+ __XXX___,_XX__XX_,________,
+ __XXX_XX,_XX__XXX,XXXXXXX_,
+ __XXX_XX,_XX__XX_,__XXX___,
+ __XXX_XX,_XX_XXX_,__XXX___,
+ __XXX_XX,_XX_XXX_,__XX____,
+ __XXX_XX,_XXXX_XX,__XX____,
+ __XXX_XX,_XXX__XX,__XX____,
+ __XXX_XX,_XX___XX,_XXX____,
+ __XXXXXX,_XX___XX,_XX_____,
+ __XXXXX_,_XX____X,XXX_____,
+ __XXXXXX,XXX____X,XXX_____,
+ __XX_XX_,XX______,XX______,
+ ____XXX_,_XX____X,XXX_____,
+ ____XX__,_XXX__XX,XXX_____,
+ ___XX___,__XX_XXX,__XXX___,
+ __XX____,____XX__,__XXXX__,
+ _XX_____,__XXX___,___XXXXX,
+ ________,_XX_____,________,
+ ________,________,________,
+};
+
+/* char: 版 code:0xB0E6 */
+static GUI_CONST_STORAGE unsigned char acB0E6[72] = {
+ ________,________,________,
+ ______XX,________,________,
+ ______XX,X_______,___XXX__,
+ ___XX_XX,X______X,XXXXXX__,
+ ___XX_XX,X__XXXXX,________,
+ ___XX_XX,X__XX___,________,
+ ___XX_XX,X__XX___,________,
+ ___XX_XX,X__XX___,________,
+ ___XXXXX,XXXXXXXX,XXXXXX__,
+ ___XX___,___XXXX_,___XXX__,
+ ___XX___,___XX_XX,___XX___,
+ ___XX___,___XX_XX,___XX___,
+ ___XXXXX,XX_XX_XX,__XXX___,
+ ___XX__X,XX_XX_XX,__XX____,
+ ___XX__X,XX_XX__X,X_XX____,
+ ___XX__X,XX_XX__X,XXX_____,
+ ___XX__X,XX_XX___,XXX_____,
+ __XXX__X,XXXX____,XXX_____,
+ __XX___X,XXXX___X,XXXX____,
+ __XX___X,XXXX__XX,__XXX___,
+ __XX___X,XXX__XX_,___XXXX_,
+ _XX_____,_XXXXX__,____XXX_,
+ _XX_____,XXXX____,________,
+ ________,________,________,
+};
+
+/* char: 包 code:0xB0FC */
+static GUI_CONST_STORAGE unsigned char acB0FC[72] = {
+ ________,________,________,
+ ________,________,________,
+ _______X,XX______,________,
+ _______X,XX______,________,
+ ______XX,X_______,________,
+ ______XX,XXXXXXXX,XXXXX___,
+ _____XXX,________,__XX____,
+ _____XX_,________,__XX____,
+ ____XX__,________,__XX____,
+ ___XXXXX,XXXXXXXX,__XX____,
+ ___XXXXX,_____XX_,__XX____,
+ __XX__XX,_____XX_,__XX____,
+ _XX___XX,_____XX_,__XX____,
+ ______XX,_____XX_,__XX____,
+ ______XX,XXXXXXX_,__XX____,
+ ______XX,_____XX_,__XX____,
+ ______XX,______XX,XXXX____,
+ ______XX,________,XXX__XX_,
+ ______XX,________,_____XX_,
+ ______XX,________,_____XX_,
+ ______XX,________,_____XX_,
+ ______XX,XXX_____,_XXXXXX_,
+ ________,XXXXXXXX,XXXXX___,
+ ________,________,________,
+};
+
+/* char: 保 code:0xB1A3 */
+static GUI_CONST_STORAGE unsigned char acB1A3[72] = {
+ ________,________,________,
+ _______X,X_______,________,
+ ______XX,X_______,________,
+ ______XX,__XXXXXX,XXXXXX__,
+ ______XX,__XX____,___XX___,
+ _____XXX,__XX____,___XX___,
+ _____XX_,__XX____,___XX___,
+ ____XXX_,__XX____,___XX___,
+ ____XXX_,__XXXXXX,XXXXX___,
+ ___XXXX_,__XX__XX,___XX___,
+ ___XXXX_,______XX,________,
+ __XX_XX_,______XX,_____XX_,
+ _XX__XXX,XXXXXXXX,XXXXXXXX,
+ _____XX_,_____XXX,XX______,
+ _____XX_,____XXXX,XX______,
+ _____XX_,____XXXX,_XX_____,
+ _____XX_,___XXXXX,__XX____,
+ _____XX_,___XX_XX,__XX____,
+ _____XX_,__XX__XX,___XX___,
+ _____XX_,_XX___XX,____XXX_,
+ _____XX_,XX____XX,X___XXX_,
+ _____XXX,X_____XX,X_______,
+ _____XX_,______XX,________,
+ ________,________,________,
+};
+
+/* char: 备 code:0xB1B8 */
+static GUI_CONST_STORAGE unsigned char acB1B8[72] = {
+ ________,________,________,
+ ________,_XX_____,________,
+ ________,XXX_____,________,
+ ________,XXXXXXXX,XXX_____,
+ _______X,XX______,XX______,
+ _______X,XXX____X,XX______,
+ ______XX,_XX___XX,X_______,
+ _____XXX,__XX_XXX,________,
+ ____XXX_,__XXXXX_,________,
+ ___XX___,___XXX__,________,
+ ________,__XXXXX_,________,
+ ________,_XX___XX,X_______,
+ _______X,XX_____X,XXXX____,
+ _____XXX,XXXXXXXX,XXXXXXXX,
+ __XXXXXX,____XX__,_XX_XX__,
+ ______XX,____XX__,_XX_____,
+ ______XX,____XX__,_XX_____,
+ ______XX,XXXXXXXX,XXX_____,
+ ______XX,____XX__,_XX_____,
+ ______XX,____XX__,_XX_____,
+ ______XX,XXXXXXXX,XXX_____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XX_____,
+ ________,________,________,
+};
+
+/* char: 本 code:0xB1BE */
+static GUI_CONST_STORAGE unsigned char acB1BE[72] = {
+ ________,________,________,
+ ________,___XX___,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,____XX__,
+ __XXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,__XXXXX_,________,
+ ________,__XXXXX_,________,
+ ________,_XXXXXXX,________,
+ ________,_XXXXXXX,________,
+ ________,XXXXXX_X,X_______,
+ ________,XX_XXX_X,XX______,
+ _______X,XX_XXX__,XX______,
+ ______XX,X__XXX__,_XX_____,
+ ______XX,___XXX__,_XXX____,
+ _____XX_,___XXX__,XXXXXX__,
+ ____XXXX,XXXXXXXX,XXXXXXXX,
+ __XXX___,___XXX__,____XX__,
+ _XX_____,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+};
+
+/* char: 编 code:0xB1E0 */
+static GUI_CONST_STORAGE unsigned char acB1E0[72] = {
+ ________,________,________,
+ ________,______XX,________,
+ _____XXX,_______X,X_______,
+ _____XX_,_______X,X_______,
+ ____XX__,__XXXXXX,XXXXXX__,
+ ____XX__,__XX____,___XXX__,
+ ___XX__X,XXXX____,___XXX__,
+ ___XX__X,X_XX____,___XXX__,
+ __XX_XXX,X_XXXXXX,XXXXXX__,
+ __XXXXXX,__XX____,___XX___,
+ _____XX_,__XX____,________,
+ ____XX__,__XXXXXX,XXXXXXX_,
+ ___XX___,_XXXX_XX,_XX_XXX_,
+ __XXX_XX,XXXXX_XX,_XX_XXX_,
+ __XXXXX_,_XXXX_XX,_XX_XXX_,
+ ________,_XXXXXXX,XXXXXXX_,
+ _______X,XXXXX_XX,_XX_XXX_,
+ ____XXXX,XXXXX_XX,_XX_XXX_,
+ _XXXXX__,XX_XX_XX,_XX_XXX_,
+ __XX___X,XX_XX_XX,_XX_XXX_,
+ _______X,X__XX___,____XXX_,
+ ______XX,___XX___,___XXX__,
+ _____XX_,________,____XX__,
+ ________,________,________,
+};
+
+/* char: 变 code:0xB1E4 */
+static GUI_CONST_STORAGE unsigned char acB1E4[72] = {
+ ________,________,________,
+ ________,__XX____,________,
+ ________,___XXX__,________,
+ ________,___XXX__,____XX__,
+ _XXXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,_XX___XX,________,
+ ________,_XX___XX,________,
+ ______XX,XXX___XX,XXX_____,
+ _____XXX,_XX___XX,__XX____,
+ ____XXX_,_XX___XX,___XXX__,
+ ____XX__,_XX___XX,____XXX_,
+ ___XX___,_XX___XX,_XX__XX_,
+ __XXXXXX,XXXXXXXX,XXXX____,
+ ________,XX______,XXX_____,
+ ________,_XX____X,XX______,
+ ________,_XX___XX,X_______,
+ ________,__XX__XX,________,
+ ________,___XXXX_,________,
+ ________,___XXX__,________,
+ ________,__XXXXXX,________,
+ ________,XXX____X,XXX_____,
+ _____XXX,X_______,_XXXXXXX,
+ __XXXX__,________,___XXX__,
+ ________,________,________,
+};
+
+/* char: 不 code:0xB2BB */
+static GUI_CONST_STORAGE unsigned char acB2BB[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,____XX__,
+ __XXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,____XXX_,________,
+ ________,___XXX__,________,
+ ________,___XX___,________,
+ ________,__XXX___,________,
+ ________,__XXXX__,________,
+ ________,_XXXXX__,________,
+ ________,XXXXXX_X,XX______,
+ ________,XX_XXX__,_XX_____,
+ _______X,X__XXX__,__XXX___,
+ ______XX,___XXX__,___XXX__,
+ _____XX_,___XXX__,____XXX_,
+ ____XX__,___XXX__,____XXX_,
+ __XXX___,___XXX__,_____XX_,
+ _XX_____,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XX___,________,
+ ________,________,________,
+};
+
+/* char: 菜 code:0xB2CB */
+static GUI_CONST_STORAGE unsigned char acB2CB[72] = {
+ ________,________,________,
+ ________,XX____XX,________,
+ ________,XXX___XX,________,
+ ________,XXX___XX,____XX__,
+ _XXXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,XXX___XX,________,
+ ________,XXX___XX,__XX____,
+ ________,____XXXX,XXXXX___,
+ ___XXXXX,XXXXX___,________,
+ ________,__XX____,________,
+ _____XX_,___XXX__,_XXX____,
+ ______XX,____XX__,XXX_____,
+ ______XX,X__XX___,XX______,
+ ________,___XXX_X,X___XX__,
+ _XXXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,_XXXXXX_,________,
+ ________,_XXXXXXX,________,
+ ________,XX_XXX_X,X_______,
+ _______X,X__XXX__,XX______,
+ _____XXX,___XXX__,_XXX____,
+ ____XXX_,___XXX__,__XXXXXX,
+ __XXX___,___XXX__,____XX__,
+ _XX_____,___XX___,________,
+ ________,________,________,
+};
+
+/* char: 参 code:0xB2CE */
+static GUI_CONST_STORAGE unsigned char acB2CE[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,__XXX___,________,
+ ________,XXX___XX,X_______,
+ _______X,X_______,XXX_____,
+ _____XXX,____XXXX,XXXX____,
+ _____XXX,XXXXX___,__XXX___,
+ ________,_XXX____,___XX___,
+ _XXXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,XXX___XX,________,
+ _______X,XX__XX_X,X_______,
+ ______XX,X__XXX__,XX______,
+ _____XXX,__XXX___,_XXX____,
+ ____XX__,_XXX__XX,__XXXXXX,
+ __XXX___,XX___XXX,X___XX__,
+ _XX___XX,X___XXX_,________,
+ ____XXX_,___XXX__,________,
+ ________,_XXX____,_XXX____,
+ _______X,XX_____X,XXX_____,
+ _____XXX,_____XXX,X_______,
+ ________,___XXXX_,________,
+ ________,XXXX____,________,
+ ___XXXXX,X_______,________,
+ ________,________,________,
+};
+
+/* char: 测 code:0xB2E2 */
+static GUI_CONST_STORAGE unsigned char acB2E2[72] = {
+ ________,________,________,
+ ________,________,________,
+ ___XX___,________,____XX__,
+ ____XX_X,XXXXXXXX,____XX__,
+ ____XXXX,XX___XXX,____XX__,
+ _______X,XX___XXX,____XX__,
+ _______X,XXXXXXXX,_XXXXX__,
+ _XX____X,XXXXXXXX,_XX_XX__,
+ __XXX_XX,XXXXXXXX,_XX_XX__,
+ ___XX_XX,XXXXXXXX,_XX_XX__,
+ ___XX_XX,XXXXXXXX,_XX_XX__,
+ _____XXX,XXXXXXXX,_XX_XX__,
+ _____XXX,XXXXXXXX,_XX_XX__,
+ _____XXX,XXXXXXXX,_XX_XX__,
+ ____XX_X,XXXX_XXX,_XX_XX__,
+ ____XX_X,XXXX_XXX,_XX_XX__,
+ __XXXX_X,XXXX_XX_,_XX_XX__,
+ ___XXX_X,XXXX____,____XX__,
+ ___XXX__,_XXXXX__,____XX__,
+ ___XXX__,XXX__XX_,____XX__,
+ ___XXX__,XX___XXX,____XX__,
+ ___XXXXX,X_____XX,__XXXX__,
+ _____XX_,________,___XXX__,
+ ________,________,________,
+};
+
+/* char: 查 code:0xB2E9 */
+static GUI_CONST_STORAGE unsigned char acB2E9[72] = {
+ ________,________,________,
+ ________,___XX___,________,
+ ________,___XXX__,________,
+ ________,___XXX__,____XX__,
+ __XXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,__XXXXX_,________,
+ ________,_XXXXXXX,________,
+ ________,XXXXXX_X,X_______,
+ _______X,XX_XXX__,XX______,
+ ______XX,X__XXX__,_XXX____,
+ _____XX_,___XX___,__XXXXXX,
+ ___XXXXX,XXXXXXXX,XXXXXX__,
+ _XXX__XX,X_______,_XX_____,
+ ______XX,X_______,_XX_____,
+ ______XX,XXXXXXXX,XXX_____,
+ ______XX,X_______,_XX_____,
+ ______XX,X_______,_XX_____,
+ ______XX,X_______,_XX_____,
+ ______XX,XXXXXXXX,XXX_____,
+ ______XX,X_______,_XX_____,
+ ______XX,________,____XX__,
+ __XXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,________,________,
+ ________,________,________,
+};
+
+/* char: 常 code:0xB3A3 */
+static GUI_CONST_STORAGE unsigned char acB3A3[72] = {
+ ________,________,________,
+ ________,___XXX__,________,
+ ______XX,X__XXX__,XXX_____,
+ _______X,XX_XXX__,XX______,
+ ________,XX_XXX_X,X_______,
+ ___XXXXX,XXXXXXXX,XXXXXXX_,
+ ___XX___,________,____XXX_,
+ __XXX___,________,____XX__,
+ __XX___X,XXXXXXXX,XX_XX___,
+ _______X,X_______,XX______,
+ _______X,X_______,XX______,
+ _______X,XXXXXXXX,XX______,
+ _______X,X__XXX__,XX______,
+ ________,___XXX__,________,
+ _____XXX,XXXXXXXX,XXXXX___,
+ _____XX_,___XXX__,__XX____,
+ _____XX_,___XXX__,__XX____,
+ _____XX_,___XXX__,__XX____,
+ _____XX_,___XXX__,__XX____,
+ _____XX_,___XXX__,XXXX____,
+ _____XX_,___XXX__,_XXX____,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,________,________,
+};
+
+/* char: 厂 code:0xB3A7 */
+static GUI_CONST_STORAGE unsigned char acB3A7[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,____XX__,
+ ____XXXX,XXXXXXXX,XXXXXXX_,
+ ____XXX_,________,________,
+ ____XXX_,________,________,
+ ____XXX_,________,________,
+ ____XXX_,________,________,
+ ____XXX_,________,________,
+ ____XXX_,________,________,
+ ____XXX_,________,________,
+ ____XXX_,________,________,
+ ____XXX_,________,________,
+ ____XXX_,________,________,
+ ____XX__,________,________,
+ ____XX__,________,________,
+ ____XX__,________,________,
+ ____XX__,________,________,
+ ___XX___,________,________,
+ ___XX___,________,________,
+ __XX____,________,________,
+ __XX____,________,________,
+ _XX_____,________,________,
+ ________,________,________,
+};
+
+/* char: 超 code:0xB3AC */
+static GUI_CONST_STORAGE unsigned char acB3AC[72] = {
+ ________,________,________,
+ ______XX,________,________,
+ ______XX,X_______,________,
+ ______XX,____XXXX,XXXXXXX_,
+ ______XX,_______X,X___XXX_,
+ __XXXXXX,XXXX___X,X___XX__,
+ ______XX,______XX,X___XX__,
+ ______XX,______XX,X___XX__,
+ ______XX,______XX,____XX__,
+ _XXXXXXX,XXXXXXX_,_XXXXX__,
+ ______XX,X___XX__,___XX___,
+ ______XX,X__XXX__,____XX__,
+ ___XXXXX,X____XXX,XXXXXXX_,
+ ___XX_XX,X_XX_XX_,____XX__,
+ ___XX_XX,XXXXXXX_,____XX__,
+ ___XX_XX,X____XX_,____XX__,
+ ___XX_XX,X____XX_,____XX__,
+ ___XXXXX,X____XXX,XXXXXX__,
+ __XXXXXX,X____XX_,____XX__,
+ __XX_XXX,X____XX_,________,
+ __XX___X,XX______,________,
+ _XX_____,XXXXXXXX,XXXXXXXX,
+ _XX_____,_____XXX,XXXXXXX_,
+ ________,________,________,
+};
+
+/* char: 成 code:0xB3C9 */
+static GUI_CONST_STORAGE unsigned char acB3C9[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,____XXX_,XX______,
+ ________,____XXX_,_XX_____,
+ ________,____XXX_,__XX____,
+ ________,_____XX_,__XXXX__,
+ ____XXXX,XXXXXXXX,XXXXXXX_,
+ ____XX__,_____XX_,________,
+ ____XX__,_____XX_,________,
+ ____XX__,_____XX_,___XX___,
+ ____XX__,_____XXX,___XXX__,
+ ____XXXX,XXXX_XXX,__XXX___,
+ ____XX__,__XX__XX,__XX____,
+ ____XX__,__XX__XX,_XXX____,
+ ____XX__,__XX__XX,XXXX____,
+ ____XX__,_XXX__XX,XXX_____,
+ ____XX__,_XXX___X,XX____XX,
+ ___XX___,_XXX___X,XX____XX,
+ ___XX_XX,XXX___XX,XXX__XX_,
+ ___XX___,XXX__XXX,_XXXXXX_,
+ __XX____,____XX__,__XXXXX_,
+ __XX____,__XXX___,___XXXX_,
+ _XX_____,________,________,
+ ________,________,________,
+};
+
+/* char: 程 code:0xB3CC */
+static GUI_CONST_STORAGE unsigned char acB3CC[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,XX______,________,
+ _____XXX,XXXXXXXX,XXXXXX__,
+ __XXXXXX,____XX__,____XX__,
+ ______XX,____XX__,____XX__,
+ ______XX,____XX__,____XX__,
+ ______XX,____XX__,____XX__,
+ _XXXXXXX,XXXXXXXX,XXXXXX__,
+ _____XXX,___XXX__,____XX__,
+ _____XXX,___XX___,____XX__,
+ _____XXX,X_XXXXXX,XXXXXXX_,
+ ____XXXX,XXX_____,XX______,
+ ____XXXX,_XX_____,XX______,
+ ___XXXXX,________,XX______,
+ ___XX_XX,________,XX__XX__,
+ __XX__XX,___XXXXX,XXXXXXX_,
+ __XX__XX,________,XX______,
+ _XX___XX,________,XX______,
+ _____XXX,________,XX______,
+ _____XXX,________,XX___XX_,
+ _____XXX,_XXXXXXX,XXXXXXXX,
+ _____XXX,________,________,
+ ________,________,________,
+};
+
+/* char: 出 code:0xB3F6 */
+static GUI_CONST_STORAGE unsigned char acB3F6[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,___XX___,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ____XXX_,___XXX__,__XXX___,
+ ____XXX_,___XXX__,__XX____,
+ ____XXX_,___XXX__,__XX____,
+ ____XXX_,___XXX__,__XX____,
+ ____XXX_,___XXX__,__XX____,
+ ____XXX_,___XXX__,__XX____,
+ ____XXXX,XXXXXXXX,XXXX____,
+ ________,___XXX__,__XXX___,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ____XXX_,___XXX__,___XXX__,
+ ____XX__,___XXX__,___XX___,
+ ____XX__,___XXX__,___XX___,
+ ____XX__,___XXX__,___XX___,
+ ____XX__,___XXX__,___XX___,
+ ____XX__,___XXX__,___XX___,
+ ___XXXXX,XXXXXXXX,XXXXX___,
+ ________,________,___XX___,
+ ________,________,________,
+};
+
+/* char: 存 code:0xB4E6 */
+static GUI_CONST_STORAGE unsigned char acB4E6[72] = {
+ ________,________,________,
+ ________,__XX____,________,
+ ________,__XXX___,________,
+ ________,__XX____,____XX__,
+ __XXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,_XXX____,________,
+ ________,_XX_____,________,
+ ________,XXXXXXXX,XXXXX___,
+ _______X,XX______,__XXX___,
+ ______XX,X_______,_XX_____,
+ ______XX,________,XX______,
+ _____XXX,_______X,XX______,
+ _____XXX,_______X,X_______,
+ ____XXXX,_______X,X_______,
+ ___XX_XX,XXXXXXXX,XXXXXXX_,
+ __XX__XX,_______X,X_______,
+ _XX___XX,_______X,X_______,
+ ______XX,_______X,X_______,
+ ______XX,_______X,X_______,
+ ______XX,_______X,X_______,
+ ______XX,_______X,X_______,
+ ______XX,____XXXX,X_______,
+ ______XX,______XX,________,
+ ________,________,________,
+};
+
+/* char: 错 code:0xB4ED */
+static GUI_CONST_STORAGE unsigned char acB4ED[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,_____XX_,_XX_____,
+ ____XXXX,_____XX_,_XXX____,
+ ____XXX_,_____XX_,_XXX____,
+ ____XX__,_____XX_,_XXX____,
+ ____XXXX,XXXXXXXX,XXXXXXX_,
+ ___XXX__,_____XX_,_XXX____,
+ ___XX___,_____XX_,_XXX____,
+ __XXXXXX,XX___XX_,_XXX_XX_,
+ __XX_XX_,_XXXXXXX,XXXXXXXX,
+ _XX__XX_,________,________,
+ _____XX_,________,________,
+ _____XX_,___XXXXX,XXXXXX__,
+ _XXXXXXX,XXXXXX__,___XX___,
+ _____XX_,___XXX__,___XX___,
+ _____XX_,___XXXXX,XXXXX___,
+ _____XX_,___XXX__,___XX___,
+ _____XX_,___XXX__,___XX___,
+ _____XXX,X__XXX__,___XX___,
+ _____XXX,___XXXXX,XXXXX___,
+ _____XX_,___XXX__,___XX___,
+ ________,___XX___,________,
+ ________,________,________,
+};
+
+/* char: 单 code:0xB5A5 */
+static GUI_CONST_STORAGE unsigned char acB5A5[72] = {
+ ________,________,________,
+ _______X,X______X,X_______,
+ ________,XX_____X,XX______,
+ ________,XXX___XX,X_______,
+ ________,_XX___XX,________,
+ _____XXX,XXXXXXXX,XXXX____,
+ _____XX_,___XX___,__XX____,
+ _____XX_,___XX___,__XX____,
+ _____XX_,___XX___,__XX____,
+ _____XXX,XXXXXXXX,XXXX____,
+ _____XX_,___XX___,__XX____,
+ _____XX_,___XX___,__XX____,
+ _____XX_,___XX___,__XX____,
+ _____XXX,XXXXXXXX,XXXX____,
+ _____XX_,___XX___,__XX____,
+ ____XX__,___XX___,____XX__,
+ _XXXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,___XX___,________,
+ ________,___XX___,________,
+ ________,___XX___,________,
+ ________,___XX___,________,
+ ________,___XX___,________,
+ ________,___XX___,________,
+ ________,________,________,
+};
+
+/* char: 但 code:0xB5AB */
+static GUI_CONST_STORAGE unsigned char acB5AB[72] = {
+ ________,________,________,
+ ________,________,________,
+ ______XX,________,________,
+ ______XX,X_______,________,
+ _____XXX,__XXXXXX,XXXXXX__,
+ _____XXX,__XX____,___XX___,
+ _____XX_,__XX____,___XX___,
+ ____XXX_,__XX____,___XX___,
+ ____XXX_,__XX____,___XX___,
+ ___XXXX_,__XX____,___XX___,
+ ___XXXX_,__XXXXXX,XXXXX___,
+ __XXXXX_,__XX____,___XX___,
+ _XX_XXX_,__XX____,___XX___,
+ ____XXX_,__XX____,___XX___,
+ ____XXX_,__XX____,___XX___,
+ ____XXX_,__XXXXXX,XXXXX___,
+ ____XXX_,__XX____,___XX___,
+ ____XXX_,_XXX____,___XX___,
+ ____XXX_,________,________,
+ ____XXX_,________,________,
+ ____XXX_,________,________,
+ ____XXXX,XXXXXXXX,XXXXXXX_,
+ ____XX__,________,________,
+ ________,________,________,
+};
+
+/* char: 当 code:0xB5B1 */
+static GUI_CONST_STORAGE unsigned char acB5B1[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,___XX___,________,
+ ________,___XXX__,________,
+ ____XX__,___XXX__,_XXX____,
+ _____XXX,___XXX__,_XXX____,
+ ______XX,X__XXX__,XXX_____,
+ ______XX,X__XXX__,XX______,
+ _______X,X__XXX_X,X_______,
+ ________,___XXXXX,________,
+ ___XXXXX,XXXXXXXX,XXXXXXX_,
+ ________,________,___XXX__,
+ ________,________,___XXX__,
+ ________,________,___XXX__,
+ ________,________,___XXX__,
+ ____XXXX,XXXXXXXX,XXXXXX__,
+ ________,________,___XXX__,
+ ________,________,___XXX__,
+ ________,________,___XXX__,
+ ________,________,___XXX__,
+ __XXXXXX,XXXXXXXX,XXXXXX__,
+ ________,________,___XXX__,
+ ________,________,___XXX__,
+ ________,________,________,
+};
+
+/* char: 的 code:0xB5C4 */
+static GUI_CONST_STORAGE unsigned char acB5C4[72] = {
+ ________,________,________,
+ ______XX,_______X,X_______,
+ ______XX,X______X,XX______,
+ ______XX,______XX,X_______,
+ ______XX,______XX,X_______,
+ _____XX_,______XX,________,
+ ___XXXXX,XXXX_XXX,XXXXXXX_,
+ ___XX___,_XX__XX_,____XX__,
+ ___XX___,_XX_XX__,____XX__,
+ ___XX___,_XX_XX__,____XX__,
+ ___XX___,_XXXX___,____XX__,
+ ___XX___,_XX__XX_,____XX__,
+ ___XXXXX,XXX___XX,X___XX__,
+ ___XX___,_XX____X,X___XX__,
+ ___XX___,_XX____X,X___XX__,
+ ___XX___,_XX_____,____XX__,
+ ___XX___,_XX_____,____XX__,
+ ___XX___,_XX_____,____XX__,
+ ___XX___,_XX_____,____XX__,
+ ___XXXXX,XXX_____,___XXX__,
+ ___XX___,_XX____X,X__XXX__,
+ ___XX___,_XX_____,XXXXX___,
+ ________,________,__XX____,
+ ________,________,________,
+};
+
+/* char: 电 code:0xB5E7 */
+static GUI_CONST_STORAGE unsigned char acB5E7[72] = {
+ ________,________,________,
+ ________,___XX___,________,
+ ________,___XX___,________,
+ ________,___XX___,________,
+ ________,___XX___,________,
+ ________,___XX___,________,
+ ____XXXX,XXXXXXXX,XXXXX___,
+ ____XX__,___XX___,__XX____,
+ ____XX__,___XX___,__XX____,
+ ____XX__,___XX___,__XX____,
+ ____XXXX,XXXXXXXX,XXXX____,
+ ____XX__,___XX___,__XX____,
+ ____XX__,___XX___,__XX____,
+ ____XX__,___XX___,__XX____,
+ ____XX__,___XX___,__XX____,
+ ____XXXX,XXXXXXXX,XXXX____,
+ ____XX__,___XX___,__XX____,
+ ____XX__,___XX___,________,
+ ________,___XX___,_____XX_,
+ ________,___XX___,_____XX_,
+ ________,___XX___,_____XX_,
+ ________,___XX___,____XXX_,
+ ________,___XXXXX,XXXXXXX_,
+ ________,________,________,
+};
+
+/* char: 定 code:0xB6A8 */
+static GUI_CONST_STORAGE unsigned char acB6A8[72] = {
+ ________,________,________,
+ ________,__XX____,________,
+ ________,___XXX__,________,
+ ________,____XX__,________,
+ ____XX__,____XX__,____XX__,
+ ____XXXX,XXXXXXXX,XXXXXX__,
+ ____XX__,________,___XXX__,
+ ___XXX__,________,___XX___,
+ __XXX___,________,__XX____,
+ ___XXXXX,XXXXXXXX,XXXXX___,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ______XX,___XXX__,________,
+ ______XX,X__XXX__,________,
+ ______XX,___XXXXX,XXXX____,
+ _____XXX,___XXX__,________,
+ _____XXX,___XXX__,________,
+ _____XXX,X__XXX__,________,
+ _____XX_,XX_XXX__,________,
+ ____XX__,_XXXXX__,________,
+ ___XX___,__XXXXXX,_____XX_,
+ ___XX___,____XXXX,XXXXXX__,
+ __XX____,________,________,
+ ________,________,________,
+};
+
+/* char: 动 code:0xB6AF */
+static GUI_CONST_STORAGE unsigned char acB6AF[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,_______X,X_______,
+ ________,_______X,X_______,
+ ________,_XX____X,X_______,
+ __XXXXXX,XXXX___X,X_______,
+ ________,_______X,X_______,
+ ________,____XXXX,XXXXXXX_,
+ ________,_______X,X___XXX_,
+ _XXXXXXX,XXXXX__X,X___XXX_,
+ ______XX,_______X,X___XXX_,
+ _____XXX,_______X,X___XXX_,
+ _____XX_,_______X,X___XX__,
+ ____XXX_,XX_____X,X___XX__,
+ ____XX__,_XX___XX,X___XX__,
+ ___XX___,_XXX__XX,____XX__,
+ ___XX___,__XX__XX,____XX__,
+ __XXXXXX,XXXXXXX_,____XX__,
+ __XXX___,___XXXX_,____XX__,
+ ________,____XX__,____XX__,
+ ________,___XX__X,XX_XXX__,
+ ________,_XXX____,_XXXX___,
+ ________,XX______,__XX____,
+ ________,________,________,
+};
+
+/* char: 度 code:0xB6C8 */
+static GUI_CONST_STORAGE unsigned char acB6C8[72] = {
+ ________,________,________,
+ ________,___XX___,________,
+ ________,____XXX_,________,
+ ________,____XXX_,____XX__,
+ ____XXXX,XXXXXXXX,XXXXXXX_,
+ ____XX__,_XX_____,XX______,
+ ____XX__,__XX____,XXX_____,
+ ____XX__,__XX____,XX__XX__,
+ ____XXXX,XXXXXXXX,XXXXXXX_,
+ ____XX__,__XX____,XX______,
+ ____XX__,__XX____,XX______,
+ ____XX__,__XXXXXX,XX______,
+ ____XX__,__XX____,XX______,
+ ____XX__,________,________,
+ ___XXX_X,XXXXXXXX,XXXX____,
+ ___XXX__,__XX____,_XX_____,
+ ___XX___,__XX____,XX______,
+ ___XX___,___XX__X,X_______,
+ ___XX___,____XXXX,________,
+ __XX____,____XXXX,________,
+ __XX____,__XXX__X,XXX_____,
+ _XX_____,XXX_____,_XXXXXXX,
+ _____XXX,X_______,____XX__,
+ ________,________,________,
+};
+
+/* char: 断 code:0xB6CF */
+static GUI_CONST_STORAGE unsigned char acB6CF[72] = {
+ ________,________,________,
+ ________,________,________,
+ ___XX___,XX______,____XX__,
+ ___XX___,XX______,__XXXXX_,
+ ___XX___,XX____XX,XXX_____,
+ ___XXXX_,XX_XXXXX,________,
+ ___XX_XX,XX_XX_XX,________,
+ ___XX_XX,XXXX__XX,________,
+ ___XX___,XXX___XX,________,
+ ___XXXXX,XXXXXXXX,XXXXXXX_,
+ ___XX__X,XX___XXX,___XX___,
+ ___XX__X,XXX___XX,___XX___,
+ ___XX__X,XXXX__XX,___XX___,
+ ___XX_XX,XX_XX_XX,___XX___,
+ ___XX_XX,XX_XXXXX,___XX___,
+ ___XXXX_,XX__XXXX,___XX___,
+ ___XXXX_,XX____XX,___XX___,
+ ___XXX__,XX___XXX,___XX___,
+ ___XX___,XXXX_XX_,___XX___,
+ __XXXXXX,XXXXXXX_,___XX___,
+ ________,____XX__,___XX___,
+ ________,___XX___,___XX___,
+ ________,__XX____,________,
+ ________,________,________,
+};
+
+/* char: 对 code:0xB6D4 */
+static GUI_CONST_STORAGE unsigned char acB6D4[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,__XX____,
+ ________,________,__XX____,
+ __XXXXXX,XXXX____,__XX____,
+ ________,_XX_____,__XX____,
+ ________,_XX_____,__XX____,
+ ________,XXXXXXXX,XXXXXXX_,
+ ___XX___,XX______,__XX____,
+ ____XX__,XX______,__XX____,
+ _____XXX,XX__XX__,__XX____,
+ ______XX,X___XXX_,__XX____,
+ ______XX,X____XXX,__XX____,
+ ______XX,X____XXX,__XX____,
+ _____XXX,XX___XX_,__XX____,
+ _____XX_,XXX_____,__XX____,
+ ____XX__,XXX_____,__XX____,
+ ___XX___,_XX_____,__XX____,
+ ___XX___,_XX_____,__XX____,
+ _XXX____,_XX__XXX,__XX____,
+ ________,_______X,XXXX____,
+ ________,________,_XX_____,
+ ________,________,________,
+};
+
+/* char: 发 code:0xB7A2 */
+static GUI_CONST_STORAGE unsigned char acB7A2[72] = {
+ ________,________,________,
+ ________,__XX__XX,________,
+ ________,__XX___X,XX______,
+ _____XXX,_XXX____,XXX_____,
+ ____XXX_,_XXX____,_XXX____,
+ ____XX__,_XX_____,_XXX____,
+ ___XXX__,_XX_____,____XX__,
+ __XXXXXX,XXXXXXXX,XXXXXXX_,
+ ___XX___,_XX_____,________,
+ ________,XXX_____,________,
+ ________,XXX_____,________,
+ ________,XXXXXXXX,XXXX____,
+ ________,XXXX____,_XXX____,
+ _______X,XXXX____,_XX_____,
+ _______X,X__XX___,XXX_____,
+ ______XX,X___XX_X,XX______,
+ ______XX,____XX_X,X_______,
+ _____XXX,_____XXX,________,
+ _____XX_,_____XXX,X_______,
+ ____XX__,___XXX_X,XXX_____,
+ ___XX___,__XXX___,XXXXX___,
+ __XX____,XXX_____,__XXXXXX,
+ _XX__XXX,X_______,____XX__,
+ ________,________,________,
+};
+
+/* char: 阀 code:0xB7A7 */
+static GUI_CONST_STORAGE unsigned char acB7A7[72] = {
+ ________,________,________,
+ _____XX_,________,________,
+ _____XXX,________,________,
+ ______XX,X_XXXXXX,XXXXXXX_,
+ ______XX,X_______,____XX__,
+ ___XXX__,____XX__,____XX__,
+ ___XXX__,_XXXXXXX,XX__XX__,
+ ___XXX__,XXX_XX__,XXX_XX__,
+ ___XXX__,XX__XX__,_XX_XX__,
+ ___XXX__,XX__XX__,_XX_XX__,
+ ___XXX_X,X__XXXXX,XX__XX__,
+ ___XXX_X,XXXX_XX_,XX__XX__,
+ ___XXXXX,XX___XX_,XXX_XX__,
+ ___XXXXX,XX___XXX,XX__XX__,
+ ___XXX_X,XX___XXX,X___XX__,
+ ___XXX_X,XX___XXX,__XXXX__,
+ ___XXX_X,XX__XXXX,X_XXXX__,
+ ___XXX_X,XXXXX__X,XXXXXX__,
+ ___XXX_X,XXX_____,XXXXXX__,
+ ___XXX_X,XX______,__XXXX__,
+ ___XXX__,________,____XX__,
+ ___XXX__,________,_XXXXX__,
+ ___XX___,________,___XX___,
+ ________,________,________,
+};
+
+/* char: 返 code:0xB7B5 */
+static GUI_CONST_STORAGE unsigned char acB7B5[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,__XX____,
+ ____XX__,______XX,XXXXX___,
+ _____XX_,__XXXXX_,________,
+ _____XXX,__XX____,________,
+ _____XX_,__XX____,________,
+ ________,__XX____,________,
+ ________,__XXXXXX,XXXXX___,
+ ________,__XX____,__XXX___,
+ _XXXXXXX,__XX____,__XX____,
+ _____XX_,__XXXX__,_XXX____,
+ _____XX_,_XXX_XX_,_XX_____,
+ _____XX_,_XXX__XX,XXX_____,
+ _____XX_,_XX_____,XXX_____,
+ _____XX_,_XX____X,XXXX____,
+ _____XX_,XX____XX,__XXX___,
+ _____XX_,XX___XX_,___XXX__,
+ _____XXX,X__XXX__,____XX__,
+ ____XXXX,_XXX____,________,
+ ___XX__X,X_______,________,
+ _XXX____,XXXXXXXX,XXXXXXXX,
+ __XX____,___XXXXX,XXXXXX__,
+ ________,________,________,
+};
+
+/* char: 复 code:0xB8B4 */
+static GUI_CONST_STORAGE unsigned char acB8B4[72] = {
+ ________,________,________,
+ _______X,X_______,________,
+ _______X,XX______,________,
+ ______XX,XXXXXXXX,XXXXXX__,
+ ______XX,________,________,
+ _____XX_,________,________,
+ ____XX_X,XXXXXXXX,XXXX____,
+ ___XX__X,X_______,_XX_____,
+ __XX___X,X_______,_XX_____,
+ _______X,XXXXXXXX,XXX_____,
+ _______X,X_______,_XX_____,
+ _______X,X_______,_XX_____,
+ _______X,XXXXXXXX,XXXX____,
+ ________,XXX_____,_XX_____,
+ ________,XXXXXXXX,XXX_____,
+ _______X,XXX_____,XXX_____,
+ ______XX,X_XX___X,XX______,
+ _____XX_,__XXX_XX,X_______,
+ ____XX__,___XXXXX,________,
+ ___XX___,___XXXX_,________,
+ ________,_XXX__XX,XX______,
+ ______XX,XX______,XXXXXXXX,
+ __XXXXX_,________,___XXX__,
+ ________,________,________,
+};
+
+/* char: 改 code:0xB8C4 */
+static GUI_CONST_STORAGE unsigned char acB8C4[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,______XX,X_______,
+ ________,______XX,X_______,
+ ________,______XX,________,
+ __XXXXXX,XXXX__XX,________,
+ ________,_XX__XX_,________,
+ ________,_XX__XXX,XXXXXXX_,
+ ________,_XX_XXX_,___XX___,
+ ________,_XX_XXX_,___XX___,
+ ___XXXXX,XXXXXXX_,__XXX___,
+ ___XX___,_XXXXXX_,__XX____,
+ ___XX___,__XX__XX,__XX____,
+ ___XX___,______XX,__XX____,
+ ___XX___,______XX,__XX____,
+ ___XX___,_______X,XXX_____,
+ ___XX___,_______X,XXX_____,
+ ___XX___,_XXX____,XX______,
+ ___XX__X,XX_____X,XXX_____,
+ ___XXXXX,______XX,__XX____,
+ __XXXX__,____XXX_,__XXXX__,
+ ___XX___,__XXX___,____XXXX,
+ ________,_XX_____,________,
+ ________,________,________,
+};
+
+/* char: 格 code:0xB8F1 */
+static GUI_CONST_STORAGE unsigned char acB8F1[72] = {
+ ________,________,________,
+ _____XX_,_____XX_,________,
+ _____XX_,____XXX_,________,
+ _____XX_,____XX__,________,
+ _____XX_,____XXXX,XXXXX___,
+ _____XX_,XX_XXX__,__XX____,
+ _XXXXXXX,XXXXXXX_,_XXX____,
+ _____XX_,__XX_XX_,XXX_____,
+ ____XXX_,_XX___XX,XX______,
+ ____XXXX,______XX,X_______,
+ ____XXXX,X_____XX,X_______,
+ ____XXXX,XX___XX_,XXX_____,
+ ___XXXX_,XX__XX__,_XXXX___,
+ ___XXXX_,__XXX___,___XXXX_,
+ __XX_XX_,XXXXXXXX,XXXXX___,
+ __XX_XXX,X__XX___,__XX____,
+ _XX__XX_,___XX___,__XX____,
+ _____XX_,___XX___,__XX____,
+ _____XX_,___XX___,__XX____,
+ _____XX_,___XX___,__XX____,
+ _____XX_,___XXXXX,XXXX____,
+ _____XX_,___XX___,__XX____,
+ _____XX_,___XX___,__XX____,
+ ________,________,________,
+};
+
+/* char: 功 code:0xB9A6 */
+static GUI_CONST_STORAGE unsigned char acB9A6[72] = {
+ ________,________,________,
+ ________,_______X,X_______,
+ ________,_______X,XX______,
+ ________,_______X,X_______,
+ ________,__XX___X,X_______,
+ __XXXXXX,XXXXX__X,X_______,
+ ______XX,_______X,X_______,
+ ______XX,___XXXXX,XXXXXXX_,
+ ______XX,_______X,X___XXX_,
+ ______XX,_______X,X___XXX_,
+ ______XX,_______X,X___XXX_,
+ ______XX,_______X,X___XX__,
+ ______XX,______XX,X___XX__,
+ ______XX,______XX,____XX__,
+ ______XX,______XX,____XX__,
+ ______XX,_XXX__XX,____XX__,
+ ______XX,XX___XX_,____XX__,
+ __XXXXX_,____XXX_,____XX__,
+ __XXX___,____XX__,____XX__,
+ ________,___XX___,____XX__,
+ ________,__XX___X,XX_XXX__,
+ ________,XXX_____,_XXXX___,
+ _______X,X_______,__XX____,
+ ________,________,________,
+};
+
+/* char: 公 code:0xB9AB */
+static GUI_CONST_STORAGE unsigned char acB9AB[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,_____XXX,________,
+ ________,_XX__XX_,________,
+ ________,XXX___XX,________,
+ ________,XXX___XX,________,
+ _______X,XX_____X,X_______,
+ _______X,X______X,X_______,
+ ______XX,X_______,XX______,
+ ______XX,________,XXX_____,
+ _____XX_,___XX___,_XXX____,
+ ____XX__,___XXX__,__XXX___,
+ ___XX___,__XXX___,___XXXX_,
+ __XX____,__XX____,____XX__,
+ ________,_XXX____,________,
+ ________,_XX_____,________,
+ ________,XX____XX,________,
+ _______X,X______X,XX______,
+ ______XX,X_______,XXX_____,
+ _____XXX,________,_XX_____,
+ ____XXXX,XXXXXXXX,XXXX____,
+ _____XXX,________,__XX____,
+ ________,________,__XX____,
+ ________,________,________,
+};
+
+/* char: 故 code:0xB9CA */
+static GUI_CONST_STORAGE unsigned char acB9CA[72] = {
+ ________,________,________,
+ ________,_______X,X_______,
+ _______X,XX_____X,XX______,
+ _______X,X______X,X_______,
+ _______X,X_____XX,X_______,
+ _______X,X_____XX,X_______,
+ _______X,X_____XX,________,
+ _XXXXXXX,XXXXXXXX,XXXXXXX_,
+ _______X,X____XXX,___XX___,
+ _______X,X____XXX,___XX___,
+ _______X,X___XXXX,___XX___,
+ _______X,X___XXXX,___XX___,
+ ___XXXXX,XXXX___X,X_XXX___,
+ ___XXX__,_XXX___X,X_XX____,
+ ___XXX__,_XXX___X,X_XX____,
+ ___XXX__,_XXX___X,X_XX____,
+ ___XXX__,_XXX____,XXX_____,
+ ___XXX__,_XXX____,XXX_____,
+ ___XXX__,_XXX___X,XXX_____,
+ ___XXXXX,XXXX__XX,X_XX____,
+ ___XXX__,_XXX_XXX,__XXXX__,
+ ___XXX__,___XXX__,____XXXX,
+ ________,__XX____,________,
+ ________,________,________,
+};
+
+/* char: 规 code:0xB9E6 */
+static GUI_CONST_STORAGE unsigned char acB9E6[72] = {
+ ________,________,________,
+ _____XXX,________,________,
+ _____XXX,________,________,
+ ______XX,____XXXX,XXXXXXX_,
+ ______XX,____XX__,____XX__,
+ ______XX,____XX__,____XX__,
+ __XXXXXX,XXX_XX_X,XX__XX__,
+ ______XX,____XX_X,XX__XX__,
+ ______XX,____XX_X,XX__XX__,
+ ______XX,____XX_X,XX__XX__,
+ ______XX,____XX_X,XX__XX__,
+ _XXXXXXX,XXXXXX_X,XX__XX__,
+ ______XX,____XX_X,XXX_XX__,
+ _____XXX,____XX_X,XXX_XX__,
+ _____XXX,____XX_X,XXX_____,
+ _____XXX,XX_____X,XXX_____,
+ _____XX_,XXX___XX,XXX_____,
+ _____XX_,_XX___XX,_XX__XX_,
+ ____XX__,_XX__XXX,_XX__XX_,
+ ____XX__,_____XX_,_XX__XX_,
+ ___XX___,___XXX__,_XX__XXX,
+ __XX____,__XX____,_XXXXXX_,
+ _XX_____,XXX_____,________,
+ ________,________,________,
+};
+
+/* char: 号 code:0xBAC5 */
+static GUI_CONST_STORAGE unsigned char acBAC5[72] = {
+ ________,________,________,
+ ________,________,________,
+ ______XX,XXXXXXXX,XXX_____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XX_____,
+ ______XX,XXXXXXXX,XXX_____,
+ ______XX,________,_XX_____,
+ __XXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,XXX_____,________,
+ ________,XX______,________,
+ _______X,XX______,________,
+ _______X,XXXXXXXX,XXXX____,
+ _______X,X_______,_XXX____,
+ ________,________,_XX_____,
+ ________,________,_XX_____,
+ ________,________,_XX_____,
+ ________,________,XXX_____,
+ ________,___XXX__,XX______,
+ ________,_____XXX,XX______,
+ ________,_____XXX,________,
+ ________,________,________,
+};
+
+/* char: 后 code:0xBAF3 */
+static GUI_CONST_STORAGE unsigned char acBAF3[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,___XX___,
+ ________,______XX,XXXXXX__,
+ _____XXX,XXXXXXX_,________,
+ _____XX_,________,________,
+ _____XX_,________,________,
+ _____XX_,________,____XX__,
+ _____XXX,XXXXXXXX,XXXXXXX_,
+ _____XX_,________,________,
+ _____XX_,________,________,
+ _____XX_,________,________,
+ _____XX_,________,________,
+ _____XX_,XXXXXXXX,XXXXX___,
+ _____XX_,_XX_____,__XXX___,
+ _____XX_,_XX_____,__XXX___,
+ ____XXX_,_XX_____,__XXX___,
+ ____XX__,_XX_____,__XXX___,
+ ____XX__,_XX_____,__XXX___,
+ ___XX___,XXXXXXXX,XXXXX___,
+ ___XX___,XXX_____,__XXX___,
+ __XX____,XXX_____,__XX____,
+ _XX_____,________,________,
+ ________,________,________,
+};
+
+/* char: 护 code:0xBBA4 */
+static GUI_CONST_STORAGE unsigned char acBBA4[72] = {
+ ________,________,________,
+ ________,________,________,
+ _____XX_,______XX,________,
+ _____XXX,_______X,X_______,
+ _____XXX,_______X,XX______,
+ _____XXX,________,XX______,
+ _____XXX,___XXXXX,XXXXXXX_,
+ _XXXXXXX,XXXXX___,____XX__,
+ _____XXX,__XXX___,____XX__,
+ _____XXX,___XX___,____XX__,
+ _____XXX,___XX___,____XX__,
+ _____XXX,XXXXXXXX,XXXXXXX_,
+ _____XXX,X__XX___,____XXX_,
+ __XXXXXX,___XX___,________,
+ __XX_XXX,___XX___,________,
+ _____XXX,___XX___,________,
+ _____XXX,__XXX___,________,
+ _____XXX,__XX____,________,
+ _____XXX,__XX____,________,
+ _____XXX,_XX_____,________,
+ __XX_XXX,XX______,________,
+ ___XXXX_,XX______,________,
+ ____XXXX,X_______,________,
+ ________,________,________,
+};
+
+/* char: 欢 code:0xBBB6 */
+static GUI_CONST_STORAGE unsigned char acBBB6[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,______XX,________,
+ ________,______XX,________,
+ ________,_____XXX,________,
+ _XXXXXXX,XXX__XX_,________,
+ ________,XXX__XX_,________,
+ ________,XX___XXX,XXXXXXX_,
+ __XX____,XX__XX_X,X___XXX_,
+ ___XX__X,XX__XX_X,XX__XX__,
+ ____XX_X,X__XX__X,XX_XX___,
+ _____XXX,X__XX__X,XX______,
+ _____XXX,X_XX___X,XX______,
+ ______XX,______XX,XX______,
+ _____XXX,X_____XX,_XX_____,
+ _____XXX,XX____XX,_XX_____,
+ ____XXX_,XXX__XXX,_XX_____,
+ ____XX__,XXX__XX_,_XXX____,
+ ___XX___,_XX_XXX_,__XX____,
+ __XX____,_XXXXX__,__XXX___,
+ __XX____,__XXX___,___XXX__,
+ _XX_____,_XX_____,____XXXX,
+ _______X,XX______,________,
+ ________,________,________,
+};
+
+/* char: 恢 code:0xBBD6 */
+static GUI_CONST_STORAGE unsigned char acBBD6[72] = {
+ ________,________,________,
+ _____XX_,____XX__,________,
+ _____XX_,____XXX_,________,
+ _____XX_,____XXX_,________,
+ _____XX_,____XXX_,________,
+ _____XX_,XXXXXXXX,XXXXXXX_,
+ _____XXX,____XX__,________,
+ _____XXX,X___XX_X,XX______,
+ __XX_XXX,XX_XXX_X,XX______,
+ __XX_XX_,___XX__X,XX______,
+ _XXX_XX_,___XXXXX,XX__XX__,
+ _____XX_,__XXXXXX,XX__XXX_,
+ _____XX_,__XX_XXX,XX_XX___,
+ _____XX_,__XXXX_X,XXXX____,
+ _____XX_,_XXXXX_X,XXX_____,
+ _____XX_,_XX___XX,XXX_____,
+ _____XX_,XX____XX,_XX_____,
+ _____XXX,X____XXX,__XX____,
+ _____XXX,X____XX_,__XXX___,
+ _____XXX,____XX__,___XXX__,
+ _____XX_,___XX___,___XXXX_,
+ _____XX_,_XXX____,____XXX_,
+ ____XX__,XX______,________,
+ ________,________,________,
+};
+
+/* char: 回 code:0xBBD8 */
+static GUI_CONST_STORAGE unsigned char acBBD8[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,____XX__,
+ ___XXXXX,XXXXXXXX,XXXXXX__,
+ ___XXX__,________,___XXX__,
+ ___XXX__,________,___XXX__,
+ ___XXX__,________,___XXX__,
+ ___XXX__,________,___XXX__,
+ ___XXX__,XXXXXXXX,XX_XXX__,
+ ___XXX__,XX_____X,X__XXX__,
+ ___XXX__,XX_____X,X__XXX__,
+ ___XXX__,XX_____X,X__XXX__,
+ ___XXX__,XX_____X,X__XXX__,
+ ___XXX__,XX_____X,X__XXX__,
+ ___XXX__,XXXXXXXX,X__XXX__,
+ ___XXX__,XX_____X,X__XXX__,
+ ___XXX__,XX______,___XXX__,
+ ___XXX__,________,___XXX__,
+ ___XXX__,________,___XXX__,
+ ___XXX__,________,___XXX__,
+ ___XXXXX,XXXXXXXX,XXXXXX__,
+ ___XXX__,________,___XXX__,
+ ___XXX__,________,________,
+ ________,________,________,
+};
+
+/* char: 或 code:0xBBF2 */
+static GUI_CONST_STORAGE unsigned char acBBF2[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,_____XX_,_XX_____,
+ ________,_____XXX,__XXX___,
+ ________,_____XXX,__XXX___,
+ ________,_____XXX,____XX__,
+ __XXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,_____XXX,________,
+ ________,_____XXX,________,
+ ____XXXX,XXXX__XX,___XX___,
+ ____XX__,__XX__XX,___XXX__,
+ ____XX__,__XX__XX,__XXX___,
+ ____XX__,__XX__XX,__XXX___,
+ ____XX__,__XX__XX,X_XX____,
+ ____XXXX,XXXX__XX,XXXX____,
+ ____XX__,__XX___X,XXX_____,
+ ___XX___,_______X,XXX_____,
+ ________,___XXX_X,XX______,
+ _______X,XXXX__XX,XXX__XX_,
+ _XXXXXXX,_____XX_,_XXX_XX_,
+ __XXX___,____XX__,__XXXXX_,
+ ________,__XXX___,___XXXX_,
+ ________,_XX_____,_____XXX,
+ ________,________,________,
+};
+
+/* char: 辑 code:0xBCAD */
+static GUI_CONST_STORAGE unsigned char acBCAD[72] = {
+ ________,________,________,
+ _____XX_,________,________,
+ _____XXX,___XXXXX,XXXXX___,
+ _____XX_,___XX___,__XX____,
+ ____XXX_,___XX___,__XX____,
+ _XXXXXXX,XXXXX___,__XX____,
+ ____XX__,___XXXXX,XXXX____,
+ ___XXX__,___XX___,__XX____,
+ ___XX_XX,X__XX___,________,
+ ___XX_XX,_XXXXXXX,XXXXXXX_,
+ __XXX_XX,XX_XXX__,__XX____,
+ _XXXXXXX,XXXXXXXX,XXXX____,
+ __XX__XX,___XXX__,__XX____,
+ ______XX,___XXX__,__XX____,
+ ______XX,___XXXXX,XXXX____,
+ ______XX,XXXXXX__,__XX____,
+ ____XXXX,___XXX__,__XX____,
+ _XXXX_XX,___XXX__,__XX_XX_,
+ ______XX,_XXXXXXX,XXXXXXX_,
+ ______XX,________,__XX____,
+ ______XX,________,__XX____,
+ ______XX,________,__XX____,
+ ______XX,________,__XX____,
+ ________,________,________,
+};
+
+/* char: 技 code:0xBCBC */
+static GUI_CONST_STORAGE unsigned char acBCBC[72] = {
+ ________,________,________,
+ _____XX_,_______X,X_______,
+ _____XXX,_______X,XX______,
+ _____XXX,_______X,X_______,
+ _____XXX,_______X,X_______,
+ _____XXX,_______X,X_______,
+ _XXXXXXX,XXXXXXXX,XXXXXXX_,
+ _____XXX,_______X,X_______,
+ _____XXX,_______X,X_______,
+ _____XXX,_______X,X_______,
+ _____XXX,_XX____X,X_______,
+ _____XXX,XXXXXXXX,XXXXXX__,
+ ____XXXX,____XX__,___XX___,
+ _XXXXXXX,____XX__,__XXX___,
+ __XX_XXX,_____XX_,__XX____,
+ _____XXX,_____XX_,_XXX____,
+ _____XXX,______XX,_XX_____,
+ _____XXX,______XX,XXX_____,
+ _____XXX,_______X,XX______,
+ _____XXX,______XX,XXX_____,
+ __XX_XXX,____XXX_,_XXXX___,
+ ___XXXXX,__XXX___,__XXXXXX,
+ _____XX_,XXX_____,____XX__,
+ ________,________,________,
+};
+
+/* char: 计 code:0xBCC6 */
+static GUI_CONST_STORAGE unsigned char acBCC6[72] = {
+ ________,________,________,
+ ________,________,________,
+ ____XX__,______XX,________,
+ _____XXX,______XX,X_______,
+ ______XX,______XX,X_______,
+ ______XX,______XX,X_______,
+ ________,______XX,X_______,
+ ________,______XX,X_______,
+ ________,______XX,X_______,
+ _XXXXXXX,______XX,X____XX_,
+ _____XX_,XXXXXXXX,XXXXXXX_,
+ _____XX_,______XX,X_______,
+ _____XX_,______XX,X_______,
+ _____XX_,______XX,X_______,
+ _____XX_,______XX,X_______,
+ _____XX_,______XX,X_______,
+ _____XX_,_XX___XX,X_______,
+ _____XX_,XX____XX,X_______,
+ _____XXX,X_____XX,X_______,
+ _____XXX,X_____XX,X_______,
+ _____XXX,______XX,X_______,
+ ________,______XX,X_______,
+ ________,______XX,X_______,
+ ________,________,________,
+};
+
+/* char: 加 code:0xBCD3 */
+static GUI_CONST_STORAGE unsigned char acBCD3[72] = {
+ ________,________,________,
+ ______XX,________,________,
+ ______XX,________,________,
+ ______XX,________,________,
+ ______XX,________,________,
+ ______XX,________,________,
+ _XXXXXXX,XXXXX_XX,XXXXXXX_,
+ ______XX,__XXX_XX,____XX__,
+ ______XX,__XXX_XX,____XX__,
+ ______XX,__XXX_XX,____XX__,
+ ______XX,__XXX_XX,____XX__,
+ _____XXX,__XX__XX,____XX__,
+ _____XXX,__XX__XX,____XX__,
+ _____XX_,__XX__XX,____XX__,
+ _____XX_,__XX__XX,____XX__,
+ _____XX_,__XX__XX,____XX__,
+ ____XXX_,__XX__XX,____XX__,
+ ____XX__,__XX__XX,____XX__,
+ ____XX__,__XX__XX,____XX__,
+ ___XXXXX,_XXX__XX,XXXXXX__,
+ ___XX__X,XXX___XX,____XXX_,
+ __XX____,XX____XX,____XXX_,
+ _XX_____,______XX,________,
+ ________,________,________,
+};
+
+/* char: 检 code:0xBCEC */
+static GUI_CONST_STORAGE unsigned char acBCEC[72] = {
+ ________,________,________,
+ _____XX_,______XX,________,
+ _____XX_,______XX,________,
+ _____XX_,_____XXX,X_______,
+ _____XX_,_____XXX,X_______,
+ _____XX_,____XXX_,XX______,
+ _XXXXXXX,XXX_XX__,_XX_____,
+ _____XX_,___XX___,__XXX___,
+ ____XXX_,__XX____,___XXXX_,
+ ____XXXX,_XX_____,____XX__,
+ ____XXXX,XXXXXXXX,XXXX____,
+ ____XXXX,XX______,________,
+ ___XXXX_,XX___XX_,__XXX___,
+ ___XXXX_,______XX,__XXX___,
+ __XX_XX_,__XX__XX,__XXX___,
+ __XX_XX_,__XX__XX,X_XX____,
+ _XX__XX_,___XX_XX,X_XX____,
+ _____XX_,___XX__X,XXXX____,
+ _____XX_,___XX___,_XX_____,
+ _____XX_,___XX___,_XX_____,
+ _____XX_,________,XX______,
+ _____XX_,XXXXXXXX,XXXXXXX_,
+ _____XX_,________,________,
+ ________,________,________,
+};
+
+/* char: 键 code:0xBCFC */
+static GUI_CONST_STORAGE unsigned char acBCFC[72] = {
+ ________,________,________,
+ ____XX__,________,XX______,
+ ____XXX_,________,XXX_____,
+ ____XX__,________,XX______,
+ ___XXX__,XXXXXXXX,XXXXXX__,
+ ___XXXXX,X__XX___,XX__XX__,
+ ___XX___,__XXXXXX,XXXXXXX_,
+ __XX____,__XX____,XX__XX__,
+ __XXXXXX,X_XX____,XX__XX__,
+ _XX_XX__,_XX___XX,XXXXXX__,
+ ____XX__,XXXXXX__,XX______,
+ ____XX__,_XX_XX__,XX______,
+ ____XX__,____XXXX,XXXXXX__,
+ _XXXXXXX,XX__XX__,XX______,
+ ____XX__,_XXXXX__,XX______,
+ ____XX__,_XXXX___,XX______,
+ ____XX__,_XXXXXXX,XXXXXXX_,
+ ____XX__,__XXX___,XX______,
+ ____XX_X,X_XX____,XX______,
+ ____XXXX,_XXXXX__,XXX_____,
+ ____XXX_,XXX_XXXX,XX___XXX,
+ _______X,X______X,XXXXXXX_,
+ ______XX,________,________,
+ ________,________,________,
+};
+
+/* char: 件 code:0xBCFE */
+static GUI_CONST_STORAGE unsigned char acBCFE[72] = {
+ ________,________,________,
+ _______X,X______X,X_______,
+ ______XX,XX_____X,X_______,
+ ______XX,X______X,X_______,
+ ______XX,__XXX__X,X_______,
+ _____XXX,__XXX__X,X_______,
+ _____XX_,__XX___X,X_______,
+ ____XXX_,__XXXXXX,XXXXXX__,
+ ____XXX_,__XX___X,X_______,
+ ___XXXX_,_XX____X,X_______,
+ ___XXXX_,_XX____X,X_______,
+ __XX_XX_,XX_____X,X_______,
+ _XX__XX_,XX_____X,X_______,
+ _____XX_,XXXXXXXX,XXXXXXX_,
+ _____XX_,_______X,X_______,
+ _____XX_,_______X,X_______,
+ _____XX_,_______X,X_______,
+ _____XX_,_______X,X_______,
+ _____XX_,_______X,X_______,
+ _____XX_,_______X,X_______,
+ _____XX_,_______X,X_______,
+ _____XX_,_______X,X_______,
+ _____XX_,_______X,X_______,
+ ________,________,________,
+};
+
+/* char: 江 code:0xBDAD */
+static GUI_CONST_STORAGE unsigned char acBDAD[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ___XX___,________,________,
+ ____XX__,________,____XX__,
+ ____XXX_,XXXXXXXX,XXXXXX__,
+ _____XXX,X_____XX,________,
+ _______X,X_____XX,________,
+ _XX____X,X_____XX,________,
+ __XXX_XX,______XX,________,
+ ___XX_XX,______XX,________,
+ ___XX_XX,______XX,________,
+ _____XX_,______XX,________,
+ _____XX_,______XX,________,
+ _____XX_,______XX,________,
+ ____XX__,______XX,________,
+ __XXXX__,______XX,________,
+ ___XXX__,______XX,________,
+ ___XXX__,______XX,________,
+ ___XXX__,______XX,_____XX_,
+ ___XXXXX,XXXXXXXX,XXXXXXXX,
+ ___XXX__,________,________,
+ ________,________,________,
+ ________,________,________,
+};
+
+/* char: 阶 code:0xBDD7 */
+static GUI_CONST_STORAGE unsigned char acBDD7[72] = {
+ ________,________,________,
+ ________,______XX,________,
+ ________,_____XXX,________,
+ __XXXXXX,XX___XXX,X_______,
+ __XX___X,X___XXXX,X_______,
+ __XX__XX,X___XX__,XX______,
+ __XX__XX,___XXX__,_XX_____,
+ __XX__XX,___XX___,_XXX____,
+ __XX_XX_,__XX____,__XXXX__,
+ __XX_XX_,XXXXX___,____XXXX,
+ __XX_XX_,___XXX__,_XX_____,
+ __XX__XX,___XXX__,_XX_____,
+ __XX___X,X__XXX__,_XX_____,
+ __XX___X,X__XXX__,_XX_____,
+ __XX___X,XX_XXX__,_XX_____,
+ __XX___X,X__XXX__,_XX_____,
+ __XXXXXX,X__XXX__,_XX_____,
+ __XX_XXX,___XX___,_XX_____,
+ __XX____,___XX___,_XX_____,
+ __XX____,__XXX___,_XX_____,
+ __XX____,__XX____,_XX_____,
+ __XX____,XXX_____,_XX_____,
+ __XX___X,X_______,________,
+ ________,________,________,
+};
+
+/* char: 进 code:0xBDF8 */
+static GUI_CONST_STORAGE unsigned char acBDF8[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,XX______,
+ ____XX__,____XX__,_XX_____,
+ ____XXX_,____XX__,_XX_____,
+ _____XXX,____XX__,_XX_____,
+ _____XX_,____XX__,_XX_XX__,
+ ________,XXXXXXXX,XXXXXXX_,
+ ________,____XX__,_XX_____,
+ _____XX_,____XX__,_XX_____,
+ _XXXXXXX,____XX__,_XX_____,
+ _____XX_,____XX__,_XX_____,
+ _____XXX,XXXXXXXX,XXXXXXX_,
+ _____XX_,____XX__,_XX_____,
+ _____XX_,___XXX__,_XX_____,
+ _____XX_,___XX___,_XX_____,
+ _____XX_,___XX___,_XX_____,
+ _____XX_,__XX____,_XX_____,
+ _____XX_,_XX_____,_XX_____,
+ ____XXXX,XX______,_XX_____,
+ __XXX__X,X_______,________,
+ _XXX____,XXXXXXX_,__XXXXXX,
+ ________,___XXXXX,XXXXXX__,
+ ________,________,________,
+};
+
+/* char: 据 code:0xBEDD */
+static GUI_CONST_STORAGE unsigned char acBEDD[72] = {
+ ________,________,________,
+ ________,________,________,
+ _____XX_,________,________,
+ _____XXX,__XXXXXX,XXXXXX__,
+ _____XX_,__XXX___,___XXX__,
+ _____XX_,__XXX___,___XXX__,
+ _____XX_,XXXXX___,___XXX__,
+ _XXXXXXX,XXXXXXXX,XXXXXX__,
+ _____XX_,__XXX___,XX_XXX__,
+ _____XX_,__XX____,XX______,
+ _____XX_,_XXX____,XX______,
+ _____XXX,XXXXXXXX,XXXXXXX_,
+ _____XXX,__XX____,XX______,
+ ____XXX_,__XX____,XX______,
+ _XXXXXX_,__XX____,XX______,
+ __XX_XX_,_XXXXXXX,XXXXXX__,
+ _____XX_,_XX_XX__,___XXX__,
+ _____XX_,_XX_XX__,___XXX__,
+ _____XX_,XX__XX__,___XXX__,
+ _____XX_,XX__XX__,___XXX__,
+ _____XXX,X___XXXX,XXXXXX__,
+ __XXXXXX,____XX__,___XXX__,
+ ____XXX_,____XX__,___XX___,
+ ________,________,________,
+};
+
+/* char: 巨 code:0xBEDE */
+static GUI_CONST_STORAGE unsigned char acBEDE[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,___XX___,
+ ____XXXX,XXXXXXXX,XXXXXX__,
+ ____XX__,________,________,
+ ____XX__,________,________,
+ ____XX__,________,________,
+ ____XX__,________,________,
+ ____XXXX,XXXXXXXX,XXXXX___,
+ ____XX__,________,__XX____,
+ ____XX__,________,__XX____,
+ ____XX__,________,__XX____,
+ ____XX__,________,__XX____,
+ ____XX__,________,__XX____,
+ ____XX__,________,__XX____,
+ ____XXXX,XXXXXXXX,XXXX____,
+ ____XX__,________,__XX____,
+ ____XX__,________,________,
+ ____XX__,________,________,
+ ____XX__,________,________,
+ ____XX__,________,____XX__,
+ ____XXXX,XXXXXXXX,XXXXXXX_,
+ ____XX__,________,________,
+ ________,________,________,
+};
+
+/* char: 控 code:0xBFD8 */
+static GUI_CONST_STORAGE unsigned char acBFD8[72] = {
+ ________,________,________,
+ _____XX_,________,________,
+ _____XXX,______XX,________,
+ _____XX_,_______X,XX______,
+ _____XX_,_______X,X_______,
+ _____XX_,__XXXXXX,XXXXXXX_,
+ _XXXXXXX,XXXX____,____XXX_,
+ _____XX_,_XXX_XX_,____XX__,
+ _____XX_,_____XXX,XXX_____,
+ _____XX_,____XXX_,__XXX___,
+ _____XX_,XX_XXX__,___XXX__,
+ _____XXX,X_XX____,____XX__,
+ ____XXXX,_XX_____,____XX__,
+ _XXXXXX_,__XXXXXX,XXXXX___,
+ _XXX_XX_,______XX,X_______,
+ _____XX_,______XX,X_______,
+ _____XX_,______XX,X_______,
+ _____XX_,______XX,X_______,
+ _____XX_,______XX,X_______,
+ _____XX_,______XX,X_______,
+ _____XX_,XXXXXXXX,XXXXXXX_,
+ __XXXXX_,________,________,
+ ____XX__,________,________,
+ ________,________,________,
+};
+
+/* char: 括 code:0xC0A8 */
+static GUI_CONST_STORAGE unsigned char acC0A8[72] = {
+ ________,________,________,
+ _____XX_,________,________,
+ _____XXX,________,________,
+ _____XXX,________,_XXXXX__,
+ _____XXX,___XXXXX,XX______,
+ _____XXX,_______X,X_______,
+ _XXXXXXX,XXX____X,X_______,
+ _____XXX,_______X,X_______,
+ _____XXX,_______X,X____XX_,
+ _____XXX,_XXXXXXX,XXXXXXXX,
+ _____XXX,_______X,X_______,
+ _____XXX,XXX____X,X_______,
+ _____XXX,X______X,X_______,
+ __XXXXXX,___XXXXX,XXXXXX__,
+ _XXX_XXX,___XX___,___XXX__,
+ _____XXX,___XX___,___XXX__,
+ _____XXX,___XX___,___XXX__,
+ _____XXX,___XX___,___XXX__,
+ _____XXX,___XX___,___XXX__,
+ _____XXX,___XXXXX,XXXXXX__,
+ __XX_XXX,___XX___,___XXX__,
+ ___XXXXX,___XX___,___XXX__,
+ _____XX_,________,________,
+ ________,________,________,
+};
+
+/* char: 量 code:0xC1BF */
+static GUI_CONST_STORAGE unsigned char acC1BF[72] = {
+ ________,________,________,
+ ________,________,________,
+ _____XXX,XXXXXXXX,XXX_____,
+ _____XXX,________,_XX_____,
+ _____XXX,XXXXXXXX,XXX_____,
+ _____XXX,________,_XX_____,
+ _____XXX,________,_XX_____,
+ _____XXX,XXXXXXXX,XXX_____,
+ _____XXX,________,_XX__XX_,
+ _XXXXXXX,XXXXXXXX,XXXXXXXX,
+ ________,________,________,
+ _____XXX,XXXXXXXX,XXXX____,
+ _____XX_,___XXX__,_XXX____,
+ _____XXX,XXXXXXXX,XXXX____,
+ _____XX_,___XXX__,_XXX____,
+ _____XX_,___XXX__,_XXX____,
+ _____XXX,XXXXXXXX,XXXX____,
+ _____XX_,___XXX__,_XXX____,
+ ___XXXXX,XXXXXXXX,XXXXX___,
+ ________,___XXX__,________,
+ ________,___XXX__,_____XX_,
+ _XXXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,________,________,
+ ________,________,________,
+};
+
+/* char: 流 code:0xC1F7 */
+static GUI_CONST_STORAGE unsigned char acC1F7[72] = {
+ ________,________,________,
+ ________,____XX__,________,
+ ___XX___,_____XXX,________,
+ ____XXX_,______XX,____XX__,
+ _____XXX,XXXXXXXX,XXXXXXX_,
+ _____XXX,_____XXX,________,
+ ________,XX__XXX_,________,
+ _______X,X___XX__,_XX_____,
+ _XXX___X,X__XX___,__XX____,
+ __XXX__X,X_XX___X,XXXXX___,
+ ___XX_XX,_XXXXXXX,___XX___,
+ ___XX_XX,________,___XX___,
+ ______XX,_XXX_XXX,_XXX____,
+ _____XX_,_XXX_XX_,_XX_____,
+ _____XX_,_XXX_XX_,_XX_____,
+ ____XX__,_XXX_XX_,_XX_____,
+ _XXXXX__,_XXX_XX_,_XX_____,
+ ___XXX__,_XX__XX_,_XX_____,
+ ___XXX__,_XX__XX_,_XX__XX_,
+ ___XXX__,XXX__XX_,_XX__XX_,
+ ___XXX__,XX___XX_,_XX__XXX,
+ ___XXX_X,X____XX_,_XXXXXX_,
+ _____XXX,_____XX_,________,
+ ________,________,________,
+};
+
+/* char: 码 code:0xC2EB */
+static GUI_CONST_STORAGE unsigned char acC2EB[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,___XX___,
+ _XXXXXXX,XXXXXXXX,XXXXXX__,
+ _____XX_,________,___XX___,
+ ____XXX_,____XXX_,___XX___,
+ ____XX__,____XXX_,___XX___,
+ ____XX__,____XX__,__XXX___,
+ ____XX__,____XX__,__XXX___,
+ ___XXXXX,XX__XX__,__XX____,
+ ___XXX_X,XX__XX__,__XX____,
+ __XXXX_X,XX__XX__,__XX____,
+ __XXXX_X,XX_XXXXX,XXXXXXX_,
+ _XXXXX_X,XX__XX__,_____XX_,
+ ___XXX_X,XX______,_____XX_,
+ ___XXX_X,XX______,_____XX_,
+ ___XXX_X,XXXXXXXX,XXXXXXX_,
+ ___XXXXX,XX______,____XXX_,
+ ___XXX_X,XX______,____XX__,
+ ___XXX_X,X_______,____XX__,
+ ___XXX__,________,XX__XX__,
+ ________,________,_XXXXX__,
+ ________,________,__XXX___,
+ ________,________,________,
+};
+
+/* char: 满 code:0xC2FA */
+static GUI_CONST_STORAGE unsigned char acC2FA[72] = {
+ ________,________,________,
+ ________,____XX__,XX______,
+ ___XX___,____XX__,XX______,
+ ____XXX_,____XX__,XX______,
+ _____XX_,XXXXXXXX,XXXXXXX_,
+ _____XX_,____XX__,XX______,
+ ________,____XX__,XX______,
+ _XX___XX,________,________,
+ __XXX_XX,XXXXXXXX,XXXXXXX_,
+ ___XX_XX,____XX__,XX______,
+ ___XXXX_,____XX__,XX______,
+ _____XX_,XXXXXXXX,XXXXXXX_,
+ _____XX_,XX__XX__,XX__XX__,
+ _____XX_,XX__XX__,XX__XX__,
+ ____XX__,XX__XXX_,XX__XX__,
+ ____XX__,XX__XXXX,XXX_XX__,
+ __XXXX__,XX_XX_XX,X_XXXX__,
+ ___XXX__,XX_XX__X,X_XXXX__,
+ ___XXX__,XXXX__XX,____XX__,
+ ___XXX__,XXX__XX_,____XX__,
+ ___XXX__,XX______,____XX__,
+ ___XXX__,XX______,__XXXX__,
+ ________,XX______,___XX___,
+ ________,________,________,
+};
+
+/* char: 门 code:0xC3C5 */
+static GUI_CONST_STORAGE unsigned char acC3C5[72] = {
+ ________,________,________,
+ ________,________,________,
+ ______XX,________,________,
+ ______XX,X_______,________,
+ _______X,XX_XXXXX,XXXXXX__,
+ _______X,XX______,___XXX__,
+ ____XX__,________,___XXX__,
+ ____XX__,________,___XXX__,
+ ____XX__,________,___XXX__,
+ ____XX__,________,___XXX__,
+ ____XX__,________,___XXX__,
+ ____XX__,________,___XXX__,
+ ____XX__,________,___XXX__,
+ ____XX__,________,___XXX__,
+ ____XX__,________,___XXX__,
+ ____XX__,________,___XXX__,
+ ____XX__,________,___XXX__,
+ ____XX__,________,___XXX__,
+ ____XX__,________,___XXX__,
+ ____XX__,________,___XXX__,
+ ____XX__,_______X,XX_XXX__,
+ ____XX__,________,_XXXX___,
+ ____XX__,________,__XX____,
+ ________,________,________,
+};
+
+/* char: 密 code:0xC3DC */
+static GUI_CONST_STORAGE unsigned char acC3DC[72] = {
+ ________,________,________,
+ ________,__XX____,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ___XXXXX,XXXXXXXX,XXXXXXX_,
+ ___XX___,_XX_____,____XX__,
+ __XXX___,__XXX___,XX_XX___,
+ __XX____,XX_XX__X,XX______,
+ ________,XX_XX_XX,X_______,
+ _____XX_,XX__XXX_,__XXX___,
+ ____XX__,XX_XXX__,XX_XXX__,
+ ___XXX__,XXXX____,XX__XX__,
+ _______X,XXX_____,XX__XX__,
+ ____XXXX,XXXXXXXX,XX______,
+ _XXXX___,________,________,
+ ________,___XX___,________,
+ ________,___XXX__,________,
+ _____XXX,___XX___,__XXX___,
+ _____XX_,___XX___,__XX____,
+ _____XX_,___XX___,__XX____,
+ _____XX_,___XX___,__XX____,
+ ____XXXX,XXXXXXXX,XXXX____,
+ ________,________,__XX____,
+ ________,________,________,
+};
+
+/* char: 面 code:0xC3E6 */
+static GUI_CONST_STORAGE unsigned char acC3E6[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,_____XX_,
+ _XXXXXXX,XXXXXXXX,XXXXXXXX,
+ ________,__XXX___,________,
+ ________,__XX____,________,
+ ________,__XX____,________,
+ ___XXXXX,XXXXXXXX,XXXXXX__,
+ ___XXX__,_XX___XX,___XXX__,
+ ___XXX__,_XX___XX,___XXX__,
+ ___XXX__,_XX___XX,___XXX__,
+ ___XXX__,_XXXXXXX,___XXX__,
+ ___XXX__,_XX___XX,___XXX__,
+ ___XXX__,_XX___XX,___XXX__,
+ ___XXX__,_XX___XX,___XXX__,
+ ___XXX__,_XX___XX,___XXX__,
+ ___XXX__,_XXXXXXX,___XXX__,
+ ___XXX__,_XX___XX,___XXX__,
+ ___XXX__,_XX___XX,___XXX__,
+ ___XXX__,_XX___XX,___XXX__,
+ ___XXXXX,XXXXXXXX,XXXXXX__,
+ ___XXX__,________,___XXX__,
+ ___XX___,________,___XX___,
+ ________,________,________,
+};
+
+/* char: 秒 code:0xC3EB */
+static GUI_CONST_STORAGE unsigned char acC3EB[72] = {
+ ________,________,________,
+ ________,________,XX______,
+ ________,XXX_____,XX______,
+ ____XXXX,XX______,XX______,
+ __XXX_XX,________,XX______,
+ ______XX,________,XX______,
+ ______XX,____XXX_,XX_XX___,
+ ______XX,____XXX_,XX__XX__,
+ _XXXXXXX,XXX_XX__,XX__XXX_,
+ _____XXX,____XX__,XX___XX_,
+ _____XXX,___XXX__,XX___XX_,
+ _____XXX,XX_XX___,XX______,
+ ____XXXX,XXXXX___,XX__XX__,
+ ____XXXX,XXXX____,XX_XXXX_,
+ ___XX_XX,________,XX_XXX__,
+ __XX__XX,________,XXXXX___,
+ __XX__XX,________,_XXX____,
+ _XX___XX,________,XXX_____,
+ ______XX,_______X,XX______,
+ ______XX,______XX,X_______,
+ ______XX,____XXX_,________,
+ ______XX,_XXXX___,________,
+ ________,XX______,________,
+ ________,________,________,
+};
+
+/* char: 默 code:0xC4AC */
+static GUI_CONST_STORAGE unsigned char acC4AC[72] = {
+ ________,________,________,
+ ________,_______X,X_______,
+ ________,_______X,XX______,
+ __XXXXXX,XXXX___X,X_XX____,
+ __XX__XX,_XXX___X,X__XXX__,
+ __XX__XX,XXXX___X,X__XXX__,
+ __XXXXXX,XXXX___X,X___XX__,
+ __XXXXXX,_XXX___X,X____XX_,
+ __XXXXXX,XXXXXXXX,XXXXXXX_,
+ __XX__XX,_XXX___X,XX______,
+ ______XX,_______X,XXX_____,
+ ______XX,_______X,XXX_____,
+ __XXXXXX,XXXX___X,XXX_____,
+ ______XX,_______X,XXX_____,
+ ______XX,_______X,XXX_____,
+ ______XX,XXXX__XX,XXX_____,
+ ___XXXXX,X_____XX,__XX____,
+ __XXX___,__XX__XX,__XX____,
+ _______X,X__XXXXX,__XXX___,
+ _____XX_,XX_XXXX_,___XX___,
+ __XX_XXX,XX__XX__,___XXX__,
+ __XX_XXX,___XX___,____XXX_,
+ __XX____,__XX____,____XX__,
+ ________,_XX_____,________,
+};
+
+/* char: 目 code:0xC4BF */
+static GUI_CONST_STORAGE unsigned char acC4BF[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,_XX_____,
+ ______XX,XXXXXXXX,XXXX____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XX_____,
+ ______XX,XXXXXXXX,XXX_____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XX_____,
+ ______XX,XXXXXXXX,XXX_____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XX_____,
+ ______XX,XXXXXXXX,XXX_____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XXX____,
+ ________,________,_XX_____,
+ ________,________,________,
+};
+
+/* char: 能 code:0xC4DC */
+static GUI_CONST_STORAGE unsigned char acC4DC[72] = {
+ ________,________,________,
+ ______XX,________,________,
+ ______XX,X_____XX,X_______,
+ _____XXX,______XX,___XX___,
+ _____XX_,_XX___XX,__XXXX__,
+ ____XX__,__XX__XX,_XXX____,
+ __XXX___,XXXXX_XX,XX______,
+ __XXXXXX,X__XX_XX,________,
+ ________,___XX_XX,_____XX_,
+ ___XXXXX,XXXX__XX,_____XX_,
+ ___XXX__,_XXX__XX,XXXXXXX_,
+ ___XXX__,_XXX____,________,
+ ___XXXXX,XXXX_XX_,________,
+ ___XXX__,_XXX__XX,___XX___,
+ ___XXX__,_XXX__XX,__XXXX__,
+ ___XXX__,_XXX__XX,_XXX____,
+ ___XXXXX,XXXX__XX,XX______,
+ ___XXX__,_XXX__XX,_____XX_,
+ ___XXX__,_XXX__XX,_____XX_,
+ ___XXX__,_XXX__XX,_____XX_,
+ ___XXX__,_XXX__XX,_____XXX,
+ ___XXX_X,XXXX__XX,XXXXXXX_,
+ ___XX___,_XX_____,________,
+ ________,________,________,
+};
+
+/* char: 配 code:0xC5E4 */
+static GUI_CONST_STORAGE unsigned char acC5E4[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,___XX___,____XX__,
+ _XXXXXXX,XXXXXXXX,XXXXXXX_,
+ _____XX_,XX______,____XX__,
+ _____XX_,XX______,____XX__,
+ __XXXXXX,XXXXX___,____XX__,
+ __XXXXX_,XXXXX___,____XX__,
+ __XXXXX_,XXXXX___,____XX__,
+ __XXXXX_,XXXXX___,____XX__,
+ __XXXXX_,XXXXX_XX,XXXXXX__,
+ __XXXXX_,XXXXX_XX,____XX__,
+ __XXXX__,XXXXX_XX,________,
+ __XXX___,XXXXX_XX,________,
+ __XXX___,__XXX_XX,________,
+ __XXXXXX,XXXXX_XX,________,
+ __XXX___,__XXX_XX,_____XX_,
+ __XXX___,__XXX_XX,_____XX_,
+ __XXX___,__XXX_XX,_____XX_,
+ __XXX___,__XXX_XX,_____XX_,
+ __XXXXXX,XXXXX_XX,_____XXX,
+ __XXX___,__XXX_XX,XXXXXXX_,
+ __XXX___,__XX____,________,
+ ________,________,________,
+};
+
+/* char: 坡 code:0xC6C2 */
+static GUI_CONST_STORAGE unsigned char acC6C2[72] = {
+ ________,________,________,
+ _____XX_,_______X,X_______,
+ _____XX_,_______X,X_______,
+ _____XX_,_______X,X_______,
+ _____XX_,_______X,X_______,
+ _____XX_,__XXXXXX,XXXXXXX_,
+ _____XX_,__XXX__X,X___XXX_,
+ _____XX_,__XXX__X,X__XX___,
+ _XXXXXXX,XXXXX__X,X_______,
+ _____XX_,__XXX__X,X_______,
+ _____XX_,__XXX__X,X_______,
+ _____XX_,__XXXXXX,XXXXX___,
+ _____XX_,__XX_XX_,__XXX___,
+ _____XX_,__XX_XX_,__XX____,
+ _____XX_,__XX__XX,__XX____,
+ _____XXX,XXXX__XX,_XXX____,
+ ____XXXX,__XX___X,XXX_____,
+ _XXXX___,_XX____X,XX______,
+ __XX____,_XX____X,XX______,
+ ________,XX____XX,_XXX____,
+ ________,XX__XXX_,__XXXX__,
+ _______X,X_XXX___,___XXXXX,
+ ______XX,_XX_____,________,
+ ________,________,________,
+};
+
+/* char: 启 code:0xC6F4 */
+static GUI_CONST_STORAGE unsigned char acC6F4[72] = {
+ ________,________,________,
+ ________,___XX___,________,
+ ________,____XX__,________,
+ ________,____XXX_,________,
+ _____XXX,XXXXXXXX,XXXXX___,
+ _____XX_,________,__XXX___,
+ _____XX_,________,__XXX___,
+ _____XX_,________,__XXX___,
+ _____XX_,________,__XXX___,
+ _____XXX,XXXXXXXX,XXXXX___,
+ _____XX_,________,__XXX___,
+ _____XX_,________,________,
+ _____XX_,________,________,
+ _____XX_,XXXXXXXX,XXXXX___,
+ _____XX_,XX______,__XXX___,
+ _____XX_,XX______,__XXX___,
+ ____XXX_,XX______,__XXX___,
+ ____XX__,XX______,__XXX___,
+ ____XX__,XX______,__XXX___,
+ ___XXX__,XX______,__XXX___,
+ ___XX___,XXXXXXXX,XXXXX___,
+ __XX____,XX______,__XXX___,
+ _XX_____,XX______,__XX____,
+ ________,________,________,
+};
+
+/* char: 器 code:0xC6F7 */
+static GUI_CONST_STORAGE unsigned char acC6F7[72] = {
+ ________,________,________,
+ ________,________,________,
+ ____XXXX,XXX__XXX,XXXXX___,
+ ____XXX_,_XXX_XXX,__XXX___,
+ ____XXX_,_XXX_XXX,__XXX___,
+ ____XXX_,_XXX_XXX,__XXX___,
+ ____XXX_,_XXX_XXX,__XXX___,
+ ____XXXX,XXXX_XXX,XXXXX___,
+ ____XXX_,_XXXXXXX,XXXXX___,
+ ____XX__,__XXX___,XXX_XX__,
+ __XXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,_XX___XX,________,
+ ________,XX_____X,X_______,
+ _______X,X_______,XX______,
+ _____XXX,________,_XXXX___,
+ ____XXXX,XXXX_XXX,XXXXXXX_,
+ __XXXXX_,_XXX_XX_,__XXX___,
+ _____XX_,_XXX_XX_,__XXX___,
+ _____XX_,_XXX_XX_,__XXX___,
+ _____XX_,_XXX_XX_,__XXX___,
+ _____XXX,XXXX_XXX,XXXXX___,
+ _____XX_,_XXX_XX_,__XXX___,
+ ____XX__,_XX__XX_,__XX____,
+ ________,________,________,
+};
+
+/* char: 前 code:0xC7B0 */
+static GUI_CONST_STORAGE unsigned char acC7B0[72] = {
+ ________,________,________,
+ _______X,X_______,________,
+ ________,XX_____X,XX______,
+ ________,XXX____X,X_______,
+ ________,_XX___XX,____XX__,
+ _XXXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,________,________,
+ ________,________,__XX____,
+ ____XXXX,XXXX__XX,__XXX___,
+ ____XX__,__XX__XX,X_XXX___,
+ ____XX__,__XX__XX,__XXX___,
+ ____XX__,__XX__XX,__XXX___,
+ ____XXXX,XXXX__XX,__XXX___,
+ ____XX__,__XX__XX,__XXX___,
+ ____XX__,__XX__XX,__XXX___,
+ ____XX__,__XX__XX,__XXX___,
+ ____XXXX,XXXX__XX,__XXX___,
+ ____XX__,__XX__XX,__XXX___,
+ ____XX__,__XX__XX,X_XXX___,
+ ____XX__,__XX____,__XXX___,
+ ____XX__,__XX___X,X_XXX___,
+ ____XX_X,XXXX____,XXXX____,
+ ____XX__,_XX_____,_XX_____,
+ ________,________,________,
+};
+
+/* char: 请 code:0xC7EB */
+static GUI_CONST_STORAGE unsigned char acC7EB[72] = {
+ ________,________,________,
+ ________,______XX,________,
+ ____XX__,______XX,X_______,
+ ____XXX_,______XX,X___XX__,
+ ____XXX_,XXXXXXXX,XXXXXXX_,
+ _____XX_,______XX,X__XX___,
+ ________,__XXXXXX,XXXXXX__,
+ ________,______XX,X_______,
+ ________,______XX,X____XX_,
+ _XXXXXXX,XXXXXXXX,XXXXXXX_,
+ ____XXX_,________,________,
+ ____XXX_,________,________,
+ ____XXX_,__XXXXXX,XXXXX___,
+ ____XXX_,__XXX___,___XX___,
+ ____XXX_,__XXXXXX,XXXXX___,
+ ____XXX_,__XXX___,___XX___,
+ ____XXX_,XXXXX___,___XX___,
+ ____XXXX,X_XXXXXX,XXXXX___,
+ ____XXXX,__XXX___,___XX___,
+ ____XXXX,__XXX___,___XX___,
+ ____XXX_,__XXX___,___XX___,
+ ________,__XXX___,XXXXX___,
+ ________,__XX____,__XX____,
+ ________,________,________,
+};
+
+/* char: 求 code:0xC7F3 */
+static GUI_CONST_STORAGE unsigned char acC7F3[72] = {
+ ________,________,________,
+ ________,___XX___,________,
+ ________,___XXX_X,XX______,
+ ________,___XX___,XXX_____,
+ ________,___XX___,_XXX____,
+ ________,___XX___,_XX_XX__,
+ __XXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ____XXX_,___XXX__,___XX___,
+ _____XXX,___XXXX_,__XXXX__,
+ ______XX,X__XXXX_,_XXX____,
+ _______X,X__XX_XX,XX______,
+ ________,___XX_XX,X_______,
+ ________,_XXXX_XX,X_______,
+ ________,XX_XX__X,XX______,
+ ______XX,X__XX___,XXX_____,
+ ____XXX_,___XX___,XXXX____,
+ _XXXXX__,___XX___,_XXXXX__,
+ __XX____,___XX___,__XXXXXX,
+ _______X,XX_XX___,____XX__,
+ ________,_XXXX___,________,
+ ________,__XX____,________,
+ ________,________,________,
+};
+
+/* char: 驱 code:0xC7FD */
+static GUI_CONST_STORAGE unsigned char acC7FD[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ __XXXXXX,XX______,_____XX_,
+ ________,XXX_XXXX,XXXXXXX_,
+ ________,XX__XX__,________,
+ ____XX__,XX__XX__,________,
+ ____XX__,XX__XX__,____XX__,
+ ___XXX__,XX__XXXX,____XXX_,
+ ___XXX__,XX__XX_X,X__XXX__,
+ ___XX___,XX__XX__,XX_XX___,
+ ___XX__X,XX__XX__,_XXXX___,
+ ___XX__X,XX__XX__,_XXX____,
+ ___XXXXX,XXXXXX__,_XXX____,
+ ___XX___,__XXXX__,_XXXX___,
+ ________,_XXXXX__,XX_XXX__,
+ ________,XXX_XX__,XX__XX__,
+ _____XXX,XXX_XX_X,X___XX__,
+ _XXXXX__,_XX_XXXX,________,
+ ________,_XX_XX__,________,
+ ________,XXX_XX__,_____XX_,
+ ______XX,XX__XXXX,XXXXXXXX,
+ _______X,X___XX__,________,
+ ________,________,________,
+};
+
+/* char: 取 code:0xC8A1 */
+static GUI_CONST_STORAGE unsigned char acC8A1[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,___XX___,________,
+ _XXXXXXX,XXXXX___,________,
+ ____XX__,_XX_____,________,
+ ____XX__,_XXXXXXX,XXXXXX__,
+ ____XX__,_XX__XX_,___XX___,
+ ____XXXX,XXX__XX_,___XX___,
+ ____XX__,_XX__XX_,___XX___,
+ ____XX__,_XX___XX,__XXX___,
+ ____XX__,_XX___XX,__XX____,
+ ____XX__,_XX___XX,__XX____,
+ ____XXXX,XXX___XX,_XXX____,
+ ____XX__,_XX____X,XXX_____,
+ ____XX__,_XX____X,XXX_____,
+ ____XX__,_XXXXX_X,XX______,
+ ____XX_X,XXXX____,XX______,
+ _XXXXXXX,_XX____X,XXX_____,
+ __XXX___,_XX___XX,_XXX____,
+ ________,_XX__XXX,__XXXX__,
+ ________,_XX_XXX_,___XXXXX,
+ ________,_XXXX___,____XX__,
+ ________,_XXX____,________,
+ ________,________,________,
+};
+
+/* char: 认 code:0xC8CF */
+static GUI_CONST_STORAGE unsigned char acC8CF[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,______XX,________,
+ _____XX_,______XX,X_______,
+ _____XXX,______XX,________,
+ ______XX,______XX,________,
+ ______XX,______XX,________,
+ ______XX,______XX,X_______,
+ ________,______XX,X_______,
+ _____XX_,______XX,X_______,
+ _XXXXXXX,______XX,X_______,
+ _____XX_,_____XXX,X_______,
+ _____XX_,_____XXX,X_______,
+ _____XX_,_____XX_,XX______,
+ _____XX_,_____XX_,XX______,
+ _____XX_,__XXXXX_,XX______,
+ _____XX_,_XX_XX__,_XX_____,
+ _____XX_,XX_XXX__,_XXX____,
+ _____XXX,X__XX___,__XX____,
+ _____XXX,__XX____,__XXX___,
+ _____XXX,_XX_____,___XXXX_,
+ _____XXX,XX______,____XXX_,
+ ______XX,________,________,
+ ________,________,________,
+};
+
+/* char: 入 code:0xC8EB */
+static GUI_CONST_STORAGE unsigned char acC8EB[72] = {
+ ________,________,________,
+ ________,________,________,
+ _______X,XX______,________,
+ ________,_XXX____,________,
+ ________,__XXX___,________,
+ ________,___XX___,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,__XXXXX_,________,
+ ________,__XX_XX_,________,
+ ________,__XX_XX_,________,
+ ________,_XXX__XX,________,
+ ________,_XX___XX,________,
+ ________,XX____XX,X_______,
+ _______X,XX_____X,XX______,
+ _______X,X_______,XX______,
+ ______XX,________,XXX_____,
+ _____XXX,________,_XXX____,
+ ____XXX_,________,__XXXX__,
+ ___XX___,________,___XXXXX,
+ __XX____,________,____XX__,
+ _XX_____,________,________,
+ ________,________,________,
+};
+
+/* char: 设 code:0xC9E8 */
+static GUI_CONST_STORAGE unsigned char acC9E8[72] = {
+ ________,________,________,
+ ________,________,________,
+ ____XX__,___XXXXX,XXX_____,
+ _____XX_,___XXX__,_XXX____,
+ _____XXX,___XXX__,_XX_____,
+ _____XXX,___XXX__,_XX_____,
+ ________,___XX___,_XX_____,
+ ________,___XX___,_XX_____,
+ ________,__XX____,_XX_____,
+ _XXXXXXX,_XXX____,_XXXXXXX,
+ _____XX_,XX______,__XX____,
+ _____XXX,X_XXXXXX,XXXXX___,
+ _____XX_,___XX___,__XX____,
+ _____XX_,____XX__,_XXX____,
+ _____XX_,____XX__,_XXX____,
+ _____XX_,_____XX_,_XX_____,
+ _____XX_,_XX__XX_,XX______,
+ _____XX_,XX____XX,XX______,
+ _____XXX,X_____XX,X_______,
+ _____XXX,_____XXX,XXX_____,
+ _____XXX,___XXX__,_XXXX___,
+ ________,_XXX____,___XXXX_,
+ _______X,XX______,________,
+ ________,________,________,
+};
+
+/* char: 生 code:0xC9FA */
+static GUI_CONST_STORAGE unsigned char acC9FA[72] = {
+ ________,________,________,
+ ________,___XX___,________,
+ ________,___XXX__,________,
+ ______XX,___XXX__,________,
+ _____XXX,___XXX__,________,
+ _____XXX,___XXX__,________,
+ _____XX_,___XXX__,___XX___,
+ ____XXXX,XXXXXXXX,XXXXXX__,
+ ____XX__,___XXX__,________,
+ ____XX__,___XXX__,________,
+ ___XX___,___XXX__,________,
+ ___XX___,___XXX__,________,
+ __XX____,___XXX__,________,
+ _XX_____,___XXX__,__XX____,
+ _____XXX,XXXXXXXX,XXXXX___,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,____XXX_,
+ _XXXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,________,________,
+ ________,________,________,
+};
+
+/* char: 失 code:0xCAA7 */
+static GUI_CONST_STORAGE unsigned char acCAA7[72] = {
+ ________,________,________,
+ ________,___XX___,________,
+ ________,___XXX__,________,
+ ______XX,___XXX__,________,
+ ______XX,___XXX__,________,
+ _____XXX,___XXX__,__XX____,
+ _____XXX,XXXXXXXX,XXXXX___,
+ _____XX_,___XXX__,________,
+ ____XX__,___XXX__,________,
+ ____XX__,___XX___,________,
+ ___XX___,___XX___,________,
+ ________,___XX___,____XX__,
+ __XXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,___XXXX_,________,
+ ________,__XXXXX_,________,
+ ________,__XX__XX,________,
+ ________,_XXX__XX,________,
+ ________,_XX____X,X_______,
+ ________,XX______,XX______,
+ _______X,X_______,_XXX____,
+ ______XX,________,__XXX___,
+ ____XXX_,________,___XXXXX,
+ __XXX___,________,____XX__,
+ ________,________,________,
+};
+
+/* char: 石 code:0xCAAF */
+static GUI_CONST_STORAGE unsigned char acCAAF[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,____XX__,
+ __XXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,__XXX___,________,
+ ________,__XX____,________,
+ ________,_XXX____,________,
+ ________,_XX_____,________,
+ ________,XX______,________,
+ _______X,XX______,__XX____,
+ _______X,XXXXXXXX,XXXXX___,
+ ______XX,XX______,__XX____,
+ _____XXX,XX______,__XX____,
+ ____XXX_,XX______,__XX____,
+ ___XX___,XX______,__XX____,
+ __XX____,XX______,__XX____,
+ _XX_____,XX______,__XX____,
+ ________,XX______,__XX____,
+ ________,XXXXXXXX,XXXX____,
+ ________,XX______,__XX____,
+ ________,XX______,__XX____,
+ _______X,X_______,________,
+ ________,________,________,
+};
+
+/* char: 时 code:0xCAB1 */
+static GUI_CONST_STORAGE unsigned char acCAB1[72] = {
+ ________,________,________,
+ ________,________,_XX_____,
+ ________,________,_XXX____,
+ ________,________,_XX_____,
+ __XXXXXX,XX______,_XX_____,
+ __XX___X,XX______,_XX_____,
+ __XX___X,XX______,_XX_____,
+ __XX___X,XXXXXXXX,XXXXXXX_,
+ __XX___X,XX______,_XX_____,
+ __XX___X,XX______,_XX_____,
+ __XXXXXX,XX______,_XX_____,
+ __XX___X,XX_XX___,_XX_____,
+ __XX___X,XX__XXX_,_XX_____,
+ __XX___X,XX__XXX_,_XX_____,
+ __XX___X,XX___XX_,_XX_____,
+ __XX___X,XX______,_XX_____,
+ __XX___X,XX______,_XX_____,
+ __XXXXXX,XX______,_XX_____,
+ __XX___X,XX______,_XX_____,
+ __XX___X,X_______,_XX_____,
+ ________,_____XX_,_XX_____,
+ ________,______XX,XXX_____,
+ ________,________,XX______,
+ ________,________,________,
+};
+
+/* char: 实 code:0xCAB5 */
+static GUI_CONST_STORAGE unsigned char acCAB5[72] = {
+ ________,________,________,
+ ________,___XX___,________,
+ ________,___XXX__,________,
+ ________,____XXX_,________,
+ ________,____XX__,________,
+ ____XXXX,XXXXXXXX,XXXXXXX_,
+ ___XX___,________,____XXX_,
+ ___XX__X,X____XX_,___XX___,
+ __XXX___,XXX__XXX,________,
+ ________,_XXX_XX_,________,
+ ________,_XX__XX_,________,
+ _____XXX,_____XX_,________,
+ ______XX,X____XX_,________,
+ _______X,X___XXX_,________,
+ _______X,X___XXX_,____XX__,
+ __XXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,____XX__,________,
+ ________,___XXXX_,________,
+ ________,___XX_XX,X_______,
+ ________,__XX____,XXXX____,
+ ________,XXX_____,__XXX___,
+ _____XXX,X_______,___XXX__,
+ __XXXX__,________,____XX__,
+ ________,________,________,
+};
+
+/* char: 使 code:0xCAB9 */
+static GUI_CONST_STORAGE unsigned char acCAB9[72] = {
+ ________,________,________,
+ _______X,X_____XX,________,
+ ______XX,X_____XX,X_______,
+ ______XX,X_____XX,X_______,
+ ______XX,______XX,X_______,
+ _____XXX,XXXXXXXX,XXXXXXX_,
+ _____XX_,______XX,X_______,
+ ____XXX_,______XX,X_______,
+ ____XXXX,__XXXXXX,XXXXXX__,
+ ___XXXX_,__XX__XX,X__XXX__,
+ ___XXXX_,__XX__XX,X__XXX__,
+ __XX_XX_,__XX__XX,X__XXX__,
+ _XX__XX_,__XXXXXX,XXXXXX__,
+ _____XX_,_XXX__XX,X__XXX__,
+ _____XX_,__XX__XX,________,
+ _____XX_,___XX_XX,________,
+ _____XX_,____XXXX,________,
+ _____XX_,_____XXX,________,
+ _____XX_,_____XXX,________,
+ _____XX_,____XXXX,XX______,
+ _____XX_,___XXX__,XXXX____,
+ _____XX_,_XXX____,_XXXXXXX,
+ _____XXX,XX______,____XX__,
+ ________,________,________,
+};
+
+/* char: 试 code:0xCAD4 */
+static GUI_CONST_STORAGE unsigned char acCAD4[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,_______X,X_______,
+ ___XX___,_______X,XXXXX___,
+ ____XX__,________,XX_XXX__,
+ ____XXX_,________,XX__XX__,
+ _____XX_,________,XX___XX_,
+ _____XX_,XXXXXXXX,XXXXXXXX,
+ ________,________,XX______,
+ ________,________,XX______,
+ _XXXXXXX,______XX,XX______,
+ _____XX_,XXXXXXXX,XX______,
+ _____XX_,____XX__,XX______,
+ _____XX_,____XX__,XXX_____,
+ _____XX_,____XX__,_XX_____,
+ _____XX_,____XX__,_XX_____,
+ _____XX_,_XX_XX__,_XXX____,
+ _____XX_,XX__XX_X,X_XX__XX,
+ _____XXX,X___XXXX,__XXX_XX,
+ _____XXX,_XXXX___,___XX_XX,
+ ____XXXX,_XX_____,___XXXX_,
+ _____XX_,________,____XXXX,
+ ________,________,______XX,
+ ________,________,________,
+};
+
+/* char: 首 code:0xCAD7 */
+static GUI_CONST_STORAGE unsigned char acCAD7[72] = {
+ ________,________,________,
+ _______X,X______X,X_______,
+ ________,XX_____X,XX______,
+ ________,XXX____X,X_______,
+ ________,_XX___XX,____XX__,
+ _XXXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,__XXX___,________,
+ ________,__XX____,________,
+ ________,__XX____,________,
+ ______XX,XXXXXXXX,XXXX____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XX_____,
+ ______XX,XXXXXXXX,XXX_____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XX_____,
+ ______XX,XXXXXXXX,XXX_____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XX_____,
+ ______XX,XXXXXXXX,XXX_____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XX_____,
+ ________,________,________,
+};
+
+/* char: 输 code:0xCAE4 */
+static GUI_CONST_STORAGE unsigned char acCAE4[72] = {
+ ________,________,________,
+ ________,______XX,________,
+ ____XXX_,______XX,X_______,
+ ____XXX_,_____XXX,X_______,
+ ____XX__,_____XX_,XX______,
+ _XXXXXXX,XXX_XXX_,_XX_____,
+ ___XXX__,____XX__,__XX____,
+ ___XX___,___XX___,_XXXXX__,
+ ___XXXXX,_XXXXXXX,XXXXXXX_,
+ __XXX_XX,XX______,________,
+ __XX__XX,__XXXXXX,____XX__,
+ _XXXXXXX,XXXX__XX,_XX_XX__,
+ ______XX,__XX__XX,_XX_XX__,
+ ______XX,__XXXXXX,_XX_XX__,
+ ______XX,__XX__XX,_XX_XX__,
+ ______XX,XXXX__XX,_XX_XX__,
+ ___XXXXX,__XXXXXX,_XX_XX__,
+ _XXX__XX,__XX__XX,_XX_XX__,
+ ______XX,__XX__XX,_XX_XX__,
+ ______XX,__XX__XX,____XX__,
+ _____XXX,__XX__XX,____XX__,
+ _____XXX,__XXXXXX,__XXXX__,
+ _____XXX,__XX_XX_,___XX___,
+ ________,________,________,
+};
+
+/* char: 术 code:0xCAF5 */
+static GUI_CONST_STORAGE unsigned char acCAF5[72] = {
+ ________,________,________,
+ ________,___XX___,________,
+ ________,___XXX_X,X_______,
+ ________,___XXX__,XXX_____,
+ ________,___XXX__,_XXX____,
+ ________,___XXX__,__XX____,
+ ________,___XXX__,__XXXX__,
+ _XXXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,__XXXXX_,________,
+ ________,__XXXXX_,________,
+ ________,_XXXXXXX,________,
+ ________,_XXXXXXX,________,
+ ________,XXXXXX_X,X_______,
+ _______X,XX_XXX_X,X_______,
+ _______X,X__XXX__,XX______,
+ ______XX,___XXX__,XXX_____,
+ _____XX_,___XXX__,_XXXX___,
+ ____XX__,___XXX__,__XXXX__,
+ ___XX___,___XXX__,___XXXX_,
+ __XX____,___XXX__,____XX__,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XX___,________,
+ ________,________,________,
+};
+
+/* char: 数 code:0xCAFD */
+static GUI_CONST_STORAGE unsigned char acCAFD[72] = {
+ ________,________,________,
+ _______X,X______X,X_______,
+ ___XX__X,X__XX__X,XX______,
+ ____XX_X,X__XX__X,X_______,
+ ____XXXX,X_XX__XX,X_______,
+ ____XX_X,XXX___XX,________,
+ __XXXXXX,XXXXXXXX,XXXXXXX_,
+ ______XX,X____XXX,___XX___,
+ _____XXX,XXX__XXX,___XX___,
+ _____XXX,X_XX_XXX,___XX___,
+ ____XX_X,X_XXXXXX,__XXX___,
+ __XXX__X,X___XXXX,__XXX___,
+ _XX____X,X______X,X_XXX___,
+ ______XX,X______X,X_XX____,
+ _XXXXXXX,XXXXX__X,X_XX____,
+ _____XXX,__XX___X,XXXX____,
+ _____XX_,__XX____,XXX_____,
+ ____XXXX,_XX_____,XXX_____,
+ _______X,XXXX___X,XXXX____,
+ _______X,XXXXX_XX,X_XXX___,
+ _____XXX,___XXXXX,___XXXX_,
+ ___XXX__,___XXX__,____XXX_,
+ _XXX____,__XX____,________,
+ ________,________,________,
+};
+
+/* char: 司 code:0xCBBE */
+static GUI_CONST_STORAGE unsigned char acCBBE[72] = {
+ ________,________,________,
+ ________,________,________,
+ ____XXXX,XXXXXXXX,XXXXX___,
+ ________,________,___XX___,
+ ________,________,___XX___,
+ ________,________,___XX___,
+ ________,________,___XX___,
+ __XXXXXX,XXXXXXXX,X__XX___,
+ ________,________,___XX___,
+ ________,________,___XX___,
+ _____XXX,XXXXXXX_,___XX___,
+ _____XX_,____XXX_,___XX___,
+ _____XX_,____XXX_,___XX___,
+ _____XX_,____XXX_,___XX___,
+ _____XX_,____XXX_,___XX___,
+ _____XX_,____XXX_,___XX___,
+ _____XXX,XXXXXXX_,___XX___,
+ _____XX_,____XXX_,___XX___,
+ _____XX_,____XX__,___XX___,
+ ________,________,___XX___,
+ ________,_______X,X_XXX___,
+ ________,________,XXXXX___,
+ ________,________,__XX____,
+ ________,________,________,
+};
+
+/* char: 苏 code:0xCBD5 */
+static GUI_CONST_STORAGE unsigned char acCBD5[72] = {
+ ________,________,________,
+ ________,XX____XX,________,
+ ________,XX____XX,X_______,
+ ________,XX____XX,X___XX__,
+ _XXXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,XX____XX,X_______,
+ ________,XX____XX,X_______,
+ ________,XXXXX_XX,X_______,
+ ________,__XXX___,________,
+ ________,__XXX___,________,
+ ___XXXXX,XXXXXXXX,XXXX____,
+ ________,__XX____,XXX_____,
+ ________,__XX____,XXX_____,
+ ________,__XX____,XXX_____,
+ ____XX__,_XXX____,XX_XXX__,
+ ____XX__,_XX_____,XX__XXX_,
+ ___XXX__,_XX_____,XX__XXX_,
+ __XXX___,XX______,XX___XX_,
+ _______X,XX______,XX______,
+ _______X,X______X,XX______,
+ _____XXX,___XXXXX,XX______,
+ ____XX__,_____XXX,X_______,
+ ___XX___,________,________,
+ ________,________,________,
+};
+
+/* char: 所 code:0xCBF9 */
+static GUI_CONST_STORAGE unsigned char acCBF9[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,__XX____,____XX__,
+ _______X,XXXXX___,_XXXXXX_,
+ ____XXXX,_____XXX,XX______,
+ ____XX__,_____XX_,________,
+ ____XX__,_____XX_,________,
+ ____XX__,_____XX_,________,
+ ____XXXX,XXXX_XX_,_____XX_,
+ ____XX__,_XXX_XXX,XXXXXXXX,
+ ____XX__,_XXX_XX_,__XX____,
+ ____XX__,_XXX_XX_,__XX____,
+ ____XX__,_XXX_XX_,__XX____,
+ ____XXXX,XXXX_XX_,__XX____,
+ ____XX__,_XXXXXX_,__XX____,
+ ____XX__,____XX__,__XX____,
+ ___XXX__,____XX__,__XX____,
+ ___XX___,___XXX__,__XX____,
+ ___XX___,___XX___,__XX____,
+ ___XX___,__XX____,__XX____,
+ __XX____,__XX____,__XX____,
+ __XX____,_XX_____,__XX____,
+ _XX_____,XX______,__XX____,
+ ________,________,________,
+};
+
+/* char: 特 code:0xCCD8 */
+static GUI_CONST_STORAGE unsigned char acCCD8[72] = {
+ ________,________,________,
+ ________,______XX,X_______,
+ ______XX,______XX,X_______,
+ ______XX,______XX,X__XX___,
+ __XXX_XX,__XXXXXX,XXXXXX__,
+ __XXX_XX,______XX,X_______,
+ __XX__XX,______XX,X_______,
+ __XXXXXX,XXX___XX,X_______,
+ __XX__XX,______XX,X____XX_,
+ _XX___XX,_XXXXXXX,XXXXXXXX,
+ _XX___XX,________,_XX_____,
+ ______XX,_XX_____,_XXX____,
+ ______XX,XX______,_XX__XX_,
+ _____XXX,_XXXXXXX,XXXXXXXX,
+ ___XXXXX,________,_XX_____,
+ _XXXX_XX,___XX___,_XX_____,
+ __XX__XX,___XXX__,_XX_____,
+ ______XX,____XXX_,_XX_____,
+ ______XX,____XX__,_XX_____,
+ ______XX,________,_XX_____,
+ ______XX,_____XXX,_XX_____,
+ ______XX,_______X,XXX_____,
+ ______XX,________,XX______,
+ ________,________,________,
+};
+
+/* char: 条 code:0xCCF5 */
+static GUI_CONST_STORAGE unsigned char acCCF5[72] = {
+ ________,________,________,
+ ________,XX______,________,
+ ________,XXX_____,________,
+ _______X,XXXXXXXX,XXX_____,
+ _______X,XX______,XXX_____,
+ ______XX,_XX____X,XX______,
+ _____XX_,_XX___XX,X_______,
+ ____XX__,__XX_XXX,________,
+ ___XX___,___XXXX_,________,
+ __XX____,___XXXX_,________,
+ ________,_XXX_XXX,X_______,
+ ______XX,XX__XX_X,XXXXXXXX,
+ __XXXXX_,____XX__,_XXXXX__,
+ ________,____XX__,__XX____,
+ ____XXXX,XXXXXXXX,XXXXX___,
+ ________,____XX__,________,
+ _______X,XX__XX_X,X_______,
+ _______X,XX__XX__,XX______,
+ ______XX,X___XX__,_XXX____,
+ _____XXX,____XX__,__XXX___,
+ ____XX__,XX_XXX__,___XXX__,
+ ___XX___,_XXXXX__,___XXX__,
+ ________,___XX___,________,
+ ________,________,________,
+};
+
+/* char: 维 code:0xCEAC */
+static GUI_CONST_STORAGE unsigned char acCEAC[72] = {
+ ________,________,________,
+ ________,____XX__,________,
+ _____XXX,____XXX_,XX______,
+ _____XX_,____XX__,XXX_____,
+ ____XXX_,___XXX__,_XX_____,
+ ____XX__,___XX___,_XX_____,
+ ____XX__,XXXXXXXX,XXXXXXX_,
+ ___XX__X,XXXXX___,XX______,
+ ___XX__X,X_XXX___,XX______,
+ __XX_XXX,XXXXX___,XX__XX__,
+ __XXXXXX,_XXXXXXX,XXXXXXX_,
+ __XX_XXX,XX_XX___,XX______,
+ _____XX_,___XX___,XX______,
+ ____XX__,___XX___,XX______,
+ ___XX__X,XX_XX___,XX__XX__,
+ __XXXXXX,___XXXXX,XXXXXXX_,
+ __XXX___,___XX___,XX______,
+ ________,_XXXX___,XX______,
+ ______XX,XX_XX___,XX______,
+ ___XXXX_,___XX___,XX___XX_,
+ __XXX___,___XXXXX,XXXXXXXX,
+ ________,___XX___,________,
+ ________,___XX___,________,
+ ________,________,________,
+};
+
+/* char: 未 code:0xCEB4 */
+static GUI_CONST_STORAGE unsigned char acCEB4[72] = {
+ ________,________,________,
+ ________,___XX___,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ____XXXX,XXXXXXXX,XXXX____,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,____XX__,
+ __XXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,__XXXXX_,________,
+ ________,_XXXXXX_,________,
+ ________,_XXXXXXX,________,
+ ________,XXXXXX_X,X_______,
+ _______X,XX_XXX_X,XX______,
+ ______XX,X__XXX__,XXX_____,
+ _____XXX,___XXX__,_XXX____,
+ ____XX__,___XXX__,__XXXX__,
+ ___XX___,___XXX__,___XXXX_,
+ _XXX____,___XXX__,____XX__,
+ ________,___XXX__,________,
+ ________,___XX___,________,
+ ________,________,________,
+};
+
+/* char: 位 code:0xCEBB */
+static GUI_CONST_STORAGE unsigned char acCEBB[72] = {
+ ________,________,________,
+ ______XX,____XX__,________,
+ ______XX,X____XX_,________,
+ ______XX,_____XXX,________,
+ _____XXX,______XX,________,
+ _____XX_,______XX,____XX__,
+ _____XX_,XXXXXXXX,XXXXXXX_,
+ ____XXX_,________,________,
+ ____XXXX,________,__XX____,
+ ___XXXX_,________,__XXX___,
+ ___XXXX_,__XX____,_XXX____,
+ __XX_XX_,___XX___,_XXX____,
+ __XX_XX_,___XX___,_XX_____,
+ _XX__XX_,___XXX__,_XX_____,
+ _____XX_,___XXX__,_XX_____,
+ _____XX_,___XXX__,XX______,
+ _____XX_,____XX__,XX______,
+ _____XX_,________,XX______,
+ _____XX_,_______X,X_______,
+ _____XX_,_______X,X____XX_,
+ _____XXX,XXXXXXXX,XXXXXXXX,
+ _____XX_,________,________,
+ _____XX_,________,________,
+ ________,________,________,
+};
+
+/* char: 温 code:0xCEC2 */
+static GUI_CONST_STORAGE unsigned char acCEC2[72] = {
+ ________,________,________,
+ ________,________,________,
+ ___XX___,________,__XX____,
+ ____XXX_,_XXXXXXX,XXXX____,
+ _____XX_,_XX_____,__XX____,
+ ________,_XX_____,__XX____,
+ _______X,XXXXXXXX,XXXX____,
+ _XX____X,XXX_____,__XX____,
+ __XXX_XX,_XX_____,__XX____,
+ ___XX_XX,_XX_____,__XX____,
+ ___XX_XX,_XXXXXXX,XXXX____,
+ _____XX_,_XX_____,__XX____,
+ _____XX_,________,________,
+ _____XX_,XXXXXXXX,XXXXXX__,
+ _____XX_,XX__XX_X,X__XX___,
+ ____XX__,XX__XX_X,X__XX___,
+ _XXXXX__,XX__XX_X,X__XX___,
+ ___XXX__,XX__XX_X,X__XX___,
+ ___XXX__,XX__XX_X,X__XX___,
+ ___XXX__,XX__XX_X,X__XX___,
+ ___XXX__,XX__XX_X,X__XXXX_,
+ ___XXXXX,XXXXXXXX,XXXXXXXX,
+ ________,________,________,
+ ________,________,________,
+};
+
+/* char: 误 code:0xCEF3 */
+static GUI_CONST_STORAGE unsigned char acCEF3[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,__XXXXXX,XXXXX___,
+ ____XXX_,__XXX___,___XX___,
+ _____XX_,__XXX___,___XX___,
+ _____XXX,__XXX___,___XX___,
+ ________,__XXX___,___XX___,
+ ________,__XXXXXX,XXXXX___,
+ ________,__XXX___,________,
+ _XXXXXXX,________,________,
+ _____XX_,_XXXXXXX,XXXXXX__,
+ _____XX_,______XX,________,
+ _____XX_,______XX,________,
+ _____XX_,______XX,________,
+ _____XX_,XXXXXXXX,XXXXXXX_,
+ _____XX_,_XX___XX,X_______,
+ _____XX_,XX___XXX,XX______,
+ _____XXX,X____XX_,XX______,
+ _____XXX,____XXX_,_XX_____,
+ _____XXX,___XXX__,__XX____,
+ _____XX_,__XXX___,__XXXX__,
+ ________,_XXX____,___XXXXX,
+ _______X,XX______,________,
+ ________,________,________,
+};
+
+/* char: 息 code:0xCFA2 */
+static GUI_CONST_STORAGE unsigned char acCFA2[72] = {
+ ________,________,________,
+ ________,__XXX___,________,
+ ________,__XX____,________,
+ ______XX,XXXXXXXX,XXXX____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XX_____,
+ ______XX,XXXXXXXX,XXX_____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XX_____,
+ ______XX,XXXXXXXX,XXX_____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XX_____,
+ ______XX,XXXXXXXX,XXXX____,
+ ______XX,__XX____,_XX_____,
+ ________,___XX___,________,
+ _______X,X__XXX__,________,
+ ____XX_X,XX__XXX_,___XX___,
+ ____XX_X,XX__XXX_,____XX__,
+ ____XX_X,XX______,_XX_XXX_,
+ ___XXX_X,XX______,_XX__XX_,
+ __XXXX__,XX______,XXX__XX_,
+ ________,XXXXXXXX,XXX_____,
+ ________,________,________,
+ ________,________,________,
+};
+
+/* char: 限 code:0xCFDE */
+static GUI_CONST_STORAGE unsigned char acCFDE[72] = {
+ ________,________,________,
+ ________,________,________,
+ ___XXXXX,XX______,___XX___,
+ ___XX__X,X__XXXXX,XXXXX___,
+ ___XX__X,X__XX___,__XXX___,
+ ___XX__X,X__XX___,__XXX___,
+ ___XX_XX,___XX___,__XXX___,
+ ___XX_XX,___XXXXX,XXXXX___,
+ ___XX_XX,___XX___,__XXX___,
+ ___XX_XX,___XX___,__XXX___,
+ ___XX__X,X__XX___,__XXX___,
+ ___XX__X,X__XXXXX,XXXXX___,
+ ___XX___,XX_XX_XX,__XX____,
+ ___XX___,XX_XX_XX,___XXX__,
+ ___XX___,XX_XX_XX,___XXX__,
+ ___XXX_X,XX_XX__X,XXXX____,
+ ___XXXXX,XX_XX__X,XX______,
+ ___XX_XX,___XX___,XX______,
+ ___XX___,___XX__X,XXX_____,
+ ___XX___,___XXXXX,_XXX____,
+ ___XX___,___XXX__,__XXXX__,
+ ___XX___,___XX___,___XXXX_,
+ ___XX___,___XX___,________,
+ ________,________,________,
+};
+
+/* char: 项 code:0xCFEE */
+static GUI_CONST_STORAGE unsigned char acCFEE[72] = {
+ ________,________,________,
+ ________,________,____XX__,
+ ________,_XXXXXXX,XXXXXXX_,
+ ________,XX_____X,X_______,
+ _XXXXXXX,XXX____X,X_______,
+ _____XX_,______XX,________,
+ _____XX_,___XXXXX,XXXXXX__,
+ _____XX_,___XX___,____XX__,
+ _____XX_,___XX___,____XX__,
+ _____XX_,___XX__X,XX__XX__,
+ _____XX_,___XX__X,XX__XX__,
+ _____XX_,___XX__X,XX__XX__,
+ _____XX_,___XX__X,XX__XX__,
+ _____XX_,___XX__X,XX__XX__,
+ _____XX_,XXXXX__X,X___XX__,
+ _____XXX,X__XX__X,X___XX__,
+ __XXXX__,___XX__X,XX__XX__,
+ __XX____,______XX,XXX_____,
+ ________,______XX,__XXX___,
+ ________,_____XXX,___XXX__,
+ ________,____XXX_,____XXX_,
+ ________,__XXX___,_____XX_,
+ ________,XXX_____,_____XX_,
+ ________,________,________,
+};
+
+/* char: 消 code:0xCFFB */
+static GUI_CONST_STORAGE unsigned char acCFFB[72] = {
+ ________,________,________,
+ ________,_______X,X_______,
+ ____XX__,_XX____X,X_______,
+ ____XXX_,__XX___X,X__XXXX_,
+ _____XXX,___XX__X,X__XX___,
+ _____XXX,___XXX_X,X_XX____,
+ ________,XX_XXX_X,XXX_____,
+ _XX_____,XX_____X,XXX_____,
+ __XXX___,XXXXXXXX,XXXXXX__,
+ ___XXX_X,X_XX____,___XX___,
+ ___XXX_X,X_XX____,___XX___,
+ _______X,X_XXXXXX,XXXXX___,
+ ______XX,__XX____,___XX___,
+ ______XX,__XX____,___XX___,
+ ______XX,__XX____,___XX___,
+ _____XX_,__XXXXXX,XXXXX___,
+ __XXXXX_,__XX____,___XX___,
+ ____XXX_,__XX____,___XX___,
+ ____XXX_,__XX____,___XX___,
+ ____XXX_,__XX____,___XX___,
+ ____XXX_,__XX____,___XX___,
+ ____XXX_,__XX____,XXXXX___,
+ _____XX_,__XX____,__XX____,
+ ________,________,________,
+};
+
+/* char: 校 code:0xD0A3 */
+static GUI_CONST_STORAGE unsigned char acD0A3[72] = {
+ ________,________,________,
+ _____XX_,_____XX_,________,
+ _____XXX,______XX,X_______,
+ _____XX_,_______X,X_______,
+ _____XX_,_______X,X_______,
+ _____XX_,XXXXXXXX,XXXXXXX_,
+ _XXXXXXX,XXX_____,________,
+ _____XX_,_____XX_,_XX_____,
+ _____XX_,____XXX_,__XXX___,
+ ____XXXX,X__XXX__,___XXX__,
+ ____XXXX,XX_XX___,____XXX_,
+ ____XXX_,XXXXX___,__XXXXX_,
+ ___XXXX_,_XX_XX__,_XXXX___,
+ ___XXXX_,____XX__,_XXX____,
+ ___XXXX_,____XX__,XXX_____,
+ __XX_XX_,_____XX_,XXX_____,
+ _XX__XX_,_____XXX,XX______,
+ _____XX_,______XX,X_______,
+ _____XX_,______XX,X_______,
+ _____XX_,_____XXX,XXX_____,
+ _____XX_,___XXX__,_XXXX___,
+ _____XX_,_XXX____,__XXXXXX,
+ _____XXX,XX______,____XX__,
+ ________,________,________,
+};
+
+/* char: 斜 code:0xD0B1 */
+static GUI_CONST_STORAGE unsigned char acD0B1[72] = {
+ ________,________,________,
+ _______X,X_______,__XX____,
+ _______X,XX______,__XXX___,
+ ______XX,XX______,__XXX___,
+ ______XX,_XXX__XX,__XXX___,
+ _____XX_,__XXX__X,XXXXX___,
+ ____XXX_,___XXX_X,XXXXX___,
+ ____XX__,__XXXX__,__XXX___,
+ ___XXXXX,XXXXX___,__XXX___,
+ __XX___X,X____XX_,__XXX___,
+ _XX____X,X_____XX,X_XXX___,
+ _______X,X__XX__X,X_XXX___,
+ __XXXXXX,XXXXXX_X,X_XXX___,
+ _______X,X_______,__XXXXX_,
+ ____XX_X,X_______,__XXXXX_,
+ ____XXXX,X_XXXXXX,XXXXX___,
+ ____XX_X,X_XXX___,__XXX___,
+ ___XXX_X,X__XXX__,__XXX___,
+ ___XX__X,X__XXX__,__XXX___,
+ __XX___X,X___XX__,__XXX___,
+ __XX___X,X_______,__XXX___,
+ _XX__XXX,X_______,__XXX___,
+ ______XX,________,__XX____,
+ ________,________,________,
+};
+
+/* char: 信 code:0xD0C5 */
+static GUI_CONST_STORAGE unsigned char acD0C5[72] = {
+ ________,________,________,
+ ________,_____XX_,________,
+ ______XX,X_____XX,________,
+ ______XX,______XX,X_______,
+ ______XX,______XX,X___XX__,
+ _____XX_,XXXXXXXX,XXXXXXX_,
+ _____XX_,________,________,
+ ____XX__,________,___XX___,
+ ____XXX_,_XXXXXXX,XXXXXX__,
+ ___XXXX_,________,________,
+ ___XXXX_,________,___XX___,
+ __XX_XX_,_XXXXXXX,XXXXXX__,
+ _XX__XX_,________,________,
+ _____XX_,________,________,
+ _____XX_,________,________,
+ _____XX_,__XXXXXX,XXXXXX__,
+ _____XX_,__XX____,___XX___,
+ _____XX_,__XX____,___XX___,
+ _____XX_,__XX____,___XX___,
+ _____XX_,__XX____,___XX___,
+ _____XX_,__XXXXXX,XXXXX___,
+ _____XX_,__XX____,___XX___,
+ _____XX_,__XX____,___XX___,
+ ________,________,________,
+};
+
+/* char: 行 code:0xD0D0 */
+static GUI_CONST_STORAGE unsigned char acD0D0[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ______XX,X_______,________,
+ ______XX,___XXXXX,XXXXXX__,
+ _____XX_,________,________,
+ ____XX__,XX______,________,
+ ___XX__X,XX______,________,
+ __XX__XX,X_______,_____XX_,
+ ______XX,_XXXXXXX,XXXXXXX_,
+ _____XXX,________,XX______,
+ ____XXXX,________,XX______,
+ ____XXXX,________,XX______,
+ ___XX_XX,________,XX______,
+ __XX__XX,________,XX______,
+ ______XX,________,XX______,
+ ______XX,________,XX______,
+ ______XX,________,XX______,
+ ______XX,________,XX______,
+ ______XX,________,XX______,
+ ______XX,___XXXXX,XX______,
+ ______XX,______XX,XX______,
+ ________,_______X,X_______,
+ ________,________,________,
+};
+
+/* char: 性 code:0xD0D4 */
+static GUI_CONST_STORAGE unsigned char acD0D4[72] = {
+ ________,________,________,
+ _____XX_,_______X,X_______,
+ _____XX_,_______X,XX______,
+ _____XX_,___XX__X,X_______,
+ _____XX_,___XXX_X,X_______,
+ _____XX_,__XXX__X,X_______,
+ _____XXX,__XXX__X,X___XX__,
+ _____XXX,XXXXXXXX,XXXXXXX_,
+ ___XXXXX,XXXX___X,X_______,
+ __XX_XX_,_XX____X,X_______,
+ __XX_XX_,_XX____X,X_______,
+ _XXX_XX_,XX_____X,X_______,
+ _____XX_,XX_____X,X_______,
+ _____XX_,__XXXXXX,XXXXXX__,
+ _____XX_,_______X,X_______,
+ _____XX_,_______X,X_______,
+ _____XX_,_______X,X_______,
+ _____XX_,_______X,X_______,
+ _____XX_,_______X,X_______,
+ _____XX_,_______X,X____XX_,
+ _____XX_,XXXXXXXX,XXXXXXXX,
+ _____XX_,________,________,
+ _____XX_,________,________,
+ ________,________,________,
+};
+
+/* char: 修 code:0xD0DE */
+static GUI_CONST_STORAGE unsigned char acD0DE[72] = {
+ ________,________,________,
+ ______XX,______XX,________,
+ ______XX,_____XXX,________,
+ _____XXX,_____XX_,________,
+ _____XX_,____XXXX,XXXXXX__,
+ _____XX_,____XXX_,___XXX__,
+ ____XX_X,XX_XX_XX,__XXX___,
+ ____XXXX,XXXX___X,XXXX____,
+ ___XXXXX,XX______,XXX_____,
+ ___XXXXX,XX_____X,XXX_____,
+ __XXXXXX,XX___XXX,__XXXX__,
+ __XXXXXX,XX_XXX__,_XX_XXX_,
+ _XX_XXXX,XXXX___X,XXX_____,
+ ____XXXX,XX____XX,X_______,
+ ____XXXX,XX___XX_,__XXX___,
+ ____XXXX,XX_XXX__,_XXX____,
+ ____XXXX,XX______,XXX__XX_,
+ ____XXXX,XX____XX,X___XXX_,
+ ____XXXX,XX__XXX_,___XXX__,
+ ____XXX_,__XXX___,_XXX____,
+ ____XXX_,_______X,XX______,
+ ____XXX_,___XXXXX,________,
+ ____XX__,XXXX____,________,
+ ________,________,________,
+};
+
+/* char: 需 code:0xD0E8 */
+static GUI_CONST_STORAGE unsigned char acD0E8[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,__XX____,
+ ____XXXX,XXXXXXXX,XXXXX___,
+ ________,____XX__,________,
+ ____XXXX,XXXXXXXX,XXXXXXX_,
+ ___XX___,____XX__,____XX__,
+ __XXX_XX,XXX_XXXX,XXXXX___,
+ ________,____XX__,________,
+ _____XXX,XXX_XXXX,XXX_____,
+ ________,____XX__,________,
+ ________,________,________,
+ __XXXXXX,XXXXXXXX,XXXXXX__,
+ ________,__XX____,________,
+ ____XXXX,XXXXXXXX,XXXXX___,
+ ____XXX_,_XXX__XX,___XX___,
+ ____XXX_,_XXX__XX,___XX___,
+ ____XXX_,_XXX__XX,___XX___,
+ ____XXX_,_XXX__XX,___XX___,
+ ____XXX_,_XXX__XX,___XX___,
+ ____XXX_,_XXX__XX,___XX___,
+ ____XXX_,_XX_____,_XXXX___,
+ ____XX__,________,__XX____,
+ ________,________,________,
+};
+
+/* char: 选 code:0xD1A1 */
+static GUI_CONST_STORAGE unsigned char acD1A1[72] = {
+ ________,________,________,
+ ________,______XX,________,
+ ___XX___,______XX,________,
+ ____XX__,__XX__XX,________,
+ _____XX_,__XXX_XX,________,
+ _____XX_,__XX__XX,________,
+ ________,__XXXXXX,XXXXX___,
+ ________,_XX___XX,________,
+ ________,_XX___XX,________,
+ _XXXXXXX,XX____XX,____XX__,
+ _____XXX,XXXXXXXX,XXXXXX__,
+ _____XX_,____XX_X,XX______,
+ _____XX_,____XX_X,XX______,
+ _____XX_,____XX_X,XX______,
+ _____XX_,___XXX_X,XX______,
+ _____XX_,___XX__X,XX______,
+ _____XX_,__XXX__X,XX__XX__,
+ _____XX_,__XX___X,XX__XX__,
+ ____XXX_,XXX____X,XX__XXX_,
+ __XXX_XX,X_______,XXXXXXX_,
+ _XXX___X,XX______,________,
+ ________,_XXXXXXX,XXXXXXX_,
+ ________,___XXXXX,XXXXXX__,
+ ________,________,________,
+};
+
+/* char: 要 code:0xD2AA */
+static GUI_CONST_STORAGE unsigned char acD2AA[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,____XX__,
+ __XXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,_XX___XX,________,
+ ________,_XX___XX,________,
+ ____XXXX,XXXXXXXX,XXXXX___,
+ ____XXX_,_XX___XX,__XXX___,
+ ____XXX_,_XX___XX,__XXX___,
+ ____XXX_,_XX___XX,__XXX___,
+ ____XXXX,XXXXXXXX,XXXXX___,
+ ____XXX_,_XX_____,__XX____,
+ ________,_XXX____,________,
+ ________,_XX_____,____XX__,
+ _XXXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,XX_____X,XX______,
+ _______X,X_____XX,X_______,
+ ______XX,X_____XX,________,
+ ________,XXXXXXXX,________,
+ ________,____XXXX,XX______,
+ ________,__XXX___,XXXXX___,
+ ______XX,XXX_____,__XXXX__,
+ __XXXXX_,________,____XX__,
+ ________,________,________,
+};
+
+/* char: 页 code:0xD2B3 */
+static GUI_CONST_STORAGE unsigned char acD2B3[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,___XX___,
+ __XXXXXX,XXXXXXXX,XXXXXX__,
+ ________,__XXX___,________,
+ ________,__XXX___,________,
+ ________,__XX____,_XX_____,
+ _____XXX,XXXXXXXX,XXXX____,
+ _____XXX,________,_XX_____,
+ _____XXX,___XX___,_XX_____,
+ _____XXX,___XXX__,_XX_____,
+ _____XXX,___XX___,_XX_____,
+ _____XXX,___XX___,_XX_____,
+ _____XXX,___XX___,_XX_____,
+ _____XXX,___XX___,_XX_____,
+ _____XXX,___XX___,_XX_____,
+ _____XXX,__XXX___,_XX_____,
+ _____XX_,__XXXXXX,________,
+ ________,_XXX___X,XX______,
+ ________,XXX_____,XXXX____,
+ _______X,XX______,__XXXX__,
+ _____XXX,________,___XXX__,
+ __XXXX__,________,________,
+ ________,________,________,
+};
+
+/* char: 一 code:0xD2BB */
+static GUI_CONST_STORAGE unsigned char acD2BB[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,____XX__,
+ _XXXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+};
+
+/* char: 已 code:0xD2D1 */
+static GUI_CONST_STORAGE unsigned char acD2D1[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,__XX____,
+ ____XXXX,XXXXXXXX,XXXX____,
+ ________,________,_XXX____,
+ ________,________,_XXX____,
+ ________,________,_XXX____,
+ ________,________,_XXX____,
+ ____XX__,________,_XXX____,
+ ____XXX_,________,_XXX____,
+ ____XXXX,XXXXXXXX,XXXX____,
+ ____XXX_,________,_XXX____,
+ ____XXX_,________,________,
+ ____XXX_,________,________,
+ ____XXX_,________,________,
+ ____XXX_,________,________,
+ ____XXX_,________,____XX__,
+ ____XXX_,________,____XX__,
+ ____XXX_,________,____XX__,
+ ____XXX_,________,____XX__,
+ ____XXX_,________,____XXX_,
+ _____XXX,XXXXXXXX,XXXXXXX_,
+ ________,________,________,
+ ________,________,________,
+};
+
+/* char: 迎 code:0xD3AD */
+static GUI_CONST_STORAGE unsigned char acD3AD[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,______XX,________,
+ ____XX__,____XXXX,X_______,
+ ____XXX_,_XXXX___,________,
+ _____XX_,_XX____X,XXXXXXX_,
+ ________,_XX____X,X___XX__,
+ ________,_XX____X,X___XX__,
+ ________,_XX____X,X___XX__,
+ _XXXXXXX,_XX____X,X___XX__,
+ _____XX_,_XX____X,X___XX__,
+ _____XX_,_XX____X,X___XX__,
+ _____XX_,_XX____X,X___XX__,
+ _____XX_,_XX__XXX,X___XX__,
+ _____XX_,_XXXXX_X,X___XX__,
+ _____XX_,_XXX___X,XXXXXX__,
+ _____XX_,_XX____X,X__XXX__,
+ _____XX_,_______X,X_______,
+ ___XXXXX,_______X,X_______,
+ _XXX___X,XX_____X,X_______,
+ __XX____,XXXXXXX_,__XXXXXX,
+ ________,___XXXXX,XXXXXX__,
+ ________,________,________,
+ ________,________,________,
+};
+
+/* char: 用 code:0xD3C3 */
+static GUI_CONST_STORAGE unsigned char acD3C3[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,___XX___,
+ ____XXXX,XXXXXXXX,XXXXXX__,
+ ____XXX_,____XX__,___XX___,
+ ____XXX_,____XX__,___XX___,
+ ____XXX_,____XX__,___XX___,
+ ____XXX_,____XX__,___XX___,
+ ____XXXX,XXXXXXXX,XXXXX___,
+ ____XXX_,____XX__,___XX___,
+ ____XX__,____XX__,___XX___,
+ ____XX__,____XX__,___XX___,
+ ____XX__,____XX__,___XX___,
+ ____XX__,____XX__,___XX___,
+ ____XXXX,XXXXXXXX,XXXXX___,
+ ____XX__,____XX__,___XX___,
+ ____XX__,____XX__,___XX___,
+ ___XXX__,____XX__,___XX___,
+ ___XX___,____XX__,___XX___,
+ ___XX___,___XXX__,___XX___,
+ __XX____,___XXX__,XX_XX___,
+ __XX____,___XXX__,_XXXX___,
+ _XX_____,___XX___,__XX____,
+ ________,________,________,
+};
+
+/* char: 有 code:0xD3D0 */
+static GUI_CONST_STORAGE unsigned char acD3D0[72] = {
+ ________,________,________,
+ ________,___XX___,________,
+ ________,__XXX___,________,
+ ________,__XXX___,____XX__,
+ _XXXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,_XXX____,________,
+ ________,XXX_____,________,
+ ________,XX______,________,
+ _______X,XXXXXXXX,XXXX____,
+ _______X,X_______,_XX_____,
+ ______XX,X_______,_XX_____,
+ _____XXX,X_______,_XX_____,
+ ____XX_X,XXXXXXXX,XXX_____,
+ ___XX__X,X_______,_XX_____,
+ __XX___X,X_______,_XX_____,
+ _______X,X_______,_XX_____,
+ _______X,XXXXXXXX,XXX_____,
+ _______X,X_______,_XX_____,
+ _______X,X_______,_XX_____,
+ _______X,X_______,_XX_____,
+ _______X,X_______,_XX_____,
+ _______X,X______X,XXX_____,
+ _______X,X_______,XX______,
+ ________,________,________,
+};
+
+/* char: 跃 code:0xD4BE */
+static GUI_CONST_STORAGE unsigned char acD4BE[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,___XX___,
+ __XXXXXX,XXX_____,_XXXXX__,
+ __XX____,XX__XXXX,XX______,
+ __XX____,XX_____X,X_______,
+ __XX____,XX_____X,X_______,
+ __XX____,XX_____X,X_______,
+ __XX____,XX_____X,X_______,
+ __XXXXXX,XX_____X,X____XX_,
+ __XX_XXX,XXXXXXXX,XXXXXXXX,
+ _____XXX,______XX,XX______,
+ __XXXXXX,______XX,XX______,
+ __XX_XXX,XXX___XX,XX______,
+ __XX_XXX,______XX,_XX_____,
+ __XX_XXX,_____XXX,_XX_____,
+ __XX_XXX,_____XX_,_XX_____,
+ __XX_XXX,____XXX_,__XX____,
+ __XX_XXX,XXX_XX__,__XXX___,
+ __XXXXX_,___XX___,___XX___,
+ _XXXX___,__XX____,___XXXX_,
+ ________,XXX_____,____XXXX,
+ _______X,X_______,________,
+ ________,________,________,
+};
+
+/* char: 载 code:0xD4D8 */
+static GUI_CONST_STORAGE unsigned char acD4D8[72] = {
+ ________,________,________,
+ _______X,X_____XX,________,
+ _______X,X_____XX,________,
+ _______X,X_____XX,_XXX____,
+ ___XXXXX,XXXXX_XX,__XXX___,
+ _______X,X_____XX,___XX___,
+ _______X,X_____XX,________,
+ _XXXXXXX,XXXXXXXX,XXXXXXX_,
+ ______XX,X_____XX,________,
+ ______XX,___XX_XX,___XX___,
+ _XXXXXXX,XXXXX_XX,___XXX__,
+ _____XX_,______XX,X__XX___,
+ ____XXXX,XX_____X,X_XXX___,
+ ____XX_X,XX_XX__X,X_XX____,
+ ___XXXXX,XXXXXX_X,XXXX____,
+ _______X,XX_____X,XXX_____,
+ _______X,XX______,XX______,
+ _______X,XXXXX__X,XXX_____,
+ __XXXXXX,XX____XX,XXX__XX_,
+ __XXX__X,XX___XXX,_XXX_XX_,
+ _______X,XX__XXX_,__XXXXX_,
+ _______X,XX_XX___,____XXX_,
+ _______X,X_XX____,_____XXX,
+ ________,________,________,
+};
+
+/* char: 择 code:0xD4F1 */
+static GUI_CONST_STORAGE unsigned char acD4F1[72] = {
+ ________,________,________,
+ ______XX,________,___XX___,
+ ______XX,__XXXXXX,XXXXXX__,
+ ______XX,____XX__,__XXX___,
+ ______XX,____XX__,__XX____,
+ ______XX,_____XX_,_XX_____,
+ _XXXXXXX,XXXX__XX,XXX_____,
+ ______XX,______XX,XX______,
+ ______XX,______XX,XXX_____,
+ ______XX,__XXXXX_,_XXXXXXX,
+ ______XX,XXXXX__X,X__XXX__,
+ ______XX,XXX____X,X_______,
+ ____XXXX,_______X,X_______,
+ _XXXX_XX,__XXXXXX,XXXXXX__,
+ __XX__XX,_______X,X_______,
+ ______XX,_______X,X_______,
+ ______XX,_______X,X_______,
+ ______XX,XXXXXXXX,XXXXXXX_,
+ ______XX,_______X,X_______,
+ ______XX,_______X,X_______,
+ __XXXXXX,_______X,X_______,
+ ____XXXX,_______X,X_______,
+ _____XX_,_______X,X_______,
+ ________,________,________,
+};
+
+/* char: 障 code:0xD5CF */
+static GUI_CONST_STORAGE unsigned char acD5CF[72] = {
+ ________,________,________,
+ ________,_____XX_,________,
+ ________,______XX,________,
+ __XXXXXX,X_____XX,X__XX___,
+ __XX__XX,XXXXXXXX,XXXXXX__,
+ __XX__XX,___XX___,_XX_____,
+ __XX__XX,____XX__,_XX_____,
+ __XX_XX_,____XXX_,XX______,
+ __XX_XX_,XXXXXXXX,XXXXXXX_,
+ __XX_XX_,________,________,
+ __XX_XX_,__XXXXXX,XXXXXX__,
+ __XX__XX,__XX____,___XX___,
+ __XX___X,X_XXXXXX,XXXXX___,
+ __XX___X,X_XX____,___XX___,
+ __XX___X,X_XX____,___XX___,
+ __XX___X,X_XXXXXX,XXXXX___,
+ __XXXXXX,X_XX__XX,X__XX___,
+ __XX_XXX,______XX,X____XX_,
+ __XX___X,XXXXXXXX,XXXXXXXX,
+ __XX____,______XX,X_______,
+ __XX____,______XX,X_______,
+ __XX____,______XX,X_______,
+ __XX____,______XX,X_______,
+ ________,________,________,
+};
+
+/* char: 诊 code:0xD5EF */
+static GUI_CONST_STORAGE unsigned char acD5EF[72] = {
+ ________,________,________,
+ ________,______XX,________,
+ ____XX__,_____XXX,________,
+ _____XX_,_____XXX,X_______,
+ _____XXX,____XXXX,X_______,
+ _____XXX,____XX__,XX______,
+ ________,___XXX__,XXX_____,
+ ________,___XX___,_XXX____,
+ ________,__XX____,__XXX___,
+ _XXXXXX_,_XX___XX,X__XXXXX,
+ ____XXX_,XX___XXX,____XX__,
+ ____XXX_,____XXX_,________,
+ ____XXX_,___XXX__,_XX_____,
+ ____XXX_,__XX____,XXXX____,
+ ____XXX_,_______X,XX______,
+ ____XXX_,______XX,X_______,
+ ____XXX_,XX___XX_,____XX__,
+ ____XXXX,X__XXX__,__XXXX__,
+ ____XXXX,_XXX____,_XXXX___,
+ ____XXXX,________,XXX_____,
+ _____XX_,______XX,X_______,
+ ________,___XXXX_,________,
+ ________,_XXX____,________,
+ ________,________,________,
+};
+
+/* char: 整 code:0xD5FB */
+static GUI_CONST_STORAGE unsigned char acD5FB[72] = {
+ ________,________,________,
+ _______X,X______X,X_______,
+ _______X,X______X,X_______,
+ __XXXXXX,XXXXXXXX,X_______,
+ _______X,X_____XX,XXXXXXX_,
+ _______X,X_____XX,___XX___,
+ ___XXXXX,XXXXXXXX,__XXX___,
+ ___XXX_X,X_XXXXXX,X_XXX___,
+ ___XXX_X,X_XXXX_X,X_XX____,
+ ___XXXXX,XXXXX___,XXXX____,
+ ___XXXXX,XXXX____,XXX_____,
+ _____XXX,XXXX___X,XXXX____,
+ ____XX_X,X_XX__XX,__XXXX__,
+ ___XX__X,X_XXXXX_,__XXXXX_,
+ __XXXXXX,XXXXXXXX,XXXXX___,
+ ________,___XXX__,________,
+ ________,___XXX__,_XX_____,
+ _______X,X__XXXXX,XXXX____,
+ _______X,X__XXX__,________,
+ _______X,X__XXX__,________,
+ _______X,X__XXX__,____XX__,
+ __XXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,________,________,
+ ________,________,________,
+};
+
+/* char: 正 code:0xD5FD */
+static GUI_CONST_STORAGE unsigned char acD5FD[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,____XX__,
+ ___XXXXX,XXXXXXXX,XXXXXXX_,
+ ________,____XX__,________,
+ ________,____XX__,________,
+ ________,____XX__,________,
+ ________,____XX__,________,
+ ______XX,____XX__,________,
+ ______XX,X___XX__,________,
+ ______XX,____XX__,___XX___,
+ ______XX,____XXXX,XXXXXX__,
+ ______XX,____XX__,________,
+ ______XX,____XX__,________,
+ ______XX,____XX__,________,
+ ______XX,____XX__,________,
+ ______XX,____XX__,________,
+ ______XX,____XX__,________,
+ ______XX,____XX__,________,
+ ______XX,____XX__,____XX__,
+ _XXXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,________,________,
+ ________,________,________,
+ ________,________,________,
+};
+
+/* char: 知 code:0xD6AA */
+static GUI_CONST_STORAGE unsigned char acD6AA[72] = {
+ ________,________,________,
+ ________,________,________,
+ _____XX_,________,________,
+ _____XX_,________,________,
+ _____XX_,________,________,
+ ____XXX_,________,________,
+ ____XXXX,XXXXX_XX,XXXXXXX_,
+ ____XX_X,X_____XX,____XX__,
+ ___XX__X,X_____XX,____XX__,
+ ___XX__X,X_____XX,____XX__,
+ __XX___X,X_____XX,____XX__,
+ _______X,X__XX_XX,____XX__,
+ _XXXXXXX,XXXXXXXX,____XX__,
+ _______X,X_____XX,____XX__,
+ _______X,X_____XX,____XX__,
+ _______X,XX____XX,____XX__,
+ ______XX,XXX___XX,____XX__,
+ ______XX,__XXX_XX,____XX__,
+ _____XXX,__XXX_XX,XXXXXX__,
+ _____XX_,___XXXXX,____XX__,
+ ____XX__,______XX,____XX__,
+ ___XX___,______XX,____XX__,
+ __XX____,________,________,
+ ________,________,________,
+};
+
+/* char: 至 code:0xD6C1 */
+static GUI_CONST_STORAGE unsigned char acD6C1[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,___XX___,
+ __XXXXXX,XXXXXXXX,XXXXXX__,
+ ________,__XXX___,________,
+ ________,_XXX____,________,
+ ________,_XX__XXX,________,
+ ________,XX_____X,X_______,
+ _______X,X_______,XXX_____,
+ ______XX,________,_XXXX___,
+ ____XXXX,XXXXXXXX,XXXXX___,
+ ____XXXX,X__XXX__,___XX___,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,__XX____,
+ ____XXXX,XXXXXXXX,XXXXX___,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,____XX__,
+ _XXXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,________,________,
+ ________,________,________,
+};
+
+/* char: 置 code:0xD6C3 */
+static GUI_CONST_STORAGE unsigned char acD6C3[72] = {
+ ________,________,________,
+ ________,________,________,
+ ____XXXX,XXXXXXXX,XXXXX___,
+ ____XX__,_XX___XX,___XX___,
+ ____XX__,_XX___XX,___XX___,
+ ____XX__,_XX___XX,___XX___,
+ ____XXXX,XXXXXXXX,XXXXX___,
+ ____XX__,___XX___,___XX___,
+ ________,___XX___,___XX___,
+ ___XXXXX,XXXXXXXX,XXXXXX__,
+ ________,___XX___,_XX_____,
+ ______XX,XXXXXXXX,XXXX____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XX_____,
+ ______XX,XXXXXXXX,XXX_____,
+ ______XX,________,_XX_____,
+ ______XX,XXXXXXXX,XXX_____,
+ ______XX,________,_XX_____,
+ ______XX,XXXXXXXX,XXX_____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XX__XX_,
+ _XXXXXXX,XXXXXXXX,XXXXXXXX,
+ ________,________,________,
+ ________,________,________,
+};
+
+/* char: 制 code:0xD6C6 */
+static GUI_CONST_STORAGE unsigned char acD6C6[72] = {
+ ________,________,________,
+ _______X,X_______,____XX__,
+ _______X,XX______,____XX__,
+ _______X,X_______,____XX__,
+ ____XX_X,X_______,____XX__,
+ ___XXX_X,X__XX___,XXX_XX__,
+ ___XXXXX,XXXXXX__,XX__XX__,
+ ___XX__X,X_______,XX__XX__,
+ __XX___X,X_______,XX__XX__,
+ _XXXXXXX,XXXXXXX_,XX__XX__,
+ _______X,X_______,XX__XX__,
+ _______X,X_______,XX__XX__,
+ ___XXXXX,XXXXXX__,XX__XX__,
+ ___XX__X,X___XX__,XX__XX__,
+ ___XX__X,X___XX__,XX__XX__,
+ ___XX__X,X___XX__,XX__XX__,
+ ___XX__X,X___XX__,XX__XX__,
+ ___XX__X,X___XX__,____XX__,
+ ___XX__X,XXXXXX__,____XX__,
+ ___XX__X,X__XX___,____XX__,
+ _______X,X_______,____XX__,
+ _______X,X_______,_XXXXX__,
+ _______X,X_______,___XX___,
+ ________,________,________,
+};
+
+/* char: 智 code:0xD6C7 */
+static GUI_CONST_STORAGE unsigned char acD6C7[72] = {
+ ________,________,________,
+ _____XX_,________,________,
+ _____XX_,________,________,
+ ____XXXX,XXXXX_XX,XXXXXX__,
+ ____XX__,XX____XX,____XX__,
+ ___XX___,XX____XX,____XX__,
+ ___XX__X,XX____XX,____XX__,
+ __XXXXXX,XXXXXXXX,____XX__,
+ _______X,X_____XX,____XX__,
+ _______X,XXX___XX,____XX__,
+ ______XX,X_XXX_XX,XXXXXX__,
+ _____XXX,___XXXXX,____XX__,
+ ____XXX_,___XX_XX,________,
+ ___XX__X,XXXXXXXX,XXXX____,
+ __XX___X,X_______,_XX_____,
+ _______X,X_______,_XX_____,
+ _______X,XXXXXXXX,XXX_____,
+ _______X,X_______,_XX_____,
+ _______X,X_______,_XX_____,
+ _______X,X_______,_XX_____,
+ _______X,XXXXXXXX,XXXX____,
+ _______X,X_______,_XXX____,
+ ________,________,_XX_____,
+ ________,________,________,
+};
+
+/* char: 中 code:0xD6D0 */
+static GUI_CONST_STORAGE unsigned char acD6D0[72] = {
+ ________,________,________,
+ ________,___XX___,________,
+ ________,___XXX__,________,
+ ________,___XX___,________,
+ ________,___XX___,________,
+ ________,___XX___,________,
+ ___XXXXX,XXXXXXXX,XXXXXX__,
+ ___XXX__,___XX___,___XXX__,
+ ___XXX__,___XX___,___XXX__,
+ ___XXX__,___XX___,___XXX__,
+ ___XXX__,___XX___,___XXX__,
+ ___XXX__,___XX___,___XXX__,
+ ___XXX__,___XX___,___XXX__,
+ ___XXXXX,XXXXXXXX,XXXXXX__,
+ ___XXX__,___XX___,___XXX__,
+ ___XX___,___XX___,___XX___,
+ ________,___XX___,________,
+ ________,___XX___,________,
+ ________,___XX___,________,
+ ________,___XX___,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XX___,________,
+ ________,________,________,
+};
+
+/* char: 重 code:0xD6D8 */
+static GUI_CONST_STORAGE unsigned char acD6D8[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,XXX_____,
+ ________,__XXXXXX,XXXX____,
+ ____XXXX,XXXXX___,________,
+ ________,___XX___,________,
+ __XXXXXX,XXXXXXXX,XXXXXX__,
+ ________,___XX___,________,
+ ________,___XX___,________,
+ _____XXX,XXXXXXXX,XXXX____,
+ _____XXX,___XX___,_XX_____,
+ _____XXX,___XX___,_XX_____,
+ _____XXX,XXXXXXXX,XXX_____,
+ _____XXX,___XX___,_XX_____,
+ _____XXX,___XX___,_XX_____,
+ _____XXX,XXXXXXXX,XXX_____,
+ _____XXX,___XX___,_XX_____,
+ ________,___XX___,__XX____,
+ ___XXXXX,XXXXXXXX,XXXXX___,
+ ________,___XX___,________,
+ ________,___XX___,____XXX_,
+ _XXXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,________,________,
+ ________,________,________,
+};
+
+/* char: 主 code:0xD6F7 */
+static GUI_CONST_STORAGE unsigned char acD6F7[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,_XX_____,________,
+ ________,__XXX___,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,____XX__,___XX___,
+ ___XXXXX,XXXXXXXX,XXXXXX__,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,__XX____,
+ _____XXX,XXXXXXXX,XXXXX___,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,____XX__,
+ _XXXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,________,________,
+ ________,________,________,
+};
+
+/* char: 准 code:0xD7BC */
+static GUI_CONST_STORAGE unsigned char acD7BC[72] = {
+ ________,________,________,
+ ________,___XX__X,X_______,
+ ________,___XXX_X,XX______,
+ __XXX___,__XXX___,XX______,
+ ___XXX__,__XX____,XX__XX__,
+ ___XXX_X,X_XXXXXX,XXXXXXX_,
+ ____XX_X,XXXX___X,XX______,
+ ______XX,_XXX___X,XX______,
+ ______XX,XXXX___X,XX______,
+ _____XX_,XXXX___X,XX______,
+ _____XXX,X_XXXXXX,XXXXXX__,
+ _____XXX,__XX___X,XX______,
+ ____XX__,__XX___X,XX______,
+ ___XXX__,__XX___X,XX______,
+ __XXXX__,__XX___X,XX__XX__,
+ ___XXX__,__XXXXXX,XXXXXXX_,
+ ___XX___,__XX___X,XX______,
+ ___XX___,__XX___X,XX______,
+ ___XX___,__XX___X,XX______,
+ ___XX___,__XX___X,XX______,
+ ___XX___,__XXXXXX,XXXXXXX_,
+ ________,__XX____,________,
+ ________,__XX____,________,
+ ________,________,________,
+};
+
+/* char: 自 code:0xD7D4 */
+static GUI_CONST_STORAGE unsigned char acD7D4[72] = {
+ ________,________,________,
+ ________,__XXX___,________,
+ ________,__XXX___,________,
+ ________,__XX____,________,
+ ________,__XX____,________,
+ _____XXX,XXXXXXXX,XXXXX___,
+ _____XX_,________,__XX____,
+ _____XX_,________,__XX____,
+ _____XX_,________,__XX____,
+ _____XX_,________,__XX____,
+ _____XXX,XXXXXXXX,XXXX____,
+ _____XX_,________,__XX____,
+ _____XX_,________,__XX____,
+ _____XX_,________,__XX____,
+ _____XX_,________,__XX____,
+ _____XXX,XXXXXXXX,XXXX____,
+ _____XX_,________,__XX____,
+ _____XX_,________,__XX____,
+ _____XX_,________,__XX____,
+ _____XX_,________,__XX____,
+ _____XXX,XXXXXXXX,XXXX____,
+ _____XX_,________,__XX____,
+ _____XX_,________,__XX____,
+ ________,________,________,
+};
+
+/* char: 字 code:0xD7D6 */
+static GUI_CONST_STORAGE unsigned char acD7D6[72] = {
+ ________,________,________,
+ ________,__XX____,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ____XX__,____XX__,____XX__,
+ ____XXXX,XXXXXXXX,XXXXXXX_,
+ ____XX__,________,___XXX__,
+ ___XXX__,________,___XX___,
+ __XXXXXX,XXXXXXXX,XXXX____,
+ ________,_______X,XXX_____,
+ ________,______XX,X_______,
+ ________,_____XX_,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ _XXXXXXX,XXXXXXXX,XXXXXXX_,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ________,XXXXXX__,________,
+ ________,__XXX___,________,
+ ________,________,________,
+};
+
+/* char: 足 code:0xD7E3 */
+static GUI_CONST_STORAGE unsigned char acD7E3[72] = {
+ ________,________,________,
+ ________,________,________,
+ ________,________,_XX_____,
+ ______XX,XXXXXXXX,XXXX____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XX_____,
+ ______XX,________,_XX_____,
+ ______XX,XXXXXXXX,XXX_____,
+ ______XX,___XXX__,_XX_____,
+ ________,___XXX__,________,
+ ________,___XXX__,________,
+ ______XX,___XXX__,________,
+ _____XXX,___XXXXX,XXXXX___,
+ _____XXX,___XXX__,________,
+ _____XX_,___XXX__,________,
+ ____XXXX,___XXX__,________,
+ ____XXXX,XX_XXX__,________,
+ ____XX__,XXXXXX__,________,
+ ___XX___,_XXXXX__,________,
+ __XX____,___XXXXX,XXXXXXXX,
+ _XX_____,______XX,XXXXXX__,
+ ________,________,________,
+};
+
+static GUI_CONST_STORAGE GUI_CHARINFO Cinfo[245] = {
+ { 10, 10, 2, (unsigned char *)&ac0020 }, /*0: */
+ { 8, 8, 2, (unsigned char *)&ac0021 }, /*1: !*/
+ { 12, 12, 2, (unsigned char *)&ac0022 }, /*2: "*/
+ { 12, 12, 2, (unsigned char *)&ac0023 }, /*3: #*/
+ { 11, 11, 2, (unsigned char *)&ac0024 }, /*4: $*/
+ { 12, 12, 2, (unsigned char *)&ac0025 }, /*5: %*/
+ { 13, 13, 2, (unsigned char *)&ac0026 }, /*6: &*/
+ { 6, 6, 2, (unsigned char *)&ac0027 }, /*7: '*/
+ { 12, 12, 2, (unsigned char *)&ac0028 }, /*8: (*/
+ { 8, 8, 2, (unsigned char *)&ac0029 }, /*9: )*/
+ { 13, 13, 2, (unsigned char *)&ac002A }, /*10: **/
+ { 13, 13, 2, (unsigned char *)&ac002B }, /*11: +*/
+ { 6, 6, 2, (unsigned char *)&ac002C }, /*12: ,*/
+ { 12, 12, 2, (unsigned char *)&ac002D }, /*13: -*/
+ { 6, 6, 2, (unsigned char *)&ac002E }, /*14: .*/
+ { 12, 12, 2, (unsigned char *)&ac002F }, /*15: /*/
+ { 12, 12, 2, (unsigned char *)&ac0030 }, /*16: 0*/
+ { 11, 11, 2, (unsigned char *)&ac0031 }, /*17: 1*/
+ { 11, 11, 2, (unsigned char *)&ac0032 }, /*18: 2*/
+ { 11, 11, 2, (unsigned char *)&ac0033 }, /*19: 3*/
+ { 13, 13, 2, (unsigned char *)&ac0034 }, /*20: 4*/
+ { 11, 11, 2, (unsigned char *)&ac0035 }, /*21: 5*/
+ { 12, 12, 2, (unsigned char *)&ac0036 }, /*22: 6*/
+ { 12, 12, 2, (unsigned char *)&ac0037 }, /*23: 7*/
+ { 12, 12, 2, (unsigned char *)&ac0038 }, /*24: 8*/
+ { 12, 12, 2, (unsigned char *)&ac0039 }, /*25: 9*/
+ { 9, 9, 2, (unsigned char *)&ac003A }, /*26: :*/
+ { 8, 8, 2, (unsigned char *)&ac003B }, /*27: ;*/
+ { 12, 12, 2, (unsigned char *)&ac003C }, /*28: <*/
+ { 12, 12, 2, (unsigned char *)&ac003D }, /*29: =*/
+ { 12, 12, 2, (unsigned char *)&ac003E }, /*30: >*/
+ { 13, 13, 2, (unsigned char *)&ac003F }, /*31: ?*/
+ { 12, 12, 2, (unsigned char *)&ac0040 }, /*32: @*/
+ { 13, 13, 2, (unsigned char *)&ac0041 }, /*33: A*/
+ { 12, 12, 2, (unsigned char *)&ac0042 }, /*34: B*/
+ { 12, 12, 2, (unsigned char *)&ac0043 }, /*35: C*/
+ { 12, 12, 2, (unsigned char *)&ac0044 }, /*36: D*/
+ { 12, 12, 2, (unsigned char *)&ac0045 }, /*37: E*/
+ { 12, 12, 2, (unsigned char *)&ac0046 }, /*38: F*/
+ { 13, 13, 2, (unsigned char *)&ac0047 }, /*39: G*/
+ { 13, 13, 2, (unsigned char *)&ac0048 }, /*40: H*/
+ { 11, 11, 2, (unsigned char *)&ac0049 }, /*41: I*/
+ { 12, 12, 2, (unsigned char *)&ac004A }, /*42: J*/
+ { 12, 12, 2, (unsigned char *)&ac004B }, /*43: K*/
+ { 12, 12, 2, (unsigned char *)&ac004C }, /*44: L*/
+ { 12, 12, 2, (unsigned char *)&ac004D }, /*45: M*/
+ { 13, 13, 2, (unsigned char *)&ac004E }, /*46: N*/
+ { 12, 12, 2, (unsigned char *)&ac004F }, /*47: O*/
+ { 12, 12, 2, (unsigned char *)&ac0050 }, /*48: P*/
+ { 12, 12, 2, (unsigned char *)&ac0051 }, /*49: Q*/
+ { 13, 13, 2, (unsigned char *)&ac0052 }, /*50: R*/
+ { 12, 12, 2, (unsigned char *)&ac0053 }, /*51: S*/
+ { 13, 13, 2, (unsigned char *)&ac0054 }, /*52: T*/
+ { 12, 12, 2, (unsigned char *)&ac0055 }, /*53: U*/
+ { 12, 12, 2, (unsigned char *)&ac0056 }, /*54: V*/
+ { 13, 13, 2, (unsigned char *)&ac0057 }, /*55: W*/
+ { 12, 12, 2, (unsigned char *)&ac0058 }, /*56: X*/
+ { 13, 13, 2, (unsigned char *)&ac0059 }, /*57: Y*/
+ { 12, 12, 2, (unsigned char *)&ac005A }, /*58: Z*/
+ { 11, 11, 2, (unsigned char *)&ac005B }, /*59: [*/
+ { 12, 12, 2, (unsigned char *)&ac005C }, /*60: \*/
+ { 8, 8, 2, (unsigned char *)&ac005D }, /*61: ]*/
+ { 10, 10, 2, (unsigned char *)&ac005E }, /*62: ^*/
+ { 13, 13, 2, (unsigned char *)&ac005F }, /*63: _*/
+ { 8, 8, 2, (unsigned char *)&ac0060 }, /*64: `*/
+ { 13, 13, 2, (unsigned char *)&ac0061 }, /*65: a*/
+ { 12, 12, 2, (unsigned char *)&ac0062 }, /*66: b*/
+ { 11, 11, 2, (unsigned char *)&ac0063 }, /*67: c*/
+ { 12, 12, 2, (unsigned char *)&ac0064 }, /*68: d*/
+ { 12, 12, 2, (unsigned char *)&ac0065 }, /*69: e*/
+ { 12, 12, 2, (unsigned char *)&ac0066 }, /*70: f*/
+ { 12, 12, 2, (unsigned char *)&ac0067 }, /*71: g*/
+ { 12, 12, 2, (unsigned char *)&ac0068 }, /*72: h*/
+ { 11, 11, 2, (unsigned char *)&ac0069 }, /*73: i*/
+ { 10, 10, 2, (unsigned char *)&ac006A }, /*74: j*/
+ { 12, 12, 2, (unsigned char *)&ac006B }, /*75: k*/
+ { 11, 11, 2, (unsigned char *)&ac006C }, /*76: l*/
+ { 13, 13, 2, (unsigned char *)&ac006D }, /*77: m*/
+ { 12, 12, 2, (unsigned char *)&ac006E }, /*78: n*/
+ { 12, 12, 2, (unsigned char *)&ac006F }, /*79: o*/
+ { 12, 12, 2, (unsigned char *)&ac0070 }, /*80: p*/
+ { 12, 12, 2, (unsigned char *)&ac0071 }, /*81: q*/
+ { 12, 12, 2, (unsigned char *)&ac0072 }, /*82: r*/
+ { 11, 11, 2, (unsigned char *)&ac0073 }, /*83: s*/
+ { 11, 11, 2, (unsigned char *)&ac0074 }, /*84: t*/
+ { 12, 12, 2, (unsigned char *)&ac0075 }, /*85: u*/
+ { 12, 12, 2, (unsigned char *)&ac0076 }, /*86: v*/
+ { 13, 13, 2, (unsigned char *)&ac0077 }, /*87: w*/
+ { 12, 12, 2, (unsigned char *)&ac0078 }, /*88: x*/
+ { 12, 12, 2, (unsigned char *)&ac0079 }, /*89: y*/
+ { 11, 11, 2, (unsigned char *)&ac007A }, /*90: z*/
+ { 11, 11, 2, (unsigned char *)&ac007B }, /*91: {*/
+ { 8, 8, 2, (unsigned char *)&ac007C }, /*92: |*/
+ { 8, 8, 2, (unsigned char *)&ac007D }, /*93: }*/
+ { 12, 12, 2, (unsigned char *)&ac007E }, /*94: ~*/
+ { 10, 10, 2, (unsigned char *)&ac007F }, /*95: */
+ { 9, 9, 3, (unsigned char *)&acA1A3 }, /*96: 。*/
+ { 10, 10, 3, (unsigned char *)&acA1E3 }, /*97: °*/
+ { 22, 22, 3, (unsigned char *)&acA1E6 }, /*98: ℃*/
+ { 7, 7, 3, (unsigned char *)&acA3AC }, /*99: ,*/
+ { 21, 21, 3, (unsigned char *)&acA848 }, /*100: ℉*/
+ { 24, 24, 3, (unsigned char *)&acB0DC }, /*101: 败*/
+ { 23, 23, 3, (unsigned char *)&acB0E6 }, /*102: 版*/
+ { 23, 23, 3, (unsigned char *)&acB0FC }, /*103: 包*/
+ { 24, 24, 3, (unsigned char *)&acB1A3 }, /*104: 保*/
+ { 24, 24, 3, (unsigned char *)&acB1B8 }, /*105: 备*/
+ { 24, 24, 3, (unsigned char *)&acB1BE }, /*106: 本*/
+ { 23, 23, 3, (unsigned char *)&acB1E0 }, /*107: 编*/
+ { 24, 24, 3, (unsigned char *)&acB1E4 }, /*108: 变*/
+ { 23, 23, 3, (unsigned char *)&acB2BB }, /*109: 不*/
+ { 24, 24, 3, (unsigned char *)&acB2CB }, /*110: 菜*/
+ { 24, 24, 3, (unsigned char *)&acB2CE }, /*111: 参*/
+ { 22, 22, 3, (unsigned char *)&acB2E2 }, /*112: 测*/
+ { 24, 24, 3, (unsigned char *)&acB2E9 }, /*113: 查*/
+ { 23, 23, 3, (unsigned char *)&acB3A3 }, /*114: 常*/
+ { 23, 23, 3, (unsigned char *)&acB3A7 }, /*115: 厂*/
+ { 24, 24, 3, (unsigned char *)&acB3AC }, /*116: 超*/
+ { 24, 24, 3, (unsigned char *)&acB3C9 }, /*117: 成*/
+ { 24, 24, 3, (unsigned char *)&acB3CC }, /*118: 程*/
+ { 22, 22, 3, (unsigned char *)&acB3F6 }, /*119: 出*/
+ { 23, 23, 3, (unsigned char *)&acB4E6 }, /*120: 存*/
+ { 24, 24, 3, (unsigned char *)&acB4ED }, /*121: 错*/
+ { 23, 23, 3, (unsigned char *)&acB5A5 }, /*122: 单*/
+ { 23, 23, 3, (unsigned char *)&acB5AB }, /*123: 但*/
+ { 23, 23, 3, (unsigned char *)&acB5B1 }, /*124: 当*/
+ { 23, 23, 3, (unsigned char *)&acB5C4 }, /*125: 的*/
+ { 23, 23, 3, (unsigned char *)&acB5E7 }, /*126: 电*/
+ { 23, 23, 3, (unsigned char *)&acB6A8 }, /*127: 定*/
+ { 23, 23, 3, (unsigned char *)&acB6AF }, /*128: 动*/
+ { 24, 24, 3, (unsigned char *)&acB6C8 }, /*129: 度*/
+ { 23, 23, 3, (unsigned char *)&acB6CF }, /*130: 断*/
+ { 23, 23, 3, (unsigned char *)&acB6D4 }, /*131: 对*/
+ { 24, 24, 3, (unsigned char *)&acB7A2 }, /*132: 发*/
+ { 23, 23, 3, (unsigned char *)&acB7A7 }, /*133: 阀*/
+ { 24, 24, 3, (unsigned char *)&acB7B5 }, /*134: 返*/
+ { 24, 24, 3, (unsigned char *)&acB8B4 }, /*135: 复*/
+ { 24, 24, 3, (unsigned char *)&acB8C4 }, /*136: 改*/
+ { 23, 23, 3, (unsigned char *)&acB8F1 }, /*137: 格*/
+ { 23, 23, 3, (unsigned char *)&acB9A6 }, /*138: 功*/
+ { 23, 23, 3, (unsigned char *)&acB9AB }, /*139: 公*/
+ { 24, 24, 3, (unsigned char *)&acB9CA }, /*140: 故*/
+ { 24, 24, 3, (unsigned char *)&acB9E6 }, /*141: 规*/
+ { 23, 23, 3, (unsigned char *)&acBAC5 }, /*142: 号*/
+ { 23, 23, 3, (unsigned char *)&acBAF3 }, /*143: 后*/
+ { 23, 23, 3, (unsigned char *)&acBBA4 }, /*144: 护*/
+ { 24, 24, 3, (unsigned char *)&acBBB6 }, /*145: 欢*/
+ { 23, 23, 3, (unsigned char *)&acBBD6 }, /*146: 恢*/
+ { 22, 22, 3, (unsigned char *)&acBBD8 }, /*147: 回*/
+ { 24, 24, 3, (unsigned char *)&acBBF2 }, /*148: 或*/
+ { 23, 23, 3, (unsigned char *)&acBCAD }, /*149: 辑*/
+ { 24, 24, 3, (unsigned char *)&acBCBC }, /*150: 技*/
+ { 23, 23, 3, (unsigned char *)&acBCC6 }, /*151: 计*/
+ { 23, 23, 3, (unsigned char *)&acBCD3 }, /*152: 加*/
+ { 23, 23, 3, (unsigned char *)&acBCEC }, /*153: 检*/
+ { 24, 24, 3, (unsigned char *)&acBCFC }, /*154: 键*/
+ { 23, 23, 3, (unsigned char *)&acBCFE }, /*155: 件*/
+ { 24, 24, 3, (unsigned char *)&acBDAD }, /*156: 江*/
+ { 24, 24, 3, (unsigned char *)&acBDD7 }, /*157: 阶*/
+ { 24, 24, 3, (unsigned char *)&acBDF8 }, /*158: 进*/
+ { 23, 23, 3, (unsigned char *)&acBEDD }, /*159: 据*/
+ { 23, 23, 3, (unsigned char *)&acBEDE }, /*160: 巨*/
+ { 23, 23, 3, (unsigned char *)&acBFD8 }, /*161: 控*/
+ { 24, 24, 3, (unsigned char *)&acC0A8 }, /*162: 括*/
+ { 24, 24, 3, (unsigned char *)&acC1BF }, /*163: 量*/
+ { 24, 24, 3, (unsigned char *)&acC1F7 }, /*164: 流*/
+ { 23, 23, 3, (unsigned char *)&acC2EB }, /*165: 码*/
+ { 23, 23, 3, (unsigned char *)&acC2FA }, /*166: 满*/
+ { 22, 22, 3, (unsigned char *)&acC3C5 }, /*167: 门*/
+ { 23, 23, 3, (unsigned char *)&acC3DC }, /*168: 密*/
+ { 24, 24, 3, (unsigned char *)&acC3E6 }, /*169: 面*/
+ { 23, 23, 3, (unsigned char *)&acC3EB }, /*170: 秒*/
+ { 23, 23, 3, (unsigned char *)&acC4AC }, /*171: 默*/
+ { 20, 20, 3, (unsigned char *)&acC4BF }, /*172: 目*/
+ { 24, 24, 3, (unsigned char *)&acC4DC }, /*173: 能*/
+ { 24, 24, 3, (unsigned char *)&acC5E4 }, /*174: 配*/
+ { 24, 24, 3, (unsigned char *)&acC6C2 }, /*175: 坡*/
+ { 21, 21, 3, (unsigned char *)&acC6F4 }, /*176: 启*/
+ { 23, 23, 3, (unsigned char *)&acC6F7 }, /*177: 器*/
+ { 23, 23, 3, (unsigned char *)&acC7B0 }, /*178: 前*/
+ { 23, 23, 3, (unsigned char *)&acC7EB }, /*179: 请*/
+ { 24, 24, 3, (unsigned char *)&acC7F3 }, /*180: 求*/
+ { 24, 24, 3, (unsigned char *)&acC7FD }, /*181: 驱*/
+ { 24, 24, 3, (unsigned char *)&acC8A1 }, /*182: 取*/
+ { 23, 23, 3, (unsigned char *)&acC8CF }, /*183: 认*/
+ { 24, 24, 3, (unsigned char *)&acC8EB }, /*184: 入*/
+ { 24, 24, 3, (unsigned char *)&acC9E8 }, /*185: 设*/
+ { 23, 23, 3, (unsigned char *)&acC9FA }, /*186: 生*/
+ { 24, 24, 3, (unsigned char *)&acCAA7 }, /*187: 失*/
+ { 23, 23, 3, (unsigned char *)&acCAAF }, /*188: 石*/
+ { 23, 23, 3, (unsigned char *)&acCAB1 }, /*189: 时*/
+ { 23, 23, 3, (unsigned char *)&acCAB5 }, /*190: 实*/
+ { 24, 24, 3, (unsigned char *)&acCAB9 }, /*191: 使*/
+ { 24, 24, 3, (unsigned char *)&acCAD4 }, /*192: 试*/
+ { 23, 23, 3, (unsigned char *)&acCAD7 }, /*193: 首*/
+ { 23, 23, 3, (unsigned char *)&acCAE4 }, /*194: 输*/
+ { 23, 23, 3, (unsigned char *)&acCAF5 }, /*195: 术*/
+ { 23, 23, 3, (unsigned char *)&acCAFD }, /*196: 数*/
+ { 21, 21, 3, (unsigned char *)&acCBBE }, /*197: 司*/
+ { 23, 23, 3, (unsigned char *)&acCBD5 }, /*198: 苏*/
+ { 24, 24, 3, (unsigned char *)&acCBF9 }, /*199: 所*/
+ { 24, 24, 3, (unsigned char *)&acCCD8 }, /*200: 特*/
+ { 24, 24, 3, (unsigned char *)&acCCF5 }, /*201: 条*/
+ { 24, 24, 3, (unsigned char *)&acCEAC }, /*202: 维*/
+ { 23, 23, 3, (unsigned char *)&acCEB4 }, /*203: 未*/
+ { 24, 24, 3, (unsigned char *)&acCEBB }, /*204: 位*/
+ { 24, 24, 3, (unsigned char *)&acCEC2 }, /*205: 温*/
+ { 24, 24, 3, (unsigned char *)&acCEF3 }, /*206: 误*/
+ { 23, 23, 3, (unsigned char *)&acCFA2 }, /*207: 息*/
+ { 23, 23, 3, (unsigned char *)&acCFDE }, /*208: 限*/
+ { 23, 23, 3, (unsigned char *)&acCFEE }, /*209: 项*/
+ { 23, 23, 3, (unsigned char *)&acCFFB }, /*210: 消*/
+ { 24, 24, 3, (unsigned char *)&acD0A3 }, /*211: 校*/
+ { 23, 23, 3, (unsigned char *)&acD0B1 }, /*212: 斜*/
+ { 23, 23, 3, (unsigned char *)&acD0C5 }, /*213: 信*/
+ { 23, 23, 3, (unsigned char *)&acD0D0 }, /*214: 行*/
+ { 24, 24, 3, (unsigned char *)&acD0D4 }, /*215: 性*/
+ { 23, 23, 3, (unsigned char *)&acD0DE }, /*216: 修*/
+ { 23, 23, 3, (unsigned char *)&acD0E8 }, /*217: 需*/
+ { 23, 23, 3, (unsigned char *)&acD1A1 }, /*218: 选*/
+ { 23, 23, 3, (unsigned char *)&acD2AA }, /*219: 要*/
+ { 22, 22, 3, (unsigned char *)&acD2B3 }, /*220: 页*/
+ { 23, 23, 3, (unsigned char *)&acD2BB }, /*221: 一*/
+ { 23, 23, 3, (unsigned char *)&acD2D1 }, /*222: 已*/
+ { 24, 24, 3, (unsigned char *)&acD3AD }, /*223: 迎*/
+ { 22, 22, 3, (unsigned char *)&acD3C3 }, /*224: 用*/
+ { 23, 23, 3, (unsigned char *)&acD3D0 }, /*225: 有*/
+ { 24, 24, 3, (unsigned char *)&acD4BE }, /*226: 跃*/
+ { 24, 24, 3, (unsigned char *)&acD4D8 }, /*227: 载*/
+ { 24, 24, 3, (unsigned char *)&acD4F1 }, /*228: 择*/
+ { 24, 24, 3, (unsigned char *)&acD5CF }, /*229: 障*/
+ { 24, 24, 3, (unsigned char *)&acD5EF }, /*230: 诊*/
+ { 23, 23, 3, (unsigned char *)&acD5FB }, /*231: 整*/
+ { 23, 23, 3, (unsigned char *)&acD5FD }, /*232: 正*/
+ { 23, 23, 3, (unsigned char *)&acD6AA }, /*233: 知*/
+ { 23, 23, 3, (unsigned char *)&acD6C1 }, /*234: 至*/
+ { 24, 24, 3, (unsigned char *)&acD6C3 }, /*235: 置*/
+ { 22, 22, 3, (unsigned char *)&acD6C6 }, /*236: 制*/
+ { 22, 22, 3, (unsigned char *)&acD6C7 }, /*237: 智*/
+ { 22, 22, 3, (unsigned char *)&acD6D0 }, /*238: 中*/
+ { 23, 23, 3, (unsigned char *)&acD6D8 }, /*239: 重*/
+ { 23, 23, 3, (unsigned char *)&acD6F7 }, /*240: 主*/
+ { 23, 23, 3, (unsigned char *)&acD7BC }, /*241: 准*/
+ { 21, 21, 3, (unsigned char *)&acD7D4 }, /*242: 自*/
+ { 23, 23, 3, (unsigned char *)&acD7D6 }, /*243: 字*/
+ { 24, 24, 3, (unsigned char *)&acD7E3 }, /*244: 足*/
+};
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop148 = {
+ 0xD7E3, /*start :足*/
+ 0xD7E3, /*end :足, len=1*/
+ &Cinfo[ 244 ],
+ (void*)0
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop147 = {
+ 0xD7D6, /*start :字*/
+ 0xD7D6, /*end :字, len=1*/
+ &Cinfo[ 243 ],
+ &Prop148
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop146 = {
+ 0xD7D4, /*start :自*/
+ 0xD7D4, /*end :自, len=1*/
+ &Cinfo[ 242 ],
+ &Prop147
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop145 = {
+ 0xD7BC, /*start :准*/
+ 0xD7BC, /*end :准, len=1*/
+ &Cinfo[ 241 ],
+ &Prop146
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop144 = {
+ 0xD6F7, /*start :主*/
+ 0xD6F7, /*end :主, len=1*/
+ &Cinfo[ 240 ],
+ &Prop145
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop143 = {
+ 0xD6D8, /*start :重*/
+ 0xD6D8, /*end :重, len=1*/
+ &Cinfo[ 239 ],
+ &Prop144
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop142 = {
+ 0xD6D0, /*start :中*/
+ 0xD6D0, /*end :中, len=1*/
+ &Cinfo[ 238 ],
+ &Prop143
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop141 = {
+ 0xD6C6, /*start :制*/
+ 0xD6C7, /*end :智, len=2*/
+ &Cinfo[ 236 ],
+ &Prop142
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop140 = {
+ 0xD6C3, /*start :置*/
+ 0xD6C3, /*end :置, len=1*/
+ &Cinfo[ 235 ],
+ &Prop141
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop139 = {
+ 0xD6C1, /*start :至*/
+ 0xD6C1, /*end :至, len=1*/
+ &Cinfo[ 234 ],
+ &Prop140
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop138 = {
+ 0xD6AA, /*start :知*/
+ 0xD6AA, /*end :知, len=1*/
+ &Cinfo[ 233 ],
+ &Prop139
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop137 = {
+ 0xD5FD, /*start :正*/
+ 0xD5FD, /*end :正, len=1*/
+ &Cinfo[ 232 ],
+ &Prop138
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop136 = {
+ 0xD5FB, /*start :整*/
+ 0xD5FB, /*end :整, len=1*/
+ &Cinfo[ 231 ],
+ &Prop137
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop135 = {
+ 0xD5EF, /*start :诊*/
+ 0xD5EF, /*end :诊, len=1*/
+ &Cinfo[ 230 ],
+ &Prop136
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop134 = {
+ 0xD5CF, /*start :障*/
+ 0xD5CF, /*end :障, len=1*/
+ &Cinfo[ 229 ],
+ &Prop135
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop133 = {
+ 0xD4F1, /*start :择*/
+ 0xD4F1, /*end :择, len=1*/
+ &Cinfo[ 228 ],
+ &Prop134
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop132 = {
+ 0xD4D8, /*start :载*/
+ 0xD4D8, /*end :载, len=1*/
+ &Cinfo[ 227 ],
+ &Prop133
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop131 = {
+ 0xD4BE, /*start :跃*/
+ 0xD4BE, /*end :跃, len=1*/
+ &Cinfo[ 226 ],
+ &Prop132
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop130 = {
+ 0xD3D0, /*start :有*/
+ 0xD3D0, /*end :有, len=1*/
+ &Cinfo[ 225 ],
+ &Prop131
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop129 = {
+ 0xD3C3, /*start :用*/
+ 0xD3C3, /*end :用, len=1*/
+ &Cinfo[ 224 ],
+ &Prop130
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop128 = {
+ 0xD3AD, /*start :迎*/
+ 0xD3AD, /*end :迎, len=1*/
+ &Cinfo[ 223 ],
+ &Prop129
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop127 = {
+ 0xD2D1, /*start :已*/
+ 0xD2D1, /*end :已, len=1*/
+ &Cinfo[ 222 ],
+ &Prop128
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop126 = {
+ 0xD2BB, /*start :一*/
+ 0xD2BB, /*end :一, len=1*/
+ &Cinfo[ 221 ],
+ &Prop127
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop125 = {
+ 0xD2B3, /*start :页*/
+ 0xD2B3, /*end :页, len=1*/
+ &Cinfo[ 220 ],
+ &Prop126
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop124 = {
+ 0xD2AA, /*start :要*/
+ 0xD2AA, /*end :要, len=1*/
+ &Cinfo[ 219 ],
+ &Prop125
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop123 = {
+ 0xD1A1, /*start :选*/
+ 0xD1A1, /*end :选, len=1*/
+ &Cinfo[ 218 ],
+ &Prop124
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop122 = {
+ 0xD0E8, /*start :需*/
+ 0xD0E8, /*end :需, len=1*/
+ &Cinfo[ 217 ],
+ &Prop123
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop121 = {
+ 0xD0DE, /*start :修*/
+ 0xD0DE, /*end :修, len=1*/
+ &Cinfo[ 216 ],
+ &Prop122
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop120 = {
+ 0xD0D4, /*start :性*/
+ 0xD0D4, /*end :性, len=1*/
+ &Cinfo[ 215 ],
+ &Prop121
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop119 = {
+ 0xD0D0, /*start :行*/
+ 0xD0D0, /*end :行, len=1*/
+ &Cinfo[ 214 ],
+ &Prop120
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop118 = {
+ 0xD0C5, /*start :信*/
+ 0xD0C5, /*end :信, len=1*/
+ &Cinfo[ 213 ],
+ &Prop119
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop117 = {
+ 0xD0B1, /*start :斜*/
+ 0xD0B1, /*end :斜, len=1*/
+ &Cinfo[ 212 ],
+ &Prop118
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop116 = {
+ 0xD0A3, /*start :校*/
+ 0xD0A3, /*end :校, len=1*/
+ &Cinfo[ 211 ],
+ &Prop117
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop115 = {
+ 0xCFFB, /*start :消*/
+ 0xCFFB, /*end :消, len=1*/
+ &Cinfo[ 210 ],
+ &Prop116
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop114 = {
+ 0xCFEE, /*start :项*/
+ 0xCFEE, /*end :项, len=1*/
+ &Cinfo[ 209 ],
+ &Prop115
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop113 = {
+ 0xCFDE, /*start :限*/
+ 0xCFDE, /*end :限, len=1*/
+ &Cinfo[ 208 ],
+ &Prop114
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop112 = {
+ 0xCFA2, /*start :息*/
+ 0xCFA2, /*end :息, len=1*/
+ &Cinfo[ 207 ],
+ &Prop113
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop111 = {
+ 0xCEF3, /*start :误*/
+ 0xCEF3, /*end :误, len=1*/
+ &Cinfo[ 206 ],
+ &Prop112
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop110 = {
+ 0xCEC2, /*start :温*/
+ 0xCEC2, /*end :温, len=1*/
+ &Cinfo[ 205 ],
+ &Prop111
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop109 = {
+ 0xCEBB, /*start :位*/
+ 0xCEBB, /*end :位, len=1*/
+ &Cinfo[ 204 ],
+ &Prop110
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop108 = {
+ 0xCEB4, /*start :未*/
+ 0xCEB4, /*end :未, len=1*/
+ &Cinfo[ 203 ],
+ &Prop109
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop107 = {
+ 0xCEAC, /*start :维*/
+ 0xCEAC, /*end :维, len=1*/
+ &Cinfo[ 202 ],
+ &Prop108
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop106 = {
+ 0xCCF5, /*start :条*/
+ 0xCCF5, /*end :条, len=1*/
+ &Cinfo[ 201 ],
+ &Prop107
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop105 = {
+ 0xCCD8, /*start :特*/
+ 0xCCD8, /*end :特, len=1*/
+ &Cinfo[ 200 ],
+ &Prop106
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop104 = {
+ 0xCBF9, /*start :所*/
+ 0xCBF9, /*end :所, len=1*/
+ &Cinfo[ 199 ],
+ &Prop105
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop103 = {
+ 0xCBD5, /*start :苏*/
+ 0xCBD5, /*end :苏, len=1*/
+ &Cinfo[ 198 ],
+ &Prop104
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop102 = {
+ 0xCBBE, /*start :司*/
+ 0xCBBE, /*end :司, len=1*/
+ &Cinfo[ 197 ],
+ &Prop103
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop101 = {
+ 0xCAFD, /*start :数*/
+ 0xCAFD, /*end :数, len=1*/
+ &Cinfo[ 196 ],
+ &Prop102
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop100 = {
+ 0xCAF5, /*start :术*/
+ 0xCAF5, /*end :术, len=1*/
+ &Cinfo[ 195 ],
+ &Prop101
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop99 = {
+ 0xCAE4, /*start :输*/
+ 0xCAE4, /*end :输, len=1*/
+ &Cinfo[ 194 ],
+ &Prop100
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop98 = {
+ 0xCAD7, /*start :首*/
+ 0xCAD7, /*end :首, len=1*/
+ &Cinfo[ 193 ],
+ &Prop99
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop97 = {
+ 0xCAD4, /*start :试*/
+ 0xCAD4, /*end :试, len=1*/
+ &Cinfo[ 192 ],
+ &Prop98
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop96 = {
+ 0xCAB9, /*start :使*/
+ 0xCAB9, /*end :使, len=1*/
+ &Cinfo[ 191 ],
+ &Prop97
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop95 = {
+ 0xCAB5, /*start :实*/
+ 0xCAB5, /*end :实, len=1*/
+ &Cinfo[ 190 ],
+ &Prop96
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop94 = {
+ 0xCAB1, /*start :时*/
+ 0xCAB1, /*end :时, len=1*/
+ &Cinfo[ 189 ],
+ &Prop95
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop93 = {
+ 0xCAAF, /*start :石*/
+ 0xCAAF, /*end :石, len=1*/
+ &Cinfo[ 188 ],
+ &Prop94
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop92 = {
+ 0xCAA7, /*start :失*/
+ 0xCAA7, /*end :失, len=1*/
+ &Cinfo[ 187 ],
+ &Prop93
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop91 = {
+ 0xC9FA, /*start :生*/
+ 0xC9FA, /*end :生, len=1*/
+ &Cinfo[ 186 ],
+ &Prop92
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop90 = {
+ 0xC9E8, /*start :设*/
+ 0xC9E8, /*end :设, len=1*/
+ &Cinfo[ 185 ],
+ &Prop91
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop89 = {
+ 0xC8EB, /*start :入*/
+ 0xC8EB, /*end :入, len=1*/
+ &Cinfo[ 184 ],
+ &Prop90
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop88 = {
+ 0xC8CF, /*start :认*/
+ 0xC8CF, /*end :认, len=1*/
+ &Cinfo[ 183 ],
+ &Prop89
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop87 = {
+ 0xC8A1, /*start :取*/
+ 0xC8A1, /*end :取, len=1*/
+ &Cinfo[ 182 ],
+ &Prop88
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop86 = {
+ 0xC7FD, /*start :驱*/
+ 0xC7FD, /*end :驱, len=1*/
+ &Cinfo[ 181 ],
+ &Prop87
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop85 = {
+ 0xC7F3, /*start :求*/
+ 0xC7F3, /*end :求, len=1*/
+ &Cinfo[ 180 ],
+ &Prop86
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop84 = {
+ 0xC7EB, /*start :请*/
+ 0xC7EB, /*end :请, len=1*/
+ &Cinfo[ 179 ],
+ &Prop85
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop83 = {
+ 0xC7B0, /*start :前*/
+ 0xC7B0, /*end :前, len=1*/
+ &Cinfo[ 178 ],
+ &Prop84
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop82 = {
+ 0xC6F7, /*start :器*/
+ 0xC6F7, /*end :器, len=1*/
+ &Cinfo[ 177 ],
+ &Prop83
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop81 = {
+ 0xC6F4, /*start :启*/
+ 0xC6F4, /*end :启, len=1*/
+ &Cinfo[ 176 ],
+ &Prop82
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop80 = {
+ 0xC6C2, /*start :坡*/
+ 0xC6C2, /*end :坡, len=1*/
+ &Cinfo[ 175 ],
+ &Prop81
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop79 = {
+ 0xC5E4, /*start :配*/
+ 0xC5E4, /*end :配, len=1*/
+ &Cinfo[ 174 ],
+ &Prop80
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop78 = {
+ 0xC4DC, /*start :能*/
+ 0xC4DC, /*end :能, len=1*/
+ &Cinfo[ 173 ],
+ &Prop79
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop77 = {
+ 0xC4BF, /*start :目*/
+ 0xC4BF, /*end :目, len=1*/
+ &Cinfo[ 172 ],
+ &Prop78
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop76 = {
+ 0xC4AC, /*start :默*/
+ 0xC4AC, /*end :默, len=1*/
+ &Cinfo[ 171 ],
+ &Prop77
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop75 = {
+ 0xC3EB, /*start :秒*/
+ 0xC3EB, /*end :秒, len=1*/
+ &Cinfo[ 170 ],
+ &Prop76
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop74 = {
+ 0xC3E6, /*start :面*/
+ 0xC3E6, /*end :面, len=1*/
+ &Cinfo[ 169 ],
+ &Prop75
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop73 = {
+ 0xC3DC, /*start :密*/
+ 0xC3DC, /*end :密, len=1*/
+ &Cinfo[ 168 ],
+ &Prop74
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop72 = {
+ 0xC3C5, /*start :门*/
+ 0xC3C5, /*end :门, len=1*/
+ &Cinfo[ 167 ],
+ &Prop73
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop71 = {
+ 0xC2FA, /*start :满*/
+ 0xC2FA, /*end :满, len=1*/
+ &Cinfo[ 166 ],
+ &Prop72
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop70 = {
+ 0xC2EB, /*start :码*/
+ 0xC2EB, /*end :码, len=1*/
+ &Cinfo[ 165 ],
+ &Prop71
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop69 = {
+ 0xC1F7, /*start :流*/
+ 0xC1F7, /*end :流, len=1*/
+ &Cinfo[ 164 ],
+ &Prop70
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop68 = {
+ 0xC1BF, /*start :量*/
+ 0xC1BF, /*end :量, len=1*/
+ &Cinfo[ 163 ],
+ &Prop69
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop67 = {
+ 0xC0A8, /*start :括*/
+ 0xC0A8, /*end :括, len=1*/
+ &Cinfo[ 162 ],
+ &Prop68
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop66 = {
+ 0xBFD8, /*start :控*/
+ 0xBFD8, /*end :控, len=1*/
+ &Cinfo[ 161 ],
+ &Prop67
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop65 = {
+ 0xBEDD, /*start :据*/
+ 0xBEDE, /*end :巨, len=2*/
+ &Cinfo[ 159 ],
+ &Prop66
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop64 = {
+ 0xBDF8, /*start :进*/
+ 0xBDF8, /*end :进, len=1*/
+ &Cinfo[ 158 ],
+ &Prop65
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop63 = {
+ 0xBDD7, /*start :阶*/
+ 0xBDD7, /*end :阶, len=1*/
+ &Cinfo[ 157 ],
+ &Prop64
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop62 = {
+ 0xBDAD, /*start :江*/
+ 0xBDAD, /*end :江, len=1*/
+ &Cinfo[ 156 ],
+ &Prop63
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop61 = {
+ 0xBCFE, /*start :件*/
+ 0xBCFE, /*end :件, len=1*/
+ &Cinfo[ 155 ],
+ &Prop62
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop60 = {
+ 0xBCFC, /*start :键*/
+ 0xBCFC, /*end :键, len=1*/
+ &Cinfo[ 154 ],
+ &Prop61
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop59 = {
+ 0xBCEC, /*start :检*/
+ 0xBCEC, /*end :检, len=1*/
+ &Cinfo[ 153 ],
+ &Prop60
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop58 = {
+ 0xBCD3, /*start :加*/
+ 0xBCD3, /*end :加, len=1*/
+ &Cinfo[ 152 ],
+ &Prop59
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop57 = {
+ 0xBCC6, /*start :计*/
+ 0xBCC6, /*end :计, len=1*/
+ &Cinfo[ 151 ],
+ &Prop58
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop56 = {
+ 0xBCBC, /*start :技*/
+ 0xBCBC, /*end :技, len=1*/
+ &Cinfo[ 150 ],
+ &Prop57
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop55 = {
+ 0xBCAD, /*start :辑*/
+ 0xBCAD, /*end :辑, len=1*/
+ &Cinfo[ 149 ],
+ &Prop56
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop54 = {
+ 0xBBF2, /*start :或*/
+ 0xBBF2, /*end :或, len=1*/
+ &Cinfo[ 148 ],
+ &Prop55
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop53 = {
+ 0xBBD8, /*start :回*/
+ 0xBBD8, /*end :回, len=1*/
+ &Cinfo[ 147 ],
+ &Prop54
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop52 = {
+ 0xBBD6, /*start :恢*/
+ 0xBBD6, /*end :恢, len=1*/
+ &Cinfo[ 146 ],
+ &Prop53
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop51 = {
+ 0xBBB6, /*start :欢*/
+ 0xBBB6, /*end :欢, len=1*/
+ &Cinfo[ 145 ],
+ &Prop52
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop50 = {
+ 0xBBA4, /*start :护*/
+ 0xBBA4, /*end :护, len=1*/
+ &Cinfo[ 144 ],
+ &Prop51
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop49 = {
+ 0xBAF3, /*start :后*/
+ 0xBAF3, /*end :后, len=1*/
+ &Cinfo[ 143 ],
+ &Prop50
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop48 = {
+ 0xBAC5, /*start :号*/
+ 0xBAC5, /*end :号, len=1*/
+ &Cinfo[ 142 ],
+ &Prop49
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop47 = {
+ 0xB9E6, /*start :规*/
+ 0xB9E6, /*end :规, len=1*/
+ &Cinfo[ 141 ],
+ &Prop48
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop46 = {
+ 0xB9CA, /*start :故*/
+ 0xB9CA, /*end :故, len=1*/
+ &Cinfo[ 140 ],
+ &Prop47
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop45 = {
+ 0xB9AB, /*start :公*/
+ 0xB9AB, /*end :公, len=1*/
+ &Cinfo[ 139 ],
+ &Prop46
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop44 = {
+ 0xB9A6, /*start :功*/
+ 0xB9A6, /*end :功, len=1*/
+ &Cinfo[ 138 ],
+ &Prop45
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop43 = {
+ 0xB8F1, /*start :格*/
+ 0xB8F1, /*end :格, len=1*/
+ &Cinfo[ 137 ],
+ &Prop44
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop42 = {
+ 0xB8C4, /*start :改*/
+ 0xB8C4, /*end :改, len=1*/
+ &Cinfo[ 136 ],
+ &Prop43
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop41 = {
+ 0xB8B4, /*start :复*/
+ 0xB8B4, /*end :复, len=1*/
+ &Cinfo[ 135 ],
+ &Prop42
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop40 = {
+ 0xB7B5, /*start :返*/
+ 0xB7B5, /*end :返, len=1*/
+ &Cinfo[ 134 ],
+ &Prop41
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop39 = {
+ 0xB7A7, /*start :阀*/
+ 0xB7A7, /*end :阀, len=1*/
+ &Cinfo[ 133 ],
+ &Prop40
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop38 = {
+ 0xB7A2, /*start :发*/
+ 0xB7A2, /*end :发, len=1*/
+ &Cinfo[ 132 ],
+ &Prop39
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop37 = {
+ 0xB6D4, /*start :对*/
+ 0xB6D4, /*end :对, len=1*/
+ &Cinfo[ 131 ],
+ &Prop38
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop36 = {
+ 0xB6CF, /*start :断*/
+ 0xB6CF, /*end :断, len=1*/
+ &Cinfo[ 130 ],
+ &Prop37
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop35 = {
+ 0xB6C8, /*start :度*/
+ 0xB6C8, /*end :度, len=1*/
+ &Cinfo[ 129 ],
+ &Prop36
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop34 = {
+ 0xB6AF, /*start :动*/
+ 0xB6AF, /*end :动, len=1*/
+ &Cinfo[ 128 ],
+ &Prop35
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop33 = {
+ 0xB6A8, /*start :定*/
+ 0xB6A8, /*end :定, len=1*/
+ &Cinfo[ 127 ],
+ &Prop34
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop32 = {
+ 0xB5E7, /*start :电*/
+ 0xB5E7, /*end :电, len=1*/
+ &Cinfo[ 126 ],
+ &Prop33
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop31 = {
+ 0xB5C4, /*start :的*/
+ 0xB5C4, /*end :的, len=1*/
+ &Cinfo[ 125 ],
+ &Prop32
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop30 = {
+ 0xB5B1, /*start :当*/
+ 0xB5B1, /*end :当, len=1*/
+ &Cinfo[ 124 ],
+ &Prop31
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop29 = {
+ 0xB5AB, /*start :但*/
+ 0xB5AB, /*end :但, len=1*/
+ &Cinfo[ 123 ],
+ &Prop30
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop28 = {
+ 0xB5A5, /*start :单*/
+ 0xB5A5, /*end :单, len=1*/
+ &Cinfo[ 122 ],
+ &Prop29
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop27 = {
+ 0xB4ED, /*start :错*/
+ 0xB4ED, /*end :错, len=1*/
+ &Cinfo[ 121 ],
+ &Prop28
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop26 = {
+ 0xB4E6, /*start :存*/
+ 0xB4E6, /*end :存, len=1*/
+ &Cinfo[ 120 ],
+ &Prop27
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop25 = {
+ 0xB3F6, /*start :出*/
+ 0xB3F6, /*end :出, len=1*/
+ &Cinfo[ 119 ],
+ &Prop26
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop24 = {
+ 0xB3CC, /*start :程*/
+ 0xB3CC, /*end :程, len=1*/
+ &Cinfo[ 118 ],
+ &Prop25
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop23 = {
+ 0xB3C9, /*start :成*/
+ 0xB3C9, /*end :成, len=1*/
+ &Cinfo[ 117 ],
+ &Prop24
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop22 = {
+ 0xB3AC, /*start :超*/
+ 0xB3AC, /*end :超, len=1*/
+ &Cinfo[ 116 ],
+ &Prop23
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop21 = {
+ 0xB3A7, /*start :厂*/
+ 0xB3A7, /*end :厂, len=1*/
+ &Cinfo[ 115 ],
+ &Prop22
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop20 = {
+ 0xB3A3, /*start :常*/
+ 0xB3A3, /*end :常, len=1*/
+ &Cinfo[ 114 ],
+ &Prop21
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop19 = {
+ 0xB2E9, /*start :查*/
+ 0xB2E9, /*end :查, len=1*/
+ &Cinfo[ 113 ],
+ &Prop20
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop18 = {
+ 0xB2E2, /*start :测*/
+ 0xB2E2, /*end :测, len=1*/
+ &Cinfo[ 112 ],
+ &Prop19
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop17 = {
+ 0xB2CE, /*start :参*/
+ 0xB2CE, /*end :参, len=1*/
+ &Cinfo[ 111 ],
+ &Prop18
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop16 = {
+ 0xB2CB, /*start :菜*/
+ 0xB2CB, /*end :菜, len=1*/
+ &Cinfo[ 110 ],
+ &Prop17
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop15 = {
+ 0xB2BB, /*start :不*/
+ 0xB2BB, /*end :不, len=1*/
+ &Cinfo[ 109 ],
+ &Prop16
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop14 = {
+ 0xB1E4, /*start :变*/
+ 0xB1E4, /*end :变, len=1*/
+ &Cinfo[ 108 ],
+ &Prop15
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop13 = {
+ 0xB1E0, /*start :编*/
+ 0xB1E0, /*end :编, len=1*/
+ &Cinfo[ 107 ],
+ &Prop14
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop12 = {
+ 0xB1BE, /*start :本*/
+ 0xB1BE, /*end :本, len=1*/
+ &Cinfo[ 106 ],
+ &Prop13
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop11 = {
+ 0xB1B8, /*start :备*/
+ 0xB1B8, /*end :备, len=1*/
+ &Cinfo[ 105 ],
+ &Prop12
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop10 = {
+ 0xB1A3, /*start :保*/
+ 0xB1A3, /*end :保, len=1*/
+ &Cinfo[ 104 ],
+ &Prop11
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop9 = {
+ 0xB0FC, /*start :包*/
+ 0xB0FC, /*end :包, len=1*/
+ &Cinfo[ 103 ],
+ &Prop10
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop8 = {
+ 0xB0E6, /*start :版*/
+ 0xB0E6, /*end :版, len=1*/
+ &Cinfo[ 102 ],
+ &Prop9
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop7 = {
+ 0xB0DC, /*start :败*/
+ 0xB0DC, /*end :败, len=1*/
+ &Cinfo[ 101 ],
+ &Prop8
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop6 = {
+ 0xA848, /*start :℉*/
+ 0xA848, /*end :℉, len=1*/
+ &Cinfo[ 100 ],
+ &Prop7
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop5 = {
+ 0xA3AC, /*start :,*/
+ 0xA3AC, /*end :,, len=1*/
+ &Cinfo[ 99 ],
+ &Prop6
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop4 = {
+ 0xA1E6, /*start :℃*/
+ 0xA1E6, /*end :℃, len=1*/
+ &Cinfo[ 98 ],
+ &Prop5
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop3 = {
+ 0xA1E3, /*start :°*/
+ 0xA1E3, /*end :°, len=1*/
+ &Cinfo[ 97 ],
+ &Prop4
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop2 = {
+ 0xA1A3, /*start :。*/
+ 0xA1A3, /*end :。, len=1*/
+ &Cinfo[ 96 ],
+ &Prop3
+};
+
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop1 = {
+ 0x0020, /*start : */
+ 0x007F, /*end :, len=96*/
+ &Cinfo[ 0 ],
+ &Prop2
+};
+
+
+GUI_CONST_STORAGE GUI_FONT GUI_FontHZ24x24 = {
+ GUI_FONTTYPE_PROP_SJIS,
+ 24, /* height of font */
+ 24, /* space of font y */
+ 1,
+ 1,
+ &Prop1
+};
+
diff --git a/User/system/lib/lcd/font/HZ32x32.c b/User/system/lib/lcd/font/HZ32x32.c
new file mode 100644
index 0000000..92a4e2e
--- /dev/null
+++ b/User/system/lib/lcd/font/HZ32x32.c
@@ -0,0 +1,3765 @@
+/*
+**********************************************************************
+* UcGUI Font
+* Chinese GB2312 library
+* (c) Copyright 19xx-20xx, company name
+*
+*
+* 注:本字体文件由 ucGUI字体生成器v9.0 生成,作者:馋嘴猫(qq:602426967)
+* 字体:宋体,字形:粗体,大小:26,宽:32,高:32,水平偏移:0,垂直偏移:0
+*
+**********************************************************************
+*/
+
+#include "GUI.H"
+
+/* char: code:0x0020 */
+static GUI_CONST_STORAGE unsigned char ac0020[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: ! code:0x0021 */
+static GUI_CONST_STORAGE unsigned char ac0021[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, XXXX____, ________,
+ _______X, XXXX____, ________,
+ _______X, XXXX____, ________,
+ _______X, XXXX____, ________,
+ _______X, XXXX____, ________,
+ _______X, XXXX____, ________,
+ ________, XXXX____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, XXX_____, ________,
+ _______X, XXXX____, ________,
+ _______X, XXXX____, ________,
+ ________, XXX_____, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: " code:0x0022 */
+static GUI_CONST_STORAGE unsigned char ac0022[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ______XX, XX_XXXX_, ________,
+ ______XX, XX_XXXX_, ________,
+ _____XXX, XXXXXXX_, ________,
+ ____XXXX, _XXXX___, ________,
+ ____XXX_, _XXX____, ________,
+ ___XXX__, XXX_____, ________,
+ ___XX___, XX______, ________,
+ __XX___X, X_______, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: # code:0x0023 */
+static GUI_CONST_STORAGE unsigned char ac0023[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _____XX_, _____XX_, ________,
+ _____XX_, _____XX_, ________,
+ _____XX_, _____XX_, ________,
+ _____XX_, _____XX_, ________,
+ _____XX_, _____XX_, ________,
+ _XXXXXXX, XXXXXXXX, XX______,
+ _XXXXXXX, XXXXXXXX, XX______,
+ _XXXXXXX, XXXXXXXX, XX______,
+ ____XXX_, ____XXX_, ________,
+ ____XX__, ____XX__, ________,
+ ____XX__, ____XX__, ________,
+ ____XX__, ____XX__, ________,
+ ____XX__, ____XX__, ________,
+ ____XX__, ____XX__, ________,
+ ____XX__, ____XX__, ________,
+ _XXXXXXX, XXXXXXXX, XX______,
+ _XXXXXXX, XXXXXXXX, XX______,
+ _XXXXXXX, XXXXXXXX, XX______,
+ ___XXX__, ___XXX__, ________,
+ ___XXX__, ___XXX__, ________,
+ ___XX___, ___XXX__, ________,
+ ___XX___, ___XX___, ________,
+ ___XX___, ___XX___, ________,
+ ___XX___, ___XX___, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: $ code:0x0024 */
+static GUI_CONST_STORAGE unsigned char ac0024[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ______XX, XXXXX___, ________,
+ _____XXX, XX__XX__, ________,
+ ____XXX_, XX___XX_, ________,
+ ___XXX__, XX___XXX, ________,
+ ___XXX__, XX___XXX, ________,
+ ___XXX__, XX__XXXX, ________,
+ ___XXX__, XX__XXXX, ________,
+ ___XXXX_, XX______, ________,
+ ____XXXX, XX______, ________,
+ _____XXX, XX______, ________,
+ ______XX, XXX_____, ________,
+ _______X, XXXX____, ________,
+ ________, XXXXX___, ________,
+ ________, XXXXXX__, ________,
+ ________, XX_XXXX_, ________,
+ ________, XX__XXXX, ________,
+ ________, XX__XXXX, ________,
+ __XXXX__, XX___XXX, ________,
+ __XXXX__, XX___XXX, ________,
+ __XXXX__, XX___XXX, ________,
+ __XXX___, XX___XX_, ________,
+ ___XX___, XX__XXX_, ________,
+ ____XX__, XX_XXX__, ________,
+ _____XXX, XXXX____, ________,
+ ________, XX______, ________,
+ ________, XX______, ________};
+
+/* char: % code:0x0025 */
+static GUI_CONST_STORAGE unsigned char ac0025[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ __XXXX__, _____XX_, ________,
+ _XXXXXX_, ____XXX_, ________,
+ _XX__XX_, ____XX__, ________,
+ XXX__XXX, ____XX__, ________,
+ XXX__XXX, ___XX___, ________,
+ XXX__XXX, ___XX___, ________,
+ XXX__XXX, __XX____, ________,
+ XXX__XXX, __XX____, ________,
+ XXX__XXX, _XXX____, ________,
+ XXX__XXX, _XX_____, ________,
+ _XX__XX_, _XX_____, ________,
+ _XXXXXX_, XX__XXXX, ________,
+ __XXXX__, XX_XXXXX, X_______,
+ _______X, X__XX__X, X_______,
+ _______X, X_XXX__X, XX______,
+ ______XX, X_XXX__X, XX______,
+ ______XX, __XXX__X, XX______,
+ ______XX, __XXX__X, XX______,
+ _____XX_, __XXX__X, XX______,
+ _____XX_, __XXX__X, XX______,
+ ____XX__, __XXX__X, XX______,
+ ____XX__, ___XX__X, X_______,
+ ___XX___, ___XXXXX, X_______,
+ ___XX___, ____XXXX, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: & code:0x0026 */
+static GUI_CONST_STORAGE unsigned char ac0026[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _____XXX, XX______, ________,
+ ____XXX_, XX______, ________,
+ ___XXX__, XXX_____, ________,
+ ___XXX__, XXX_____, ________,
+ ___XXX__, XXX_____, ________,
+ ___XXX__, XXX_____, ________,
+ ___XXX__, XXX_____, ________,
+ ___XXX__, XX______, ________,
+ ___XXXXX, XX______, ________,
+ ____XXXX, X_______, ________,
+ ____XXXX, __XXXXXX, ________,
+ ___XXXXX, ___XXX__, ________,
+ __XXXXXX, ____XX__, ________,
+ _XXX_XXX, ____XX__, ________,
+ _XX__XXX, X___XX__, ________,
+ XXX___XX, X__XXX__, ________,
+ XXX___XX, XX_XX___, ________,
+ XXX____X, XX_XX___, ________,
+ XXX____X, XXXXX___, ________,
+ XXX_____, XXXX____, ________,
+ _XXX____, _XXXX___, XX______,
+ _XXX____, _XXXXX_X, XX______,
+ __XXX___, XX_XXXXX, X_______,
+ ___XXXXX, X___XXXX, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: ' code:0x0027 */
+static GUI_CONST_STORAGE unsigned char ac0027[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ___XXX__, ________, ________,
+ __XXXXX_, ________, ________,
+ __XXXXX_, ________, ________,
+ ___XXXX_, ________, ________,
+ ____XXX_, ________, ________,
+ ____XX__, ________, ________,
+ ___XXX__, ________, ________,
+ __XXX___, ________, ________,
+ _XXX____, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: ( code:0x0028 */
+static GUI_CONST_STORAGE unsigned char ac0028[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, _______X, X_______,
+ ________, ______XX, ________,
+ ________, _____XX_, ________,
+ ________, ____XXX_, ________,
+ ________, ____XX__, ________,
+ ________, ___XXX__, ________,
+ ________, __XXX___, ________,
+ ________, __XXX___, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, __XXX___, ________,
+ ________, __XXX___, ________,
+ ________, ___XXX__, ________,
+ ________, ___XXX__, ________,
+ ________, ____XXX_, ________,
+ ________, _____XX_, ________,
+ ________, ______XX, ________};
+
+/* char: ) code:0x0029 */
+static GUI_CONST_STORAGE unsigned char ac0029[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ __XX____, ________, ________,
+ ___XX___, ________, ________,
+ ____XX__, ________, ________,
+ ____XXX_, ________, ________,
+ _____XX_, ________, ________,
+ _____XXX, ________, ________,
+ ______XX, X_______, ________,
+ ______XX, X_______, ________,
+ _______X, XX______, ________,
+ _______X, XX______, ________,
+ _______X, XX______, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ _______X, XX______, ________,
+ _______X, XX______, ________,
+ _______X, XX______, ________,
+ ______XX, X_______, ________,
+ ______XX, X_______, ________,
+ _____XXX, ________, ________,
+ _____XXX, ________, ________,
+ ____XXX_, ________, ________,
+ ____XX__, ________, ________,
+ ___XX___, ________, ________};
+
+/* char: * code:0x002A */
+static GUI_CONST_STORAGE unsigned char ac002A[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, XXX_____, ________,
+ _______X, XXX_____, ________,
+ _______X, XXX_____, ________,
+ _______X, XXX_____, ________,
+ _XXXX___, XX___XXX, X_______,
+ _XXXXX__, XX__XXXX, X_______,
+ __XXXXX_, XX_XXXXX, ________,
+ ____XXXX, XXXXXX__, ________,
+ _______X, XXX_____, ________,
+ _______X, XXX_____, ________,
+ ____XXXX, XXXXXX__, ________,
+ __XXXXX_, XX_XXXXX, ________,
+ _XXXXX__, XX__XXXX, X_______,
+ _XXXX___, XX___XXX, X_______,
+ _______X, XXX_____, ________,
+ _______X, XXX_____, ________,
+ _______X, XXX_____, ________,
+ _______X, XXX_____, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: + code:0x002B */
+static GUI_CONST_STORAGE unsigned char ac002B[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, _XX_____, ________,
+ ________, _XX_____, ________,
+ ________, _XX_____, ________,
+ ________, _XX_____, ________,
+ ________, _XX_____, ________,
+ ________, _XX_____, ________,
+ ________, _XX_____, ________,
+ ________, _XX_____, ________,
+ __XXXXXX, XXXXXXXX, XX______,
+ ________, _XX_____, ________,
+ ________, _XX_____, ________,
+ ________, _XX_____, ________,
+ ________, _XX_____, ________,
+ ________, _XX_____, ________,
+ ________, _XX_____, ________,
+ ________, _XX_____, ________,
+ ________, _XX_____, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: , code:0x002C */
+static GUI_CONST_STORAGE unsigned char ac002C[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ___XXX__, ________, ________,
+ __XXXXX_, ________, ________,
+ __XXXXX_, ________, ________,
+ ___XXXX_, ________, ________,
+ ____XXX_, ________, ________,
+ ____XX__, ________, ________,
+ ___XXX__, ________, ________};
+
+/* char: - code:0x002D */
+static GUI_CONST_STORAGE unsigned char ac002D[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _XXXXXXX, XXXXXXXX, X_______,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: . code:0x002E */
+static GUI_CONST_STORAGE unsigned char ac002E[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ___XXX__, ________, ________,
+ __XXXXX_, ________, ________,
+ __XXXXX_, ________, ________,
+ ___XXX__, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: / code:0x002F */
+static GUI_CONST_STORAGE unsigned char ac002F[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, XX______,
+ ________, _______X, XX______,
+ ________, _______X, X_______,
+ ________, ______XX, ________,
+ ________, ______XX, ________,
+ ________, _____XX_, ________,
+ ________, _____XX_, ________,
+ ________, ____XX__, ________,
+ ________, ____XX__, ________,
+ ________, ___XX___, ________,
+ ________, ___XX___, ________,
+ ________, __XX____, ________,
+ ________, __XX____, ________,
+ ________, _XX_____, ________,
+ ________, _XX_____, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________,
+ ______XX, ________, ________,
+ ______XX, ________, ________,
+ _____XX_, ________, ________,
+ _____XX_, ________, ________,
+ ____XX__, ________, ________,
+ ____XX__, ________, ________,
+ ___XX___, ________, ________,
+ ___XX___, ________, ________,
+ __XX____, ________, ________,
+ _XXX____, ________, ________};
+
+/* char: 0 code:0x0030 */
+static GUI_CONST_STORAGE unsigned char ac0030[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _______X, XXXX____, ________,
+ _____XXX, ___XXX__, ________,
+ ____XXX_, ____XXX_, ________,
+ ____XXX_, _____XX_, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, ______XX, ________,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ ___XXX__, ______XX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ____XXX_, _____XX_, ________,
+ _____XX_, ____XXX_, ________,
+ _____XXX, ___XXX__, ________,
+ _______X, XXXX____, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: 1 code:0x0031 */
+static GUI_CONST_STORAGE unsigned char ac0031[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, _XX_____, ________,
+ ________, XXX_____, ________,
+ ____XXXX, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ _______X, XXXX____, ________,
+ ____XXXX, XXXXXXX_, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: 2 code:0x0032 */
+static GUI_CONST_STORAGE unsigned char ac0032[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ______XX, XXXXX___, ________,
+ ____XXX_, ___XXXX_, ________,
+ ___XXX__, _____XXX, ________,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ __XXXX__, ______XX, X_______,
+ __XXXX__, ______XX, X_______,
+ __XXXX__, ______XX, X_______,
+ ________, _____XXX, ________,
+ ________, _____XXX, ________,
+ ________, ____XXX_, ________,
+ ________, ____XXX_, ________,
+ ________, ___XX___, ________,
+ ________, __XX____, ________,
+ ________, _XX_____, ________,
+ ________, XX______, ________,
+ _______X, X_______, ________,
+ ______XX, ________, ________,
+ _____XX_, _______X, X_______,
+ ____XX__, _______X, X_______,
+ ___XX___, ______XX, X_______,
+ __XXX___, _____XXX, X_______,
+ __XXXXXX, XXXXXXXX, ________,
+ __XXXXXX, XXXXXXXX, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: 3 code:0x0033 */
+static GUI_CONST_STORAGE unsigned char ac0033[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _____XXX, XXXX____, ________,
+ ____XX__, __XXXX__, ________,
+ ___XX___, ____XXX_, ________,
+ __XX____, ____XXXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ ________, _____XXX, ________,
+ ________, ____XXX_, ________,
+ ________, ____XXX_, ________,
+ ________, __XXX___, ________,
+ _______X, XXXX____, ________,
+ ________, ___XXX__, ________,
+ ________, _____XX_, ________,
+ ________, _____XXX, ________,
+ ________, ______XX, X_______,
+ ________, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ __XXXX__, ______XX, X_______,
+ __XXXX__, ______XX, X_______,
+ __XXXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ____XXX_, ___XXX__, ________,
+ ______XX, XXXXX___, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: 4 code:0x0034 */
+static GUI_CONST_STORAGE unsigned char ac0034[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ___XXX__, ________,
+ ________, ___XXX__, ________,
+ ________, __XXXX__, ________,
+ ________, _XXXXX__, ________,
+ ________, _XXXXX__, ________,
+ ________, XX_XXX__, ________,
+ _______X, XX_XXX__, ________,
+ _______X, X__XXX__, ________,
+ ______XX, ___XXX__, ________,
+ _____XXX, ___XXX__, ________,
+ _____XX_, ___XXX__, ________,
+ ____XX__, ___XXX__, ________,
+ ___XXX__, ___XXX__, ________,
+ ___XX___, ___XXX__, ________,
+ __XX____, ___XXX__, ________,
+ _XXX____, ___XXX__, ________,
+ _XXXXXXX, XXXXXXXX, XX______,
+ ________, ___XXX__, ________,
+ ________, ___XXX__, ________,
+ ________, ___XXX__, ________,
+ ________, ___XXX__, ________,
+ ________, ___XXX__, ________,
+ ________, ___XXX__, ________,
+ _______X, XXXXXXXX, X_______,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: 5 code:0x0035 */
+static GUI_CONST_STORAGE unsigned char ac0035[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ____XXXX, XXXXXXXX, X_______,
+ ____XXXX, XXXXXXXX, X_______,
+ ____XX__, ________, ________,
+ ____XX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XX___, ________, ________,
+ ___XX___, ________, ________,
+ ___XX___, ________, ________,
+ ___XX___, ________, ________,
+ ___XX_XX, XXXXX___, ________,
+ ___XXXXX, ____XXX_, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ________, ______XX, X_______,
+ ________, ______XX, X_______,
+ ________, ______XX, X_______,
+ ________, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ __XXXX__, ______XX, X_______,
+ __XXXX__, ______XX, X_______,
+ __XXX___, _____XXX, ________,
+ ___XX___, ____XXX_, ________,
+ ____XXX_, ___XXXX_, ________,
+ ______XX, XXXXX___, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: 6 code:0x0036 */
+static GUI_CONST_STORAGE unsigned char ac0036[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, XXXXXX__, ________,
+ ______XX, X____XX_, ________,
+ _____XXX, _____XXX, ________,
+ ____XXX_, _____XXX, ________,
+ ____XX__, _____XXX, ________,
+ ___XXX__, ________, ________,
+ ___XX___, ________, ________,
+ ___XX___, ________, ________,
+ __XXX___, ________, ________,
+ __XXX__X, XXXXX___, ________,
+ __XXXXXX, ____XXX_, ________,
+ __XXXXX_, _____XXX, ________,
+ __XXXX__, _____XXX, ________,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, _____XXX, ________,
+ ____XXX_, _____XXX, ________,
+ _____XXX, ____XXX_, ________,
+ _______X, XXXXX___, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: 7 code:0x0037 */
+static GUI_CONST_STORAGE unsigned char ac0037[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ___XXXXX, XXXXXXXX, X_______,
+ ___XXXXX, XXXXXXXX, X_______,
+ ___XXX__, ______XX, ________,
+ __XXX___, _____XX_, ________,
+ __XX____, _____XX_, ________,
+ __XX____, ____XX__, ________,
+ ________, ___XXX__, ________,
+ ________, ___XX___, ________,
+ ________, __XXX___, ________,
+ ________, __XX____, ________,
+ ________, _XXX____, ________,
+ ________, _XX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XX______, ________,
+ _______X, XX______, ________,
+ _______X, XX______, ________,
+ _______X, XX______, ________,
+ ______XX, XX______, ________,
+ ______XX, XX______, ________,
+ ______XX, XX______, ________,
+ ______XX, XX______, ________,
+ ______XX, XX______, ________,
+ ______XX, XX______, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: 8 code:0x0038 */
+static GUI_CONST_STORAGE unsigned char ac0038[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _______X, XXXXX___, ________,
+ _____XXX, ____XXX_, ________,
+ ____XXX_, _____XXX, ________,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXXX_, ______XX, X_______,
+ ____XXXX, _____XXX, ________,
+ ____XXXX, X____XX_, ________,
+ _____XXX, XXXXXX__, ________,
+ ______XX, XXXXX___, ________,
+ _____XXX, _XXXXX__, ________,
+ ____XXX_, ___XXXX_, ________,
+ ___XXX__, ____XXXX, ________,
+ __XXX___, _____XXX, X_______,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ ___XXX__, ______XX, ________,
+ ___XXX__, _____XXX, ________,
+ ____XXXX, ____XXX_, ________,
+ ______XX, XXXXX___, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: 9 code:0x0039 */
+static GUI_CONST_STORAGE unsigned char ac0039[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ______XX, XXXX____, ________,
+ ____XXXX, ___XXX__, ________,
+ ____XX__, ____XXX_, ________,
+ ___XXX__, _____XXX, ________,
+ ___XX___, _____XXX, ________,
+ __XXX___, ______XX, ________,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ __XXX___, _____XXX, X_______,
+ ___XXX__, _____XXX, X_______,
+ ___XXX__, ____XXXX, X_______,
+ ____XXXX, ___XX_XX, X_______,
+ ______XX, XXXX__XX, X_______,
+ ________, ______XX, X_______,
+ ________, _____XXX, ________,
+ ________, _____XXX, ________,
+ ________, _____XXX, ________,
+ ___XXX__, ____XXX_, ________,
+ ___XXX__, ____XXX_, ________,
+ ___XXX__, ___XXX__, ________,
+ ____XX__, _XXXX___, ________,
+ _____XXX, XXX_____, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: : code:0x003A */
+static GUI_CONST_STORAGE unsigned char ac003A[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, XXX_____, ________,
+ _______X, XXXX____, ________,
+ _______X, XXXX____, ________,
+ ________, XXX_____, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, XXX_____, ________,
+ _______X, XXXX____, ________,
+ _______X, XXXX____, ________,
+ ________, XXX_____, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: ; code:0x003B */
+static GUI_CONST_STORAGE unsigned char ac003B[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _______X, XXX_____, ________,
+ _______X, XXX_____, ________,
+ _______X, XXX_____, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _______X, XXX_____, ________,
+ _______X, XXX_____, ________,
+ _______X, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XX______, ________};
+
+/* char: < code:0x003C */
+static GUI_CONST_STORAGE unsigned char ac003C[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ______XX, ________,
+ ________, _____XX_, ________,
+ ________, ____XX__, ________,
+ ________, ___XX___, ________,
+ ________, __XX____, ________,
+ ________, _XX_____, ________,
+ ________, XX______, ________,
+ _______X, X_______, ________,
+ ______XX, ________, ________,
+ _____XX_, ________, ________,
+ ____XX__, ________, ________,
+ ___XX___, ________, ________,
+ ___XX___, ________, ________,
+ ____XX__, ________, ________,
+ _____XX_, ________, ________,
+ ______XX, ________, ________,
+ _______X, X_______, ________,
+ ________, XX______, ________,
+ ________, _XX_____, ________,
+ ________, __XX____, ________,
+ ________, ___XX___, ________,
+ ________, ____XX__, ________,
+ ________, _____XX_, ________,
+ ________, ______XX, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: = code:0x003D */
+static GUI_CONST_STORAGE unsigned char ac003D[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _XXXXXXX, XXXXXXXX, X_______,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _XXXXXXX, XXXXXXXX, X_______,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: > code:0x003E */
+static GUI_CONST_STORAGE unsigned char ac003E[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ __XX____, ________, ________,
+ ___XX___, ________, ________,
+ ____XX__, ________, ________,
+ _____XX_, ________, ________,
+ ______XX, ________, ________,
+ _______X, X_______, ________,
+ ________, XX______, ________,
+ ________, _XX_____, ________,
+ ________, __XX____, ________,
+ ________, ___XX___, ________,
+ ________, ____XX__, ________,
+ ________, _____XX_, ________,
+ ________, _____XX_, ________,
+ ________, ____XX__, ________,
+ ________, ___XX___, ________,
+ ________, __XX____, ________,
+ ________, _XX_____, ________,
+ ________, XX______, ________,
+ _______X, X_______, ________,
+ ______XX, ________, ________,
+ _____XX_, ________, ________,
+ ____XX__, ________, ________,
+ ___XX___, ________, ________,
+ __XX____, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: ? code:0x003F */
+static GUI_CONST_STORAGE unsigned char ac003F[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ______XX, XXXXX___, ________,
+ _____XXX, ____XXX_, ________,
+ ____XX__, _____XXX, ________,
+ ___XX___, ______XX, ________,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ __XXXX__, ______XX, X_______,
+ __XXXX__, ______XX, X_______,
+ ___XXX__, _____XXX, X_______,
+ ________, _____XXX, ________,
+ ________, ___XXXXX, ________,
+ ________, __XXXX__, ________,
+ ________, _XXX____, ________,
+ ________, XXX_____, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, XXX_____, ________,
+ _______X, XXXX____, ________,
+ _______X, XXXX____, ________,
+ ________, XXX_____, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: @ code:0x0040 */
+static GUI_CONST_STORAGE unsigned char ac0040[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _______X, XXXXX___, ________,
+ _____XXX, X___XXX_, ________,
+ ____XXX_, ______XX, ________,
+ ___XXX__, _______X, X_______,
+ ___XX___, _XXXXXXX, X_______,
+ __XXX___, XXX_XXX_, XX______,
+ __XXX__X, XX__XXX_, XX______,
+ __XX___X, XX__XXX_, XX______,
+ _XXX__XX, X___XX__, XX______,
+ _XXX__XX, X___XX__, XX______,
+ _XXX_XXX, ___XXX__, XX______,
+ _XXX_XXX, ___XXX__, XX______,
+ _XXX_XXX, ___XXX__, XX______,
+ _XXX_XXX, ___XXX__, XX______,
+ _XXX_XXX, ___XXX_X, X_______,
+ _XXX_XXX, __XXX__X, X_______,
+ _XXX__XX, _XXXX_XX, ________,
+ __XXX_XX, XX__XXX_, ________,
+ __XXX___, ________, XX______,
+ ___XX___, _______X, X_______,
+ ___XXX__, ______XX, X_______,
+ ____XXX_, _____XXX, ________,
+ _____XXX, ____XXX_, ________,
+ _______X, XXXXX___, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: A code:0x0041 */
+static GUI_CONST_STORAGE unsigned char ac0041[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _______X, XXX_____, ________,
+ _______X, XXX_____, ________,
+ _______X, XXX_____, ________,
+ _______X, XXX_____, ________,
+ ______XX, _XXX____, ________,
+ ______XX, _XXX____, ________,
+ ______XX, _XXX____, ________,
+ ______XX, _XXX____, ________,
+ _____XX_, __XXX___, ________,
+ _____XX_, __XXX___, ________,
+ _____XX_, __XXX___, ________,
+ _____XX_, __XXX___, ________,
+ ____XX__, ___XXX__, ________,
+ ____XX__, ___XXX__, ________,
+ ____XXXX, XXXXXX__, ________,
+ ___XXX__, ___XXX__, ________,
+ ___XX___, ___XXXX_, ________,
+ ___XX___, ____XXX_, ________,
+ ___XX___, ____XXX_, ________,
+ __XXX___, ____XXX_, ________,
+ __XX____, ____XXXX, ________,
+ __XX____, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ XXXXXX__, ___XXXXX, XX______,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: B code:0x0042 */
+static GUI_CONST_STORAGE unsigned char ac0042[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _XXXXXXX, XXXXXX__, ________,
+ ___XXX__, ___XXXXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, ___XXX__, ________,
+ ___XXXXX, XXXXX___, ________,
+ ___XXX__, ____XXX_, ________,
+ ___XXX__, ______XX, ________,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, _______X, XX______,
+ ___XXX__, _______X, XX______,
+ ___XXX__, _______X, XX______,
+ ___XXX__, _______X, XX______,
+ ___XXX__, _______X, XX______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ____XXXX, ________,
+ _XXXXXXX, XXXXXX__, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: C code:0x0043 */
+static GUI_CONST_STORAGE unsigned char ac0043[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _______X, XXXXXX_X, X_______,
+ _____XXX, ____XXXX, X_______,
+ ____XXX_, ______XX, X_______,
+ ___XXX__, _______X, X_______,
+ ___XXX__, ________, XX______,
+ __XXX___, ________, XX______,
+ __XXX___, ________, ________,
+ __XX____, ________, ________,
+ _XXX____, ________, ________,
+ _XXX____, ________, ________,
+ _XXX____, ________, ________,
+ _XXX____, ________, ________,
+ _XXX____, ________, ________,
+ _XXX____, ________, ________,
+ _XXX____, ________, ________,
+ _XXX____, ________, ________,
+ _XXX____, ________, ________,
+ __XXX___, ________, XX______,
+ __XXX___, ________, XX______,
+ __XXX___, _______X, X_______,
+ ___XXX__, _______X, X_______,
+ ____XXX_, ______XX, ________,
+ _____XXX, ____XXX_, ________,
+ _______X, XXXXX___, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: D code:0x0044 */
+static GUI_CONST_STORAGE unsigned char ac0044[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _XXXXXXX, XXXX____, ________,
+ ___XXX__, __XXXX__, ________,
+ ___XXX__, ____XXX_, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, _______X, XX______,
+ ___XXX__, _______X, XX______,
+ ___XXX__, _______X, XX______,
+ ___XXX__, _______X, XX______,
+ ___XXX__, _______X, XX______,
+ ___XXX__, _______X, XX______,
+ ___XXX__, _______X, XX______,
+ ___XXX__, _______X, XX______,
+ ___XXX__, _______X, XX______,
+ ___XXX__, _______X, XX______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ______XX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, ____XXX_, ________,
+ ___XXX__, __XXXX__, ________,
+ _XXXXXXX, XXXX____, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: E code:0x0045 */
+static GUI_CONST_STORAGE unsigned char ac0045[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _XXXXXXX, XXXXXXXX, X_______,
+ ___XXX__, _____XXX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, _______X, XX______,
+ ___XXX__, ________, XX______,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ____XX__, ________,
+ ___XXX__, ____XX__, ________,
+ ___XXX__, ____XX__, ________,
+ ___XXX__, ___XXX__, ________,
+ ___XXXXX, XXXXXX__, ________,
+ ___XXX__, ___XXX__, ________,
+ ___XXX__, ____XX__, ________,
+ ___XXX__, ____XX__, ________,
+ ___XXX__, ____XX__, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, XX______,
+ ___XXX__, ________, XX______,
+ ___XXX__, _______X, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, _____XXX, X_______,
+ _XXXXXXX, XXXXXXXX, X_______,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: F code:0x0046 */
+static GUI_CONST_STORAGE unsigned char ac0046[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _XXXXXXX, XXXXXXXX, X_______,
+ ___XXX__, _____XXX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, _______X, XX______,
+ ___XXX__, ________, XX______,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ____XX__, ________,
+ ___XXX__, ____XX__, ________,
+ ___XXX__, ___XXX__, ________,
+ ___XXXXX, XXXXXX__, ________,
+ ___XXX__, ___XXX__, ________,
+ ___XXX__, ____XX__, ________,
+ ___XXX__, ____XX__, ________,
+ ___XXX__, ____XX__, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ _XXXXXXX, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: G code:0x0047 */
+static GUI_CONST_STORAGE unsigned char ac0047[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _______X, XXXX____, ________,
+ _____XXX, ___XXXX_, ________,
+ ____XXX_, ____XXX_, ________,
+ ___XXX__, _____XXX, ________,
+ ___XX___, ______XX, ________,
+ __XXX___, ______XX, ________,
+ __XXX___, ________, ________,
+ __XX____, ________, ________,
+ _XXX____, ________, ________,
+ _XXX____, ________, ________,
+ _XXX____, ________, ________,
+ _XXX____, ________, ________,
+ _XXX____, ________, ________,
+ _XXX____, ___XXXXX, XX______,
+ _XXX____, _____XXX, ________,
+ _XXX____, _____XXX, ________,
+ _XXX____, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ ___XX___, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ____XXX_, _____XXX, ________,
+ _____XXX, ____XX__, ________,
+ ______XX, XXXXX___, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: H code:0x0048 */
+static GUI_CONST_STORAGE unsigned char ac0048[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ XXXXXXX_, ___XXXXX, XX______,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXXXXX, XXXXXXXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ XXXXXXX_, ___XXXXX, XX______,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: I code:0x0049 */
+static GUI_CONST_STORAGE unsigned char ac0049[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ____XXXX, XXXXXXX_, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ____XXXX, XXXXXXX_, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: J code:0x004A */
+static GUI_CONST_STORAGE unsigned char ac004A[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ______XX, XXXXXXXX, XXX_____,
+ ________, ___XXX__, ________,
+ ________, ___XXX__, ________,
+ ________, ___XXX__, ________,
+ ________, ___XXX__, ________,
+ ________, ___XXX__, ________,
+ ________, ___XXX__, ________,
+ ________, ___XXX__, ________,
+ ________, ___XXX__, ________,
+ ________, ___XXX__, ________,
+ ________, ___XXX__, ________,
+ ________, ___XXX__, ________,
+ ________, ___XXX__, ________,
+ ________, ___XXX__, ________,
+ ________, ___XXX__, ________,
+ ________, ___XXX__, ________,
+ ________, ___XXX__, ________,
+ ________, ___XXX__, ________,
+ ________, ___XXX__, ________,
+ ________, ___XXX__, ________,
+ ________, ___XXX__, ________,
+ ________, ___XXX__, ________,
+ ________, ___XXX__, ________,
+ ________, ___XXX__, ________,
+ _XXXX___, ___XX___, ________,
+ _XXXX___, __XXX___, ________};
+
+/* char: K code:0x004B */
+static GUI_CONST_STORAGE unsigned char ac004B[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _XXXXXXX, __XXXXXX, X_______,
+ ___XXX__, ____XXX_, ________,
+ ___XXX__, ____XX__, ________,
+ ___XXX__, ___XX___, ________,
+ ___XXX__, __XXX___, ________,
+ ___XXX__, __XX____, ________,
+ ___XXX__, _XX_____, ________,
+ ___XXX__, XX______, ________,
+ ___XXX__, XX______, ________,
+ ___XXX_X, XX______, ________,
+ ___XXXXX, XX______, ________,
+ ___XXXXX, XXX_____, ________,
+ ___XXXX_, XXX_____, ________,
+ ___XXX__, _XXX____, ________,
+ ___XXX__, _XXX____, ________,
+ ___XXX__, __XXX___, ________,
+ ___XXX__, __XXX___, ________,
+ ___XXX__, ___XXX__, ________,
+ ___XXX__, ___XXX__, ________,
+ ___XXX__, ___XXXX_, ________,
+ ___XXX__, ____XXX_, ________,
+ ___XXX__, ____XXXX, ________,
+ ___XXX__, _____XXX, ________,
+ _XXXXXXX, ___XXXXX, XX______,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: L code:0x004C */
+static GUI_CONST_STORAGE unsigned char ac004C[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _XXXXXXX, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, XX______,
+ ___XXX__, ________, XX______,
+ ___XXX__, _______X, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, _____XXX, X_______,
+ _XXXXXXX, XXXXXXXX, X_______,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: M code:0x004D */
+static GUI_CONST_STORAGE unsigned char ac004D[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ XXXXXX__, _____XXX, XXX_____,
+ __XXXX__, _____XXX, X_______,
+ __XXXX__, _____XXX, X_______,
+ __XXXX__, _____XXX, X_______,
+ __XXXXX_, ____XXXX, X_______,
+ __XXXXX_, ____XXXX, X_______,
+ __XXXXX_, ____XXXX, X_______,
+ __XXXXX_, ____XXXX, X_______,
+ __XXXXX_, ___XXXXX, X_______,
+ __XXXXXX, ___XX_XX, X_______,
+ __XX_XXX, ___XX_XX, X_______,
+ __XX_XXX, ___XX_XX, X_______,
+ __XX_XXX, __XXX_XX, X_______,
+ __XX_XXX, X_XX__XX, X_______,
+ __XX__XX, X_XX__XX, X_______,
+ __XX__XX, X_XX__XX, X_______,
+ __XX__XX, XXXX__XX, X_______,
+ __XX__XX, XXX___XX, X_______,
+ __XX___X, XXX___XX, X_______,
+ __XX___X, XXX___XX, X_______,
+ __XX___X, XXX___XX, X_______,
+ __XX___X, XX____XX, X_______,
+ __XX___X, XX____XX, X_______,
+ XXXXXX__, XX__XXXX, XXX_____,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: N code:0x004E */
+static GUI_CONST_STORAGE unsigned char ac004E[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _XXXXX__, ____XXXX, XX______,
+ ___XXXX_, ______XX, ________,
+ ___XXXX_, ______XX, ________,
+ ___XXXXX, ______XX, ________,
+ ___XXXXX, ______XX, ________,
+ ___XXXXX, X_____XX, ________,
+ ___XX_XX, X_____XX, ________,
+ ___XX_XX, X_____XX, ________,
+ ___XX__X, XX____XX, ________,
+ ___XX__X, XX____XX, ________,
+ ___XX___, XXX___XX, ________,
+ ___XX___, XXX___XX, ________,
+ ___XX___, _XXX__XX, ________,
+ ___XX___, _XXX__XX, ________,
+ ___XX___, __XXX_XX, ________,
+ ___XX___, __XXX_XX, ________,
+ ___XX___, ___XXXXX, ________,
+ ___XX___, ___XXXXX, ________,
+ ___XX___, ___XXXXX, ________,
+ ___XX___, ____XXXX, ________,
+ ___XX___, ____XXXX, ________,
+ ___XX___, _____XXX, ________,
+ ___XX___, _____XXX, ________,
+ _XXXXXX_, ______XX, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: O code:0x004F */
+static GUI_CONST_STORAGE unsigned char ac004F[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ______XX, XXXXX___, ________,
+ _____XXX, ___XXX__, ________,
+ ____XXX_, _____XX_, ________,
+ ___XXX__, _____XXX, ________,
+ ___XX___, ______XX, ________,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ _XXX____, _______X, X_______,
+ _XXX____, _______X, XX______,
+ _XXX____, _______X, XX______,
+ _XXX____, _______X, XX______,
+ _XXX____, _______X, XX______,
+ _XXX____, _______X, XX______,
+ _XXX____, _______X, XX______,
+ _XXX____, _______X, XX______,
+ _XXX____, _______X, XX______,
+ _XXX____, _______X, XX______,
+ __XXX___, _______X, X_______,
+ __XXX___, ______XX, X_______,
+ ___XX___, ______XX, ________,
+ ___XXX__, _____XXX, ________,
+ ____XXX_, _____XX_, ________,
+ _____XXX, ___XXX__, ________,
+ _______X, XXXXX___, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: P code:0x0050 */
+static GUI_CONST_STORAGE unsigned char ac0050[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _XXXXXXX, XXXXXX__, ________,
+ ___XXX__, ____XXXX, ________,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, _______X, XX______,
+ ___XXX__, _______X, XX______,
+ ___XXX__, _______X, XX______,
+ ___XXX__, _______X, XX______,
+ ___XXX__, _______X, XX______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, _____XXX, X_______,
+ ___XXX__, ____XXXX, ________,
+ ___XXXXX, XXXXXX__, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ _XXXXXXX, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: Q code:0x0051 */
+static GUI_CONST_STORAGE unsigned char ac0051[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ______XX, XXXXX___, ________,
+ _____XXX, ___XXX__, ________,
+ ____XXX_, _____XX_, ________,
+ ___XXX__, _____XXX, ________,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ __XXX___, _______X, X_______,
+ _XXX____, _______X, XX______,
+ _XXX____, _______X, XX______,
+ _XXX____, _______X, XX______,
+ _XXX____, _______X, XX______,
+ _XXX____, _______X, XX______,
+ _XXX____, _______X, XX______,
+ _XXX____, _______X, XX______,
+ _XXX____, _______X, XX______,
+ _XXX____, _______X, XX______,
+ _XXX____, _______X, XX______,
+ __XX_XXX, XXX____X, X_______,
+ __XXXXX_, _XXX__XX, X_______,
+ __XXXX__, __XXX_XX, X_______,
+ ___XXX__, __XXX_XX, ________,
+ ____XX__, __XXXXX_, ________,
+ _____XXX, ___XXXX_, ________,
+ ______XX, XXXXXX__, ________,
+ ________, ___XXXX_, XX______,
+ ________, ____XXXX, X_______};
+
+/* char: R code:0x0052 */
+static GUI_CONST_STORAGE unsigned char ac0052[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _XXXXXXX, XXXXX___, ________,
+ ___XXX__, ___XXXX_, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, ___XXXX_, ________,
+ ___XXXXX, XXXXX___, ________,
+ ___XXX__, _XXX____, ________,
+ ___XXX__, _XXX____, ________,
+ ___XXX__, _XXXX___, ________,
+ ___XXX__, __XXX___, ________,
+ ___XXX__, __XXXX__, ________,
+ ___XXX__, ___XXX__, ________,
+ ___XXX__, ___XXX__, ________,
+ ___XXX__, ___XXXX_, ________,
+ ___XXX__, ____XXX_, ________,
+ ___XXX__, ____XXXX, ________,
+ ___XXX__, _____XXX, ________,
+ _XXXXXXX, _____XXX, XX______,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: S code:0x0053 */
+static GUI_CONST_STORAGE unsigned char ac0053[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ______XX, XXXX____, ________,
+ ____XXX_, ___XXXXX, ________,
+ ___XXX__, ____XXXX, ________,
+ ___XX___, _____XXX, ________,
+ __XXX___, ______XX, ________,
+ __XXX___, ______XX, ________,
+ __XXX___, ________, ________,
+ __XXXX__, ________, ________,
+ ___XXXX_, ________, ________,
+ ___XXXXX, ________, ________,
+ _____XXX, XX______, ________,
+ _______X, XXXXX___, ________,
+ ________, _XXXXX__, ________,
+ ________, ___XXXX_, ________,
+ ________, ____XXXX, ________,
+ ________, _____XXX, X_______,
+ ________, ______XX, X_______,
+ __XX____, ______XX, X_______,
+ __XX____, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ ___XX___, ______XX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXXXX, ____XXX_, ________,
+ ___XX__X, XXXXX___, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: T code:0x0054 */
+static GUI_CONST_STORAGE unsigned char ac0054[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ __XXXXXX, XXXXXXXX, X_______,
+ __XXX___, XXX___XX, X_______,
+ __XX____, XXX____X, X_______,
+ _XXX____, XXX_____, XX______,
+ _XX_____, XXX_____, XX______,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ______XX, XXXXX___, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: U code:0x0055 */
+static GUI_CONST_STORAGE unsigned char ac0055[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ XXXXXXX_, ____XXXX, XX______,
+ __XXX___, ______XX, ________,
+ __XXX___, ______XX, ________,
+ __XXX___, ______XX, ________,
+ __XXX___, ______XX, ________,
+ __XXX___, ______XX, ________,
+ __XXX___, ______XX, ________,
+ __XXX___, ______XX, ________,
+ __XXX___, ______XX, ________,
+ __XXX___, ______XX, ________,
+ __XXX___, ______XX, ________,
+ __XXX___, ______XX, ________,
+ __XXX___, ______XX, ________,
+ __XXX___, ______XX, ________,
+ __XXX___, ______XX, ________,
+ __XXX___, ______XX, ________,
+ __XXX___, ______XX, ________,
+ __XXX___, ______XX, ________,
+ __XXX___, ______XX, ________,
+ __XXX___, ______XX, ________,
+ __XXX___, _____XXX, ________,
+ ___XXX__, _____XX_, ________,
+ ____XXX_, ___XXX__, ________,
+ ______XX, XXXX____, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: V code:0x0056 */
+static GUI_CONST_STORAGE unsigned char ac0056[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _XXXXXXX, ____XXXX, XX______,
+ ___XXX__, ______XX, ________,
+ ___XXX__, ______XX, ________,
+ ___XXXX_, _____XXX, ________,
+ ____XXX_, _____XX_, ________,
+ ____XXX_, _____XX_, ________,
+ ____XXX_, _____XX_, ________,
+ ____XXXX, ____XX__, ________,
+ _____XXX, ____XX__, ________,
+ _____XXX, ____XX__, ________,
+ _____XXX, ____XX__, ________,
+ _____XXX, ___XX___, ________,
+ _____XXX, X__XX___, ________,
+ ______XX, X__XX___, ________,
+ ______XX, X__XX___, ________,
+ ______XX, X_XX____, ________,
+ ______XX, XXXX____, ________,
+ _______X, XXXX____, ________,
+ _______X, XXXX____, ________,
+ _______X, XXX_____, ________,
+ _______X, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: W code:0x0057 */
+static GUI_CONST_STORAGE unsigned char ac0057[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ XXXXXX_X, XXXXX_XX, XXX_____,
+ _XXXX___, XXX____X, XX______,
+ __XXX___, XXX____X, X_______,
+ __XXX___, XXX____X, X_______,
+ __XXX___, XXXX___X, X_______,
+ __XXX___, _XXX___X, X_______,
+ __XXX___, XXXX__XX, ________,
+ __XXX___, XXXX__XX, ________,
+ __XXX___, XXXX__XX, ________,
+ ___XXX__, XXXX__XX, ________,
+ ___XXX__, XXXX__XX, ________,
+ ___XXX_X, XXXXX_XX, ________,
+ ___XXX_X, X_XXXXX_, ________,
+ ___XXX_X, X_XXXXX_, ________,
+ ___XXX_X, X_XXXXX_, ________,
+ ____XXXX, X_XXXXX_, ________,
+ ____XXXX, __XXXXX_, ________,
+ ____XXXX, __XXXXX_, ________,
+ ____XXXX, ___XXX__, ________,
+ ____XXXX, ___XXX__, ________,
+ ____XXXX, ___XXX__, ________,
+ _____XX_, ___XXX__, ________,
+ _____XX_, ___XXX__, ________,
+ _____XX_, ___XX___, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: X code:0x0058 */
+static GUI_CONST_STORAGE unsigned char ac0058[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _XXXXXXX, ___XXXXX, X_______,
+ ___XXXX_, _____XXX, ________,
+ ____XXX_, _____XX_, ________,
+ ____XXX_, ____XX__, ________,
+ _____XXX, ____XX__, ________,
+ _____XXX, ___XX___, ________,
+ ______XX, X__XX___, ________,
+ ______XX, X_XXX___, ________,
+ ______XX, XXXX____, ________,
+ _______X, XXXX____, ________,
+ _______X, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ _______X, XXXX____, ________,
+ _______X, XXXX____, ________,
+ ______XX, X_XXX___, ________,
+ ______XX, __XXX___, ________,
+ ______XX, __XXXX__, ________,
+ _____XX_, ___XXX__, ________,
+ _____XX_, ___XXXX_, ________,
+ ____XX__, ____XXX_, ________,
+ ____XX__, ____XXXX, ________,
+ ___XXX__, _____XXX, ________,
+ _XXXXXX_, ___XXXXX, XX______,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: Y code:0x0059 */
+static GUI_CONST_STORAGE unsigned char ac0059[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _XXXXXXX, ____XXXX, XX______,
+ __XXXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXXX_, _____XX_, ________,
+ ____XXX_, _____XX_, ________,
+ ____XXX_, ____XX__, ________,
+ _____XXX, ____XX__, ________,
+ _____XXX, ___XXX__, ________,
+ _____XXX, X__XX___, ________,
+ ______XX, X__XX___, ________,
+ ______XX, X_XX____, ________,
+ _______X, XXXX____, ________,
+ _______X, XXXX____, ________,
+ _______X, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ______XX, XXXXX___, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: Z code:0x005A */
+static GUI_CONST_STORAGE unsigned char ac005A[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ___XXXXX, XXXXXXXX, X_______,
+ ___XXXX_, _____XXX, ________,
+ ___XXX__, ____XXXX, ________,
+ __XXX___, ____XXX_, ________,
+ __XX____, ___XXXX_, ________,
+ ________, ___XXX__, ________,
+ ________, __XXXX__, ________,
+ ________, __XXX___, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ _______X, XX______, ________,
+ _______X, XX______, ________,
+ ______XX, X_______, ________,
+ ______XX, X_______, ________,
+ _____XXX, ________, ________,
+ ____XXXX, ________, ________,
+ ____XXX_, _______X, X_______,
+ ___XXXX_, _______X, X_______,
+ ___XXX__, ______XX, ________,
+ __XXXX__, _____XXX, ________,
+ __XXX___, ____XXXX, ________,
+ _XXXXXXX, XXXXXXXX, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: [ code:0x005B */
+static GUI_CONST_STORAGE unsigned char ac005B[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ _______X, XXXXXXXX, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________};
+
+/* char: \ code:0x005C */
+static GUI_CONST_STORAGE unsigned char ac005C[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ___XXX__, ________, ________,
+ ____XX__, ________, ________,
+ ____XXX_, ________, ________,
+ ____XXX_, ________, ________,
+ _____XX_, ________, ________,
+ _____XXX, ________, ________,
+ _____XXX, ________, ________,
+ ______XX, X_______, ________,
+ ______XX, X_______, ________,
+ _______X, X_______, ________,
+ _______X, XX______, ________,
+ _______X, XX______, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, __XX____, ________,
+ ________, __XXX___, ________,
+ ________, __XXX___, ________,
+ ________, ___XXX__, ________,
+ ________, ___XXX__, ________,
+ ________, ____XX__, ________,
+ ________, ____XXX_, ________,
+ ________, ____XXX_, ________,
+ ________, _____XXX, ________,
+ ________, _____XXX, ________};
+
+/* char: ] code:0x005D */
+static GUI_CONST_STORAGE unsigned char ac005D[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ __XXXXXX, XXXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XXX____, ________};
+
+/* char: ^ code:0x005E */
+static GUI_CONST_STORAGE unsigned char ac005E[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ _______X, XXXX____, ________,
+ ______XX, XXXX____, ________,
+ _____XXX, __XXX___, ________,
+ ____XX__, ____XX__, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: _ code:0x005F */
+static GUI_CONST_STORAGE unsigned char ac005F[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: ` code:0x0060 */
+static GUI_CONST_STORAGE unsigned char ac0060[96] = {
+ ________, ________, ________,
+ ___XXXXX, ________, ________,
+ _____XXX, X_______, ________,
+ _______X, XX______, ________,
+ ________, _XX_____, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: a code:0x0061 */
+static GUI_CONST_STORAGE unsigned char ac0061[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ______XX, XXXXX___, ________,
+ ____XXX_, ___XXX__, ________,
+ ___XXX__, ____XXX_, ________,
+ ___XXX__, ____XXX_, ________,
+ ___XXX__, ____XXX_, ________,
+ ________, ____XXX_, ________,
+ _______X, XXXXXXX_, ________,
+ _____XXX, X___XXX_, ________,
+ ___XXXX_, ____XXX_, ________,
+ ___XXX__, ____XXX_, ________,
+ __XXX___, ____XXX_, ________,
+ __XXX___, ____XXX_, ________,
+ __XXX___, ____XXX_, XX______,
+ __XXX___, ___XXXX_, XX______,
+ ___XXX__, __XXXXX_, XX______,
+ ____XXXX, XXX__XXX, X_______,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: b code:0x0062 */
+static GUI_CONST_STORAGE unsigned char ac0062[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ____XX__, ________, ________,
+ _XXXXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, XXXXXX__, ________,
+ ___XXXXX, X___XXX_, ________,
+ ___XXXXX, _____XXX, ________,
+ ___XXXX_, _____XXX, ________,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, _____XXX, ________,
+ ___XXXX_, _____XXX, ________,
+ ___XXXXX, ____XXX_, ________,
+ ___XX__X, XXXXX___, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: c code:0x0063 */
+static GUI_CONST_STORAGE unsigned char ac0063[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _______X, XXXXXX__, ________,
+ _____XXX, X___XXX_, ________,
+ ____XXX_, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ __XXX___, ________, ________,
+ __XXX___, ________, ________,
+ __XXX___, ________, ________,
+ __XXX___, ________, ________,
+ __XXX___, ________, ________,
+ __XXX___, ________, ________,
+ ___XX___, _______X, X_______,
+ ___XXX__, ______XX, ________,
+ ____XXX_, ______XX, ________,
+ _____XXX, ____XXX_, ________,
+ ______XX, XXXXX___, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: d code:0x0064 */
+static GUI_CONST_STORAGE unsigned char ac0064[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ______XX, ________,
+ ________, ___XXXXX, ________,
+ ________, _____XXX, ________,
+ ________, _____XXX, ________,
+ ________, _____XXX, ________,
+ ________, _____XXX, ________,
+ ________, _____XXX, ________,
+ ________, _____XXX, ________,
+ ________, _____XXX, ________,
+ ______XX, XXXX_XXX, ________,
+ _____XXX, ___XXXXX, ________,
+ ____XXX_, ____XXXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ ___XXX__, ____XXXX, ________,
+ ___XXX__, ____XXXX, ________,
+ ____XXX_, ___XXXXX, XX______,
+ ______XX, XXXX_XX_, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: e code:0x0065 */
+static GUI_CONST_STORAGE unsigned char ac0065[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _______X, XXXXX___, ________,
+ _____XXX, ____XXX_, ________,
+ ____XXX_, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ __XXXXXX, XXXXXXXX, X_______,
+ __XXX___, ________, ________,
+ __XXX___, ________, ________,
+ __XXX___, ________, ________,
+ ___XX___, _______X, X_______,
+ ___XXX__, _______X, X_______,
+ ____XXX_, ______XX, ________,
+ _____XXX, ____XXX_, ________,
+ _______X, XXXXXX__, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: f code:0x0066 */
+static GUI_CONST_STORAGE unsigned char ac0066[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, _XXXXXXX, ________,
+ ________, XXX____X, XX______,
+ _______X, XX_____X, XX______,
+ ______XX, X______X, XX______,
+ ______XX, X_______, ________,
+ ______XX, X_______, ________,
+ ______XX, X_______, ________,
+ ______XX, X_______, ________,
+ __XXXXXX, XXXXXXX_, ________,
+ ______XX, X_______, ________,
+ ______XX, X_______, ________,
+ ______XX, X_______, ________,
+ ______XX, X_______, ________,
+ ______XX, X_______, ________,
+ ______XX, X_______, ________,
+ ______XX, X_______, ________,
+ ______XX, X_______, ________,
+ ______XX, X_______, ________,
+ ______XX, X_______, ________,
+ ______XX, X_______, ________,
+ ______XX, X_______, ________,
+ ______XX, X_______, ________,
+ ______XX, X_______, ________,
+ __XXXXXX, XXXXXX__, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: g code:0x0067 */
+static GUI_CONST_STORAGE unsigned char ac0067[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ______XX, XXXX__XX, XX______,
+ _____XXX, __XXXXXX, XX______,
+ ____XXX_, ___XXX__, ________,
+ ___XXX__, ____XXX_, ________,
+ ___XXX__, ____XXX_, ________,
+ ___XXX__, ____XXX_, ________,
+ ___XXX__, ____XXX_, ________,
+ ____XXX_, ___XXX__, ________,
+ _____XXX, ___XXX__, ________,
+ ____XXXX, XXXX____, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXXXX, XXX_____, ________,
+ _____XXX, XXXXXXX_, ________,
+ ___XXX__, ___XXXXX, ________,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______};
+
+/* char: h code:0x0068 */
+static GUI_CONST_STORAGE unsigned char ac0068[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ____XX__, ________, ________,
+ _XXXXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, XXXXXX__, ________,
+ ___XXXXX, X___XXX_, ________,
+ ___XXXX_, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ _XXXXXXX, ___XXXXX, XX______,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: i code:0x0069 */
+static GUI_CONST_STORAGE unsigned char ac0069[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, XXX_____, ________,
+ _______X, XXXX____, ________,
+ ________, XXX_____, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, _XX_____, ________,
+ ____XXXX, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ____XXXX, XXXXXXX_, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: j code:0x006A */
+static GUI_CONST_STORAGE unsigned char ac006A[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ____XXXX, ________,
+ ________, ___XXXXX, ________,
+ ________, ____XXX_, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, _____XX_, ________,
+ ________, XXXXXXX_, ________,
+ ________, ____XXX_, ________,
+ ________, ____XXX_, ________,
+ ________, ____XXX_, ________,
+ ________, ____XXX_, ________,
+ ________, ____XXX_, ________,
+ ________, ____XXX_, ________,
+ ________, ____XXX_, ________,
+ ________, ____XXX_, ________,
+ ________, ____XXX_, ________,
+ ________, ____XXX_, ________,
+ ________, ____XXX_, ________,
+ ________, ____XXX_, ________,
+ ________, ____XXX_, ________,
+ ________, ____XXX_, ________,
+ ________, ____XXX_, ________,
+ ________, ____XXX_, ________,
+ ___XXX__, ____XX__, ________};
+
+/* char: k code:0x006B */
+static GUI_CONST_STORAGE unsigned char ac006B[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ____XX__, ________, ________,
+ _XXXXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, __XXXXXX, X_______,
+ ___XXX__, ___XXXX_, ________,
+ ___XXX__, ___XX___, ________,
+ ___XXX__, __XXX___, ________,
+ ___XXX__, _XXX____, ________,
+ ___XXX__, XXX_____, ________,
+ ___XXX_X, XXX_____, ________,
+ ___XXXXX, XXXX____, ________,
+ ___XXXXX, _XXX____, ________,
+ ___XXXX_, _XXXX___, ________,
+ ___XXX__, __XXXX__, ________,
+ ___XXX__, ___XXX__, ________,
+ ___XXX__, ___XXXX_, ________,
+ ___XXX__, ____XXXX, ________,
+ ___XXX__, _____XXX, ________,
+ _XXXXXXX, ___XXXXX, XX______,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: l code:0x006C */
+static GUI_CONST_STORAGE unsigned char ac006C[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, _XX_____, ________,
+ ____XXXX, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ________, XXX_____, ________,
+ ____XXXX, XXXXXXX_, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: m code:0x006D */
+static GUI_CONST_STORAGE unsigned char ac006D[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ___XX___, ________, ________,
+ _XXXXXXX, XX_XXXXX, ________,
+ __XXXX__, XXXX__XX, X_______,
+ __XXXX__, XXX___XX, X_______,
+ __XXX___, XXX___XX, X_______,
+ __XXX___, XXX___XX, X_______,
+ __XXX___, XXX___XX, X_______,
+ __XXX___, XXX___XX, X_______,
+ __XXX___, XXX___XX, X_______,
+ __XXX___, XXX___XX, X_______,
+ __XXX___, XXX___XX, X_______,
+ __XXX___, XXX___XX, X_______,
+ __XXX___, XXX___XX, X_______,
+ __XXX___, XXX___XX, X_______,
+ __XXX___, XXX___XX, X_______,
+ __XXX___, XXX___XX, X_______,
+ _XXXXX_X, XXXX_XXX, XX______,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: n code:0x006E */
+static GUI_CONST_STORAGE unsigned char ac006E[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ____XX__, XXXXXX__, ________,
+ _XXXXXXX, X___XXX_, ________,
+ ___XXXXX, _____XXX, ________,
+ ___XXXX_, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ _XXXXXXX, ___XXXXX, XX______,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: o code:0x006F */
+static GUI_CONST_STORAGE unsigned char ac006F[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ______XX, XXXXX___, ________,
+ _____XXX, ___XXX__, ________,
+ ____XXX_, ____XXX_, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ __XXX___, ______XX, X_______,
+ ___XX___, ______XX, ________,
+ ___XXX__, _____XXX, ________,
+ ____XXX_, ____XXX_, ________,
+ _____XXX, ___XXX__, ________,
+ ______XX, XXXXX___, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: p code:0x0070 */
+static GUI_CONST_STORAGE unsigned char ac0070[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ____XX_X, XXXXX___, ________,
+ _XXXXXXX, X___XXX_, ________,
+ ___XXXX_, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, ______XX, X_______,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXXX_, ____XXX_, ________,
+ ___XXXXX, ___XXX__, ________,
+ ___XXX_X, XXXXX___, ________,
+ ___XXX__, ________, ________,
+ ___XXX__, ________, ________};
+
+/* char: q code:0x0071 */
+static GUI_CONST_STORAGE unsigned char ac0071[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ______XX, XXXX__XX, ________,
+ _____XXX, ___XXXXX, ________,
+ ____XXX_, ____XXXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ __XXX___, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, ____XXXX, ________,
+ ____XXX_, ___XXXXX, ________,
+ ______XX, XXXX_XXX, ________,
+ ________, _____XXX, ________,
+ ________, _____XXX, ________};
+
+/* char: r code:0x0072 */
+static GUI_CONST_STORAGE unsigned char ac0072[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _____XXX, ___XXXXX, ________,
+ _XXXXXXX, __XX__XX, X_______,
+ _____XXX, XXX___XX, X_______,
+ _____XXX, XX____XX, X_______,
+ _____XXX, X_______, ________,
+ _____XXX, ________, ________,
+ _____XXX, ________, ________,
+ _____XXX, ________, ________,
+ _____XXX, ________, ________,
+ _____XXX, ________, ________,
+ _____XXX, ________, ________,
+ _____XXX, ________, ________,
+ _____XXX, ________, ________,
+ _____XXX, ________, ________,
+ _____XXX, ________, ________,
+ _XXXXXXX, XXXX____, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: s code:0x0073 */
+static GUI_CONST_STORAGE unsigned char ac0073[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _______X, XXXXX_XX, ________,
+ _____XXX, ____XXXX, ________,
+ ____XXX_, _____XXX, ________,
+ ____XXX_, ______XX, ________,
+ ____XXX_, ______XX, ________,
+ ____XXXX, ________, ________,
+ _____XXX, XX______, ________,
+ ______XX, XXXX____, ________,
+ ________, XXXXXX__, ________,
+ ________, ___XXXX_, ________,
+ ________, ____XXXX, ________,
+ ___XX___, _____XXX, ________,
+ ___XX___, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXXXX, ____XXX_, ________,
+ ___XX__X, XXXXX___, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: t code:0x0074 */
+static GUI_CONST_STORAGE unsigned char ac0074[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________,
+ _______X, X_______, ________,
+ ______XX, X_______, ________,
+ _____XXX, X_______, ________,
+ __XXXXXX, XXXXXXX_, ________,
+ ______XX, X_______, ________,
+ ______XX, X_______, ________,
+ ______XX, X_______, ________,
+ ______XX, X_______, ________,
+ ______XX, X_______, ________,
+ ______XX, X_______, ________,
+ ______XX, X_______, ________,
+ ______XX, X_______, ________,
+ ______XX, X_______, ________,
+ ______XX, X_______, ________,
+ ______XX, X_______, ________,
+ ______XX, X_____XX, ________,
+ ______XX, X____XX_, ________,
+ _______X, XX___XX_, ________,
+ ________, XXXXXX__, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: u code:0x0075 */
+static GUI_CONST_STORAGE unsigned char ac0075[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ____XX__, ______XX, ________,
+ _XXXXX__, ___XXXXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, _____XXX, ________,
+ ___XXX__, ____XXXX, ________,
+ ____XXX_, ___XXXXX, XX______,
+ _____XXX, XXXX_XX_, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: v code:0x0076 */
+static GUI_CONST_STORAGE unsigned char ac0076[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ _XXXXXXX, ___XXXXX, X_______,
+ ___XXX__, _____XX_, ________,
+ ___XXX__, _____XX_, ________,
+ ____XXX_, ____XX__, ________,
+ ____XXX_, ____XX__, ________,
+ ____XXX_, ____XX__, ________,
+ _____XXX, ___XX___, ________,
+ _____XXX, ___XX___, ________,
+ _____XXX, __XXX___, ________,
+ ______XX, X_XX____, ________,
+ ______XX, X_XX____, ________,
+ ______XX, XXX_____, ________,
+ _______X, XXX_____, ________,
+ _______X, XXX_____, ________,
+ _______X, XX______, ________,
+ ________, XX______, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: w code:0x0077 */
+static GUI_CONST_STORAGE unsigned char ac0077[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ XXXXXX_X, XXXX_XXX, XXX_____,
+ _XXXX___, XXX____X, X_______,
+ __XXX___, XXX____X, X_______,
+ __XXX___, XXX____X, X_______,
+ __XXX___, XXXX__XX, ________,
+ ___XX___, XXXX__XX, ________,
+ ___XXX__, XXXX__XX, ________,
+ ___XXX_X, XXXX__XX, ________,
+ ___XXX_X, X_XXXXX_, ________,
+ ____XX_X, X_XXXXX_, ________,
+ ____XXXX, X_XXXXX_, ________,
+ ____XXXX, __XXXXX_, ________,
+ ____XXXX, ___XXX__, ________,
+ _____XXX, ___XXX__, ________,
+ _____XX_, ___XXX__, ________,
+ _____XX_, ___XX___, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: x code:0x0078 */
+static GUI_CONST_STORAGE unsigned char ac0078[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ __XXXXXX, X_XXXXXX, ________,
+ ____XXXX, ____XX__, ________,
+ _____XXX, ___XX___, ________,
+ _____XXX, ___XX___, ________,
+ ______XX, X_XX____, ________,
+ ______XX, XXXX____, ________,
+ _______X, XXX_____, ________,
+ ________, XXX_____, ________,
+ _______X, XXX_____, ________,
+ _______X, XXXX____, ________,
+ ______XX, __XXX___, ________,
+ _____XXX, __XXX___, ________,
+ _____XX_, ___XXX__, ________,
+ ____XX__, ___XXX__, ________,
+ ___XXX__, ____XXX_, ________,
+ _XXXXXX_, __XXXXXX, X_______,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: y code:0x0079 */
+static GUI_CONST_STORAGE unsigned char ac0079[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ __XXXXXX, X__XXXXX, XX______,
+ ____XXX_, _____XXX, ________,
+ ____XXX_, _____XX_, ________,
+ _____XXX, _____XX_, ________,
+ _____XXX, ____XXX_, ________,
+ ______XX, ____XX__, ________,
+ ______XX, X___XX__, ________,
+ ______XX, X__XXX__, ________,
+ _______X, XX_XX___, ________,
+ _______X, XX_XX___, ________,
+ _______X, XXXXX___, ________,
+ ________, XXXX____, ________,
+ ________, XXXX____, ________,
+ ________, _XXX____, ________,
+ ________, _XX_____, ________,
+ ________, _XX_____, ________,
+ ________, XX______, ________,
+ ________, XX______, ________};
+
+/* char: z code:0x007A */
+static GUI_CONST_STORAGE unsigned char ac007A[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ___XXXXX, XXXXXXXX, ________,
+ __XXXX__, ____XXXX, ________,
+ __XXX___, ___XXXX_, ________,
+ __XX____, ___XXX__, ________,
+ __XX____, __XXX___, ________,
+ ________, _XXXX___, ________,
+ ________, XXXX____, ________,
+ ________, XXX_____, ________,
+ _______X, XX______, ________,
+ ______XX, XX______, ________,
+ _____XXX, X______X, X_______,
+ _____XXX, _______X, X_______,
+ ____XXX_, ______XX, X_______,
+ ___XXX__, ______XX, ________,
+ __XXXX__, ____XXXX, ________,
+ __XXXXXX, XXXXXXXX, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: { code:0x007B */
+static GUI_CONST_STORAGE unsigned char ac007B[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, _____XXX, ________,
+ ________, ____XX__, ________,
+ ________, ___XX___, ________,
+ ________, ___XX___, ________,
+ ________, ___XX___, ________,
+ ________, ___XX___, ________,
+ ________, ___XX___, ________,
+ ________, ___XX___, ________,
+ ________, ___XX___, ________,
+ ________, ___XX___, ________,
+ ________, ___XX___, ________,
+ ________, ___XX___, ________,
+ ________, ___XX___, ________,
+ ________, ___XX___, ________,
+ ________, _XXX____, ________,
+ ________, XX______, ________,
+ ________, _XXX____, ________,
+ ________, ___XX___, ________,
+ ________, ___XX___, ________,
+ ________, ___XX___, ________,
+ ________, ___XX___, ________,
+ ________, ___XX___, ________,
+ ________, ___XX___, ________,
+ ________, ___XX___, ________,
+ ________, ___XX___, ________,
+ ________, ___XX___, ________,
+ ________, ___XX___, ________,
+ ________, ___XX___, ________,
+ ________, ___XX___, ________,
+ ________, ____XX__, ________};
+
+/* char: | code:0x007C */
+static GUI_CONST_STORAGE unsigned char ac007C[96] = {
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________,
+ ________, XX______, ________};
+
+/* char: } code:0x007D */
+static GUI_CONST_STORAGE unsigned char ac007D[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ___XXX__, ________, ________,
+ _____XX_, ________, ________,
+ ______XX, ________, ________,
+ ______XX, ________, ________,
+ ______XX, ________, ________,
+ ______XX, ________, ________,
+ ______XX, ________, ________,
+ ______XX, ________, ________,
+ ______XX, ________, ________,
+ ______XX, ________, ________,
+ ______XX, ________, ________,
+ ______XX, ________, ________,
+ ______XX, ________, ________,
+ ______XX, ________, ________,
+ _______X, XX______, ________,
+ ________, XXX_____, ________,
+ _______X, X_______, ________,
+ ______XX, ________, ________,
+ ______XX, ________, ________,
+ ______XX, ________, ________,
+ ______XX, ________, ________,
+ ______XX, ________, ________,
+ ______XX, ________, ________,
+ ______XX, ________, ________,
+ ______XX, ________, ________,
+ ______XX, ________, ________,
+ ______XX, ________, ________,
+ ______XX, ________, ________,
+ ______XX, ________, ________,
+ _____XX_, ________, ________};
+
+/* char: ~ code:0x007E */
+static GUI_CONST_STORAGE unsigned char ac007E[96] = {
+ ___XXXXX, ________, ________,
+ __XX__XX, XX______, ________,
+ _XX____X, XXX_____, XX______,
+ _XX_____, XXXX____, XX______,
+ ________, __XXX__X, X_______,
+ ________, ___XXXXX, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: code:0x007F */
+static GUI_CONST_STORAGE unsigned char ac007F[96] = {
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________,
+ ________, ________, ________};
+
+/* char: 度 code:0xB6C8 */
+static GUI_CONST_STORAGE unsigned char acB6C8[128] = {
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ XX______,
+ ________,
+ ________,
+ ________,
+ _XXX____,
+ ________,
+ ________,
+ ________,
+ _XXXX___,
+ ________,
+ ________,
+ ________,
+ __XXX___,
+ ________,
+ _____XX_,
+ ________,
+ __XXX___,
+ _____XXX,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ______XX,
+ X_____XX,
+ X______X,
+ XX______,
+ ______XX,
+ X_____XX,
+ X______X,
+ XXX_____,
+ ______XX,
+ X_____XX,
+ X______X,
+ XX______,
+ ______XX,
+ X_____XX,
+ X_______,
+ XX___XXX,
+ ______XX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ______XX,
+ X_____XX,
+ X_______,
+ XX______,
+ ______XX,
+ ______XX,
+ X_______,
+ XX______,
+ _____XXX,
+ ______XX,
+ X_______,
+ XX______,
+ _____XXX,
+ ______XX,
+ X_______,
+ XX______,
+ _____XXX,
+ ______XX,
+ XXXXXXXX,
+ XX______,
+ _____XXX,
+ ______XX,
+ X_______,
+ XX______,
+ _____XXX,
+ ________,
+ ________,
+ ________,
+ _____XXX,
+ ________,
+ ________,
+ _XXX____,
+ _____XXX,
+ ___XXXXX,
+ XXXXXXXX,
+ XXXXX___,
+ _____XXX,
+ ______XX,
+ ________,
+ XXXX____,
+ _____XXX,
+ _______X,
+ X_______,
+ XXX_____,
+ _____XX_,
+ ________,
+ XX_____X,
+ XX______,
+ ____XXX_,
+ ________,
+ XXX___XX,
+ X_______,
+ ____XXX_,
+ ________,
+ _XXX_XXX,
+ ________,
+ ____XX__,
+ ________,
+ __XXXXX_,
+ ________,
+ ____XX__,
+ ________,
+ ___XXXX_,
+ ________,
+ ___XX___,
+ ________,
+ _XXXXXXX,
+ X_______,
+ ___XX___,
+ _______X,
+ XXX___XX,
+ XXXX____,
+ __XX____,
+ _____XXX,
+ X_______,
+ XXXXXXXX,
+ __XX____,
+ _XXXXX__,
+ ________,
+ __XXXXXX,
+};
+
+/* char: 进 code:0xBDF8 */
+static GUI_CONST_STORAGE unsigned char acBDF8[128] = {
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ _XX_____,
+ XX______,
+ _____XX_,
+ ________,
+ _XXXX___,
+ XXXX____,
+ ______XX,
+ X_______,
+ _XXX____,
+ XXX_____,
+ ______XX,
+ XX______,
+ _XXX____,
+ XXX_____,
+ _______X,
+ XX______,
+ _XXX____,
+ XXX_____,
+ _______X,
+ XXX_____,
+ _XXX____,
+ XXX_____,
+ ________,
+ XX______,
+ _XXX____,
+ XXX__XXX,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ _XXX____,
+ XXX_____,
+ ________,
+ ________,
+ _XXX____,
+ XXX_____,
+ ________,
+ ________,
+ _XXX____,
+ XXX_____,
+ _______X,
+ XX______,
+ _XXX____,
+ XXX_____,
+ _XXXXXXX,
+ XXX_____,
+ _XXX____,
+ XXX_____,
+ _______X,
+ XX______,
+ _XXX____,
+ XXX_____,
+ _______X,
+ XX______,
+ _XXX____,
+ XXX___XX,
+ _______X,
+ XX_XXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ _______X,
+ XX______,
+ _XXX____,
+ XXX_____,
+ _______X,
+ XX______,
+ _XXX____,
+ XXX_____,
+ _______X,
+ XX______,
+ _XX_____,
+ XXX_____,
+ _______X,
+ XX______,
+ XXX_____,
+ XXX_____,
+ _______X,
+ XX______,
+ XXX_____,
+ XXX_____,
+ _______X,
+ XX_____X,
+ XX______,
+ XXX_____,
+ _______X,
+ XX_____X,
+ X_______,
+ XXX_____,
+ _______X,
+ XX____XX,
+ ________,
+ XXX_____,
+ ______XX,
+ XX___XX_,
+ ________,
+ XXX_____,
+ _____XX_,
+ _XXXXX__,
+ ________,
+ XXX_____,
+ ___XXXX_,
+ __XXX___,
+ ________,
+ XX______,
+ __XXXX__,
+ ____XXXX,
+ X_______,
+ _______X,
+ __XXX___,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ XXXXXXXX,
+ XXXXXXXX,
+};
+
+static GUI_CONST_STORAGE GUI_CHARINFO Cinfo[98] = {
+ {14, 14, 3, (unsigned char *)&ac0020}, /*0: */
+ {12, 12, 3, (unsigned char *)&ac0021}, /*1: !*/
+ {15, 15, 3, (unsigned char *)&ac0022}, /*2: "*/
+ {18, 18, 3, (unsigned char *)&ac0023}, /*3: #*/
+ {16, 16, 3, (unsigned char *)&ac0024}, /*4: $*/
+ {18, 18, 3, (unsigned char *)&ac0025}, /*5: %*/
+ {18, 18, 3, (unsigned char *)&ac0026}, /*6: &*/
+ {7, 7, 3, (unsigned char *)&ac0027}, /*7: '*/
+ {17, 17, 3, (unsigned char *)&ac0028}, /*8: (*/
+ {11, 11, 3, (unsigned char *)&ac0029}, /*9: )*/
+ {17, 17, 3, (unsigned char *)&ac002A}, /*10: **/
+ {18, 18, 3, (unsigned char *)&ac002B}, /*11: +*/
+ {7, 7, 3, (unsigned char *)&ac002C}, /*12: ,*/
+ {17, 17, 3, (unsigned char *)&ac002D}, /*13: -*/
+ {7, 7, 3, (unsigned char *)&ac002E}, /*14: .*/
+ {18, 18, 3, (unsigned char *)&ac002F}, /*15: /*/
+ {17, 17, 3, (unsigned char *)&ac0030}, /*16: 0*/
+ {15, 15, 3, (unsigned char *)&ac0031}, /*17: 1*/
+ {17, 17, 3, (unsigned char *)&ac0032}, /*18: 2*/
+ {17, 17, 3, (unsigned char *)&ac0033}, /*19: 3*/
+ {18, 18, 3, (unsigned char *)&ac0034}, /*20: 4*/
+ {17, 17, 3, (unsigned char *)&ac0035}, /*21: 5*/
+ {17, 17, 3, (unsigned char *)&ac0036}, /*22: 6*/
+ {17, 17, 3, (unsigned char *)&ac0037}, /*23: 7*/
+ {17, 17, 3, (unsigned char *)&ac0038}, /*24: 8*/
+ {17, 17, 3, (unsigned char *)&ac0039}, /*25: 9*/
+ {12, 12, 3, (unsigned char *)&ac003A}, /*26: :*/
+ {11, 11, 3, (unsigned char *)&ac003B}, /*27: ;*/
+ {16, 16, 3, (unsigned char *)&ac003C}, /*28: <*/
+ {17, 17, 3, (unsigned char *)&ac003D}, /*29: =*/
+ {15, 15, 3, (unsigned char *)&ac003E}, /*30: >*/
+ {17, 17, 3, (unsigned char *)&ac003F}, /*31: ?*/
+ {18, 18, 3, (unsigned char *)&ac0040}, /*32: @*/
+ {18, 18, 3, (unsigned char *)&ac0041}, /*33: A*/
+ {18, 18, 3, (unsigned char *)&ac0042}, /*34: B*/
+ {18, 18, 3, (unsigned char *)&ac0043}, /*35: C*/
+ {18, 18, 3, (unsigned char *)&ac0044}, /*36: D*/
+ {18, 18, 3, (unsigned char *)&ac0045}, /*37: E*/
+ {18, 18, 3, (unsigned char *)&ac0046}, /*38: F*/
+ {18, 18, 3, (unsigned char *)&ac0047}, /*39: G*/
+ {18, 18, 3, (unsigned char *)&ac0048}, /*40: H*/
+ {15, 15, 3, (unsigned char *)&ac0049}, /*41: I*/
+ {19, 19, 3, (unsigned char *)&ac004A}, /*42: J*/
+ {18, 18, 3, (unsigned char *)&ac004B}, /*43: K*/
+ {18, 18, 3, (unsigned char *)&ac004C}, /*44: L*/
+ {19, 19, 3, (unsigned char *)&ac004D}, /*45: M*/
+ {18, 18, 3, (unsigned char *)&ac004E}, /*46: N*/
+ {18, 18, 3, (unsigned char *)&ac004F}, /*47: O*/
+ {18, 18, 3, (unsigned char *)&ac0050}, /*48: P*/
+ {18, 18, 3, (unsigned char *)&ac0051}, /*49: Q*/
+ {18, 18, 3, (unsigned char *)&ac0052}, /*50: R*/
+ {17, 17, 3, (unsigned char *)&ac0053}, /*51: S*/
+ {18, 18, 3, (unsigned char *)&ac0054}, /*52: T*/
+ {18, 18, 3, (unsigned char *)&ac0055}, /*53: U*/
+ {18, 18, 3, (unsigned char *)&ac0056}, /*54: V*/
+ {19, 19, 3, (unsigned char *)&ac0057}, /*55: W*/
+ {18, 18, 3, (unsigned char *)&ac0058}, /*56: X*/
+ {18, 18, 3, (unsigned char *)&ac0059}, /*57: Y*/
+ {17, 17, 3, (unsigned char *)&ac005A}, /*58: Z*/
+ {16, 16, 3, (unsigned char *)&ac005B}, /*59: [*/
+ {16, 16, 3, (unsigned char *)&ac005C}, /*60: \*/
+ {12, 12, 3, (unsigned char *)&ac005D}, /*61: ]*/
+ {14, 14, 3, (unsigned char *)&ac005E}, /*62: ^*/
+ {14, 14, 3, (unsigned char *)&ac005F}, /*63: _*/
+ {11, 11, 3, (unsigned char *)&ac0060}, /*64: `*/
+ {18, 18, 3, (unsigned char *)&ac0061}, /*65: a*/
+ {17, 17, 3, (unsigned char *)&ac0062}, /*66: b*/
+ {17, 17, 3, (unsigned char *)&ac0063}, /*67: c*/
+ {18, 18, 3, (unsigned char *)&ac0064}, /*68: d*/
+ {17, 17, 3, (unsigned char *)&ac0065}, /*69: e*/
+ {18, 18, 3, (unsigned char *)&ac0066}, /*70: f*/
+ {18, 18, 3, (unsigned char *)&ac0067}, /*71: g*/
+ {18, 18, 3, (unsigned char *)&ac0068}, /*72: h*/
+ {15, 15, 3, (unsigned char *)&ac0069}, /*73: i*/
+ {16, 16, 3, (unsigned char *)&ac006A}, /*74: j*/
+ {18, 18, 3, (unsigned char *)&ac006B}, /*75: k*/
+ {15, 15, 3, (unsigned char *)&ac006C}, /*76: l*/
+ {18, 18, 3, (unsigned char *)&ac006D}, /*77: m*/
+ {18, 18, 3, (unsigned char *)&ac006E}, /*78: n*/
+ {17, 17, 3, (unsigned char *)&ac006F}, /*79: o*/
+ {17, 17, 3, (unsigned char *)&ac0070}, /*80: p*/
+ {16, 16, 3, (unsigned char *)&ac0071}, /*81: q*/
+ {17, 17, 3, (unsigned char *)&ac0072}, /*82: r*/
+ {16, 16, 3, (unsigned char *)&ac0073}, /*83: s*/
+ {16, 16, 3, (unsigned char *)&ac0074}, /*84: t*/
+ {18, 18, 3, (unsigned char *)&ac0075}, /*85: u*/
+ {17, 17, 3, (unsigned char *)&ac0076}, /*86: v*/
+ {19, 19, 3, (unsigned char *)&ac0077}, /*87: w*/
+ {17, 17, 3, (unsigned char *)&ac0078}, /*88: x*/
+ {18, 18, 3, (unsigned char *)&ac0079}, /*89: y*/
+ {17, 17, 3, (unsigned char *)&ac007A}, /*90: z*/
+ {16, 16, 3, (unsigned char *)&ac007B}, /*91: {*/
+ {10, 10, 3, (unsigned char *)&ac007C}, /*92: |*/
+ {11, 11, 3, (unsigned char *)&ac007D}, /*93: }*/
+ {18, 18, 3, (unsigned char *)&ac007E}, /*94: ~*/
+ {14, 14, 3, (unsigned char *)&ac007F}, /*95: */
+ {32, 32, 4, (unsigned char *)&acB6C8}, /*96: 度*/
+ {32, 32, 4, (unsigned char *)&acBDF8}, /*97: 进*/
+};
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop3 = {
+ 0xBDF8, /*start :进*/
+ 0xBDF8, /*end :进, len=1*/
+ &Cinfo[97],
+ (void *)0};
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop2 = {
+ 0xB6C8, /*start :度*/
+ 0xB6C8, /*end :度, len=1*/
+ &Cinfo[96],
+ &Prop3};
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop1 = {
+ 0x0020, /*start : */
+ 0x007F, /*end :, len=96*/
+ &Cinfo[0],
+ &Prop2};
+
+GUI_CONST_STORAGE GUI_FONT GUI_FontHZ32x32 = {
+ GUI_FONTTYPE_PROP_SJIS,
+ 32, /* height of font */
+ 32, /* space of font y */
+ 1,
+ 1,
+ &Prop1};
diff --git a/User/system/lib/lcd/font/LOGO.c b/User/system/lib/lcd/font/LOGO.c
new file mode 100644
index 0000000..b0e5481
--- /dev/null
+++ b/User/system/lib/lcd/font/LOGO.c
@@ -0,0 +1,10040 @@
+/*
+**********************************************************************
+* UcGUI Font
+* Chinese GB2312 library
+* (c) Copyright 19xx-20xx, company name
+*
+*
+* 注:本字体文件由 ucGUI字体生成器v9.0 生成,作者:馋嘴猫(qq:602426967)
+*
+**********************************************************************
+*/
+
+#include "GUI.H"
+
+/* char: code:0x0030 */
+static GUI_CONST_STORAGE unsigned char ac0030[5000] = {
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XX____XX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXX_,
+ ________,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXX__,
+ ________,
+ __XXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXX___,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXX_____,
+ ________,
+ ____XXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXX_____,
+ ________,
+ ____XXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXX_____,
+ ________,
+ ________,
+ _XXXXXXX,
+ XXX_____,
+ ________,
+ ____XXXX,
+ XX______,
+ ________,
+ _____XXX,
+ XXX_____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXX___,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ ________,
+ ________,
+ _XXXXXXX,
+ XXX_____,
+ ________,
+ ____XXXX,
+ XX______,
+ ________,
+ _____XXX,
+ XXX_____,
+ ________,
+ ________,
+ ____XXXX,
+ XXXXXX__,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ ________,
+ ________,
+ ________,
+ _XXXXXXX,
+ XXX_____,
+ ________,
+ ____XXXX,
+ XX______,
+ ________,
+ _____XXX,
+ XXX_____,
+ ________,
+ ________,
+ _______X,
+ XXXXXXX_,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ XXXXXXXX,
+ XXXXXX__,
+ ________,
+ ________,
+ ________,
+ ________,
+ _XXXXXXX,
+ XX______,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXX_____,
+ ________,
+ ________,
+ ________,
+ _XXXXXXX,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ ________,
+ ________,
+ ________,
+ _XXXXXXX,
+ XX______,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ ________,
+ ________,
+ ___XXXXX,
+ X_______,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ XXXXXXXX,
+ XXX_____,
+ ________,
+ ________,
+ ________,
+ ________,
+ _XXXXXXX,
+ XX______,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ ________,
+ ________,
+ ____XXXX,
+ XX______,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ XXXXXXXX,
+ X_______,
+ ________,
+ ________,
+ ________,
+ ________,
+ _XXXXXXX,
+ XX______,
+ ________,
+ ____XXXX,
+ XXXX____,
+ ________,
+ ___XXXXX,
+ XX______,
+ ________,
+ ________,
+ ________,
+ _____XXX,
+ XXX_____,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ XXXXXXXX,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ _XXXXXXX,
+ XXX_____,
+ ________,
+ ____XXXX,
+ XXXXX___,
+ ________,
+ ___XXXXX,
+ XX______,
+ ________,
+ ________,
+ ________,
+ ______XX,
+ XXXX____,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ XXXXXXX_,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ _XXXXXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXX__,
+ ________,
+ __XXXXXX,
+ XX______,
+ ________,
+ ________,
+ ________,
+ _______X,
+ XXXXX___,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ XXXXXX__,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ _XXXXXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXX_,
+ ________,
+ XXXXXXXX,
+ X_______,
+ ________,
+ ________,
+ ________,
+ ________,
+ XXXXX___,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ XXXXX___,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ _XXXXXXX,
+ XXX_____,
+ ________,
+ ______XX,
+ XXXXXXXX,
+ X_____XX,
+ XXXXXXXX,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ XXXXXX__,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ XXXX____,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ _XXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ _XXXXX__,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ XXXX____,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ _XXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXX_,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ __XXXXX_,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ XXX_____,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ _XXXXXXX,
+ XXXXX___,
+ ________,
+ ________,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXX__,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ __XXXXX_,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ XXX_____,
+ ________,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXX___,
+ ________,
+ ________,
+ _XXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXX___,
+ ________,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ XX______,
+ ________,
+ ________,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXX__,
+ ________,
+ ________,
+ __XXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ XX______,
+ ________,
+ ______XX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXX__,
+ ________,
+ ________,
+ __XXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ ________,
+ ____XXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXX_,
+ ________,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XX______,
+ ________,
+ ____XXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ ________,
+ ____XXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ ____XXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXX_____,
+ ________,
+ ____XXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ __XXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XX______,
+ ________,
+ ______XX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ __XXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XX______,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXX___,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ _XXXXXXX,
+ XX______,
+ ________,
+ ________,
+ _XXXXXXX,
+ XXXXXXXX,
+ XXX_____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XXXXX___,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ _XXXXXXX,
+ XX______,
+ ________,
+ ________,
+ _XXXXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ ________,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XXXXX___,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ XXXXXXXX,
+ XX______,
+ ________,
+ ________,
+ _XXXXXXX,
+ XXXXXXXX,
+ XXXXX___,
+ ________,
+ ________,
+ _XXXXXXX,
+ XXXX____,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XXXXXX__,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ XXXXXXXX,
+ XX______,
+ ________,
+ ________,
+ _XXXXXXX,
+ XXXXXXXX,
+ XXXXXX__,
+ ________,
+ ________,
+ __XXXXXX,
+ XXXX____,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XXXXXX__,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ XXXXXXXX,
+ XX______,
+ ________,
+ ________,
+ _XXXXXXX,
+ XXXXXXXX,
+ XXXXXXX_,
+ ________,
+ ________,
+ __XXXXXX,
+ XXXX____,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XXXXXX__,
+ ________,
+ ______XX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ XXXXXXXX,
+ XX______,
+ ________,
+ ________,
+ _XXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ ___XXXXX,
+ XXXX____,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XXXXXX__,
+ ________,
+ ______XX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ XXXXXXXX,
+ XX______,
+ ________,
+ ________,
+ _XXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ ____XXXX,
+ XXXX____,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XXXXXX__,
+ ________,
+ ______XX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ XXXXXXXX,
+ XX______,
+ ________,
+ ________,
+ _XXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ ________,
+ ____XXXX,
+ XXXX____,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XXXXXX__,
+ ________,
+ ______XX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ XXXXXXXX,
+ XX______,
+ ________,
+ ________,
+ _XXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XX______,
+ ________,
+ _____XXX,
+ XXXX____,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XXXXXX__,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ XXXXXXXX,
+ XX______,
+ ________,
+ ________,
+ _XXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXX____,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XXXXX___,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ _XXXXXXX,
+ XX______,
+ ________,
+ ________,
+ _XXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXX_____,
+ ________,
+ ______XX,
+ XXXX____,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XXXXX___,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ _XXXXXXX,
+ X_______,
+ ________,
+ ________,
+ _XXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ ______XX,
+ XXXX____,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XXXXX___,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ ________,
+ _XXXXXXX,
+ XXXXXXXX,
+ XX______,
+ ________,
+ _XXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ ______XX,
+ XXXX____,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XXXXX___,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ ________,
+ __XXXXXX,
+ XXXXXXXX,
+ XX______,
+ ________,
+ _XXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXX___,
+ ________,
+ ______XX,
+ XXXX____,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ ________,
+ __XXXXXX,
+ XXXXXXXX,
+ XX______,
+ ________,
+ _XXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXX___,
+ ________,
+ ______XX,
+ XXXX____,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XXX_____,
+ ________,
+ ____XXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ XX______,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XX______,
+ ________,
+ _XXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ ______XX,
+ XXXX____,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XXX_____,
+ ________,
+ ____XXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ XX______,
+ ________,
+ ____XXXX,
+ XXXXXXXX,
+ XX______,
+ ________,
+ _XXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ ______XX,
+ XXXX____,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XX______,
+ ________,
+ ____XXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ XX______,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XX______,
+ ________,
+ _XXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ ______XX,
+ XXXX____,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXX_____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XX______,
+ ________,
+ _XXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XX______,
+ ________,
+ ______XX,
+ XXXX____,
+ ________,
+ ___XXXXX,
+ XXXXXXX_,
+ ________,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXX_____,
+ ________,
+ ________,
+ _XXXXXXX,
+ XX______,
+ ________,
+ _XXXXXX_,
+ ________,
+ ________,
+ ________,
+ ________,
+ ______XX,
+ XXXX____,
+ ________,
+ ___XXXXX,
+ XX______,
+ ________,
+ ________,
+ __XXXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ ________,
+ _____XXX,
+ XX______,
+ ________,
+ _XXXXXX_,
+ ________,
+ ________,
+ ________,
+ ________,
+ ______XX,
+ XXXX____,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ __XXXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXX___,
+ ________,
+ ________,
+ ______XX,
+ XX______,
+ ________,
+ _XXXXXX_,
+ ________,
+ ________,
+ ________,
+ ________,
+ ______XX,
+ XXXX____,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ _XXXXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXX___,
+ ________,
+ ________,
+ ______XX,
+ XX______,
+ ________,
+ _XXXXXX_,
+ ________,
+ ________,
+ ________,
+ ________,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ _XXXXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXX__,
+ ________,
+ ________,
+ ______XX,
+ XX______,
+ ________,
+ _XXXXXX_,
+ ________,
+ ________,
+ ________,
+ ________,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXX_,
+ ________,
+ ________,
+ ______XX,
+ XX______,
+ ________,
+ _XXXXXX_,
+ ________,
+ ________,
+ ________,
+ ________,
+ ____XXXX,
+ XXXX____,
+ ________,
+ ________,
+ ________,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ ______XX,
+ XX______,
+ ________,
+ _XXXXXX_,
+ ________,
+ ________,
+ ________,
+ ________,
+ ___XXXXX,
+ XXXX____,
+ ________,
+ ________,
+ ________,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ ________,
+ ______XX,
+ XX______,
+ ________,
+ _XXXXXX_,
+ ________,
+ ________,
+ ________,
+ ________,
+ ___XXXXX,
+ XXXX____,
+ ________,
+ ________,
+ ________,
+ ________,
+ ______XX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XX______,
+ ________,
+ ______XX,
+ XX______,
+ ________,
+ _XXXXXX_,
+ ________,
+ ________,
+ ________,
+ ________,
+ __XXXXXX,
+ XXXX____,
+ ________,
+ ________,
+ ________,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ ______XX,
+ XX______,
+ ________,
+ _XXXXXX_,
+ ________,
+ ________,
+ ________,
+ ________,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ ________,
+ ________,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXX___,
+ ________,
+ ______XX,
+ XX______,
+ ________,
+ XXXXXXX_,
+ ________,
+ ________,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ ________,
+ ________,
+ ________,
+ __XXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXX_,
+ ________,
+ ______XX,
+ XX______,
+ _______X,
+ XXXXXXX_,
+ ________,
+ ________,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ ________,
+ ________,
+ ________,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XX______,
+ ______XX,
+ XX______,
+ _____XXX,
+ XXXXXXX_,
+ ________,
+ ________,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ ________,
+ ________,
+ ______XX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXX___,
+ ______XX,
+ XX______,
+ __XXXXXX,
+ XXXXXX__,
+ ________,
+ ________,
+ ________,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ ________,
+ ________,
+ __XXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ _______X,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XX____XX,
+ XX____XX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+};
+
+/* char: code:0x0031 */
+static GUI_CONST_STORAGE unsigned char ac0031[5000] = {
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ __XXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XX______,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ____XXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXXX____,
+ ________,
+ ____XXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXXX____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX_XXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX___X,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ _XXXXXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ___XXXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ____XXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ______XX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ________,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ______XX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ____XXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ ___XXXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX____,
+ _XXXXXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX___X,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXX_XXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXX_____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXXX____,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXXX____,
+ ________,
+ ____XXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ____XXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ _____XXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ X_______,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ____XXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XX______,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ___XXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXX____,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ ________,
+ __XXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+ XXXXXXXX,
+};
+
+static GUI_CONST_STORAGE GUI_CHARINFO Cinfo[2] = {
+ {200, 200, 25, (unsigned char *)&ac0030}, /*0: */
+ {200, 200, 25, (unsigned char *)&ac0031}, /*1: */
+};
+
+static GUI_CONST_STORAGE GUI_FONT_PROP Prop1 = {
+ 0x0030, /*start :*/
+ 0x0031, /*end :, len=2*/
+ &Cinfo[0],
+ (void *)0};
+
+GUI_CONST_STORAGE GUI_FONT GUI_FontHZ200x200 = {
+ GUI_FONTTYPE_PROP_SJIS,
+ 200, /* height of font */
+ 200, /* space of font y */
+ 1,
+ 1,
+ &Prop1};
diff --git a/User/system/lib/lcd/gui/AntiAlias/CCGUIAntiAlias.bat b/User/system/lib/lcd/gui/AntiAlias/CCGUIAntiAlias.bat
new file mode 100644
index 0000000..b6725d9
--- /dev/null
+++ b/User/system/lib/lcd/gui/AntiAlias/CCGUIAntiAlias.bat
@@ -0,0 +1,13 @@
+@ECHO OFF
+
+ECHO CCGUIAntiAlias.BAT: Compiling GUI\AntiAlias
+
+CALL CC GUIAAArc
+CALL CC GUIAAChar
+CALL CC GUIAAChar2
+CALL CC GUIAAChar4
+CALL CC GUIAACircle
+CALL CC GUIAALib
+CALL CC GUIAALine
+CALL CC GUIAAPoly
+CALL CC GUIAAPolyOut
diff --git a/User/system/lib/lcd/gui/AntiAlias/GUIAAArc.c b/User/system/lib/lcd/gui/AntiAlias/GUIAAArc.c
new file mode 100644
index 0000000..36655c2
--- /dev/null
+++ b/User/system/lib/lcd/gui/AntiAlias/GUIAAArc.c
@@ -0,0 +1,87 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUIArcAA.C
+Purpose : Draw Arc routines with Antialiasing
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+#include
+#include
+#include
+
+#include "GUI_Protected.h"
+
+#if GUI_SUPPORT_AA
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _DrawArcAA
+*/
+static void _DrawArcAA(int x0, int y0, int rx, int ry, int a0, int a1) {
+ int PenSizePrev = GUI_GetPenSize();
+ int PenSize_AA;
+ int Factor;
+
+ Factor = GUI_Context.AA_HiResEnable ? 1 : GUI_Context.AA_Factor;
+ /* Convert into Hires coordinates (if not already done) */
+ x0 *= Factor;
+ y0 *= Factor;
+ rx *= Factor;
+ ry *= Factor;
+ PenSize_AA = PenSizePrev * GUI_Context.AA_Factor;
+ GUI_AA_Init_HiRes(x0 - rx - PenSize_AA, x0 + rx + PenSize_AA);
+ GUI_SetPenSize(PenSize_AA);
+ GL_DrawArc(x0, y0, rx, ry,a0,a1);
+ GUI_SetPenSize(PenSizePrev); /* restore former pen size */
+ /* Cleanup */
+ GUI_AA_Exit();
+}
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_AA_DrawArc
+*/
+void GUI_AA_DrawArc(int x0, int y0, int rx, int ry, int a0, int a1) {
+ GUI_LOCK();
+ #if (GUI_WINSUPPORT)
+ WM_ADDORG_AA(x0,y0);
+ WM_ITERATE_START(NULL) {
+ #endif
+ _DrawArcAA( x0, y0, rx, ry, a0, a1);
+ #if (GUI_WINSUPPORT)
+ } WM_ITERATE_END();
+ #endif
+ GUI_UNLOCK();
+}
+
+#else /* Avoid problems with empty object modules */
+ void GUIAAArc_C(void);
+ void GUIAAArc_C(void) {}
+#endif /* GUI_SUPPORT_AA */
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/AntiAlias/GUIAAChar.c b/User/system/lib/lcd/gui/AntiAlias/GUIAAChar.c
new file mode 100644
index 0000000..99ee9dc
--- /dev/null
+++ b/User/system/lib/lcd/gui/AntiAlias/GUIAAChar.c
@@ -0,0 +1,167 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUICharAA.C
+Purpose : Display antialiased
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Private.h"
+
+#if GUI_SUPPORT_AA
+
+#include
+#include
+
+/*********************************************************************
+*
+* Types
+*
+**********************************************************************
+*/
+
+typedef void tSetPixelAA(int x, int y, U8 Intens);
+
+/*********************************************************************
+*
+* Static data
+*
+**********************************************************************
+*/
+
+static const U8 Bit2Mask0[] = {1<<7, 1<<5, 1<<3, 1<<1};
+static const U8 Bit2Mask1[] = {1<<6, 1<<4, 1<<2, 1<<0};
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* Draw
+*/
+static void Draw(int x0, int y0, int XSize, int YSize, int BytesPerLine, const U8*pData) {
+ int x, y;
+ tSetPixelAA* pfSetPixelAA;
+ pfSetPixelAA = (GUI_Context.TextMode & GUI_TM_TRANS)
+ ? LCD_SetPixelAA : LCD_SetPixelAA_NoTrans;
+ for (y=0; yp.pProp; pProp; pProp=(const GUI_FONT_PROP*) pProp->pNext) {
+ if ((c>=pProp->First) && (c<=pProp->Last))
+ break;
+ }
+ return pProp;
+}
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUIPROPAA_DispChar
+*/
+void GUIPROPAA_DispChar(U16P c) {
+ int BytesPerLine;
+ GUI_DRAWMODE DrawMode = GUI_Context.TextMode;
+ const GUI_FONT_PROP* pProp = GUIPROP_FindChar(GUI_Context.pAFont->p.pProp, c);
+ if (pProp) {
+ GUI_DRAWMODE OldDrawMode;
+ const GUI_CHARINFO* pCharInfo = pProp->paCharInfo+(c-pProp->First);
+ BytesPerLine = pCharInfo->BytesPerLine;
+ OldDrawMode = LCD_SetDrawMode(DrawMode);
+ Draw ( GUI_Context.DispPosX, GUI_Context.DispPosY,
+ (pCharInfo->XSize+1)/2,
+ GUI_Context.pAFont->YSize,
+ BytesPerLine,
+ (U8 const*) pCharInfo->pData
+ );
+ LCD_SetDrawMode(OldDrawMode); /* Restore draw mode */
+ GUI_Context.DispPosX += (pCharInfo->XDist+1)/2;
+ }
+}
+
+/*********************************************************************
+*
+* GUIPROPAA_GetCharDistX
+*/
+int GUIPROPAA_GetCharDistX(U16P c) {
+ int r;
+ const GUI_FONT_PROP* pProp = GUIPROP_FindChar(GUI_Context.pAFont->p.pProp, c);
+ r = (pProp) ? (pProp->paCharInfo+(c-pProp->First))->XSize : 0;
+ return (r+1)/2;
+}
+
+/*********************************************************************
+*
+* GUIPROPAA_GetFontInfo
+*/
+void GUIPROPAA_GetFontInfo(const GUI_FONT * pFont, GUI_FONTINFO* pfi) {
+ GUI_USE_PARA(pFont);
+ pfi->Flags = GUI_FONTINFO_FLAG_PROP | GUI_FONTINFO_FLAG_AA;
+}
+
+/*********************************************************************
+*
+* GUIPROPAA_IsInFont
+*/
+char GUIPROPAA_IsInFont(const GUI_FONT * pFont, U16 c) {
+ const GUI_FONT_PROP* pProp = GUIPROP_FindChar(pFont->p.pProp, c);
+ return (pProp==NULL) ? 0 : 1;
+}
+
+#else /* Avoid problems with empty object modules */
+ void GUIAAChar_C(void);
+ void GUIAAChar_C(void) {}
+#endif /* GUI_SUPPORT_AA */
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/AntiAlias/GUIAAChar2.c b/User/system/lib/lcd/gui/AntiAlias/GUIAAChar2.c
new file mode 100644
index 0000000..7291253
--- /dev/null
+++ b/User/system/lib/lcd/gui/AntiAlias/GUIAAChar2.c
@@ -0,0 +1,201 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUICharAA2.C
+Purpose : Display antialiased 2bpp
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Private.h"
+
+#if GUI_SUPPORT_AA
+
+#include
+#include
+
+/*********************************************************************
+*
+* Defines
+*
+**********************************************************************
+*/
+
+#define MAX_CHAR_SIZE 100
+
+/*********************************************************************
+*
+* Static data
+*
+**********************************************************************
+*/
+
+/* used by transparent characters */
+static const int aConvTable[4] = {0, 5, 10, 15};
+
+/* used by non transparent characters */
+static LCD_COLOR aColor[4];
+static LCD_PIXELINDEX OldColorIndex, OldBkColorIndex;
+static GUI_LOGPALETTE Palette = {4, 0, &aColor[0]};
+static GUI_BITMAP Bitmap = {0, 0, 0, 2, 0, &Palette, 0};
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* DrawNoTrans
+*/
+static void DrawNoTrans(int x0, int y0, int XSize, int YSize, int BytesPerLine, const U8*pData) {
+ if ((OldColorIndex != LCD_COLORINDEX) ||
+ (OldBkColorIndex != LCD_BKCOLORINDEX)) {
+ int i;
+ LCD_PIXELINDEX BkColorIndex = LCD_BKCOLORINDEX;
+ LCD_PIXELINDEX ColorIndex = LCD_COLORINDEX;
+ LCD_COLOR BkColor = LCD_Index2Color(BkColorIndex);
+ LCD_COLOR Color = LCD_Index2Color(ColorIndex);
+ aColor[0] = BkColor;
+ for (i = 1; i < 3; i++) {
+ U8 Intens;
+ Intens = 5 * i;
+ aColor[i] = LCD_AA_MixColors(Color, BkColor, Intens);
+ }
+ aColor[3] = Color;
+ LCD_GetpPalConvTableUncached(&Palette);
+ OldColorIndex = ColorIndex;
+ OldBkColorIndex = BkColorIndex;
+ }
+ Bitmap.XSize = XSize;
+ Bitmap.YSize = YSize;
+ Bitmap.BytesPerLine = BytesPerLine;
+ Bitmap.pData = pData;
+ GL_DrawBitmap(&Bitmap, x0, y0);
+}
+
+/*********************************************************************
+*
+* DrawTrans
+*/
+static void DrawTrans(int x0, int y0, int XSize, int YSize, int BytesPerLine, const U8*pData) {
+ int x, y;
+ for (y = 0; y < YSize; y++) {
+ const U8 *pData0 = pData;
+ U8 Rem = XSize & 3;
+ for (x = 0; x < XSize - 1; x += 4) {
+ LCD_SetPixelAA(x + x0 , y0 + y, aConvTable[((*pData0 ) >> 6) ]);
+ LCD_SetPixelAA(x + x0 + 1, y0 + y, aConvTable[((*pData0 ) >> 4) & 0x03]);
+ LCD_SetPixelAA(x + x0 + 2, y0 + y, aConvTable[((*pData0 ) >> 2) & 0x03]);
+ LCD_SetPixelAA(x + x0 + 3, y0 + y, aConvTable[((*pData0++) ) & 0x03]);
+ }
+ if (Rem) {
+ LCD_SetPixelAA(x + x0 , y0 + y, aConvTable[((*pData0 ) >> 6) ]);
+ if (Rem > 1) {
+ LCD_SetPixelAA(x + x0 + 1, y0 + y, aConvTable[((*pData0 ) >> 4) & 0x03]);
+ if (Rem > 2) {
+ LCD_SetPixelAA(x + x0 + 2, y0 + y, aConvTable[((*pData0 ) >> 2) & 0x03]);
+ }
+ }
+ }
+ pData += BytesPerLine;
+ }
+}
+
+/*********************************************************************
+*
+* GUIPROP_FindChar
+*/
+static const GUI_FONT_PROP* GUIPROP_FindChar(const GUI_FONT_PROP* pProp, U16P c) {
+ for (pProp = GUI_Context.pAFont->p.pProp; pProp; pProp=(const GUI_FONT_PROP*) pProp->pNext) {
+ if ((c>=pProp->First) && (c<=pProp->Last))
+ break;
+ }
+ return pProp;
+}
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUIPROP_AA2_DispChar
+*/
+void GUIPROP_AA2_DispChar(U16P c) {
+ int BytesPerLine;
+ GUI_DRAWMODE DrawMode = GUI_Context.TextMode;
+ const GUI_FONT_PROP* pProp = GUIPROP_FindChar(GUI_Context.pAFont->p.pProp, c);
+ if (pProp) {
+ GUI_DRAWMODE OldDrawMode;
+ const GUI_CHARINFO* pCharInfo = pProp->paCharInfo+(c-pProp->First);
+ BytesPerLine = pCharInfo->BytesPerLine;
+ OldDrawMode = LCD_SetDrawMode(DrawMode);
+ if (DrawMode & GUI_TM_TRANS) {
+ DrawTrans(GUI_Context.DispPosX,
+ GUI_Context.DispPosY,
+ pCharInfo->XSize,
+ GUI_Context.pAFont->YSize,
+ BytesPerLine,
+ (U8 const*)pCharInfo->pData
+ );
+ } else {
+ DrawNoTrans(GUI_Context.DispPosX,
+ GUI_Context.DispPosY,
+ pCharInfo->XSize,
+ GUI_Context.pAFont->YSize,
+ BytesPerLine,
+ (U8 const*)pCharInfo->pData
+ );
+ }
+ LCD_SetDrawMode(OldDrawMode); /* Restore draw mode */
+ GUI_Context.DispPosX += pCharInfo->XDist;
+ }
+}
+
+/*********************************************************************
+*
+* GUIPROP_AA2_GetCharDistX
+*/
+int GUIPROP_AA2_GetCharDistX(U16P c) {
+ const GUI_FONT_PROP* pProp = GUIPROP_FindChar(GUI_Context.pAFont->p.pProp, c);
+ return (pProp) ? (pProp->paCharInfo+(c-pProp->First))->XSize : 0;
+}
+
+/*********************************************************************
+*
+* GUIPROP_AA2_GetFontInfo
+*/
+void GUIPROP_AA2_GetFontInfo(const GUI_FONT * pFont, GUI_FONTINFO* pfi) {
+ GUI_USE_PARA(pFont);
+ pfi->Flags = GUI_FONTINFO_FLAG_PROP | GUI_FONTINFO_FLAG_AA2;
+}
+
+/*********************************************************************
+*
+* GUIPROP_AA2_IsInFont
+*/
+char GUIPROP_AA2_IsInFont(const GUI_FONT * pFont, U16 c) {
+ const GUI_FONT_PROP* pProp = GUIPROP_FindChar(pFont->p.pProp, c);
+ return (pProp==NULL) ? 0 : 1;
+}
+
+#else /* Avoid problems with empty object modules */
+ void GUIAAChar2_C(void);
+ void GUIAAChar2_C(void) {}
+#endif /* GUI_SUPPORT_AA */
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/AntiAlias/GUIAAChar4.c b/User/system/lib/lcd/gui/AntiAlias/GUIAAChar4.c
new file mode 100644
index 0000000..318359b
--- /dev/null
+++ b/User/system/lib/lcd/gui/AntiAlias/GUIAAChar4.c
@@ -0,0 +1,129 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUICharAA.C
+Purpose : Display antialiased
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Private.h"
+
+#if GUI_SUPPORT_AA
+
+#include
+#include
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* Draw
+*/
+static void Draw(int x0, int y0, int XSize, int YSize, int BytesPerLine, const U8*pData) {
+ int x, y;
+ tLCD_SetPixelAA* pfSetPixelAA;
+ pfSetPixelAA = (GUI_Context.TextMode && GUI_TM_TRANS) ?
+ LCD_SetPixelAA : LCD_SetPixelAA_NoTrans;
+ for (y=0; y>4); /* x0+x changed -> x+x0 to avoid problems with IAR's ICCMC80 */
+ (*pfSetPixelAA)(x0+x+1,y0+y, (*pData0++)&15);
+ }
+ if (XSize&1) {
+ (*pfSetPixelAA)(x0+x,y0+y, (*pData0)&15);
+ }
+ pData+=BytesPerLine;
+ }
+}
+
+/*********************************************************************
+*
+* GUIPROP_FindChar
+*/
+static const GUI_FONT_PROP* GUIPROP_FindChar(const GUI_FONT_PROP* pProp, U16P c) {
+ for (pProp = GUI_Context.pAFont->p.pProp; pProp; pProp=(const GUI_FONT_PROP*) pProp->pNext) {
+ if ((c>=pProp->First) && (c<=pProp->Last))
+ break;
+ }
+ return pProp;
+}
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUIPROP_AA4_DispChar
+*/
+void GUIPROP_AA4_DispChar(U16P c) {
+ int BytesPerLine;
+ GUI_DRAWMODE DrawMode = GUI_Context.TextMode;
+ const GUI_FONT_PROP* pProp = GUIPROP_FindChar(GUI_Context.pAFont->p.pProp, c);
+ if (pProp) {
+ GUI_DRAWMODE OldDrawMode;
+ const GUI_CHARINFO* pCharInfo = pProp->paCharInfo+(c-pProp->First);
+ BytesPerLine = pCharInfo->BytesPerLine;
+ OldDrawMode = LCD_SetDrawMode(DrawMode);
+ Draw ( GUI_Context.DispPosX, GUI_Context.DispPosY,
+ pCharInfo->XSize,
+ GUI_Context.pAFont->YSize,
+ BytesPerLine,
+ (U8 const*)pCharInfo->pData
+ );
+ LCD_SetDrawMode(OldDrawMode); /* Restore draw mode */
+ GUI_Context.DispPosX += pCharInfo->XDist;
+ }
+}
+
+/*********************************************************************
+*
+* GUIPROP_AA4_GetCharDistX
+*/
+int GUIPROP_AA4_GetCharDistX(U16P c) {
+ const GUI_FONT_PROP* pProp = GUIPROP_FindChar(GUI_Context.pAFont->p.pProp, c);
+ return (pProp) ? (pProp->paCharInfo+(c-pProp->First))->XSize : 0;
+}
+
+/*********************************************************************
+*
+* GUIPROP_AA4_GetFontInfo
+*/
+void GUIPROP_AA4_GetFontInfo(const GUI_FONT * pFont, GUI_FONTINFO* pfi) {
+ GUI_USE_PARA(pFont);
+ pfi->Flags = GUI_FONTINFO_FLAG_PROP | GUI_FONTINFO_FLAG_AA4;
+}
+
+/*********************************************************************
+*
+* GUIPROP_AA4_IsInFont
+*/
+char GUIPROP_AA4_IsInFont(const GUI_FONT * pFont, U16 c) {
+ const GUI_FONT_PROP* pProp = GUIPROP_FindChar(pFont->p.pProp, c);
+ return (pProp==NULL) ? 0 : 1;
+}
+
+#else /* Avoid problems with empty object modules */
+ void GUIAAChar4_C(void);
+ void GUIAAChar4_C(void) {}
+#endif /* GUI_SUPPORT_AA */
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/AntiAlias/GUIAACircle.c b/User/system/lib/lcd/gui/AntiAlias/GUIAACircle.c
new file mode 100644
index 0000000..3b6f876
--- /dev/null
+++ b/User/system/lib/lcd/gui/AntiAlias/GUIAACircle.c
@@ -0,0 +1,133 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUICirleAA.C
+Purpose : Draw Circle routines with Antialiasing
+
+TBD: Circle needs to be calculated from top to bottom in order
+to avoid AA problems at certain positions.
+
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+#include
+#include
+#include
+
+#if GUI_SUPPORT_AA
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* FillCircle
+*/
+static void FillCircle(int x0, int y0, int r) {
+ int i, x;
+ int sqmax = r*r+r/2;
+ int yMin, yMax;
+ /* First step : find uppermost and lowermost coordinates */
+ yMin = y0 - r;
+ yMax = y0 + r;
+ /* Use Clipping rect to reduce calculation (if possible) */
+ if (GUI_Context.pClipRect_HL) {
+ if (yMax > GUI_Context.pClipRect_HL->y1)
+ yMax = GUI_Context.pClipRect_HL->y1;
+ if (yMin < GUI_Context.pClipRect_HL->y0)
+ yMin = GUI_Context.pClipRect_HL->y0;
+ }
+ /* Draw top half */
+ for (i=0, x=r; i= yMin) && (y <= yMax)) {
+ /* calc proper x-value */
+ while ((i*i+x*x) >sqmax)
+ --x;
+ LCD_HL_DrawHLine (x0-x, y, x0+x);
+ }
+ }
+ /* Draw bottom half */
+ for (i=0, x=r; i= yMin) && (y <= yMax)) {
+ /* calc proper x-value */
+ while ((i*i+x*x) >sqmax)
+ --x;
+ LCD_HL_DrawHLine (x0-x, y, x0+x);
+ }
+ }
+}
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GL_FillCircleAA_HiRes
+*/
+void GL_FillCircleAA_HiRes(int x0, int y0, int r) {
+/* Init AA Subsystem, pass horizontal limits */
+ GUI_AA_Init_HiRes(x0-r, x0+r);
+/* Do the actual drawing */
+ FillCircle(x0, y0, r);
+/* Cleanup */
+ GUI_AA_Exit();
+}
+
+/*********************************************************************
+*
+* GUI_AA_FillCircle
+*/
+void GUI_AA_FillCircle(int x0, int y0, int r) {
+ #if (GUI_WINSUPPORT)
+ GUI_RECT Rect;
+ #endif
+ GUI_LOCK();
+ #if (GUI_WINSUPPORT)
+ WM_ADDORG_AA(x0,y0);
+ #endif
+ if (!GUI_Context.AA_HiResEnable) {
+ x0 *= GUI_Context.AA_Factor;
+ y0 *= GUI_Context.AA_Factor;
+ r *= GUI_Context.AA_Factor;
+ }
+ #if (GUI_WINSUPPORT)
+ Rect.x0 = GUI_AA_HiRes2Pixel(x0 - r);
+ Rect.x1 = GUI_AA_HiRes2Pixel(x0 + r);
+ Rect.y0 = GUI_AA_HiRes2Pixel(y0 - r);
+ Rect.y1 = GUI_AA_HiRes2Pixel(y0 + r);
+ WM_ITERATE_START(&Rect); {
+ #endif
+ GL_FillCircleAA_HiRes(x0, y0, r);
+ #if (GUI_WINSUPPORT)
+ } WM_ITERATE_END();
+ #endif
+ GUI_UNLOCK();
+}
+
+#else /* Avoid problems with empty object modules */
+ void GUIAACircle_C(void);
+ void GUIAACircle_C(void) {}
+#endif /* GUI_SUPPORT_AA */
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/AntiAlias/GUIAALib.c b/User/system/lib/lcd/gui/AntiAlias/GUIAALib.c
new file mode 100644
index 0000000..eff811d
--- /dev/null
+++ b/User/system/lib/lcd/gui/AntiAlias/GUIAALib.c
@@ -0,0 +1,280 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUIAALib.C
+Purpose : Antialiasing library
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Private.h"
+#include "LCD_ConfDefaults.h" /* Required in order to know max. XSize so we do not waste memory */
+
+#if GUI_SUPPORT_AA
+
+#include
+#include
+
+/*********************************************************************
+*
+* Defines, config defaults
+*
+**********************************************************************
+*/
+
+#ifndef GUI_AA_LINEBUFFER_SIZE
+ #define GUI_AA_LINEBUFFER_SIZE LCD_XSIZE
+#endif
+
+/*********************************************************************
+*
+* Static data
+*
+**********************************************************************
+*/
+
+static U8 abAABuffer[GUI_AA_LINEBUFFER_SIZE]; /* This could be changed to dynamic memory ... */
+static U8* pabAABuffer;
+static int _x0, _x1, _y, _x0_InUse, _x1_InUse;
+static GUI_RECT ClipRect_HL;
+
+static tLCD_HL_APIList DrawAPICopy; /* Copy of device function ptr list */
+static const tLCD_HL_APIList* pLCD_HLPrev; /* Copy of device function ptr list */
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _CleanLine
+*/
+static void _CleanLine(void) {
+ GUI_MEMSET(pabAABuffer,0, _x1 - _x0+1);
+ _y = -16383; /* Invalidate */
+ _x0_InUse = 16383;
+ _x1_InUse = -16383;
+}
+
+/*********************************************************************
+*
+* _FlushLine
+*/
+static void _FlushLine(void) {
+ int i;
+ int iEnd = _x1_InUse-_x0;
+ int IMax = GUI_Context.AA_Factor * GUI_Context.AA_Factor;
+ for (i =_x0_InUse-_x0; i<=iEnd; i++) {
+ int Intens = *(pabAABuffer+i);
+ if (Intens) {
+ /* Check we can use line draw */
+ if (Intens == IMax) {
+ int j;
+ for (j=i; jpfDrawHLine(_x0+i, _y, _x0+j);
+ i = j; /*xxx*/
+ } else {
+ LCD_HL_DrawPixel (_x0+i,_y);
+ }
+ } else {
+ LCD_SetPixelAA(_x0+i,_y, (15*Intens+IMax/2)/IMax);
+ }
+ }
+ }
+ _CleanLine();
+}
+
+/*********************************************************************
+*
+* _DrawHLine
+*
+* Purpose:
+* This is the redirected DrawHLine routine which is called
+* instead of the default output routine. Its job is to do
+* antialiasing and then perform the drawing operations.
+*/
+static void _DrawHLine (int x0, int y, int x1) {
+ int x0Real, x1Real;
+/* Make sure there is something to do */
+ if (x1 _x1_InUse)
+ _x1_InUse = x1Real;
+/* Clip (should not be necessary ... Just to be on the safe side ! */
+ if (x0Real < _x0) {
+ x0 = _x0 * GUI_Context.AA_Factor;
+ }
+ if (x1Real > _x1) {
+ x1 = (_x1+1)*GUI_Context.AA_Factor-1;
+ }
+/* Make sure there is still something to do (after clipping) */
+ if (x11; ) {
+ *pDest++ +=GUI_Context.AA_Factor;
+ }
+ /* Last Pixel */
+ *pDest += (1+x1- (x1_Off+_x0) *GUI_Context.AA_Factor);
+ }
+ }
+}
+
+/*********************************************************************
+*
+* CalcClipRectHL
+*/
+static void CalcClipRectHL(void) {
+ ClipRect_HL.x0 = GUI_Context.ClipRect.x0 * GUI_Context.AA_Factor;
+ ClipRect_HL.y0 = GUI_Context.ClipRect.y0 * GUI_Context.AA_Factor;
+ ClipRect_HL.x1 = (GUI_Context.ClipRect.x1+1) * GUI_Context.AA_Factor -1;
+ ClipRect_HL.y1 = (GUI_Context.ClipRect.y1+1) * GUI_Context.AA_Factor -1;
+}
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_AA_Init
+*/
+int GUI_AA_Init(int x0, int x1) {
+ int r =0;
+ /* Bounds checking:
+ Make sure x0, x1 are in legal range ...
+ (The important point is that they span no more than configured as
+ buffer size)
+ */
+ if (x0<0)
+ x0 =0;
+ if (x1-x0 > GUI_AA_LINEBUFFER_SIZE-1)
+ x1 = x0+GUI_AA_LINEBUFFER_SIZE-1;
+ /* Is there anything to do at all ??? */
+ if (x1 < x0) {
+ x1 = x0; /* Not really ... */
+ r =1;
+ }
+ DrawAPICopy = *GUI_Context.pLCD_HL; /* Copy API table */
+ pLCD_HLPrev = GUI_Context.pLCD_HL; /* Remember list ptr (for restore) */
+ DrawAPICopy.pfDrawHLine = _DrawHLine; /* modify function ptr. for hline */
+ GUI_Context.pLCD_HL = &DrawAPICopy; /* Use copy of fp-list */
+ pabAABuffer = abAABuffer;
+ _x0 = x0;
+ _x1 = x1;
+ _CleanLine();
+ CalcClipRectHL();
+ GUI_Context.pClipRect_HL = &ClipRect_HL;
+ return r;
+}
+
+/*********************************************************************
+*
+* GUI_AA_Init_HiRes
+*/
+int GUI_AA_Init_HiRes(int x0, int x1) {
+ x0 /= GUI_Context.AA_Factor;
+ x1 /= GUI_Context.AA_Factor;
+ return GUI_AA_Init(x0, x1);
+}
+
+/*********************************************************************
+*
+* GUI_AA_SetFactor
+*/
+void GUI_AA_SetFactor(int Factor) {
+ GUI_Context.AA_Factor = Factor;
+ CalcClipRectHL(); /* High level clipping depends on quality factor */
+}
+
+/*********************************************************************
+*
+* GUI_AA_GetFactor
+*/
+int GUI_AA_GetFactor(void) {
+ return GUI_Context.AA_Factor;
+}
+
+/*********************************************************************
+*
+* GUI_AA_DisableHiRes
+*/
+void GUI_AA_DisableHiRes(void) {
+ GUI_Context.AA_HiResEnable = 0;
+}
+
+/*********************************************************************
+*
+* GUI_AA_EnableHiRes
+*/
+void GUI_AA_EnableHiRes(void) {
+ GUI_Context.AA_HiResEnable =1;
+}
+
+/*********************************************************************
+*
+* GUI_AA_HiRes2Pixel
+*/
+I16 GUI_AA_HiRes2Pixel(int HiRes) {
+ return GUI_Context.AA_Factor ? (HiRes / GUI_Context.AA_Factor) : HiRes;
+}
+
+/*********************************************************************
+*
+* GUI_AA_Exit
+*/
+void GUI_AA_Exit(void) {
+ _FlushLine();
+ /* restore previous settings */
+ GUI_Context.pLCD_HL = pLCD_HLPrev;
+ GUI_Context.pClipRect_HL = &GUI_Context.ClipRect;
+}
+
+#else /* Avoid problems with empty object modules */
+ void GUIAALib_C(void);
+ void GUIAALib_C(void) {}
+#endif /* GUI_SUPPORT_AA */
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/AntiAlias/GUIAALine.c b/User/system/lib/lcd/gui/AntiAlias/GUIAALine.c
new file mode 100644
index 0000000..a9970fd
--- /dev/null
+++ b/User/system/lib/lcd/gui/AntiAlias/GUIAALine.c
@@ -0,0 +1,109 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUIAALine.C
+Purpose : Drawing lines with antialiasing
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+#include
+
+#if GUI_SUPPORT_AA
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _AA_DrawLine
+*/
+static void _AA_DrawLine(int x0, int y0, int x1, int y1) {
+ int xMin, xMax;
+ U8 PenSizeOld = GUI_GetPenSize();
+ U8 PenSizeHR = PenSizeOld * GUI_Context.AA_Factor;
+ U8 OldPenShape = GUI_SetPenShape(GUI_PS_FLAT);
+ /* Calculate left and right borders for AA module */
+ if (x0 < x1) {
+ xMin = x0;
+ xMax = x1;
+ } else {
+ xMin = x1;
+ xMax = x0;
+ }
+ if (GUI_Context.AA_HiResEnable) {
+ xMin -= PenSizeHR;
+ xMax += PenSizeHR;
+ xMin /= GUI_Context.AA_Factor;
+ xMax /= GUI_Context.AA_Factor;
+ } else {
+ xMin -= PenSizeOld;
+ xMax += PenSizeOld;
+ x0 *= GUI_Context.AA_Factor;
+ x1 *= GUI_Context.AA_Factor;
+ y0 *= GUI_Context.AA_Factor;
+ y1 *= GUI_Context.AA_Factor;
+ }
+ /* Do the actual drawing */
+ GUI_AA_Init(xMin, xMax);
+ GUI_SetPenSize(PenSizeHR);
+ GL_DrawLine(x0 , y0 , x1 , y1 );
+ GUI_AA_Exit();
+ /* Draw end points (can be optimized away in future, TBD*/
+ switch (OldPenShape) {
+ case GUI_PS_ROUND:
+ {
+ int r = GUI_Context.AA_Factor * PenSizeOld / 2;
+ GL_FillCircleAA_HiRes(x0 , y0 , r);
+ GL_FillCircleAA_HiRes(x1 , y1 , r);
+ }
+ break;
+ }
+ GUI_SetPenSize(PenSizeOld);
+ GUI_SetPenShape(OldPenShape);
+}
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_AA_DrawLine
+*/
+void GUI_AA_DrawLine(int x0, int y0, int x1, int y1) {
+ GUI_LOCK();
+ #if (GUI_WINSUPPORT)
+ WM_ADDORG_AA(x0,y0);
+ WM_ADDORG_AA(x1,y1);
+ WM_ITERATE_START(NULL); {
+ #endif
+ _AA_DrawLine(x0, y0, x1, y1);
+ #if (GUI_WINSUPPORT)
+ } WM_ITERATE_END();
+ #endif
+ GUI_UNLOCK();
+}
+
+#else /* Avoid problems with empty object modules */
+ void GUIAALine_C(void);
+ void GUIAALine_C(void) {}
+#endif /* GUI_SUPPORT_AA */
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/AntiAlias/GUIAAPoly.c b/User/system/lib/lcd/gui/AntiAlias/GUIAAPoly.c
new file mode 100644
index 0000000..3c0e9d1
--- /dev/null
+++ b/User/system/lib/lcd/gui/AntiAlias/GUIAAPoly.c
@@ -0,0 +1,112 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUIPolyAA.C
+Purpose : Draw Polygon routines with Antialiasing
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Private.h"
+
+#include
+#include
+#include
+
+#if GUI_SUPPORT_AA
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _FillPolygonAA
+*/
+static void _FillPolygonAA(GUI_POINT* paPoint, int NumPoints, int x, int y) {
+ int i;
+ int Stat;
+ int x0,x1;
+ int PosFactor = GUI_Context.AA_HiResEnable ? 1 : GUI_Context.AA_Factor;
+/* Calc horizontal limits and init GUI_AA */
+ x0 = x1 = paPoint[0].x;
+ for (i=1; i< NumPoints; i++) {
+ int x = paPoint[i].x;
+ if (xx1)
+ x1 = x;
+ }
+ if (!GUI_Context.AA_HiResEnable) {
+ Stat = GUI_AA_Init(x0+x,x1+x);
+ } else {
+ Stat = GUI_AA_Init((x0+x)/GUI_Context.AA_Factor,(x1+x)/GUI_Context.AA_Factor);
+ }
+ if (Stat ==0) {
+ /* Modify pointlist */
+ if (!GUI_Context.AA_HiResEnable) {
+ for (i=0; i< NumPoints; i++) {
+ paPoint[i].x *= GUI_Context.AA_Factor;
+ paPoint[i].y *= GUI_Context.AA_Factor;
+ }
+ }
+ GL_FillPolygon(paPoint, NumPoints, x * PosFactor, y * PosFactor);
+ /* Restore pointlist */
+ if (!GUI_Context.AA_HiResEnable) {
+ for (i=0; i< NumPoints; i++) {
+ paPoint[i].x /= GUI_Context.AA_Factor;
+ paPoint[i].y /= GUI_Context.AA_Factor;
+ }
+ }
+ /* Cleanup */
+ }
+ GUI_AA_Exit();
+}
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_AA_FillPolygon
+*/
+void GUI_AA_FillPolygon(/*const*/ GUI_POINT* pPoints, int NumPoints, int x0, int y0) {
+ GUI_LOCK();
+ #if (GUI_WINSUPPORT)
+ WM_ADDORG_AA(x0,y0);
+ WM_ITERATE_START(NULL); {
+ #endif
+/* Variables in MEMDEV module (with memory devices only) */
+ #if GUI_SUPPORT_MEMDEV
+ if (GUI_Context.pDeviceAPI->pfFillPolygonAA)
+ GUI_Context.pDeviceAPI->pfFillPolygonAA(pPoints, NumPoints, x0, y0);
+ else
+ #endif
+ _FillPolygonAA (pPoints, NumPoints, x0, y0);
+ #if (GUI_WINSUPPORT)
+ } WM_ITERATE_END();
+ #endif
+ GUI_UNLOCK();
+}
+
+#else /* Avoid problems with empty object modules */
+ void GUIAAPoly_C(void);
+ void GUIAAPoly_C(void) {}
+#endif /* GUI_SUPPORT_AA */
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/AntiAlias/GUIAAPolyOut.c b/User/system/lib/lcd/gui/AntiAlias/GUIAAPolyOut.c
new file mode 100644
index 0000000..c635a54
--- /dev/null
+++ b/User/system/lib/lcd/gui/AntiAlias/GUIAAPolyOut.c
@@ -0,0 +1,54 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUIPolyOutAA.C
+Purpose : Draw Polygon outline routines with Antialiasing
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+#include
+
+#include "GUI.h"
+
+#if GUI_SUPPORT_AA
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_AA_DrawPolyOutline
+*/
+void GUI_AA_DrawPolyOutline(const GUI_POINT* pSrc, int NumPoints, int Thickness, int x, int y) {
+ U8 PrevDraw;
+ GUI_POINT aiTemp[10];
+ GUI_EnlargePolygon(&aiTemp[0], pSrc, NumPoints, Thickness);
+ GUI_AA_FillPolygon( &aiTemp[0], NumPoints, x, y );
+ PrevDraw = LCD_SetDrawMode(GUI_DRAWMODE_REV);
+/* Copy points due to const qualifier */
+ memcpy(aiTemp, pSrc, NumPoints*2*sizeof(GUI_POINT));
+ GUI_AA_FillPolygon( aiTemp, NumPoints, x, y );
+ LCD_SetDrawMode(PrevDraw);
+}
+
+#else /* Avoid problems with empty object modules */
+ void GUIAAPolyOut_C(void);
+ void GUIAAPolyOut_C(void) {}
+#endif /* GUI_SUPPORT_AA */
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/AntiAlias/vssver.scc b/User/system/lib/lcd/gui/AntiAlias/vssver.scc
new file mode 100644
index 0000000..2f0c075
Binary files /dev/null and b/User/system/lib/lcd/gui/AntiAlias/vssver.scc differ
diff --git a/User/system/lib/lcd/gui/Config/GUIConf.h b/User/system/lib/lcd/gui/Config/GUIConf.h
new file mode 100644
index 0000000..c397d32
--- /dev/null
+++ b/User/system/lib/lcd/gui/Config/GUIConf.h
@@ -0,0 +1,39 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* �C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUIConf.h
+Purpose : Configures abilities, fonts etc.
+----------------------------------------------------------------------
+*/
+
+#ifndef GUICONF_H
+#define GUICONF_H
+
+#define GUI_OS (0) /* Compile with multitasking support */
+#define GUI_SUPPORT_TOUCH (0) /* Support a touch screen (req. win-manager) */
+#define GUI_SUPPORT_UNICODE (1) /* Support mixed ASCII/UNICODE strings */
+
+#define GUI_DEFAULT_FONT &GUI_FontHZ16x16
+#define GUI_ALLOC_SIZE 5000 /* Size of dynamic memory ... For WM and memory devices*/
+
+/*********************************************************************
+ *
+ * Configuration of available packages
+ */
+
+#define GUI_WINSUPPORT 0 /* Window manager package available */
+#define GUI_SUPPORT_MEMDEV 0 /* Memory devices available */
+#define GUI_SUPPORT_AA 1 /* Anti aliasing available */
+
+#endif /* Avoid multiple inclusion */
diff --git a/User/system/lib/lcd/gui/Config/GUITouchConf.h b/User/system/lib/lcd/gui/Config/GUITouchConf.h
new file mode 100644
index 0000000..db2a9f6
--- /dev/null
+++ b/User/system/lib/lcd/gui/Config/GUITouchConf.h
@@ -0,0 +1,31 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUITouch.Conf.h
+Purpose : Configures touch screen module
+----------------------------------------------------------------------
+*/
+
+
+#ifndef GUITOUCH_CONF_H
+#define GUITOUCH_CONF_H
+
+
+#define GUI_TOUCH_AD_LEFT 20
+#define GUI_TOUCH_AD_RIGHT 240
+#define GUI_TOUCH_SWAP_XY 1
+#define GUI_TOUCH_MIRROR_X 0
+#define GUI_TOUCH_MIRROR_Y 1
+
+#endif /* GUITOUCH_CONF_H */
diff --git a/User/system/lib/lcd/gui/Config/GUI_X.c b/User/system/lib/lcd/gui/Config/GUI_X.c
new file mode 100644
index 0000000..ce7fa4f
--- /dev/null
+++ b/User/system/lib/lcd/gui/Config/GUI_X.c
@@ -0,0 +1,90 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_X.C
+Purpose : Config / System dependent externals for GUI
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI.h"
+#include "GUI_X.h"
+
+/*********************************************************************
+ *
+ * Global data
+ */
+volatile int OS_TimeMS;
+
+/*********************************************************************
+*
+* Timing:
+* GUI_X_GetTime()
+* GUI_X_Delay(int)
+
+ Some timing dependent routines require a GetTime
+ and delay function. Default time unit (tick), normally is
+ 1 ms.
+*/
+
+int GUI_X_GetTime(void)
+{
+ return OS_TimeMS;
+}
+
+void GUI_X_Delay(int ms)
+{
+ int tEnd = OS_TimeMS + ms;
+ while ((tEnd - OS_TimeMS) > 0)
+ ;
+}
+
+/*********************************************************************
+ *
+ * GUI_X_Init()
+ *
+ * Note:
+ * GUI_X_Init() is called from GUI_Init is a possibility to init
+ * some hardware which needs to be up and running before the GUI.
+ * If not required, leave this routine blank.
+ */
+
+void GUI_X_Init(void) {}
+
+/*********************************************************************
+ *
+ * GUI_X_ExecIdle
+ *
+ * Note:
+ * Called if WM is in idle state
+ */
+
+void GUI_X_ExecIdle(void) {}
+
+/*********************************************************************
+*
+* Logging: OS dependent
+
+Note:
+ Logging is used in higher debug levels only. The typical target
+ build does not use logging and does therefor not require any of
+ the logging routines below. For a release build without logging
+ the routines below may be eliminated to save some space.
+ (If the linker is not function aware and eliminates unreferenced
+ functions automatically)
+
+*/
+
+void GUI_X_Log(const char *s) { GUI_USE_PARA(s); }
+void GUI_X_Warn(const char *s) { GUI_USE_PARA(s); }
+void GUI_X_ErrorOut(const char *s) { GUI_USE_PARA(s); }
diff --git a/User/system/lib/lcd/gui/Config/LCDConf.h b/User/system/lib/lcd/gui/Config/LCDConf.h
new file mode 100644
index 0000000..cacd1ff
--- /dev/null
+++ b/User/system/lib/lcd/gui/Config/LCDConf.h
@@ -0,0 +1,40 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* �C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDConf_1375_C8_C320x240.h
+Purpose : Sample configuration file
+----------------------------------------------------------------------
+*/
+
+#ifndef LCDCONF_H
+#define LCDCONF_H
+#include "board.h" // user defined
+
+/*********************************************************************
+ *
+ * General configuration of LCD
+ *
+ **********************************************************************
+ */
+
+#define LCD_XSIZE (400) /* X-resolution of LCD, Logical coor. */
+#define LCD_YSIZE (240) /* Y-resolution of LCD, Logical coor. */
+
+#define LCD_BITSPERPIXEL (8)
+
+#define LCD_CONTROLLER (-1)
+
+#define LCD_INIT_CONTROLLER() lcd_init();
+
+#endif /* LCDCONF_H */
diff --git a/User/system/lib/lcd/gui/Config/vssver.scc b/User/system/lib/lcd/gui/Config/vssver.scc
new file mode 100644
index 0000000..7b91b53
Binary files /dev/null and b/User/system/lib/lcd/gui/Config/vssver.scc differ
diff --git a/User/system/lib/lcd/gui/ConvertColor/CCConvertColor.bat b/User/system/lib/lcd/gui/ConvertColor/CCConvertColor.bat
new file mode 100644
index 0000000..31cbd0f
--- /dev/null
+++ b/User/system/lib/lcd/gui/ConvertColor/CCConvertColor.bat
@@ -0,0 +1,25 @@
+@ECHO OFF
+ECHO CCConvertColor.bat: Compiling GUI\ConvertColor
+CALL CC LCDP111
+CALL CC LCDP222
+CALL CC LCDP233
+CALL CC LCDP323
+CALL CC LCDP332
+CALL CC LCDP444_12
+CALL CC LCDP444_12_1
+CALL CC LCDP444_16
+CALL CC LCDP555
+CALL CC LCDP556
+CALL CC LCDP565
+CALL CC LCDP655
+CALL CC LCDP8666
+CALL CC LCDP8666_1
+CALL CC LCDPM233
+CALL CC LCDPM323
+CALL CC LCDPM332
+CALL CC LCDPM444_12
+CALL CC LCDPM444_16
+CALL CC LCDPM555
+CALL CC LCDPM556
+CALL CC LCDPM565
+CALL CC LCDPM655
diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDP111.c b/User/system/lib/lcd/gui/ConvertColor/LCDP111.c
new file mode 100644
index 0000000..918a7da
--- /dev/null
+++ b/User/system/lib/lcd/gui/ConvertColor/LCDP111.c
@@ -0,0 +1,98 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCD111.C
+Purpose : Color conversion routines for 111 color mode
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD_Protected.h" /* inter modul definitions */
+
+/*********************************************************************
+*
+* Public code, LCD_FIXEDPALETTE == 111, 8 basic colors
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Color2Index_111
+*/
+unsigned LCD_Color2Index_111(LCD_COLOR Color) {
+ int r,g,b;
+ r = (Color>>(0+7)) &1;
+ g = (Color>>(8+7)) &1;
+ b = (Color>>(16+7)) &1;
+ return r+(g<<1)+(b<<2);
+}
+
+/*********************************************************************
+*
+* LCD_Index2Color_111
+*/
+LCD_COLOR LCD_Index2Color_111(int Index) {
+ U16 r,g,b;
+ r = (((Index>>0)&1)*0xff);
+ g = (((Index>>1)&1)*0xff);
+ b = (Index>>2) *0xff;
+ return r | (g<<8) | ((U32)b<<16);
+}
+
+/*********************************************************************
+*
+* LCD_GetIndexMask_111
+*/
+unsigned LCD_GetIndexMask_111(void) {
+ return 0x0007;
+}
+
+/*********************************************************************
+*
+* Public code, LCD_FIXEDPALETTE == 111, 8 basic colors, SWAP_RB
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Color2Index_M111
+*/
+unsigned LCD_Color2Index_M111(LCD_COLOR Color) {
+ int r,g,b;
+ r = (Color>>(0+7)) &1;
+ g = (Color>>(8+7)) &1;
+ b = (Color>>(16+7)) &1;
+ return b+(g<<1)+(r<<2);
+}
+
+/*********************************************************************
+*
+* LCD_Index2Color_M111
+*/
+LCD_COLOR LCD_Index2Color_M111(int Index) {
+ U16 r,g,b;
+ r = (((Index>>0)&1)*0xff);
+ g = (((Index>>1)&1)*0xff);
+ b = (Index>>2) *0xff;
+ return b | (g<<8) | ((U32)r<<16);
+}
+
+/*********************************************************************
+*
+* LCD_GetIndexMask_M111
+*/
+unsigned LCD_GetIndexMask_M111(void) {
+ return 0x0007;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDP222.c b/User/system/lib/lcd/gui/ConvertColor/LCDP222.c
new file mode 100644
index 0000000..4dc03cf
--- /dev/null
+++ b/User/system/lib/lcd/gui/ConvertColor/LCDP222.c
@@ -0,0 +1,98 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCD222.C
+Purpose : Color conversion routines for 222 mode
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD_Protected.h" /* inter modul definitions */
+
+/*********************************************************************
+*
+* Public code, LCD_FIXEDPALETTE == 222, 64 colors
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Color2Index_222
+*/
+unsigned LCD_Color2Index_222(LCD_COLOR Color) {
+ int r,g,b;
+ r = ((Color&255) +0x2a)/0x55;
+ g = (((Color>>8)&255) +0x2a)/0x55;
+ b = (((Color>>16)&255)+0x2a)/0x55;
+ return r+(g<<2)+(b<<4);
+}
+
+/*********************************************************************
+*
+* LCD_Index2Color_222
+*/
+LCD_COLOR LCD_Index2Color_222(int Index) {
+ U16P r,g,b;
+ r = ((Index>>0)&3)*0x55;
+ g = ((Index>>2)&3)*0x55;
+ b = (Index>>4) *0x55;
+ return (((U32)b)<<16)|(g<<8)|r;
+}
+
+/*********************************************************************
+*
+* LCD_GetIndexMask_222
+*/
+unsigned LCD_GetIndexMask_222(void) {
+ return 0x0003f;
+}
+
+/*********************************************************************
+*
+* Public code, LCD_FIXEDPALETTE == 222, 64 colors, SWAP_RB
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Color2Index_M222
+*/
+unsigned LCD_Color2Index_M222(LCD_COLOR Color) {
+ int r,g,b;
+ r = ((Color&255) +0x2a)/0x55;
+ g = (((Color>>8)&255) +0x2a)/0x55;
+ b = (((Color>>16)&255)+0x2a)/0x55;
+ return b+(g<<2)+(r<<4);
+}
+
+/*********************************************************************
+*
+* LCD_Index2Color_M222
+*/
+LCD_COLOR LCD_Index2Color_M222(int Index) {
+ U16P r,g,b;
+ r = ((Index>>0)&3)*0x55;
+ g = ((Index>>2)&3)*0x55;
+ b = (Index>>4) *0x55;
+ return (((U32)r)<<16)|(g<<8)|b;
+}
+
+/*********************************************************************
+*
+* LCD_GetIndexMask_M222
+*/
+unsigned LCD_GetIndexMask_M222(void) {
+ return 0x003f;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDP233.c b/User/system/lib/lcd/gui/ConvertColor/LCDP233.c
new file mode 100644
index 0000000..a36c202
--- /dev/null
+++ b/User/system/lib/lcd/gui/ConvertColor/LCDP233.c
@@ -0,0 +1,65 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDP233.C
+Purpose : Color conversion routines for 233 mode
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD_Protected.h" /* inter modul definitions */
+
+/*********************************************************************
+*
+* Public code,
+*
+* LCD_FIXEDPALETTE == 233, 256 colors, BBGGGRRR
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Color2Index_233
+*/
+unsigned LCD_Color2Index_233(LCD_COLOR Color) {
+ int r, g, b;
+ r = Color & 255;
+ g = (Color >> 8 ) & 255;
+ b = Color >> 16;
+ r = (r * 7 + 127) / 255;
+ g = (g * 7 + 127) / 255;
+ b = (b + 42) / 85;
+ return r + (g << 3) + (b << 6);
+}
+
+/*********************************************************************
+*
+* LCD_Index2Color_233
+*/
+LCD_COLOR LCD_Index2Color_233(int Index) {
+ int r, g, b;
+ r = (Index & 7) * 255 / 7;
+ g = ((Index >> 3) & 7) * 255 / 7;
+ b = ((Index >> 6) & 3) * 85;
+ return r + (g << 8) + (((U32)b) << 16);
+}
+
+/*********************************************************************
+*
+* LCD_GetIndexMask_233
+*/
+unsigned LCD_GetIndexMask_233(void) {
+ return 0xff;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDP323.c b/User/system/lib/lcd/gui/ConvertColor/LCDP323.c
new file mode 100644
index 0000000..36aac45
--- /dev/null
+++ b/User/system/lib/lcd/gui/ConvertColor/LCDP323.c
@@ -0,0 +1,65 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDP323.C
+Purpose : Color conversion routines for 323 mode
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD_Protected.h" /* inter modul definitions */
+
+/*********************************************************************
+*
+* Public code,
+*
+* LCD_FIXEDPALETTE == 323, 256 colors, BBBGGRRR
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Color2Index_323
+*/
+unsigned LCD_Color2Index_323(LCD_COLOR Color) {
+ int r, g, b;
+ r = Color & 255;
+ g = (Color >> 8 ) & 255;
+ b = Color >> 16;
+ r = (r * 7 + 127) / 255;
+ g = (g + 42) / 85;
+ b = (b * 7 + 127) / 255;
+ return r + (g << 3) + (b << 5);
+}
+
+/*********************************************************************
+*
+* LCD_Index2Color_323
+*/
+LCD_COLOR LCD_Index2Color_323(int Index) {
+ int r, g, b;
+ r = (Index & 7) * 255 / 7;
+ g = ((Index >> 3) & 3) * 85;
+ b = ((Index >> 5) & 7) * 255 / 7;
+ return r + (g << 8) + (((U32)b) << 16);
+}
+
+/*********************************************************************
+*
+* LCD_GetIndexMask_323
+*/
+unsigned LCD_GetIndexMask_323(void) {
+ return 0xff;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDP332.c b/User/system/lib/lcd/gui/ConvertColor/LCDP332.c
new file mode 100644
index 0000000..4303387
--- /dev/null
+++ b/User/system/lib/lcd/gui/ConvertColor/LCDP332.c
@@ -0,0 +1,65 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDP332.C
+Purpose : Color conversion routines for 332 mode
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD_Protected.h" /* inter modul definitions */
+
+/*********************************************************************
+*
+* Public code,
+*
+* LCD_FIXEDPALETTE == 332, 256 colors, BBBGGGRR
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Color2Index_332
+*/
+unsigned LCD_Color2Index_332(LCD_COLOR Color) {
+ int r, g, b;
+ r = Color & 255;
+ g = (Color >> 8 ) & 255;
+ b = Color >> 16;
+ r = (r + 42) / 85;
+ g = (g * 7 + 127) / 255;
+ b = (b * 7 + 127) / 255;
+ return r + (g << 2) + (b << 5);
+}
+
+/*********************************************************************
+*
+* LCD_Index2Color_332
+*/
+LCD_COLOR LCD_Index2Color_332(int Index) {
+ unsigned r, g, b;
+ r = (Index & 3) * 85;
+ g = ((Index >> 2) & 7) * 255 / 7;
+ b = ((Index >> 5) & 7) * 255 / 7;
+ return r + (g << 8) + (((U32)b) << 16);
+}
+
+/*********************************************************************
+*
+* LCD_GetIndexMask_332
+*/
+unsigned LCD_GetIndexMask_332(void) {
+ return 0xff;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDP444_12.c b/User/system/lib/lcd/gui/ConvertColor/LCDP444_12.c
new file mode 100644
index 0000000..b9b660f
--- /dev/null
+++ b/User/system/lib/lcd/gui/ConvertColor/LCDP444_12.c
@@ -0,0 +1,70 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDP444_12.c
+Purpose : Color conversion routines for LCD-drivers
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD_Protected.h" /* inter modul definitions */
+
+/*********************************************************************
+*
+* Public code,
+*
+* LCD_FIXEDPALETTE == 444, 4096 colors, 0000BBBBGGGGRRRR
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Color2Index_444_12
+*/
+unsigned LCD_Color2Index_444_12(LCD_COLOR Color) {
+ unsigned int r,g,b;
+ r = Color & 255;
+ g = (Color >> 8) & 255;
+ b = (Color >> 16) & 255;
+ r = (r + 8) / 17;
+ g = (g + 8) / 17;
+ b = (b + 8) / 17;
+ return r + (g << 4) + (b << 8);
+}
+
+/*********************************************************************
+*
+* LCD_Index2Color_444_12
+*/
+LCD_COLOR LCD_Index2Color_444_12(int Index) {
+ unsigned int r,g,b;
+ /* Seperate the color masks */
+ r = Index & 0xf;
+ g = (Index >> 4) & 0xf;
+ b = ((unsigned)Index >> 8) & 0xf;
+ /* Convert the color masks */
+ r = r * 17;
+ g = g * 17;
+ b = b * 17;
+ return r + (g<<8) + (((U32)b)<<16);
+}
+
+/*********************************************************************
+*
+* LCD_GetIndexMask_444_12
+*/
+unsigned LCD_GetIndexMask_444_12(void) {
+ return 0x0fff;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDP444_12_1.c b/User/system/lib/lcd/gui/ConvertColor/LCDP444_12_1.c
new file mode 100644
index 0000000..34d2461
--- /dev/null
+++ b/User/system/lib/lcd/gui/ConvertColor/LCDP444_12_1.c
@@ -0,0 +1,70 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDP444_12_1.c
+Purpose : Color conversion routines for LCD-drivers
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD_Protected.h" /* inter modul definitions */
+
+/*********************************************************************
+*
+* Public code,
+*
+* LCD_FIXEDPALETTE == 444, 4096 colors, RRRRGGGGBBBB----
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Color2Index_444_12_1
+*/
+unsigned LCD_Color2Index_444_12_1(LCD_COLOR Color) {
+ unsigned int r,g,b;
+ r = Color & 255;
+ g = (Color >> 8) & 255;
+ b = (Color >> 16) & 255;
+ r = (r + 8) / 17;
+ g = (g + 8) / 17;
+ b = (b + 8) / 17;
+ return (b << 4) + (g << 8) + (r << 12);
+}
+
+/*********************************************************************
+*
+* LCD_Index2Color_444_12_1
+*/
+LCD_COLOR LCD_Index2Color_444_12_1(int Index) {
+ unsigned int r,g,b;
+ /* Seperate the color masks */
+ r = ((unsigned)Index >> 12) & 0xf;
+ g = ((unsigned)Index >> 8) & 0xf;
+ b = ((unsigned)Index >> 4) & 0xf;
+ /* Convert the color masks */
+ r = r * 17;
+ g = g * 17;
+ b = b * 17;
+ return r + (g << 8) + (((U32)b) << 16);
+}
+
+/*********************************************************************
+*
+* LCD_GetIndexMask_444_12_1
+*/
+unsigned LCD_GetIndexMask_444_12_1(void) {
+ return 0xfff0;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDP444_16.c b/User/system/lib/lcd/gui/ConvertColor/LCDP444_16.c
new file mode 100644
index 0000000..2ad5078
--- /dev/null
+++ b/User/system/lib/lcd/gui/ConvertColor/LCDP444_16.c
@@ -0,0 +1,70 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDP444_16.C
+Purpose : Color conversion routines for LCD-drivers
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD_Protected.h" /* inter modul definitions */
+
+/*********************************************************************
+*
+* Public code,
+*
+* LCD_FIXEDPALETTE == 444, 4096 colors, 0BBBB0GGGG0RRRR0
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Color2Index_444_16
+*/
+unsigned LCD_Color2Index_444_16(LCD_COLOR Color) {
+ unsigned int r,g,b;
+ r = Color & 255;
+ g = (Color >> 8) & 255;
+ b = (Color >> 16) & 255;
+ r = (r + 8) / 17;
+ g = (g + 8) / 17;
+ b = (b + 8) / 17;
+ return (r << 1) + (g << 6) + (b << 11);
+}
+
+/*********************************************************************
+*
+* LCD_Index2Color_444_16
+*/
+LCD_COLOR LCD_Index2Color_444_16(int Index) {
+ unsigned int r,g,b;
+ /* Separate the color masks */
+ r = (Index >> 1) & 0xf;
+ g = (Index >> 6) & 0xf;
+ b = ((unsigned)Index >> 11) & 0xf;
+ /* Convert the color masks */
+ r = r * 17;
+ g = g * 17;
+ b = b * 17;
+ return r + (g<<8) + (((U32)b)<<16);
+}
+
+/*********************************************************************
+*
+* LCD_GetIndexMask_444_16
+*/
+unsigned LCD_GetIndexMask_444_16(void) {
+ return 0x7bde;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDP555.c b/User/system/lib/lcd/gui/ConvertColor/LCDP555.c
new file mode 100644
index 0000000..c95e07a
--- /dev/null
+++ b/User/system/lib/lcd/gui/ConvertColor/LCDP555.c
@@ -0,0 +1,82 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDP555.C
+Purpose : Color conversion routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD_Protected.h" /* inter modul definitions */
+
+/*********************************************************************
+*
+* Defines
+*
+**********************************************************************
+*/
+
+#define B_BITS 5
+#define G_BITS 5
+#define R_BITS 5
+
+#define R_MASK ((1 << R_BITS) -1)
+#define G_MASK ((1 << G_BITS) -1)
+#define B_MASK ((1 << B_BITS) -1)
+
+/*********************************************************************
+*
+* Public code,
+*
+* LCD_FIXEDPALETTE == 555, 32768 colors, 0BBBBBGGGGGRRRRR
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Color2Index_555
+*/
+unsigned LCD_Color2Index_555(LCD_COLOR Color) {
+ int r,g,b;
+ r = (Color>> (8 - R_BITS)) & R_MASK;
+ g = (Color>> (16 - G_BITS)) & G_MASK;
+ b = (Color>> (24 - B_BITS)) & B_MASK;
+ return r + (g << R_BITS) + (b << (G_BITS + R_BITS));
+}
+
+/*********************************************************************
+*
+* LCD_Index2Color_555
+*/
+LCD_COLOR LCD_Index2Color_555(int Index) {
+ unsigned int r,g,b;
+ /* Seperate the color masks */
+ r = Index & R_MASK;
+ g = (Index >> R_BITS) & G_MASK;
+ b = ((unsigned)Index >> (R_BITS + G_BITS)) & B_MASK;
+ /* Convert the color masks */
+ r = r * 255 / R_MASK;
+ g = g * 255 / G_MASK;
+ b = b * 255 / B_MASK;
+ return r + (g<<8) + (((U32)b)<<16);
+}
+
+/*********************************************************************
+*
+* LCD_GetIndexMask_555
+*/
+unsigned LCD_GetIndexMask_555(void) {
+ return 0x7fff;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDP556.c b/User/system/lib/lcd/gui/ConvertColor/LCDP556.c
new file mode 100644
index 0000000..9cdba92
--- /dev/null
+++ b/User/system/lib/lcd/gui/ConvertColor/LCDP556.c
@@ -0,0 +1,82 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDP556.C
+Purpose : Color conversion routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD_Protected.h" /* inter modul definitions */
+
+/*********************************************************************
+*
+* Defines
+*
+**********************************************************************
+*/
+
+#define B_BITS 5
+#define G_BITS 5
+#define R_BITS 6
+
+#define R_MASK ((1 << R_BITS) -1)
+#define G_MASK ((1 << G_BITS) -1)
+#define B_MASK ((1 << B_BITS) -1)
+
+/*********************************************************************
+*
+* Public code,
+*
+* LCD_FIXEDPALETTE == 556, 65536 colors, BBBBBGGGGGRRRRRR
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Color2Index_556
+*/
+unsigned LCD_Color2Index_556(LCD_COLOR Color) {
+ int r,g,b;
+ r = (Color>> (8 - R_BITS)) & R_MASK;
+ g = (Color>> (16 - G_BITS)) & G_MASK;
+ b = (Color>> (24 - B_BITS)) & B_MASK;
+ return r + (g << R_BITS) + (b << (G_BITS + R_BITS));
+}
+
+/*********************************************************************
+*
+* LCD_Index2Color_556
+*/
+LCD_COLOR LCD_Index2Color_556(int Index) {
+ unsigned int r,g,b;
+ /* Seperate the color masks */
+ r = Index & R_MASK;
+ g = (Index >> R_BITS) & G_MASK;
+ b = ((unsigned)Index >> (R_BITS + G_BITS)) & B_MASK;
+ /* Convert the color masks */
+ r = r * 255 / R_MASK;
+ g = g * 255 / G_MASK;
+ b = b * 255 / B_MASK;
+ return r + (g<<8) + (((U32)b)<<16);
+}
+
+/*********************************************************************
+*
+* LCD_GetIndexMask_556
+*/
+unsigned LCD_GetIndexMask_556(void) {
+ return 0xffff;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDP565.c b/User/system/lib/lcd/gui/ConvertColor/LCDP565.c
new file mode 100644
index 0000000..97bc2a2
--- /dev/null
+++ b/User/system/lib/lcd/gui/ConvertColor/LCDP565.c
@@ -0,0 +1,65 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDP565.C
+Purpose : Color conversion routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD_Protected.h" /* inter modul definitions */
+
+/*********************************************************************
+*
+* Defines
+*
+**********************************************************************
+*/
+
+#define B_BITS 5
+#define G_BITS 6
+#define R_BITS 5
+
+#define R_MASK ((1 << R_BITS) -1)
+#define G_MASK ((1 << G_BITS) -1)
+#define B_MASK ((1 << B_BITS) -1)
+
+/*********************************************************************
+*
+* Public code,
+*
+* LCD_FIXEDPALETTE == 565, 65536 colors, BBBBBGGGGGGRRRRR
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Color2Index_565
+*/
+unsigned LCD_Color2Index_565(LCD_COLOR Color) {
+ int r,g,b;
+ r = (Color>> (8 - R_BITS)) & R_MASK;
+ g = (Color>> (16 - G_BITS)) & G_MASK;
+ b = (Color>> (24 - B_BITS)) & B_MASK;
+ return r + (g << R_BITS) + (b << (G_BITS + R_BITS));
+}
+
+/*********************************************************************
+*
+* LCD_GetIndexMask_565
+*/
+unsigned LCD_GetIndexMask_565(void) {
+ return 0xffff;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDP655.c b/User/system/lib/lcd/gui/ConvertColor/LCDP655.c
new file mode 100644
index 0000000..0d3ff74
--- /dev/null
+++ b/User/system/lib/lcd/gui/ConvertColor/LCDP655.c
@@ -0,0 +1,82 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDP655.C
+Purpose : Color conversion routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD_Protected.h" /* inter modul definitions */
+
+/*********************************************************************
+*
+* Defines
+*
+**********************************************************************
+*/
+
+#define B_BITS 6
+#define G_BITS 5
+#define R_BITS 5
+
+#define R_MASK ((1 << R_BITS) -1)
+#define G_MASK ((1 << G_BITS) -1)
+#define B_MASK ((1 << B_BITS) -1)
+
+/*********************************************************************
+*
+* Public code,
+*
+* LCD_FIXEDPALETTE == 655, 65536 colors, BBBBBBGGGGGRRRRR
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Color2Index_655
+*/
+unsigned LCD_Color2Index_655(LCD_COLOR Color) {
+ int r,g,b;
+ r = (Color>> (8 - R_BITS)) & R_MASK;
+ g = (Color>> (16 - G_BITS)) & G_MASK;
+ b = (Color>> (24 - B_BITS)) & B_MASK;
+ return r + (g << R_BITS) + (b << (G_BITS + R_BITS));
+}
+
+/*********************************************************************
+*
+* LCD_Index2Color_655
+*/
+LCD_COLOR LCD_Index2Color_655(int Index) {
+ unsigned int r,g,b;
+ /* Seperate the color masks */
+ r = Index & R_MASK;
+ g = (Index >> R_BITS) & G_MASK;
+ b = ((unsigned)Index >> (R_BITS + G_BITS)) & B_MASK;
+ /* Convert the color masks */
+ r = r * 255 / R_MASK;
+ g = g * 255 / G_MASK;
+ b = b * 255 / B_MASK;
+ return r + (g<<8) + (((U32)b)<<16);
+}
+
+/*********************************************************************
+*
+* LCD_GetIndexMask_655
+*/
+unsigned LCD_GetIndexMask_655(void) {
+ return 0xffff;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDP8666.c b/User/system/lib/lcd/gui/ConvertColor/LCDP8666.c
new file mode 100644
index 0000000..5f25c1a
--- /dev/null
+++ b/User/system/lib/lcd/gui/ConvertColor/LCDP8666.c
@@ -0,0 +1,104 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCD866.C
+Purpose : Color conversion routines for 866 mode
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD_Protected.h" /* inter modul definitions */
+
+/*********************************************************************
+*
+* Public data
+*
+**********************************************************************
+*/
+
+#if GUI_SUPPORT_MEMDEV
+
+/*********************************************************************
+*
+* LCD_Color2Index_8666
+*
+* Purpose
+* API table for this color conversion mode. Only used by memory
+* devices in this mode.
+*/
+const LCD_API_COLOR_CONV LCD_API_ColorConv_8666 = {
+ LCD_Color2Index_8666,
+ LCD_Index2Color_8666,
+ LCD_GetIndexMask_8666
+};
+
+#endif
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Color2Index_8666
+*/
+unsigned LCD_Color2Index_8666(LCD_COLOR Color) {
+ int r,g,b,Index;
+ r = Color&255;
+ g = (Color>>8)&255;
+ b = Color>>16;
+/* Check if image is a gray scale ... */
+ if ((r==g) && (g==b)) {
+ return 120+ (r+8)/17; /* Convert into colors from 120 - 135*/
+ }
+/* Convert into the 6*6*6 colors ... */
+ r = (r*5+127)/255;
+ g = (g*5+127)/255;
+ b = (b*5+127)/255;
+ Index = r+6*g+36*b;
+ return (Index<108) ? Index : Index+40;
+}
+
+/*********************************************************************
+*
+* LCD_Index2Color_8666
+*/
+LCD_COLOR LCD_Index2Color_8666(int Index) {
+ unsigned int r,g;
+ U32 b;
+ /* 16 Gray scale range ? */
+ if ((Index>=120) && (Index<136)) {
+ return (U32)0x111111 * (U32)(Index-120);
+ }
+ if (Index>=108) {
+ if (Index<148)
+ return 0; /* Black for illegal indices */
+ Index -= 40;
+ }
+ r = (Index%6)*(255/5);
+ g = ((Index/6)%6)*(255/5);
+ b = (Index/36)*(255/5);
+ return r+(g<<8)+((U32)b<<16);
+}
+
+/*********************************************************************
+*
+* LCD_GetIndexMask_8666
+*/
+unsigned LCD_GetIndexMask_8666(void) {
+ return 0xff;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDP8666_1.c b/User/system/lib/lcd/gui/ConvertColor/LCDP8666_1.c
new file mode 100644
index 0000000..e8c33da
--- /dev/null
+++ b/User/system/lib/lcd/gui/ConvertColor/LCDP8666_1.c
@@ -0,0 +1,82 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDP8666_1.C
+Purpose : Color conversion routines for 86661 mode
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD_Protected.h" /* inter modul definitions */
+
+/*********************************************************************
+*
+* Public code,
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Color2Index_8666_1
+*/
+unsigned LCD_Color2Index_8666_1(LCD_COLOR Color) {
+ int r, g, b, Index;
+ r = Color & 255;
+ g = (Color >> 8) & 255;
+ b = Color >> 16;
+/* Check if image is a gray scale ... */
+ if ((r == g) && (g == b)) {
+ return 120 + (r + 8) / 17; /* Convert into colors from 120 - 135 */
+ }
+/* Convert into the 6*6*6 colors ... */
+ r = (r * 5 + 127) / 255;
+ g = (g * 5 + 127) / 255;
+ b = (b * 5 + 127) / 255;
+ Index = r + 6 * g + 36 * b;
+ return (Index < 108) ? Index + 12 : Index + 28;
+}
+
+/*********************************************************************
+*
+* LCD_Index2Color_8666_1
+*/
+LCD_COLOR LCD_Index2Color_8666_1(int Index) {
+ unsigned int r,g;
+ U32 b;
+ /* 16 Gray scale range ? */
+ if ((Index >= 120) && (Index < 136)) {
+ return (U32)0x111111 * (U32)(Index - 120);
+ }
+ if ((Index < 12) || (Index > 243)) {
+ return 0; /* Black for illegal indices */
+ }
+ if (Index >= 120) {
+ Index -= 28;
+ } else {
+ Index -= 12;
+ }
+ r = (Index % 6) * (255 / 5);
+ g = ((Index / 6) % 6) * (255 / 5);
+ b = (Index / 36) * (255 / 5);
+ return r + (g << 8) + ((U32)b << 16);
+}
+
+/*********************************************************************
+*
+* LCD_GetIndexMask_8666_1
+*/
+unsigned LCD_GetIndexMask_8666_1(void) {
+ return 0xff;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDPM233.c b/User/system/lib/lcd/gui/ConvertColor/LCDPM233.c
new file mode 100644
index 0000000..90e2a52
--- /dev/null
+++ b/User/system/lib/lcd/gui/ConvertColor/LCDPM233.c
@@ -0,0 +1,65 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDPM233.C
+Purpose : Color conversion routines for -233 mode
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD_Protected.h" /* inter modul definitions */
+
+/*********************************************************************
+*
+* Public code,
+*
+* LCD_FIXEDPALETTE == -233, 256 colors, RRGGGBBB
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Color2Index_M233
+*/
+unsigned LCD_Color2Index_M233(LCD_COLOR Color) {
+ unsigned r, g, b;
+ r = Color & 255;
+ g = (Color >> 8 ) & 255;
+ b = Color >> 16;
+ r = (r + 42 ) / 85;
+ g = (g * 7 + 127) / 255;
+ b = (b * 7 + 127) / 255;
+ return b + (g << 3) + (r << 6);
+}
+
+/*********************************************************************
+*
+* LCD_Index2Color_M233
+*/
+LCD_COLOR LCD_Index2Color_M233(int Index) {
+ unsigned r, g, b;
+ b = (Index & 7) * 255 / 7;
+ g = ((Index >> 3) & 7) * 255 / 7;
+ r = ((Index >> 6) & 3) * 85;
+ return r + (g << 8) + (((U32)b) << 16);
+}
+
+/*********************************************************************
+*
+* LCD_GetIndexMask_M233
+*/
+unsigned LCD_GetIndexMask_M233(void) {
+ return 0xff;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDPM323.c b/User/system/lib/lcd/gui/ConvertColor/LCDPM323.c
new file mode 100644
index 0000000..78fc307
--- /dev/null
+++ b/User/system/lib/lcd/gui/ConvertColor/LCDPM323.c
@@ -0,0 +1,65 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDPM323.C
+Purpose : Color conversion routines for -323 mode
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD_Protected.h" /* inter modul definitions */
+
+/*********************************************************************
+*
+* Public code,
+*
+* LCD_FIXEDPALETTE == -323, 256 colors, RRRGGBBB
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Color2Index_M323
+*/
+unsigned LCD_Color2Index_M323(LCD_COLOR Color) {
+ unsigned r, g, b;
+ r = Color & 255;
+ g = (Color >> 8 ) & 255;
+ b = Color >> 16;
+ r = (r * 7 + 127) / 255;
+ g = (g + 42) / 85;
+ b = (b * 7 + 127) / 255;
+ return b + (g << 3) + (r << 5);
+}
+
+/*********************************************************************
+*
+* LCD_Index2Color_M323
+*/
+LCD_COLOR LCD_Index2Color_M323(int Index) {
+ unsigned r, g, b;
+ b = (Index & 7) * 255 / 7;
+ g = ((Index >> 3) & 3) * 85;
+ r = ((Index >> 5) & 7) * 255 / 7;
+ return r + (g << 8) + (((U32)b) << 16);
+}
+
+/*********************************************************************
+*
+* LCD_GetIndexMask_M323
+*/
+unsigned LCD_GetIndexMask_M323(void) {
+ return 0xff;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDPM332.c b/User/system/lib/lcd/gui/ConvertColor/LCDPM332.c
new file mode 100644
index 0000000..2917fee
--- /dev/null
+++ b/User/system/lib/lcd/gui/ConvertColor/LCDPM332.c
@@ -0,0 +1,65 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDPM332.C
+Purpose : Color conversion routines for -332 mode
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD_Protected.h" /* inter modul definitions */
+
+/*********************************************************************
+*
+* Public code,
+*
+* LCD_FIXEDPALETTE == -332, 256 colors, RRRGGGBB
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Color2Index_M332
+*/
+unsigned LCD_Color2Index_M332(LCD_COLOR Color) {
+ unsigned r, g, b;
+ r = Color & 255;
+ g = (Color >> 8 ) & 255;
+ b = Color >> 16;
+ r = (r * 7 + 127) / 255;
+ g = (g * 7 + 127) / 255;
+ b = (b + 42) / 85;
+ return b + (g << 2) + (r << 5);
+}
+
+/*********************************************************************
+*
+* LCD_Index2Color_M332
+*/
+LCD_COLOR LCD_Index2Color_M332(int Index) {
+ unsigned r, g, b;
+ b = (Index & 3) * 85;
+ g = ((Index >> 2) & 7) * 255 / 7;
+ r = ((Index >> 5) & 7) * 255 / 7;
+ return r + (g << 8) + (((U32)b) << 16);
+}
+
+/*********************************************************************
+*
+* LCD_GetIndexMask_M332
+*/
+unsigned LCD_GetIndexMask_M332(void) {
+ return 0xff;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDPM444_12.c b/User/system/lib/lcd/gui/ConvertColor/LCDPM444_12.c
new file mode 100644
index 0000000..f408595
--- /dev/null
+++ b/User/system/lib/lcd/gui/ConvertColor/LCDPM444_12.c
@@ -0,0 +1,70 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDPM444_12.c
+Purpose : Color conversion routines for LCD-drivers
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD_Protected.h" /* inter modul definitions */
+
+/*********************************************************************
+*
+* Public code,
+*
+* LCD_FIXEDPALETTE == 444, 4096 colors, RRRRGGGGBBBB
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Color2Index_M444_12
+*/
+unsigned LCD_Color2Index_M444_12(LCD_COLOR Color) {
+ unsigned int r,g,b;
+ r = Color & 255;
+ g = (Color >> 8) & 255;
+ b = (Color >> 16) & 255;
+ r = (r + 8) / 17;
+ g = (g + 8) / 17;
+ b = (b + 8) / 17;
+ return b + (g << 4) + (r << 8);
+}
+
+/*********************************************************************
+*
+* LCD_Index2Color_M444_12
+*/
+LCD_COLOR LCD_Index2Color_M444_12(int Index) {
+ unsigned int r,g,b;
+ /* Seperate the color masks */
+ b = Index & 0xf;
+ g = (Index >> 4) & 0xf;
+ r = ((unsigned)Index >> 8) & 0xf;
+ /* Convert the color masks */
+ r = r * 17;
+ g = g * 17;
+ b = b * 17;
+ return r + (g<<8) + (((U32)b)<<16);
+}
+
+/*********************************************************************
+*
+* LCD_GetIndexMask_M444_12
+*/
+unsigned LCD_GetIndexMask_M444_12(void) {
+ return 0x0fff;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDPM444_16.c b/User/system/lib/lcd/gui/ConvertColor/LCDPM444_16.c
new file mode 100644
index 0000000..891c5e3
--- /dev/null
+++ b/User/system/lib/lcd/gui/ConvertColor/LCDPM444_16.c
@@ -0,0 +1,70 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDPM444_16.C
+Purpose : Color conversion routines for LCD-drivers
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD_Protected.h" /* inter modul definitions */
+
+/*********************************************************************
+*
+* Public code,
+*
+* LCD_FIXEDPALETTE == 444, 4096 colors, 0RRRR0GGGG0BBBB0
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Color2Index_M444_16
+*/
+unsigned LCD_Color2Index_M444_16(LCD_COLOR Color) {
+ unsigned int r,g,b;
+ r = Color & 255;
+ g = (Color >> 8) & 255;
+ b = (Color >> 16) & 255;
+ r = (r + 8) / 17;
+ g = (g + 8) / 17;
+ b = (b + 8) / 17;
+ return (b << 1) + (g << 6) + (r << 11);
+}
+
+/*********************************************************************
+*
+* LCD_Index2Color_M444_16
+*/
+LCD_COLOR LCD_Index2Color_M444_16(int Index) {
+ unsigned int r,g,b;
+ /* Separate the color masks */
+ b = (Index >> 1) & 0xf;
+ g = (Index >> 6) & 0xf;
+ r = ((unsigned)Index >> 11) & 0xf;
+ /* Convert the color masks */
+ r = r * 17;
+ g = g * 17;
+ b = b * 17;
+ return r + (g<<8) + (((U32)b)<<16);
+}
+
+/*********************************************************************
+*
+* LCD_GetIndexMask_M444_16
+*/
+unsigned LCD_GetIndexMask_M444_16(void) {
+ return 0x7bde;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDPM555.c b/User/system/lib/lcd/gui/ConvertColor/LCDPM555.c
new file mode 100644
index 0000000..d08c1fb
--- /dev/null
+++ b/User/system/lib/lcd/gui/ConvertColor/LCDPM555.c
@@ -0,0 +1,82 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDM555.C
+Purpose : Color conversion routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD_Protected.h" /* inter modul definitions */
+
+/*********************************************************************
+*
+* Defines
+*
+**********************************************************************
+*/
+
+#define B_BITS 5
+#define G_BITS 5
+#define R_BITS 5
+
+#define R_MASK ((1 << R_BITS) -1)
+#define G_MASK ((1 << G_BITS) -1)
+#define B_MASK ((1 << B_BITS) -1)
+
+/*********************************************************************
+*
+* Public code,
+*
+* LCD_FIXEDPALETTE == 555, 32768 colors, 0RRRRRGGGGGBBBBB
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Color2Index_M555
+*/
+unsigned LCD_Color2Index_M555(LCD_COLOR Color) {
+ int r,g,b;
+ r = (Color>> (8 - R_BITS)) & R_MASK;
+ g = (Color>> (16 - G_BITS)) & G_MASK;
+ b = (Color>> (24 - B_BITS)) & B_MASK;
+ return b + (g << B_BITS) + (r << (G_BITS + B_BITS));
+}
+
+/*********************************************************************
+*
+* LCD_Index2Color_M555
+*/
+LCD_COLOR LCD_Index2Color_M555(int Index) {
+ unsigned int r,g,b;
+ /* Seperate the color masks */
+ b = Index & B_MASK;
+ g = (Index >> B_BITS) & G_MASK;
+ r = ((unsigned)Index >> (B_BITS + G_BITS)) & R_MASK;
+ /* Convert the color masks */
+ r = r * 255 / R_MASK;
+ g = g * 255 / G_MASK;
+ b = b * 255 / B_MASK;
+ return r + (g<<8) + (((U32)b)<<16);
+}
+
+/*********************************************************************
+*
+* LCD_GetIndexMask_M555
+*/
+unsigned LCD_GetIndexMask_M555(void) {
+ return 0x7fff;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDPM556.c b/User/system/lib/lcd/gui/ConvertColor/LCDPM556.c
new file mode 100644
index 0000000..d6f0f00
--- /dev/null
+++ b/User/system/lib/lcd/gui/ConvertColor/LCDPM556.c
@@ -0,0 +1,82 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDM556.C
+Purpose : Color conversion routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD_Protected.h" /* inter modul definitions */
+
+/*********************************************************************
+*
+* Defines
+*
+**********************************************************************
+*/
+
+#define B_BITS 5
+#define G_BITS 5
+#define R_BITS 6
+
+#define R_MASK ((1 << R_BITS) -1)
+#define G_MASK ((1 << G_BITS) -1)
+#define B_MASK ((1 << B_BITS) -1)
+
+/*********************************************************************
+*
+* Public code,
+*
+* LCD_FIXEDPALETTE == 556, 65536 colors, RRRRRRGGGGGBBBBB
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Color2Index_M556
+*/
+unsigned LCD_Color2Index_M556(LCD_COLOR Color) {
+ int r,g,b;
+ r = (Color>> (8 - R_BITS)) & R_MASK;
+ g = (Color>> (16 - G_BITS)) & G_MASK;
+ b = (Color>> (24 - B_BITS)) & B_MASK;
+ return b + (g << B_BITS) + (r << (G_BITS + B_BITS));
+}
+
+/*********************************************************************
+*
+* LCD_Index2Color_M556
+*/
+LCD_COLOR LCD_Index2Color_M556(int Index) {
+ unsigned int r,g,b;
+ /* Seperate the color masks */
+ b = Index & B_MASK;
+ g = (Index >> B_BITS) & G_MASK;
+ r = ((unsigned)Index >> (B_BITS + G_BITS)) & R_MASK;
+ /* Convert the color masks */
+ r = r * 255 / R_MASK;
+ g = g * 255 / G_MASK;
+ b = b * 255 / B_MASK;
+ return r + (g<<8) + (((U32)b)<<16);
+}
+
+/*********************************************************************
+*
+* LCD_GetIndexMask_M556
+*/
+unsigned LCD_GetIndexMask_M556(void) {
+ return 0xffff;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDPM565.c b/User/system/lib/lcd/gui/ConvertColor/LCDPM565.c
new file mode 100644
index 0000000..b059a73
--- /dev/null
+++ b/User/system/lib/lcd/gui/ConvertColor/LCDPM565.c
@@ -0,0 +1,65 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDM565.C
+Purpose : Color conversion routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD_Protected.h" /* inter modul definitions */
+
+/*********************************************************************
+*
+* Defines
+*
+**********************************************************************
+*/
+
+#define B_BITS 5
+#define G_BITS 6
+#define R_BITS 5
+
+#define R_MASK ((1 << R_BITS) -1)
+#define G_MASK ((1 << G_BITS) -1)
+#define B_MASK ((1 << B_BITS) -1)
+
+/*********************************************************************
+*
+* Public code,
+*
+* LCD_FIXEDPALETTE == 565, 65536 colors, RRRRRGGGGGGBBBBB
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Color2Index_M565
+*/
+unsigned LCD_Color2Index_M565(LCD_COLOR Color) {
+ int r,g,b;
+ r = (Color>> (8 - R_BITS)) & R_MASK;
+ g = (Color>> (16 - G_BITS)) & G_MASK;
+ b = (Color>> (24 - B_BITS)) & B_MASK;
+ return b + (g << B_BITS) + (r << (G_BITS + B_BITS));
+}
+
+/*********************************************************************
+*
+* LCD_GetIndexMask_M565
+*/
+unsigned LCD_GetIndexMask_M565(void) {
+ return 0xffff;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/ConvertColor/LCDPM655.c b/User/system/lib/lcd/gui/ConvertColor/LCDPM655.c
new file mode 100644
index 0000000..fe1b209
--- /dev/null
+++ b/User/system/lib/lcd/gui/ConvertColor/LCDPM655.c
@@ -0,0 +1,82 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDPM655.C
+Purpose : Color conversion routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD_Protected.h" /* inter modul definitions */
+
+/*********************************************************************
+*
+* Defines
+*
+**********************************************************************
+*/
+
+#define B_BITS 6
+#define G_BITS 5
+#define R_BITS 5
+
+#define R_MASK ((1 << R_BITS) -1)
+#define G_MASK ((1 << G_BITS) -1)
+#define B_MASK ((1 << B_BITS) -1)
+
+/*********************************************************************
+*
+* Public code,
+*
+* LCD_FIXEDPALETTE == 655, 65536 colors, RRRRRGGGGGBBBBBB
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Color2Index_M655
+*/
+unsigned LCD_Color2Index_M655(LCD_COLOR Color) {
+ int r,g,b;
+ r = (Color>> (8 - R_BITS)) & R_MASK;
+ g = (Color>> (16 - G_BITS)) & G_MASK;
+ b = (Color>> (24 - B_BITS)) & B_MASK;
+ return b + (g << B_BITS) + (r << (G_BITS + B_BITS));
+}
+
+/*********************************************************************
+*
+* LCD_Index2Color_M655
+*/
+LCD_COLOR LCD_Index2Color_M655(int Index) {
+ unsigned int r,g,b;
+ /* Seperate the color masks */
+ b = Index & B_MASK;
+ g = (Index >> B_BITS) & G_MASK;
+ r = ((unsigned)Index >> (B_BITS + G_BITS)) & R_MASK;
+ /* Convert the color masks */
+ r = r * 255 / R_MASK;
+ g = g * 255 / G_MASK;
+ b = b * 255 / B_MASK;
+ return r + (g<<8) + (((U32)b)<<16);
+}
+
+/*********************************************************************
+*
+* LCD_GetIndexMask_M655
+*/
+unsigned LCD_GetIndexMask_M655(void) {
+ return 0xffff;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/ConvertColor/vssver.scc b/User/system/lib/lcd/gui/ConvertColor/vssver.scc
new file mode 100644
index 0000000..a86f34e
Binary files /dev/null and b/User/system/lib/lcd/gui/ConvertColor/vssver.scc differ
diff --git a/User/system/lib/lcd/gui/ConvertMono/CCConvertMono.bat b/User/system/lib/lcd/gui/ConvertMono/CCConvertMono.bat
new file mode 100644
index 0000000..58950c3
--- /dev/null
+++ b/User/system/lib/lcd/gui/ConvertMono/CCConvertMono.bat
@@ -0,0 +1,5 @@
+@ECHO OFF
+ECHO CCConvertMono.BAT: Compiling GUI\ConvertMono
+CALL CC LCDP0
+CALL CC LCDP2
+CALL CC LCDP4
diff --git a/User/system/lib/lcd/gui/ConvertMono/LCDP0.c b/User/system/lib/lcd/gui/ConvertMono/LCDP0.c
new file mode 100644
index 0000000..33133ed
--- /dev/null
+++ b/User/system/lib/lcd/gui/ConvertMono/LCDP0.c
@@ -0,0 +1,76 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDP0.C
+Purpose : Color conversion routines for LCD-drivers
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD_Private.h" /* inter modul definitions */
+#include "GUI.h"
+
+/*********************************************************************
+*
+* Public code, 1/2/4/8 bpp color, LUT
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Color2Index_0
+*/
+unsigned LCD_Color2Index_0(LCD_COLOR Color, const LCD_PHYSPALETTE* pPhysPal) {
+ int i;
+ int NumEntries = pPhysPal->NumEntries;
+ int BestIndex = 0;
+ U32 BestDiff = 0xffffff; /* Initialize to worst match */
+ const LCD_COLOR* pPalEntry;
+/* Try to find perfect match */
+ i=0; pPalEntry = &pPhysPal->pPalEntries[0];
+ do {
+ if (Color==*(pPalEntry+i))
+ return i;
+ } while (++ipPalEntries[0];
+ do {
+ U32 Diff = GUI_CalcColorDist (Color, *(pPalEntry+i));
+ if (Diff < BestDiff) {
+ BestDiff = Diff;
+ BestIndex = i;
+ }
+ } while (++i= (unsigned) pPhysPal->NumEntries) {
+ return 0; /* Illegal index */
+ }
+ return *(pPhysPal->pPalEntries+Index);
+}
+
+/*********************************************************************
+*
+* LCD_GetIndexMask_0
+*/
+unsigned LCD_GetIndexMask_0(void) {
+ return ((1 << LCD_BITSPERPIXEL) - 1);
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/ConvertMono/LCDP2.c b/User/system/lib/lcd/gui/ConvertMono/LCDP2.c
new file mode 100644
index 0000000..ef2501e
--- /dev/null
+++ b/User/system/lib/lcd/gui/ConvertMono/LCDP2.c
@@ -0,0 +1,81 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCD2.C
+Purpose : Color conversion routines for 4 bpp gray LCDs
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD_Protected.h" /* inter modul definitions */
+
+/*********************************************************************
+*
+* Public data
+*
+**********************************************************************
+*/
+
+#if GUI_SUPPORT_MEMDEV
+
+/*********************************************************************
+*
+* LCD_Color2Index_2
+*
+* Purpose
+* API table for this color conversion mode. Only used by memory
+* devices in this mode.
+*/
+const LCD_API_COLOR_CONV LCD_API_ColorConv_2 = {
+ LCD_Color2Index_2,
+ LCD_Index2Color_2,
+ LCD_GetIndexMask_2
+};
+
+#endif
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Color2Index_2
+*/
+unsigned LCD_Color2Index_2(LCD_COLOR Color) {
+ int r,g,b;
+ r = Color &255;
+ g = (Color>>8) &255;
+ b = Color>>16;
+ return (r+g+b+127) /255;
+}
+
+/*********************************************************************
+*
+* LCD_Index2Color_2
+*/
+LCD_COLOR LCD_Index2Color_2(int Index) {
+ return ((U32)Index)*0x555555;
+}
+
+/*********************************************************************
+*
+* LCD_GetIndexMask_2
+*/
+unsigned LCD_GetIndexMask_2(void) {
+ return 0x03;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/ConvertMono/LCDP4.c b/User/system/lib/lcd/gui/ConvertMono/LCDP4.c
new file mode 100644
index 0000000..104608c
--- /dev/null
+++ b/User/system/lib/lcd/gui/ConvertMono/LCDP4.c
@@ -0,0 +1,81 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCD4.C
+Purpose : Color conversion routines for 4 bpp gray LCDs
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD_Protected.h" /* inter modul definitions */
+
+/*********************************************************************
+*
+* Public data
+*
+**********************************************************************
+*/
+
+#if GUI_SUPPORT_MEMDEV
+
+/*********************************************************************
+*
+* LCD_Color2Index_4
+*
+* Purpose
+* API table for this color conversion mode. Only used by memory
+* devices in this mode.
+*/
+const LCD_API_COLOR_CONV LCD_API_ColorConv_4 = {
+ LCD_Color2Index_4,
+ LCD_Index2Color_4,
+ LCD_GetIndexMask_4
+};
+
+#endif
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Color2Index_4
+*/
+unsigned LCD_Color2Index_4(LCD_COLOR Color) {
+ int r,g,b;
+ r = (Color>>(0+4)) &15;
+ g = (Color>>(8+4)) &15;
+ b = (Color>>(16+4)) &15;
+ return (r+g+b+1) /3;
+}
+
+/*********************************************************************
+*
+* LCD_Index2Color_4
+*/
+LCD_COLOR LCD_Index2Color_4(int Index) {
+ return ((U32)Index)*0x111111;
+}
+
+/*********************************************************************
+*
+* LCD_GetIndexMask_4
+*/
+unsigned LCD_GetIndexMask_4(void) {
+ return 0x0f;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/ConvertMono/vssver.scc b/User/system/lib/lcd/gui/ConvertMono/vssver.scc
new file mode 100644
index 0000000..5016c4a
Binary files /dev/null and b/User/system/lib/lcd/gui/ConvertMono/vssver.scc differ
diff --git a/User/system/lib/lcd/gui/Core/CCGUICore.bat b/User/system/lib/lcd/gui/Core/CCGUICore.bat
new file mode 100644
index 0000000..a5c9a54
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/CCGUICore.bat
@@ -0,0 +1,199 @@
+@ECHO OFF
+ECHO CCGUICore.BAT: Compiling GUI\Core
+CALL CC GUI2DLib
+CALL CC GUI__AddSpaceHex
+CALL CC GUI__CalcTextRect
+CALL CC GUI__DivideRound
+CALL CC GUI__DivideRound32
+CALL CC GUI__GetFontSizeY
+CALL CC GUI__GetNumChars
+CALL CC GUI__HandleEOLine
+CALL CC GUI__IntersectRect
+CALL CC GUI__IntersectRects
+CALL CC GUI__memset
+CALL CC GUI__memset16
+CALL CC GUI__Read
+CALL CC GUI__ReduceRect
+CALL CC GUI__SetText
+CALL CC GUI__strcmp
+CALL CC GUI__strlen
+CALL CC GUI__Wrap
+CALL CC GUI_AddBin
+CALL CC GUI_AddDec
+CALL CC GUI_AddDecMin
+CALL CC GUI_AddDecShift
+CALL CC GUI_AddHex
+CALL CC GUI_ALLOC_AllocInit
+CALL CC GUI_ALLOC_AllocZero
+CALL CC GUI_BMP
+CALL CC GUI_BMP_Serialize
+CALL CC GUI_CalcColorDist
+CALL CC GUI_ClearRectEx
+CALL CC GUI_Color2VisColor
+CALL CC GUI_CursorArrowL
+CALL CC GUI_CursorArrowLI
+CALL CC GUI_CursorArrowLPx
+CALL CC GUI_CursorArrowM
+CALL CC GUI_CursorArrowMI
+CALL CC GUI_CursorArrowMPx
+CALL CC GUI_CursorArrowS
+CALL CC GUI_CursorArrowSI
+CALL CC GUI_CursorArrowSPx
+CALL CC GUI_CursorCrossL
+CALL CC GUI_CursorCrossLI
+CALL CC GUI_CursorCrossLPx
+CALL CC GUI_CursorCrossM
+CALL CC GUI_CursorCrossMI
+CALL CC GUI_CursorCrossMPx
+CALL CC GUI_CursorCrossS
+CALL CC GUI_CursorCrossSI
+CALL CC GUI_CursorCrossSPx
+CALL CC GUI_CursorHeaderM
+CALL CC GUI_CursorHeaderMI
+CALL CC GUI_CursorHeaderMPx
+CALL CC GUI_CursorPal
+CALL CC GUI_CursorPalI
+CALL CC GUI_DispBin
+CALL CC GUI_DispCEOL
+CALL CC GUI_DispChar
+CALL CC GUI_DispChars
+CALL CC GUI_DispHex
+CALL CC GUI_DispString
+CALL CC GUI_DispStringAt
+CALL CC GUI_DispStringAtCEOL
+CALL CC GUI_DispStringHCenter
+CALL CC GUI_DispStringInRect
+CALL CC GUI_DispStringInRectEx
+CALL CC GUI_DispStringLen
+CALL CC GUI_DrawBitmap
+CALL CC GUI_DrawBitmapEx
+CALL CC GUI_DrawBitmapExp
+CALL CC GUI_DrawBitmapMag
+CALL CC GUI_DrawFocusRect
+CALL CC GUI_DrawGraph
+CALL CC GUI_DrawHLine
+CALL CC GUI_DrawPie
+CALL CC GUI_DrawPixel
+CALL CC GUI_DrawPolyline
+CALL CC GUI_DrawRectEx
+CALL CC GUI_DrawVLine
+CALL CC GUI_ErrorOut
+CALL CC GUI_Exec
+CALL CC GUI_FillPolygon
+CALL CC GUI_FillRect
+CALL CC GUI_FillRectEx
+CALL CC GUI_GetBitmapPixelColor
+CALL CC GUI_GetBitmapPixelIndex
+CALL CC GUI_GetClientRect
+CALL CC GUI_GetColor
+CALL CC GUI_GetDispPos
+CALL CC GUI_GetFont
+CALL CC GUI_GetFontInfo
+CALL CC GUI_GetFontSizeY
+CALL CC GUI_GetLineStyle
+CALL CC GUI_GetStringDistX
+CALL CC GUI_GetTextAlign
+CALL CC GUI_GetTextExtend
+CALL CC GUI_GetTextMode
+CALL CC GUI_GetVersionString
+CALL CC GUI_GetYSizeOfFont
+CALL CC GUI_Goto
+CALL CC GUI_InvertRect
+CALL CC GUI_IsInFont
+CALL CC GUI_Log
+CALL CC GUI_MergeRect
+CALL CC GUI_MOUSE
+CALL CC GUI_MOUSE_DriverPS2
+CALL CC GUI_MoveRect
+CALL CC GUI_OnKey
+CALL CC GUI_Pen
+CALL CC GUI_PID
+CALL CC GUI_RectsIntersect
+CALL CC GUI_SaveContext
+CALL CC GUI_SelectLayer
+CALL CC GUI_SelectLCD
+CALL CC GUI_SetColor
+CALL CC GUI_SetColorIndex
+CALL CC GUI_SetDecChar
+CALL CC GUI_SetDefault
+CALL CC GUI_SetDrawMode
+CALL CC GUI_SetFont
+CALL CC GUI_SetLBorder
+CALL CC GUI_SetLineStyle
+CALL CC GUI_SetLUTColor
+CALL CC GUI_SetLUTColorEx
+CALL CC GUI_SetLUTEntry
+CALL CC GUI_SetOrg
+CALL CC GUI_SetPixelIndex
+CALL CC GUI_SetTextAlign
+CALL CC GUI_SetTextMode
+CALL CC GUI_SetTextStyle
+CALL CC GUI_SIF
+CALL CC GUI_SIF_Prop
+CALL CC GUI_TOUCH
+CALL CC GUI_TOUCH_DriverAnalog
+CALL CC GUI_TOUCH_StoreState
+CALL CC GUI_TOUCH_StoreUnstable
+CALL CC GUI_UC
+CALL CC GUI_UC_DispString
+CALL CC GUI_UC_EncodeNone
+CALL CC GUI_UC_EncodeUTF8
+CALL CC GUI_WaitKey
+CALL CC GUI_WaitEvent
+CALL CC GUI_Warn
+CALL CC GUIAlloc
+CALL CC GUIArc
+CALL CC GUIChar
+CALL CC GUICharLine
+CALL CC GUICharM
+CALL CC GUICharP
+CALL CC GUICirc
+CALL CC GUIColor2Index
+CALL CC GUICore
+CALL CC GUICurs
+CALL CC GUIEncJS
+CALL CC GUIIndex2Color
+CALL CC GUIPolyE
+CALL CC GUIPolyM
+CALL CC GUIPolyR
+CALL CC GUIRealloc
+CALL CC GUIStream
+CALL CC GUITask
+CALL CC GUITime
+CALL CC GUITimer
+CALL CC GUIUC0
+CALL CC GUIVal
+CALL CC GUIValf
+CALL CC LCD
+CALL CC LCD_API
+CALL CC LCD_DrawBitmap_565
+CALL CC LCD_DrawBitmap_M565
+CALL CC LCD_DrawVLine
+CALL CC LCD_GetColorIndex
+CALL CC LCD_GetEx
+CALL CC LCD_GetNumDisplays
+CALL CC LCD_GetPixelColor
+CALL CC LCD_Index2ColorEx
+CALL CC LCD_L0_Generic
+CALL CC LCD_MixColors256
+CALL CC LCD_Mirror
+CALL CC LCD_Rotate180
+CALL CC LCD_RotateCW
+CALL CC LCD_RotateCCW
+CALL CC LCD_SelectLCD
+CALL CC LCD_SetClipRectEx
+CALL CC LCD_SetAPI
+CALL CC LCD_UpdateColorIndices
+CALL CC LCDAA
+CALL CC LCDColor
+CALL CC LCDGetP
+CALL CC LCDInfo
+CALL CC LCDInfo0
+CALL CC LCDInfo1
+CALL CC LCDL0Delta
+CALL CC LCDL0Mag
+CALL CC LCDP1
+CALL CC LCDP565_Index2Color
+CALL CC LCDPM565_Index2Color
+CALL CC LCDRLE4
+CALL CC LCDRLE8
diff --git a/User/system/lib/lcd/gui/Core/GUI.h b/User/system/lib/lcd/gui/Core/GUI.h
new file mode 100644
index 0000000..185106c
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI.h
@@ -0,0 +1,1420 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* �C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI.h
+Purpose : GUI API include file
+---------------------------END-OF-HEADER------------------------------
+
+Attention : Do not modify this file ! If you do, you will not
+ be able do update to a later GUI version !
+
+*/
+
+#ifndef GUI_H
+#define GUI_H
+#define __EMWIN_GSC__ /* Allow "C" to find out that emWin GSC is used */
+
+#include "GUI_ConfDefaults.h"
+#include "GUIType.h"
+#include "GUIVersion.h"
+
+#if defined(__cplusplus)
+extern "C"
+{ /* Make sure we have C-declarations in C++ programs */
+#endif
+
+/*********************************************************************
+ *
+ * Limitations for certain C51 Keil (__C51__)
+ *
+ **********************************************************************
+ */
+#if defined(__C51__) && GUI_SUPPORT_MEMDEV
+#error __C51__ (Keil) can not support function pointers sufficiently ! -> Disable memory devices -> GUI_SUPPORT_MEMDEV 0
+#endif
+
+/*********************************************************************
+ *
+ * macros, function replacement
+ *
+ **********************************************************************
+ */
+#define GUI_COUNTOF(a) (sizeof(a) / sizeof(a[0]))
+
+ /************************************************************
+ *
+ * GUI_KEY_...
+ *
+ *************************************************************
+ These ID values are basically meant to be used with widgets
+ Note that we have chosen the values to be close to existing
+ "standards", so do not change them unless forced to.
+
+ */
+
+#define GUI_KEY_BACKSPACE 8 /* ASCII: BACKSPACE Crtl-H */
+#define GUI_KEY_TAB 9 /* ASCII: TAB Crtl-I */
+#define GUI_KEY_ENTER 13 /* ASCII: ENTER Crtl-M */
+#define GUI_KEY_LEFT 16
+#define GUI_KEY_UP 17
+#define GUI_KEY_RIGHT 18
+#define GUI_KEY_DOWN 19
+#define GUI_KEY_HOME 23
+#define GUI_KEY_END 24
+#define GUI_KEY_SHIFT 25
+#define GUI_KEY_CONTROL 26
+#define GUI_KEY_ESCAPE 27 /* ASCII: ESCAPE 0x1b */
+#define GUI_KEY_INSERT 29
+#define GUI_KEY_DELETE 30
+#define GUI_KEY_SPACE 32
+
+#define GUI_KEY_F1 40
+#define GUI_KEY_F2 41
+
+ /*********************************************************************
+ *
+ * Dialog item IDs
+ *
+ * The IDs below are arbitrary values. They just have to be unique
+ * within the dialog.
+ *
+ * If you use your own Ids, we recommend to use values above GUI_ID_USER.
+ */
+
+#define GUI_ID_OK 1
+#define GUI_ID_CANCEL 2
+#define GUI_ID_YES 3
+#define GUI_ID_NO 4
+#define GUI_ID_CLOSE 5
+#define GUI_ID_HELP 6
+#define GUI_ID_MAXIMIZE 7
+#define GUI_ID_MINIMIZE 8
+
+#define GUI_ID_VSCROLL 0xFE
+#define GUI_ID_HSCROLL 0xFF
+
+#define GUI_ID_EDIT0 0x100
+#define GUI_ID_EDIT1 0x101
+#define GUI_ID_EDIT2 0x102
+#define GUI_ID_EDIT3 0x103
+#define GUI_ID_EDIT4 0x104
+#define GUI_ID_EDIT5 0x105
+#define GUI_ID_EDIT6 0x106
+#define GUI_ID_EDIT7 0x107
+#define GUI_ID_EDIT8 0x108
+#define GUI_ID_EDIT9 0x109
+
+#define GUI_ID_LISTBOX0 0x110
+#define GUI_ID_LISTBOX1 0x111
+#define GUI_ID_LISTBOX2 0x112
+#define GUI_ID_LISTBOX3 0x113
+#define GUI_ID_LISTBOX4 0x114
+#define GUI_ID_LISTBOX5 0x115
+#define GUI_ID_LISTBOX6 0x116
+#define GUI_ID_LISTBOX7 0x117
+#define GUI_ID_LISTBOX8 0x118
+#define GUI_ID_LISTBOX9 0x119
+
+#define GUI_ID_CHECK0 0x120
+#define GUI_ID_CHECK1 0x121
+#define GUI_ID_CHECK2 0x122
+#define GUI_ID_CHECK3 0x123
+#define GUI_ID_CHECK4 0x124
+#define GUI_ID_CHECK5 0x125
+#define GUI_ID_CHECK6 0x126
+#define GUI_ID_CHECK7 0x127
+#define GUI_ID_CHECK8 0x128
+
+#define GUI_ID_SLIDER0 0x130
+#define GUI_ID_SLIDER1 0x131
+#define GUI_ID_SLIDER2 0x132
+#define GUI_ID_SLIDER3 0x133
+#define GUI_ID_SLIDER4 0x134
+#define GUI_ID_SLIDER5 0x135
+#define GUI_ID_SLIDER6 0x136
+#define GUI_ID_SLIDER7 0x137
+#define GUI_ID_SLIDER8 0x138
+#define GUI_ID_SLIDER9 0x139
+
+#define GUI_ID_SCROLLBAR0 0x140
+#define GUI_ID_SCROLLBAR1 0x141
+#define GUI_ID_SCROLLBAR2 0x142
+#define GUI_ID_SCROLLBAR3 0x142
+
+#define GUI_ID_RADIO0 0x150
+#define GUI_ID_RADIO1 0x151
+#define GUI_ID_RADIO2 0x152
+#define GUI_ID_RADIO3 0x153
+#define GUI_ID_RADIO4 0x154
+#define GUI_ID_RADIO5 0x155
+#define GUI_ID_RADIO6 0x156
+#define GUI_ID_RADIO7 0x157
+
+#define GUI_ID_TEXT0 0x160
+#define GUI_ID_TEXT1 0x161
+#define GUI_ID_TEXT2 0x162
+#define GUI_ID_TEXT3 0x163
+#define GUI_ID_TEXT4 0x164
+#define GUI_ID_TEXT5 0x165
+#define GUI_ID_TEXT6 0x166
+#define GUI_ID_TEXT7 0x167
+#define GUI_ID_TEXT8 0x168
+#define GUI_ID_TEXT9 0x169
+
+#define GUI_ID_BUTTON0 0x170
+#define GUI_ID_BUTTON1 0x171
+#define GUI_ID_BUTTON2 0x172
+#define GUI_ID_BUTTON3 0x173
+#define GUI_ID_BUTTON4 0x174
+#define GUI_ID_BUTTON5 0x175
+#define GUI_ID_BUTTON6 0x176
+#define GUI_ID_BUTTON7 0x177
+#define GUI_ID_BUTTON8 0x178
+#define GUI_ID_BUTTON9 0x179
+
+#define GUI_ID_DROPDOWN0 0x180
+#define GUI_ID_DROPDOWN1 0x181
+#define GUI_ID_DROPDOWN2 0x182
+#define GUI_ID_DROPDOWN3 0x183
+
+#define GUI_ID_MULTIEDIT0 0x190
+#define GUI_ID_MULTIEDIT1 0x191
+#define GUI_ID_MULTIEDIT2 0x192
+#define GUI_ID_MULTIEDIT3 0x193
+
+#define GUI_ID_LISTVIEW0 0x200
+#define GUI_ID_LISTVIEW1 0x201
+#define GUI_ID_LISTVIEW2 0x202
+#define GUI_ID_LISTVIEW3 0x203
+
+#define GUI_ID_PROGBAR0 0x210
+#define GUI_ID_PROGBAR1 0x211
+#define GUI_ID_PROGBAR2 0x212
+#define GUI_ID_PROGBAR3 0x213
+
+#define GUI_ID_USER 0x800
+
+ /*********************************************************************
+ *
+ * Constants needed for GL
+ *
+ **********************************************************************
+ */
+
+ /**********************************
+ *
+ * Text styles
+ *
+ ***********************************
+ */
+
+#define GUI_TS_NORMAL (0)
+#define GUI_TS_UNDERLINE (1 << 0)
+#define GUI_TS_STRIKETHRU (1 << 1)
+#define GUI_TS_OVERLINE (1 << 2)
+
+ /**********************************
+ *
+ * Line styles
+ *
+ ***********************************
+ */
+
+#define GUI_LS_SOLID (0)
+#define GUI_LS_DASH (1)
+#define GUI_LS_DOT (2)
+#define GUI_LS_DASHDOT (3)
+#define GUI_LS_DASHDOTDOT (4)
+
+ /**********************************
+ *
+ * Pen shapes
+ *
+ ***********************************
+ */
+
+#define GUI_PS_ROUND (0)
+#define GUI_PS_FLAT (1)
+#define GUI_PS_SQUARE (2)
+
+ /* *********************************
+ *
+ * Standard colors
+ *
+ *********************************
+ */
+
+#define GUI_BLUE 0xFF0000
+#define GUI_GREEN 0x00FF00
+#define GUI_RED 0x0000FF
+#define GUI_CYAN 0xFFFF00
+#define GUI_MAGENTA 0xFF00FF
+#define GUI_YELLOW 0x00FFFF
+#define GUI_LIGHTBLUE 0xFF8080
+#define GUI_LIGHTGREEN 0x80FF80
+#define GUI_LIGHTRED 0x8080FF
+#define GUI_LIGHTCYAN 0xFFFF80
+#define GUI_LIGHTMAGENTA 0xFF80FF
+#define GUI_LIGHTYELLOW 0x80FFFF
+#define GUI_DARKBLUE 0x800000
+#define GUI_DARKGREEN 0x008000
+#define GUI_DARKRED 0x000080
+#define GUI_DARKCYAN 0x808000
+#define GUI_DARKMAGENTA 0x800080
+#define GUI_DARKYELLOW 0x008080
+#define GUI_WHITE 0xFFFFFF
+#define GUI_LIGHTGRAY 0xD3D3D3
+#define GUI_GRAY 0x808080
+#define GUI_DARKGRAY 0x404040
+#define GUI_BLACK 0x000000
+
+#define GUI_BROWN 0x2A2AA5
+
+#define GUI_INVALID_COLOR 0xFFFFFFF /* Invalid color - more than 24 bits */
+
+/* *********************************
+ *
+ * Coordinates
+ *
+ *********************************
+ */
+#define GUI_COORD_X 0
+#define GUI_COORD_Y 1
+
+ /*********************************************************************
+ *
+ * Standard Fonts
+ *
+ **********************************************************************
+
+ Note: The external declarations for the fonts are now also included in
+ this file.
+ */
+ extern GUI_CONST_STORAGE GUI_FONT GUI_FontHZ200x200;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_FontHZ16x16;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_FontHZ18x18;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_FontHZ20x20;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_FontHZ24x24;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_FontHZ32x32;
+
+ /* Proportional fonts */
+ extern GUI_CONST_STORAGE GUI_FONT GUI_Font8_ASCII, GUI_Font8_1;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_Font10S_ASCII, GUI_Font10S_1;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_Font10_ASCII, GUI_Font10_1;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_Font13_ASCII, GUI_Font13_1;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_Font13B_ASCII, GUI_Font13B_1;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_Font13H_ASCII, GUI_Font13H_1;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_Font13HB_ASCII, GUI_Font13HB_1;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_Font16_ASCII, GUI_Font16_1, GUI_Font16_HK, GUI_Font16_1HK;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_Font16B_ASCII, GUI_Font16B_1;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_Font24_ASCII, GUI_Font24_1;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_Font24B_ASCII, GUI_Font24B_1;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_Font32_ASCII, GUI_Font32_1;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_Font32B_ASCII, GUI_Font32B_1;
+
+ /* Monospaced */
+ extern GUI_CONST_STORAGE GUI_FONT GUI_Font4x6;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_Font6x8, GUI_Font6x9;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_Font8x8, GUI_Font8x9;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_Font8x10_ASCII;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_Font8x12_ASCII;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_Font8x13_ASCII, GUI_Font8x13_1;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_Font8x15B_ASCII, GUI_Font8x15B_1;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_Font8x16, GUI_Font8x17, GUI_Font8x18;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_Font8x16x1x2, GUI_Font8x16x2x2, GUI_Font8x16x3x3;
+
+ /* Digits */
+ extern GUI_CONST_STORAGE GUI_FONT GUI_FontD24x32;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_FontD32;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_FontD36x48;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_FontD48;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_FontD48x64;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_FontD64;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_FontD60x80;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_FontD80;
+
+ /* Comic fonts */
+ extern GUI_CONST_STORAGE GUI_FONT GUI_FontComic18B_ASCII, GUI_FontComic18B_1;
+ extern GUI_CONST_STORAGE GUI_FONT GUI_FontComic24B_ASCII, GUI_FontComic24B_1;
+
+ /*
+ *********************************
+ * *
+ * Text and drawing mode defines *
+ * *
+ *********************************
+
+ These defines come in two flavors: the long version (.._DRAWMODE_..)
+ and the short ones (.._DM_..). They are identical, feel free to use
+ which ever one you like best.
+
+ */
+
+#define GUI_DRAWMODE_NORMAL LCD_DRAWMODE_NORMAL
+#define GUI_DRAWMODE_XOR LCD_DRAWMODE_XOR
+#define GUI_DRAWMODE_TRANS LCD_DRAWMODE_TRANS
+#define GUI_DRAWMODE_REV LCD_DRAWMODE_REV
+#define GUI_DM_NORMAL LCD_DRAWMODE_NORMAL
+#define GUI_DM_XOR LCD_DRAWMODE_XOR
+#define GUI_DM_TRANS LCD_DRAWMODE_TRANS
+#define GUI_DM_REV LCD_DRAWMODE_REV
+
+#define GUI_TEXTMODE_NORMAL LCD_DRAWMODE_NORMAL
+#define GUI_TEXTMODE_XOR LCD_DRAWMODE_XOR
+#define GUI_TEXTMODE_TRANS LCD_DRAWMODE_TRANS
+#define GUI_TEXTMODE_REV LCD_DRAWMODE_REV
+#define GUI_TM_NORMAL LCD_DRAWMODE_NORMAL
+#define GUI_TM_XOR LCD_DRAWMODE_XOR
+#define GUI_TM_TRANS LCD_DRAWMODE_TRANS
+#define GUI_TM_REV LCD_DRAWMODE_REV
+
+/* Text alignment flags, horizontal */
+#define GUI_TA_HORIZONTAL (3 << 0)
+#define GUI_TA_LEFT (0 << 0)
+#define GUI_TA_RIGHT (1 << 0)
+#define GUI_TA_CENTER (2 << 0)
+#define GUI_TA_HCENTER GUI_TA_CENTER /* easier to remember :-) */
+
+/* Text alignment flags, vertical */
+#define GUI_TA_VERTICAL (3 << 2)
+#define GUI_TA_TOP (0 << 2)
+#define GUI_TA_BOTTOM (1 << 2)
+#define GUI_TA_BASELINE (2 << 2)
+#define GUI_TA_VCENTER (3 << 2)
+
+/* *********************************
+ *
+ * Min/Max coordinates
+ *
+ *********************************
+ */
+/* Define minimum and maximum coordinates in x and y */
+#define GUI_XMIN -4095
+#define GUI_XMAX 4095
+#define GUI_YMIN -4095
+#define GUI_YMAX 4095
+
+ /*********************************************************************
+ *
+ * Support for multitasking systems (locking)
+ *
+ **********************************************************************
+ */
+
+#if !GUI_OS
+#define GUI_LOCK()
+#define GUI_UNLOCK()
+#define GUITASK_INIT()
+#define GUITASK_COPY_CONTEXT()
+#else
+void GUI_Lock(void);
+void GUI_Unlock(void);
+void GUITASK_Init(void);
+void GUITASK_CopyContext(void);
+#define GUI_LOCK() GUI_Lock()
+#define GUI_UNLOCK() GUI_Unlock()
+#define GUITASK_INIT() GUITASK_Init()
+#define GUITASK_COPY_CONTEXT() GUITASK_CopyContext()
+#endif
+
+ /*********************************************************************
+ *
+ * GUI_CONTEXT
+ *
+ **********************************************************************
+
+ This structure is public for one reason only:
+ To allow the application to save and restore the context.
+ */
+
+ typedef union
+ {
+ U8 aColorIndex8[2];
+ U16 aColorIndex16[2];
+ } LCD_COLORINDEX_UNION;
+
+ typedef struct
+ {
+ /* Variables in LCD module */
+ LCD_COLORINDEX_UNION GLCD;
+ LCD_RECT ClipRect;
+ U8 DrawMode;
+ U8 SelLayer;
+ U8 TextStyle;
+ /* Variables in GL module */
+ GUI_RECT *pClipRect_HL; /* High level clip rectangle ... Speed optimization so drawing routines can optimize */
+ U8 PenSize;
+ U8 PenShape;
+ U8 LineStyle;
+ U8 FillStyle;
+ /* Variables in GUICHAR module */
+ const GUI_FONT GUI_UNI_PTR *pAFont;
+ const GUI_UC_ENC_APILIST *pUC_API; /* Unicode encoding API */
+ I16P LBorder;
+ I16P DispPosX, DispPosY;
+ I16P DrawPosX, DrawPosY;
+ I16P TextMode, TextAlign;
+ GUI_COLOR Color, BkColor; /* Required only when changing devices and for speed opt (caching) */
+ /* Variables in WM module */
+#if GUI_WINSUPPORT
+ const GUI_RECT *WM__pUserClipRect;
+ GUI_HWIN hAWin;
+ int xOff, yOff;
+#endif
+ /* Variables in MEMDEV module (with memory devices only) */
+#if GUI_SUPPORT_DEVICES
+ const tLCDDEV_APIList *pDeviceAPI; /* function pointers only */
+ GUI_HMEM hDevData;
+ GUI_RECT ClipRectPrev;
+#endif
+ /* Variables in Anitaliasing module */
+#if GUI_SUPPORT_AA
+ const tLCD_HL_APIList *pLCD_HL; /* Required to reroute drawing (HLine & Pixel) to the AA module */
+ U8 AA_Factor;
+ U8 AA_HiResEnable;
+#endif
+ } GUI_CONTEXT;
+
+/* Rename GUI_SaveContext in order to avoid crashes if wrong GUIConf is used */
+#if (GUI_WINSUPPORT && GUI_SUPPORT_DEVICES)
+#define GUI_SaveContext GUI_SaveContext_W_M
+#elif (!GUI_WINSUPPORT && GUI_SUPPORT_DEVICES)
+#define GUI_SaveContext GUI_SaveContext_M
+#elif (GUI_WINSUPPORT && !GUI_SUPPORT_DEVICES)
+#define GUI_SaveContext GUI_SaveContext_W
+#else
+#define GUI_SaveContext GUI_SaveContext_
+#endif
+
+ /*********************************************************************
+ *
+ * General routines
+ *
+ **********************************************************************
+ */
+ int GUI_Init(void);
+ void GUI_SetDefault(void);
+ GUI_DRAWMODE GUI_SetDrawMode(GUI_DRAWMODE dm);
+ const char *GUI_GetVersionString(void);
+ void GUI_SaveContext(GUI_CONTEXT *pContext);
+ void GUI_RestoreContext(const GUI_CONTEXT *pContext);
+
+ /*********************************************************************
+ *
+ * Rectangle helper functions
+ *
+ **********************************************************************
+ */
+
+ int GUI_RectsIntersect(const GUI_RECT *pr0, const GUI_RECT *pr1);
+ void GUI_MoveRect(GUI_RECT *pRect, int x, int y);
+ void GUI_MergeRect(GUI_RECT *pDest, const GUI_RECT *pr0, const GUI_RECT *pr1);
+ int GUI__IntersectRects(GUI_RECT *pDest, const GUI_RECT *pr0, const GUI_RECT *pr1);
+ void GUI__IntersectRect(GUI_RECT *pDest, const GUI_RECT *pr0);
+ void GUI__ReduceRect(GUI_RECT *pDest, const GUI_RECT *pRect, int Dist);
+
+ /*********************************************************************
+ *
+ * Misc helper functions
+ *
+ **********************************************************************
+ */
+
+ int GUI__DivideRound(int a, int b);
+ I32 GUI__DivideRound32(I32 a, I32 b);
+ int GUI__SetText(GUI_HMEM *phText, const char *s);
+
+ /*********************************************************************
+ *
+ * Get / Set Attributes
+ *
+ **********************************************************************
+ */
+
+ GUI_COLOR GUI_GetBkColor(void);
+ GUI_COLOR GUI_GetColor(void);
+ int GUI_GetBkColorIndex(void);
+ int GUI_GetColorIndex(void);
+ U8 GUI_GetPenSize(void);
+ U8 GUI_GetPenShape(void);
+ U8 GUI_GetLineStyle(void);
+ U8 GUI_GetFillStyle(void);
+
+ void GUI_SetBkColor(GUI_COLOR);
+ void GUI_SetColor(GUI_COLOR);
+ void GUI_SetBkColorIndex(int Index);
+ void GUI_SetColorIndex(int Index);
+
+ U8 GUI_SetPenSize(U8 Size);
+ U8 GUI_SetPenShape(U8 Shape);
+ U8 GUI_SetLineStyle(U8 Style);
+ U8 GUI_SetFillStyle(U8 Style);
+
+ /* Get/Set Character used as decimal point (usually '.' or ',') */
+ char GUI_GetDecChar(void);
+ char GUI_SetDecChar(char c);
+
+ /*********************************************************************
+ *
+ * Color / Index related functions
+ *
+ **********************************************************************
+ */
+
+ int GUI_Color2Index(GUI_COLOR color);
+ GUI_COLOR GUI_Color2VisColor(GUI_COLOR color);
+ char GUI_ColorIsAvailable(GUI_COLOR color);
+ GUI_COLOR GUI_Index2Color(int Index);
+ void GUI_InitLUT(void);
+ void GUI_SetLUTEntry(U8 Pos, GUI_COLOR Color);
+ void GUI_SetLUTColor(U8 Pos, GUI_COLOR Color);
+ void GUI_SetLUTColorEx(U8 Pos, LCD_COLOR Color, unsigned int LayerIndex);
+ U32 GUI_CalcColorDist(GUI_COLOR Color0, GUI_COLOR Color1);
+ U32 GUI_CalcVisColorError(GUI_COLOR color);
+
+ /*********************************************************************
+ *
+ * Logging (for debugging primarily)
+ *
+ **********************************************************************
+ */
+ void GUI_Log(const char *s);
+ void GUI_Log1(const char *s, int p0);
+ void GUI_Log2(const char *s, int p0, int p1);
+ void GUI_Log3(const char *s, int p0, int p1, int p2);
+ void GUI_Log4(const char *s, int p0, int p1, int p2, int p3);
+ void GUI_Warn(const char *s);
+ void GUI_Warn1(const char *s, int p0);
+ void GUI_Warn2(const char *s, int p0, int p1);
+ void GUI_Warn3(const char *s, int p0, int p1, int p2);
+ void GUI_Warn4(const char *s, int p0, int p1, int p2, int p3);
+ void GUI_ErrorOut(const char *s);
+ void GUI_ErrorOut1(const char *s, int p0);
+ void GUI_ErrorOut2(const char *s, int p0, int p1);
+ void GUI_ErrorOut3(const char *s, int p0, int p1, int p2);
+ void GUI_ErrorOut4(const char *s, int p0, int p1, int p2, int p3);
+
+ /*********************************************************************
+ *
+ * 2d - GL
+ *
+ **********************************************************************
+ */
+
+ int GUI_BMP_Draw(const void *pFileData, int x0, int y0);
+ int GUI_BMP_GetXSize(const void *pFileData);
+ int GUI_BMP_GetYSize(const void *pFileData);
+ void GUI_Clear(void);
+ void GUI_ClearRect(int x0, int y0, int x1, int y1);
+ void GUI_ClearRectEx(const GUI_RECT *pRect);
+ void GUI_DrawArc(int x0, int y0, int rx, int ry, int a0, int a1);
+ void GUI_DrawBitmap(const GUI_BITMAP GUI_UNI_PTR *pBM, int x0, int y0);
+ void GUI_DrawBitmapMag(const GUI_BITMAP GUI_UNI_PTR *pBM, int x0, int y0, int XMul, int YMul);
+ void GUI_DrawBitmapEx(const GUI_BITMAP GUI_UNI_PTR *pBitmap, int x0, int y0, int xCenter, int yCenter, int xMag, int yMag);
+ void GUI_DrawBitmapExp(int x0, int y0, int XSize, int YSize, int XMul, int YMul, int BitsPerPixel, int BytesPerLine, const U8 GUI_UNI_PTR *pData, const GUI_LOGPALETTE GUI_UNI_PTR *pPal);
+ void GUI_DrawCircle(int x0, int y0, int r);
+ void GUI_DrawEllipse(int x0, int y0, int rx, int ry);
+ void GUI_DrawGraph(I16 *pay, int NumPoints, int x0, int y0);
+ void GUI_DrawHLine(int y0, int x0, int x1);
+ void GUI_DrawLine(int x0, int y0, int x1, int y1);
+ void GUI_DrawLineRel(int dx, int dy);
+ void GUI_DrawLineTo(int x, int y);
+ void GUI_DrawPie(int x0, int y0, int r, int a0, int a1, int Type);
+ void GUI_DrawPixel(int x, int y);
+ void GUI_DrawPoint(int x, int y);
+ void GUI_DrawPolygon(const GUI_POINT *pPoints, int NumPoints, int x0, int y0);
+ void GUI_DrawPolyLine(const GUI_POINT *pPoints, int NumPoints, int x0, int y0);
+ void GUI_DrawFocusRect(const GUI_RECT *pRect, int Dist);
+ void GUI_DrawRect(int x0, int y0, int x1, int y1); // 画矩形
+ void GUI_DrawRectEx(const GUI_RECT *pRect);
+ void GUI_DrawVLine(int x0, int y0, int y1);
+ void GUI_FillCircle(int x0, int y0, int r);
+ void GUI_FillEllipse(int x0, int y0, int rx, int ry);
+ void GUI_FillPolygon(const GUI_POINT *pPoints, int NumPoints, int x0, int y0);
+ void GUI_FillRect(int x0, int y0, int x1, int y1);
+ void GUI_FillRectEx(const GUI_RECT *pRect);
+ void GUI_GetClientRect(GUI_RECT *pRect);
+ void GUI_InvertRect(int x0, int y0, int x1, int y1);
+ void GUI_MoveRel(int dx, int dy);
+ void GUI_MoveTo(int x, int y);
+
+ /*********************************************************************
+ *
+ * JPEG support
+ *
+ **********************************************************************
+ */
+ typedef struct
+ {
+ int XSize;
+ int YSize;
+ } GUI_JPEG_INFO;
+
+ int GUI_JPEG_Draw(const void *pFileData, int DataSize, int x0, int y0);
+ int GUI_JPEG_GetInfo(const void *pFileData, int DataSize, GUI_JPEG_INFO *pInfo);
+
+ /*********************************************************************
+ *
+ * Cursor routines
+ *
+ **********************************************************************
+ */
+
+ typedef struct
+ {
+ const GUI_UNI_PTR GUI_BITMAP *pBitmap;
+ int xHot, yHot;
+ } GUI_CURSOR;
+
+#if GUI_SUPPORT_CURSOR
+ void GUI_CURSOR_Activate(void);
+ void GUI_CURSOR_Deactivate(void);
+ void GUI_CURSOR_Hide(void);
+ void GUI_CURSOR_SetXor(const GUI_BITMAP *pBM, int x, int y);
+ void GUI_CURSOR_SetPosition(int x, int y);
+ const GUI_CURSOR GUI_UNI_PTR *GUI_CURSOR_Select(const GUI_CURSOR GUI_UNI_PTR *pCursor);
+ void GUI_CURSOR_Show(void);
+#else
+#define GUI_CURSOR_Show()
+#define GUI_CURSOR_Clear() ;
+#endif
+
+ /*********************************************************************
+ *
+ * Cursors and their bitmaps
+ *
+ **********************************************************************
+ */
+ extern GUI_CONST_STORAGE GUI_CURSOR GUI_CursorArrowS, GUI_CursorArrowSI;
+ extern GUI_CONST_STORAGE GUI_CURSOR GUI_CursorArrowM, GUI_CursorArrowMI;
+ extern GUI_CONST_STORAGE GUI_CURSOR GUI_CursorArrowL, GUI_CursorArrowLI;
+ extern GUI_CONST_STORAGE GUI_CURSOR GUI_CursorCrossS, GUI_CursorCrossSI;
+ extern GUI_CONST_STORAGE GUI_CURSOR GUI_CursorCrossM, GUI_CursorCrossMI;
+ extern GUI_CONST_STORAGE GUI_CURSOR GUI_CursorCrossL, GUI_CursorCrossLI;
+ extern GUI_CONST_STORAGE GUI_CURSOR GUI_CursorHeaderM, GUI_CursorHeaderMI;
+
+ extern GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapArrowS, GUI_BitmapArrowSI;
+ extern GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapArrowM, GUI_BitmapArrowMI;
+ extern GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapArrowL, GUI_BitmapArrowLI;
+ extern GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapCrossS, GUI_BitmapCrossSI;
+ extern GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapCrossM, GUI_BitmapCrossMI;
+ extern GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapCrossL, GUI_BitmapCrossLI;
+
+ /*********************************************************************
+ *
+ * Text related routines
+ *
+ **********************************************************************
+ */
+
+ void GUI_DispCEOL(void);
+ void GUI_DispChar(U16 c);
+ void GUI_DispChars(U16 c, int Cnt);
+ void GUI_DispCharAt(U16 c, I16P x, I16P y);
+ void GUI_DispString(const char GUI_UNI_PTR *s);
+ void GUI_DispStringAt(const char GUI_UNI_PTR *s, int x, int y);
+ void GUI_DispStringAtCEOL(const char GUI_UNI_PTR *s, int x, int y);
+ void GUI_DispStringHCenterAt(const char GUI_UNI_PTR *s, int x, int y);
+ void GUI__DispStringInRect(const char GUI_UNI_PTR *s, GUI_RECT *pRect, int TextAlign, int MaxNumChars);
+ void GUI_DispStringInRect(const char GUI_UNI_PTR *s, GUI_RECT *pRect, int Flags);
+#if GUI_SUPPORT_ROTATION
+ void GUI_DispStringInRectEx(const char GUI_UNI_PTR *s, GUI_RECT *pRect, int TextAlign, int MaxLen, const GUI_ROTATION *pLCD_Api);
+#endif
+ void GUI_DispStringInRectMax(const char GUI_UNI_PTR *s, GUI_RECT *pRect, int TextAlign, int MaxLen); /* Not to be doc. */
+ void GUI_DispStringLen(const char GUI_UNI_PTR *s, int Len);
+ void GUI_GetTextExtend(GUI_RECT *pRect, const char GUI_UNI_PTR *s, int Len);
+ int GUI_GetYAdjust(void);
+ int GUI_GetDispPosX(void);
+ int GUI_GetDispPosY(void);
+ const GUI_FONT GUI_UNI_PTR *GUI_GetFont(void);
+ int GUI_GetCharDistX(U16 c);
+ int GUI_GetStringDistX(const char GUI_UNI_PTR *s);
+ int GUI_GetFontDistY(void);
+ int GUI_GetFontSizeY(void);
+ void GUI_GetFontInfo(const GUI_FONT GUI_UNI_PTR *pFont, GUI_FONTINFO *pfi);
+ int GUI_GetYSizeOfFont(const GUI_FONT GUI_UNI_PTR *pFont);
+ int GUI_GetYDistOfFont(const GUI_FONT GUI_UNI_PTR *pFont);
+ int GUI_GetTextAlign(void);
+ int GUI_GetTextMode(void);
+ char GUI_IsInFont(const GUI_FONT GUI_UNI_PTR *pFont, U16 c);
+ int GUI_SetTextAlign(int Align);
+ int GUI_SetTextMode(int Mode);
+ char GUI_SetTextStyle(char Style);
+ int GUI_SetLBorder(int x);
+ void GUI_SetOrg(int x, int y);
+ const GUI_FONT GUI_UNI_PTR *GUI_SetFont(const GUI_FONT GUI_UNI_PTR *pNewFont);
+ char GUI_GotoXY(int x, int y);
+ char GUI_GotoX(int x);
+ char GUI_GotoY(int y);
+ void GUI_DispNextLine(void);
+
+ /*********************************************************************
+ *
+ * Position independent fonts
+ *
+ **********************************************************************
+ */
+ void GUI_SIF_CreateFont(void *pFontData, GUI_FONT *pFont, const GUI_SIF_TYPE *pFontType);
+ void GUI_SIF_DeleteFont(GUI_FONT *pFont);
+
+ /*********************************************************************
+ *
+ * Unicode support
+ *
+ **********************************************************************
+ */
+
+ int GUI_UC_Encode(char *s, U16 Char);
+ int GUI_UC_GetCharSize(const char GUI_UNI_PTR *s);
+ U16 GUI_UC_GetCharCode(const char GUI_UNI_PTR *s);
+ void GUI_UC_SetEncodeNone(void);
+ void GUI_UC_SetEncodeUTF8(void);
+
+ void GUI_UC_DispString(const U16 GUI_UNI_PTR *s);
+ void GUI_UC2DB(U16 Code, U8 *pOut);
+ U16 GUI_DB2UC(U8 Byte0, U8 Byte1);
+
+ /* *********************************
+ * *
+ * GUIVAL.C *
+ * *
+ *********************************
+ */
+
+ void GUI_DispBin(U32 v, U8 Len);
+ void GUI_DispBinAt(U32 v, I16P x, I16P y, U8 Len);
+ void GUI_DispDec(I32 v, U8 Len); // 十进制显示
+ void GUI_DispDecAt(I32 v, I16P x, I16P y, U8 Len);
+ void GUI_DispDecMin(I32 v);
+ void GUI_DispDecShift(I32 v, U8 Len, U8 Shift);
+ void GUI_DispDecSpace(I32 v, U8 MaxDigits);
+ void GUI_DispHex(U32 v, U8 Len);
+ void GUI_DispHexAt(U32 v, I16P x, I16P y, U8 Len);
+ void GUI_DispSDec(I32 v, U8 Len); // 显示加减号
+ void GUI_DispSDecShift(I32 v, U8 Len, U8 Shift);
+
+ /* *********************************
+ * *
+ * GUIVALF.C *
+ * *
+ *********************************
+
+ Routines to display floating point values. These routines use the routines
+ defined in the module GUIVAL.C as base routines.
+
+ */
+
+ void GUI_DispFloat(float v, char Len);
+ void GUI_DispFloatFix(float v, char Len, char Fract);
+ void GUI_DispFloatMin(float v, char Fract);
+ void GUI_DispSFloatFix(float v, char Len, char Fract);
+ void GUI_DispSFloatMin(float v, char Fract);
+
+ /*********************************************************************
+ *
+ * Dynamic memory management
+ *
+ **********************************************************************
+ */
+
+#if !defined(GUI_ALLOC_ALLOC)
+ /* diagnostics */
+ GUI_ALLOC_DATATYPE GUI_ALLOC_GetUsed(void);
+ GUI_ALLOC_DATATYPE GUI_ALLOC_GetNumFreeBytes(void);
+#endif
+
+ GUI_HMEM GUI_ALLOC_AllocInit(const void *pInitData, GUI_ALLOC_DATATYPE Size);
+ GUI_HMEM GUI_ALLOC_AllocNoInit(GUI_ALLOC_DATATYPE size);
+ GUI_HMEM GUI_ALLOC_AllocZero(GUI_ALLOC_DATATYPE size);
+ void GUI_ALLOC_Free(GUI_HMEM hMem);
+ void GUI_ALLOC_FreePtr(GUI_HMEM *phMem);
+ GUI_ALLOC_DATATYPE GUI_ALLOC_GetSize(GUI_HMEM hMem);
+ GUI_ALLOC_DATATYPE GUI_ALLOC_GetMaxSize(void);
+ void *GUI_ALLOC_h2p(GUI_HMEM hMem);
+ void GUI_ALLOC_Init(void);
+ GUI_HMEM GUI_ALLOC_Realloc(GUI_HMEM hOld, int NewSize);
+
+ /*********************************************************************
+ *
+ * Memory device: GUI_MEMDEV
+ *
+ **********************************************************************
+ */
+
+#define GUI_MEMDEV_HASTRANS 0
+#define GUI_MEMDEV_NOTRANS (1 << 0)
+
+#if GUI_SUPPORT_DEVICES
+ typedef GUI_HMEM GUI_MEMDEV_Handle;
+ typedef void GUI_CALLBACK_VOID_P(void *p);
+
+ typedef struct
+ {
+ GUI_RECT rView, rPrev;
+ char FirstCall;
+ } GUI_AUTODEV;
+
+ typedef struct
+ {
+ char DrawFixed;
+ char IsMeasurement;
+ } GUI_AUTODEV_INFO;
+
+ int GUI_MEMDEV_CreateAuto(GUI_AUTODEV *pAutoDev);
+ void GUI_MEMDEV_DeleteAuto(GUI_AUTODEV *pAutoDev);
+ int GUI_MEMDEV_DrawAuto(GUI_AUTODEV *pAutoDev, GUI_AUTODEV_INFO *pAutoDevInfo, GUI_CALLBACK_VOID_P *pfDraw, void *pData);
+
+ /* Create a memory device which is compatible to the selected LCD */
+ GUI_MEMDEV_Handle GUI_MEMDEV_Create(int x0, int y0, int XSize, int YSize);
+ GUI_MEMDEV_Handle GUI_MEMDEV_CreateEx(int x0, int y0, int XSize, int YSize, int Flags);
+ GUI_MEMDEV_Handle GUI_MEMDEV_CreateFixed(int x0, int y0, int xsize, int ysize, int Flags,
+ const tLCDDEV_APIList *pMemDevAPI,
+ const LCD_API_COLOR_CONV *pColorConvAPI);
+ void GUI_MEMDEV_Clear(GUI_MEMDEV_Handle hMem);
+ void GUI_MEMDEV_CopyFromLCD(GUI_MEMDEV_Handle hMem);
+ void GUI_MEMDEV_CopyFromLCDAA(GUI_MEMDEV_Handle hMem);
+ void GUI_MEMDEV_CopyToLCD(GUI_MEMDEV_Handle hMem);
+ void GUI_MEMDEV_CopyToLCDAA(GUI_MEMDEV_Handle hMem);
+ void GUI_MEMDEV_CopyToLCDAt(GUI_MEMDEV_Handle hMem, int x, int y);
+ int GUI_MEMDEV_CompareWithLCD(GUI_MEMDEV_Handle hMem, int *px, int *py, int *pExp, int *pAct);
+ void GUI_MEMDEV_Delete(GUI_MEMDEV_Handle MemDev);
+ int GUI_MEMDEV_GetXSize(GUI_MEMDEV_Handle hMem);
+ int GUI_MEMDEV_GetYSize(GUI_MEMDEV_Handle hMem);
+ void GUI_MEMDEV_ReduceYSize(GUI_MEMDEV_Handle hMem, int YSize);
+ GUI_MEMDEV_Handle GUI_MEMDEV_Select(GUI_MEMDEV_Handle hMem); /* Select (activate) a particular memory device. */
+ void GUI_MEMDEV_SetOrg(GUI_MEMDEV_Handle hMem, int x0, int y0);
+ void GUI_MEMDEV_WriteAt(GUI_MEMDEV_Handle hMem, int x, int y);
+ void GUI_MEMDEV_Write(GUI_MEMDEV_Handle hMem);
+ void GUI_MEMDEV_WriteAlphaAt(GUI_MEMDEV_Handle hMem, int Alpha, int x, int y);
+ void GUI_MEMDEV_WriteAlpha(GUI_MEMDEV_Handle hMem, int Alpha);
+ void GUI_MEMDEV_WriteExAt(GUI_MEMDEV_Handle hMem, int x, int y, int xMag, int yMag, int Alpha);
+ void GUI_MEMDEV_WriteEx(GUI_MEMDEV_Handle hMem, int xMag, int yMag, int Alpha);
+ int GUI_MEMDEV_Draw(GUI_RECT *pRect, GUI_CALLBACK_VOID_P *pfDraw, void *pData, int MemSize, int Flags);
+ void *GUI_MEMDEV_GetDataPtr(GUI_MEMDEV_Handle hMem);
+#endif
+
+ void GUI_SelectLCD(void);
+ unsigned int GUI_SelectLayer(unsigned int Index);
+
+ /**************************************************************
+ *
+ * Measure device: GUI_MEASDEV
+ *
+ ***************************************************************
+ */
+
+ typedef GUI_HMEM GUI_MEASDEV_Handle;
+
+ GUI_MEASDEV_Handle GUI_MEASDEV_Create(void);
+ void GUI_MEASDEV_Delete(GUI_MEASDEV_Handle hMemDev);
+ void GUI_MEASDEV_Select(GUI_MEASDEV_Handle hMem);
+ void GUI_MEASDEV_GetRect(GUI_MEASDEV_Handle hMem, GUI_RECT *pRect);
+ void GUI_MEASDEV_ClearRect(GUI_MEASDEV_Handle hMem);
+
+ /************************************************************
+ *
+ * Polygon helpers
+ *
+ *************************************************************
+ */
+ void GUI_RotatePolygon(GUI_POINT *pDest, const GUI_POINT *pSrc, int NumPoints, float Angle);
+ void GUI_MagnifyPolygon(GUI_POINT *pDest, const GUI_POINT *pSrc, int NumPoints, int Mag);
+ void GUI_EnlargePolygon(GUI_POINT *pDest, const GUI_POINT *pSrc, int NumPoints, int Len);
+
+ /************************************************************
+ *
+ * Streamed bitmap
+ *
+ *************************************************************
+ */
+ void GUI_DrawStreamedBitmap(const GUI_BITMAP_STREAM *pBitmapStream, int x, int y);
+
+ /************************************************************
+ *
+ * BMP-export
+ *
+ *************************************************************
+ */
+ typedef void GUI_CALLBACK_VOID_U8_P(U8 Data, void *p);
+
+ void GUI_BMP_SerializeEx(GUI_CALLBACK_VOID_U8_P *pfSerialize, int x0, int y0, int xSize, int ySize, void *p);
+ void GUI_BMP_Serialize(GUI_CALLBACK_VOID_U8_P *pfSerialize, void *p);
+
+ /*********************************************************************
+ *
+ * Time / execution related routines
+ *
+ **********************************************************************
+ */
+ void GUI_Delay(int Period);
+ int GUI_GetTime(void);
+ int GUI_Exec(void); /* Execute all jobs ... Return 0 if nothing was done. */
+ int GUI_Exec1(void); /* Execute one job ... Return 0 if nothing was done. */
+
+ /*********************************************************************
+ *
+ * MessageBox
+ *
+ **********************************************************************
+
+ Note: These should be moved into a separate file.
+ */
+ int GUI_MessageBox(const char *sMessage, const char *sCaption, int Flags);
+#define GUI_MESSAGEBOX_CF_MOVEABLE (1 << 4)
+
+#define GUI_MB_OK 20
+#define GUI_MB_WARNING 21
+
+ /*********************************************************************
+ *
+ * GUI_TIMER module
+ *
+ **********************************************************************
+ */
+
+ typedef struct
+ {
+ GUI_TIMER_TIME Time;
+ U32 Context;
+ } GUI_TIMER_MESSAGE;
+
+ typedef GUI_HMEM GUI_TIMER_HANDLE;
+ typedef void GUI_TIMER_CALLBACK(/*const*/ GUI_TIMER_MESSAGE *pTM);
+
+ GUI_TIMER_HANDLE GUI_TIMER_Create(GUI_TIMER_CALLBACK *cb, int Time, U32 Context, int Flags);
+ void GUI_TIMER_Delete(GUI_TIMER_HANDLE hObj);
+
+ /* Methods changing properties */
+ void GUI_TIMER_SetPeriod(GUI_TIMER_HANDLE hObj, GUI_TIMER_TIME Period);
+ void GUI_TIMER_SetTime(GUI_TIMER_HANDLE hObj, GUI_TIMER_TIME Period);
+ void GUI_TIMER_SetDelay(GUI_TIMER_HANDLE hObj, GUI_TIMER_TIME Delay);
+ void GUI_TIMER_Restart(GUI_TIMER_HANDLE hObj);
+ int GUI_TIMER_Exec(void);
+
+ void GUI_TIMER_Context(GUI_TIMER_HANDLE hObj, U32 Context); // houhh 20061020
+
+ /******************************************************************
+ *
+ * Anti Aliasing
+ *
+ *******************************************************************
+ */
+
+ void GUI_AA_DisableHiRes(void);
+ void GUI_AA_EnableHiRes(void);
+ int GUI_AA_GetFactor(void);
+ void GUI_AA_SetFactor(int Factor);
+ void GUI_AA_DrawArc(int x0, int y0, int rx, int ry, int a0, int a1);
+ void GUI_AA_DrawLine(int x0, int y0, int x1, int y1);
+ void GUI_AA_DrawPolyOutline(const GUI_POINT *pSrc, int NumPoints, int Thickness, int x, int y);
+ void GUI_AA_FillCircle(int x0, int y0, int r);
+ void GUI_AA_FillPolygon(GUI_POINT *pPoints, int NumPoints, int x0, int y0);
+
+ /******************************************************************
+ *
+ * Keyboard
+ *
+ *******************************************************************
+ */
+
+ /* Message layer */
+ void GUI_StoreKeyMsg(int Key, int Pressed);
+ void GUI_SendKeyMsg(int Key, int Pressed);
+ int GUI_PollKeyMsg(void);
+
+ /* Message hook */
+ typedef int GUI_KEY_MSG_HOOK(int Key, int Pressed);
+ extern GUI_KEY_MSG_HOOK *GUI_pfKeyMsgHook;
+ GUI_KEY_MSG_HOOK *GUI_SetKeyMsgHook(GUI_KEY_MSG_HOOK *pHook);
+
+ /* Application layer */
+ int GUI_GetKey(void);
+ int GUI_WaitKey(void);
+ void GUI_StoreKey(int c);
+ void GUI_ClearKeyBuffer(void);
+
+ /*********************************************************************
+ *
+ * Task syncronisation (depends on configuration)
+ */
+ void GUI_WaitEvent(void);
+
+ /*********************************************************************
+ *
+ * PID (Pointer input device ... mouse/touch)
+ */
+
+ void GUI_PID_StoreState(const GUI_PID_STATE *pState);
+ int GUI_PID_GetState(GUI_PID_STATE *pState);
+
+ /*********************************************************************
+ *
+ * Mouse, generic
+ */
+ int GUI_MOUSE_GetState(GUI_PID_STATE *pState);
+ void GUI_MOUSE_StoreState(const GUI_PID_STATE *pState);
+
+ /*********************************************************************
+ *
+ * TOUCH screen, generic
+ */
+
+ int GUI_TOUCH_GetState(GUI_PID_STATE *pState);
+ void GUI_TOUCH_GetUnstable(int *px, int *py); /* for diagnostics only */
+ void GUI_TOUCH_StoreState(int x, int y);
+ void GUI_TOUCH_StoreStateEx(const GUI_PID_STATE *pState);
+ void GUI_TOUCH_StoreUnstable(int x, int y);
+
+ /*********************************************************************
+ *
+ * Mouse, PS2 driver
+ */
+ void GUI_MOUSE_DRIVER_PS2_Init(void); /* optional */
+ void GUI_MOUSE_DRIVER_PS2_OnRx(unsigned char Data);
+
+ /*********************************************************************
+ *
+ * TOUCH screen, analog driver
+ */
+ void GUI_TOUCH_Exec(void);
+ int GUI_TOUCH_Calibrate(int Coord, int Log0, int Log1, int Phys0, int Phys1);
+ void GUI_TOUCH_SetDefaultCalibration(void);
+ int GUI_TOUCH_GetxPhys(void); /* for diagnostics only */
+ int GUI_TOUCH_GetyPhys(void); /* for diagnostics only */
+ void GUI_TOUCH_GetCalData(int Coord, int *pMin, int *pMax);
+
+ /*********************************************************************
+ *
+ * TOUCH
+ *
+ * imports
+ *
+ **********************************************************************
+
+ Please note: The following functions are required by the module.
+ They need to be part of your application software (or rather, part
+ of the hardware-layer of your software).
+ */
+
+ void GUI_TOUCH_X_ActivateX(void);
+ void GUI_TOUCH_X_ActivateY(void);
+ void GUI_TOUCH_X_Disable(void);
+ int GUI_TOUCH_X_MeasureX(void);
+ int GUI_TOUCH_X_MeasureY(void);
+
+ /**************************************************************
+ *
+ * Constants for fonts and bitmaps
+ *
+ ***************************************************************
+ */
+
+ extern const GUI_BITMAP_METHODS GUI_BitmapMethodsRLE4;
+ extern const GUI_BITMAP_METHODS GUI_BitmapMethodsRLE8;
+ extern const GUI_BITMAP_METHODS GUI_BitmapMethods565;
+ extern const GUI_BITMAP_METHODS GUI_BitmapMethodsM565;
+
+#define GUI_COMPRESS_RLE4 0
+#define GUI_COMPRESS_RLE8 0
+
+#define GUI_DRAW_RLE4 &GUI_BitmapMethodsRLE4 /* Method table ! */
+#define GUI_DRAW_RLE8 &GUI_BitmapMethodsRLE8 /* Method table ! */
+#define GUI_DRAW_BMP565 &GUI_BitmapMethods565 /* Method table ! */
+#define GUI_DRAW_BMPM565 &GUI_BitmapMethodsM565 /* Method table ! */
+
+ /**************************************************************
+ *
+ * Defines for constants
+ *
+ ***************************************************************
+ */
+
+#define ________ 0x0
+#define _______X 0x1
+#define ______X_ 0x2
+#define ______XX 0x3
+#define _____X__ 0x4
+#define _____X_X 0x5
+#define _____XX_ 0x6
+#define _____XXX 0x7
+#define ____X___ 0x8
+#define ____X__X 0x9
+#define ____X_X_ 0xa
+#define ____X_XX 0xb
+#define ____XX__ 0xc
+#define ____XX_X 0xd
+#define ____XXX_ 0xe
+#define ____XXXX 0xf
+#define ___X____ 0x10
+#define ___X___X 0x11
+#define ___X__X_ 0x12
+#define ___X__XX 0x13
+#define ___X_X__ 0x14
+#define ___X_X_X 0x15
+#define ___X_XX_ 0x16
+#define ___X_XXX 0x17
+#define ___XX___ 0x18
+#define ___XX__X 0x19
+#define ___XX_X_ 0x1a
+#define ___XX_XX 0x1b
+#define ___XXX__ 0x1c
+#define ___XXX_X 0x1d
+#define ___XXXX_ 0x1e
+#define ___XXXXX 0x1f
+#define __X_____ 0x20
+#define __X____X 0x21
+#define __X___X_ 0x22
+#define __X___XX 0x23
+#define __X__X__ 0x24
+#define __X__X_X 0x25
+#define __X__XX_ 0x26
+#define __X__XXX 0x27
+#define __X_X___ 0x28
+#define __X_X__X 0x29
+#define __X_X_X_ 0x2a
+#define __X_X_XX 0x2b
+#define __X_XX__ 0x2c
+#define __X_XX_X 0x2d
+#define __X_XXX_ 0x2e
+#define __X_XXXX 0x2f
+#define __XX____ 0x30
+#define __XX___X 0x31
+#define __XX__X_ 0x32
+#define __XX__XX 0x33
+#define __XX_X__ 0x34
+#define __XX_X_X 0x35
+#define __XX_XX_ 0x36
+#define __XX_XXX 0x37
+#define __XXX___ 0x38
+#define __XXX__X 0x39
+#define __XXX_X_ 0x3a
+#define __XXX_XX 0x3b
+#define __XXXX__ 0x3c
+#define __XXXX_X 0x3d
+#define __XXXXX_ 0x3e
+#define __XXXXXX 0x3f
+#define _X______ 0x40
+#define _X_____X 0x41
+#define _X____X_ 0x42
+#define _X____XX 0x43
+#define _X___X__ 0x44
+#define _X___X_X 0x45
+#define _X___XX_ 0x46
+#define _X___XXX 0x47
+#define _X__X___ 0x48
+#define _X__X__X 0x49
+#define _X__X_X_ 0x4a
+#define _X__X_XX 0x4b
+#define _X__XX__ 0x4c
+#define _X__XX_X 0x4d
+#define _X__XXX_ 0x4e
+#define _X__XXXX 0x4f
+#define _X_X____ 0x50
+#define _X_X___X 0x51
+#define _X_X__X_ 0x52
+#define _X_X__XX 0x53
+#define _X_X_X__ 0x54
+#define _X_X_X_X 0x55
+#define _X_X_XX_ 0x56
+#define _X_X_XXX 0x57
+#define _X_XX___ 0x58
+#define _X_XX__X 0x59
+#define _X_XX_X_ 0x5a
+#define _X_XX_XX 0x5b
+#define _X_XXX__ 0x5c
+#define _X_XXX_X 0x5d
+#define _X_XXXX_ 0x5e
+#define _X_XXXXX 0x5f
+#define _XX_____ 0x60
+#define _XX____X 0x61
+#define _XX___X_ 0x62
+#define _XX___XX 0x63
+#define _XX__X__ 0x64
+#define _XX__X_X 0x65
+#define _XX__XX_ 0x66
+#define _XX__XXX 0x67
+#define _XX_X___ 0x68
+#define _XX_X__X 0x69
+#define _XX_X_X_ 0x6a
+#define _XX_X_XX 0x6b
+#define _XX_XX__ 0x6c
+#define _XX_XX_X 0x6d
+#define _XX_XXX_ 0x6e
+#define _XX_XXXX 0x6f
+#define _XXX____ 0x70
+#define _XXX___X 0x71
+#define _XXX__X_ 0x72
+#define _XXX__XX 0x73
+#define _XXX_X__ 0x74
+#define _XXX_X_X 0x75
+#define _XXX_XX_ 0x76
+#define _XXX_XXX 0x77
+#define _XXXX___ 0x78
+#define _XXXX__X 0x79
+#define _XXXX_X_ 0x7a
+#define _XXXX_XX 0x7b
+#define _XXXXX__ 0x7c
+#define _XXXXX_X 0x7d
+#define _XXXXXX_ 0x7e
+#define _XXXXXXX 0x7f
+#define X_______ 0x80
+#define X______X 0x81
+#define X_____X_ 0x82
+#define X_____XX 0x83
+#define X____X__ 0x84
+#define X____X_X 0x85
+#define X____XX_ 0x86
+#define X____XXX 0x87
+#define X___X___ 0x88
+#define X___X__X 0x89
+#define X___X_X_ 0x8a
+#define X___X_XX 0x8b
+#define X___XX__ 0x8c
+#define X___XX_X 0x8d
+#define X___XXX_ 0x8e
+#define X___XXXX 0x8f
+#define X__X____ 0x90
+#define X__X___X 0x91
+#define X__X__X_ 0x92
+#define X__X__XX 0x93
+#define X__X_X__ 0x94
+#define X__X_X_X 0x95
+#define X__X_XX_ 0x96
+#define X__X_XXX 0x97
+#define X__XX___ 0x98
+#define X__XX__X 0x99
+#define X__XX_X_ 0x9a
+#define X__XX_XX 0x9b
+#define X__XXX__ 0x9c
+#define X__XXX_X 0x9d
+#define X__XXXX_ 0x9e
+#define X__XXXXX 0x9f
+#define X_X_____ 0xa0
+#define X_X____X 0xa1
+#define X_X___X_ 0xa2
+#define X_X___XX 0xa3
+#define X_X__X__ 0xa4
+#define X_X__X_X 0xa5
+#define X_X__XX_ 0xa6
+#define X_X__XXX 0xa7
+#define X_X_X___ 0xa8
+#define X_X_X__X 0xa9
+#define X_X_X_X_ 0xaa
+#define X_X_X_XX 0xab
+#define X_X_XX__ 0xac
+#define X_X_XX_X 0xad
+#define X_X_XXX_ 0xae
+#define X_X_XXXX 0xaf
+#define X_XX____ 0xb0
+#define X_XX___X 0xb1
+#define X_XX__X_ 0xb2
+#define X_XX__XX 0xb3
+#define X_XX_X__ 0xb4
+#define X_XX_X_X 0xb5
+#define X_XX_XX_ 0xb6
+#define X_XX_XXX 0xb7
+#define X_XXX___ 0xb8
+#define X_XXX__X 0xb9
+#define X_XXX_X_ 0xba
+#define X_XXX_XX 0xbb
+#define X_XXXX__ 0xbc
+#define X_XXXX_X 0xbd
+#define X_XXXXX_ 0xbe
+#define X_XXXXXX 0xbf
+#define XX______ 0xc0
+#define XX_____X 0xc1
+#define XX____X_ 0xc2
+#define XX____XX 0xc3
+#define XX___X__ 0xc4
+#define XX___X_X 0xc5
+#define XX___XX_ 0xc6
+#define XX___XXX 0xc7
+#define XX__X___ 0xc8
+#define XX__X__X 0xc9
+#define XX__X_X_ 0xca
+#define XX__X_XX 0xcb
+#define XX__XX__ 0xcc
+#define XX__XX_X 0xcd
+#define XX__XXX_ 0xce
+#define XX__XXXX 0xcf
+#define XX_X____ 0xd0
+#define XX_X___X 0xd1
+#define XX_X__X_ 0xd2
+#define XX_X__XX 0xd3
+#define XX_X_X__ 0xd4
+#define XX_X_X_X 0xd5
+#define XX_X_XX_ 0xd6
+#define XX_X_XXX 0xd7
+#define XX_XX___ 0xd8
+#define XX_XX__X 0xd9
+#define XX_XX_X_ 0xda
+#define XX_XX_XX 0xdb
+#define XX_XXX__ 0xdc
+#define XX_XXX_X 0xdd
+#define XX_XXXX_ 0xde
+#define XX_XXXXX 0xdf
+#define XXX_____ 0xe0
+#define XXX____X 0xe1
+#define XXX___X_ 0xe2
+#define XXX___XX 0xe3
+#define XXX__X__ 0xe4
+#define XXX__X_X 0xe5
+#define XXX__XX_ 0xe6
+#define XXX__XXX 0xe7
+#define XXX_X___ 0xe8
+#define XXX_X__X 0xe9
+#define XXX_X_X_ 0xea
+#define XXX_X_XX 0xeb
+#define XXX_XX__ 0xec
+#define XXX_XX_X 0xed
+#define XXX_XXX_ 0xee
+#define XXX_XXXX 0xef
+#define XXXX____ 0xf0
+#define XXXX___X 0xf1
+#define XXXX__X_ 0xf2
+#define XXXX__XX 0xf3
+#define XXXX_X__ 0xf4
+#define XXXX_X_X 0xf5
+#define XXXX_XX_ 0xf6
+#define XXXX_XXX 0xf7
+#define XXXXX___ 0xf8
+#define XXXXX__X 0xf9
+#define XXXXX_X_ 0xfa
+#define XXXXX_XX 0xfb
+#define XXXXXX__ 0xfc
+#define XXXXXX_X 0xfd
+#define XXXXXXX_ 0xfe
+#define XXXXXXXX 0xff
+
+ /**************************************************************
+ *
+ * Compatibility with older versions
+ *
+ ***************************************************************
+ */
+
+#define GUI_DispString_UC GUI_UC_DispString
+#define TOUCH_X_ActivateX GUI_TOUCH_X_ActivateX
+#define TOUCH_X_ActivateY GUI_TOUCH_X_ActivateY
+#define TOUCH_X_Disable GUI_TOUCH_X_Disable
+#define TOUCH_X_MeasureX GUI_TOUCH_X_MeasureX
+#define TOUCH_X_MeasureY GUI_TOUCH_X_MeasureY
+#define GUI_SelLayer GUI_SelectLayer
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* ifdef GUI_H */
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI2DLib.c b/User/system/lib/lcd/gui/Core/GUI2DLib.c
new file mode 100644
index 0000000..bc67448
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI2DLib.c
@@ -0,0 +1,768 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI2DLib.C
+Purpose : Main part of the 2D graphics library
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI_Protected.h"
+#include "GUIDebug.h"
+
+/*********************************************************************
+ *
+ * defines
+ *
+ **********************************************************************
+ */
+
+#define ABS(v) ((v > 0) ? v : -v)
+
+/*********************************************************************
+ *
+ * static code, helper functions
+ *
+ **********************************************************************
+ */
+/*********************************************************************
+ *
+ * _SwapInt
+ */
+static void _SwapInt(int *pa, int *pb)
+{
+ int t;
+ t = *pa;
+ *pa = *pb;
+ *pb = t;
+}
+
+/*********************************************************************
+ *
+ * Abs
+ */
+static int Abs(int v)
+{
+ return ABS(v);
+}
+
+/*********************************************************************
+ *
+ * trigonometric functions
+ *
+ * NOTE:
+ * All trigonometric functions are for internal usage only and
+ * use the following conventions:
+ *
+ * Angles: 4096 <==> 360
+ *
+ **********************************************************************
+ */
+
+#if GUI_45DEG != 512
+#error Wrong define for this library !
+#endif
+
+/*********************************************************************
+ *
+ * sin / cos (internal)
+ *
+ * Angle : 90/1024
+ * Data : 1/1024
+ */
+static const U16 aSin[] = {
+ 0, /* 1/16 *90 */
+ 100, /* 1/16 *90 */
+ 200, /* 2/16 *90 */
+ 297, /* 3/16 *90 */
+ 392, /* 4/16 *90 */
+ 483, /* 5/16 *90 */
+ 569, /* 6/16 *90 */
+ 650, /* 7/16 *90 */
+ 724, /* 8/16 *90 */
+ 792, /* 9/16 *90 */
+ 851, /* 10/16 *90 */
+ 903, /* 11/16 *90 */
+ 946, /* 12/16 *90 */
+ 980, /* 13/16 *90 */
+ 1004, /* 14/16 *90 */
+ 1019, /* 15/16 *90 */
+ 1024 /* 16/16 *90 */
+};
+
+/*********************************************************************
+ *
+ * GUI_sin
+ */
+int GUI_sin(int angle)
+{
+ char IsNeg = 0;
+ int i;
+ U16 Faktor;
+ U32 t;
+ angle &= ((1 << 12) - 1); /* reduce to 0-360 degrees */
+ if (angle > 2 * GUI_90DEG)
+ {
+ angle -= 2 * GUI_90DEG;
+ IsNeg = 1;
+ }
+ if (angle > GUI_90DEG)
+ { /* between 90-180 */
+ angle = 2 * GUI_90DEG - angle; /* use sine symetry */
+ }
+ /* Now angle is reduced to 0 <= <= 90 */
+#if 0
+ angle >>=2; /* make sure we do not exceed 16 bits in calculations */
+ i = angle>>4;
+ Faktor = (1<<4)-(angle&((1<<4)-1));
+ r = aSin[i]*Faktor;
+ if (Faktor !=(1<<4)) {
+ r += aSin[i+1]*((1<<4)-Faktor);
+ }
+ r = (r+(1<<3)) >>4; /* divide,incl. rounding */
+#else
+ i = angle >> 6;
+ {
+ Faktor = (U16)((1 << 6) - (angle & ((1 << 6) - 1)));
+ t = aSin[i] * (U32)Faktor;
+ if (Faktor != (1 << 6))
+ {
+ t += aSin[i + 1] * ((1 << 6) - Faktor);
+ }
+ }
+ t = (t + (1 << 5)) >> 6; /* divide,incl. rounding */
+#endif
+ return (IsNeg) ? 0 - t : t;
+}
+
+/*********************************************************************
+ *
+ * GUI_cos
+ */
+int GUI_cos(int angle)
+{
+ return GUI_sin(angle + GUI_90DEG);
+}
+
+/*********************************************************************
+ *
+ * atan() (internal)
+ *
+ * Angle : 360/4096
+ */
+const I16 aTan[] = {
+ 0, /* atan(0/16) */
+ 41, /* atan(1/16) */
+ 81, /* atan(2/16) */
+ 121, /* atan(3/16) */
+ 160, /* atan(4/16) */
+ 197, /* atan(5/16) */
+ 234, /* atan(6/16) */
+ 269, /* atan(7/16) */
+ 302, /* atan(8/16) */
+ 334, /* atan(9/16) */
+ 364, /* atan(10/16) */
+ 393, /* atan(11/16) */
+ 419, /* atan(12/16) */
+ 445, /* atan(13/16) */
+ 469, /* atan(14/16) */
+ 491, /* atan(15/16) */
+ 512 /* atan(1) = 45 = 512/1024 */
+};
+
+/*********************************************************************
+ *
+ * _atan0_45
+ *
+ * Calculate arctan of q, where q is any where between 0 and 1024
+ */
+static int _atan0_45(int q)
+{
+ int r;
+ int i, Faktor;
+ /* Now angle is reduced to 0 <= <= 90 ==> 0 <= <= 256*/
+ q >>= 2; /* make sure we do not exceed 16 bits in calculations */
+ i = q >> 4;
+ Faktor = (1 << 4) - (q & ((1 << 4) - 1));
+ r = aTan[i] * Faktor;
+ if (Faktor != (1 << 4))
+ {
+ r += aTan[i + 1] * ((1 << 4) - Faktor);
+ }
+ r = (r + (1 << 3)) / (1 << 4); /* divide incl. rounding */
+ return r;
+}
+
+/*********************************************************************
+ *
+ * _atan2
+ */
+static int _atan2(I32 x, I32 y)
+{
+ U8 q = 0;
+ int angle;
+ /* first make sure we are in angle between 0 and 45 */
+ if (x < 0)
+ {
+ q = 1;
+ x = -x;
+ }
+ if (y < 0)
+ {
+ q |= (1 << 1);
+ y = -y;
+ }
+ if (y > x)
+ {
+ int t = y;
+ y = x;
+ x = t;
+ q |= (1 << 2);
+ }
+ y <<= 10;
+ y += (x / 2);
+ y /= x;
+ angle = _atan0_45(y);
+ if (q & (1 << 2))
+ { /* y/x reverse ? */
+ angle = GUI_90DEG - angle;
+ }
+ if (q & 1)
+ { /* xreverse ? */
+ angle = GUI_180DEG - angle;
+ }
+ if (q & (1 << 1))
+ { /* y-reverse ? */
+ angle = GUI_360DEG - angle;
+ }
+ return angle;
+}
+
+/*********************************************************************
+ *
+ * _SetLineColor
+ */
+static int _SetLineColor(int i)
+{
+ switch (GUI_Context.LineStyle)
+ {
+ case GUI_LS_DASH:
+ i = (i + 6) % 16;
+ return (i < 12);
+ case GUI_LS_DOT:
+ i %= 4;
+ return (i < 2);
+ case GUI_LS_DASHDOT:
+ i %= 20;
+ if (i < 12)
+ return 1;
+ else if ((i >= 16) && (i < 18))
+ return 1;
+ return 0;
+ case GUI_LS_DASHDOTDOT:
+ i %= 24;
+ if (i < 12)
+ return 1;
+ else if ((i >= 16) && (i < 18))
+ return 1;
+ else if ((i >= 20) && (i < 22))
+ return 1;
+ else
+ return 0;
+ }
+ return 0;
+}
+
+/*********************************************************************
+ *
+ * _atan2
+ */
+#if 0
+int _atan2(int xDiff, int yDiff) {
+ double atanf = atan2(xDiff, yDiff);
+ return (int)(atanf*(16384.0/6.2831852));
+}
+#endif
+
+/*********************************************************************
+ *
+ * _CalcOrto
+ */
+static void _CalcOrto(int xDiff, int yDiff, I32 r, int *px, int *py)
+{
+ I32 x, y;
+/*
+ int Angle = _atan2(xDiff, yDiff);
+*/
+#if 0
+ double Angle = atan2(xDiff, yDiff);
+ x = (int)(-r*cos(Angle));
+ y = (int)(r*sin(Angle));
+#else
+ int Angle = _atan2(xDiff, yDiff);
+ Angle += GUI_90DEG;
+ x = (r * (I32)GUI_cos(Angle));
+ y = (r * (I32)GUI_sin(Angle));
+#endif
+ x = (x < 0) ? -((-x + 512) >> 10) : ((x + 512) >> 10);
+ y = (y < 0) ? -((-y + 512) >> 10) : ((y + 512) >> 10);
+ *px = x;
+ *py = y;
+}
+
+/*********************************************************************
+ *
+ * DrawLine, public
+ *
+ * Draw end points of the line.
+ * In most cases, this is a circle.
+ *
+ **********************************************************************
+ */
+/*********************************************************************
+ *
+ * _DrawLineEnd
+ */
+static void _DrawLineEnd(int x0, int y0)
+{
+ switch (GUI_Context.PenShape)
+ {
+ case GUI_PS_ROUND:
+ GL_DrawPoint(x0, y0);
+ break;
+ case GUI_PS_FLAT:
+ break;
+ }
+}
+
+/*********************************************************************
+ *
+ * DrawLine, public
+ *
+ **********************************************************************
+ */
+
+/**
+ * @brief ????
+ *
+ * ????????????????????
+ *
+ * @param x0 ?????
+ * @param y0 ?????
+ * @param x1 ?????
+ * @param y1 ?????
+ */
+void GL_DrawLine(int x0, int y0, int x1, int y1)
+{
+ if (GUI_Context.PenSize == 1)
+ {
+ GL_DrawLine1(x0, y0, x1, y1);
+ }
+ else
+ {
+ int xdiff, ydiff;
+ xdiff = x0 - x1;
+ ydiff = y0 - y1;
+ if (xdiff | ydiff)
+ {
+ GUI_POINT Poly[4];
+ int xOff, yOff;
+ int xOffP, yOffP, xOffM, yOffM;
+ _CalcOrto(x0 - x1, y0 - y1, (I32)(GUI_Context.PenSize - 1), &xOff, &yOff);
+ /* Do rounding for offsets */
+ if (xOff > 0)
+ {
+ xOffP = (xOff + 1) / 2;
+ xOffM = xOff / 2;
+ }
+ else
+ {
+ xOffP = xOff / 2;
+ xOffM = (xOff - 1) / 2;
+ }
+ if (yOff > 0)
+ {
+ yOffP = (yOff + 1) / 2;
+ yOffM = yOff / 2;
+ }
+ else
+ {
+ yOffP = yOff / 2;
+ yOffM = (yOff - 1) / 2;
+ }
+ Poly[0].x = x0 + xOffP;
+ Poly[0].y = y0 + yOffP;
+ Poly[1].x = x0 - xOffM;
+ Poly[1].y = y0 - yOffM;
+ Poly[2].x = x1 - xOffM;
+ Poly[2].y = y1 - yOffM;
+ Poly[3].x = x1 + xOffP;
+ Poly[3].y = y1 + yOffP;
+ GL_FillPolygon(&Poly[0], 4, 0, 0);
+ _DrawLineEnd(x0, y0);
+ _DrawLineEnd(x1, y1);
+ }
+ }
+}
+
+/*********************************************************************
+ *
+ * GUI_DrawLine
+ */
+void GUI_DrawLine(int x0, int y0, int x1, int y1)
+{
+ GUI_LOCK();
+#if (GUI_WINSUPPORT)
+ WM_ADDORG(x0, y0);
+ WM_ADDORG(x1, y1);
+ WM_ITERATE_START(NULL);
+ {
+#endif
+ GL_DrawLine(x0, y0, x1, y1);
+#if (GUI_WINSUPPORT)
+ }
+ WM_ITERATE_END();
+#endif
+ GUI_UNLOCK();
+}
+
+/*********************************************************************
+ *
+ * GL_DrawPolygon
+ */
+void GL_DrawPolygon(const GUI_POINT *pPoints, int NumPoints, int x0, int y0)
+{
+ const GUI_POINT *pPoint = pPoints;
+ GL_MoveTo(pPoint->x + x0, pPoint->y + y0);
+ while (--NumPoints > 0)
+ {
+ pPoint++;
+ GL_DrawLineTo(pPoint->x + x0, pPoint->y + y0);
+ }
+ /* Now draw closing line unless it has already been closed */
+ if ((pPoint->x != pPoints->x) || (pPoint->y != pPoints->y))
+ {
+ GL_DrawLineTo(pPoints->x + x0, pPoints->y + y0);
+ }
+}
+
+/*********************************************************************
+ *
+ * GUI_DrawPolygon
+ */
+void GUI_DrawPolygon(const GUI_POINT *pPoints, int NumPoints, int x0, int y0)
+{
+ GUI_LOCK();
+#if (GUI_WINSUPPORT)
+ WM_ADDORG(x0, y0);
+ WM_ITERATE_START(NULL);
+ {
+#endif
+ GL_DrawPolygon(pPoints, NumPoints, x0, y0);
+#if (GUI_WINSUPPORT)
+ }
+ WM_ITERATE_END();
+#endif
+ GUI_UNLOCK();
+}
+
+/*********************************************************************
+ *
+ * Draw Line to group
+ *
+ **********************************************************************
+ */
+/*********************************************************************
+ *
+ * GL_DrawLineRelNM
+ */
+static void GL_DrawLineRelNM(int dx, int dy)
+{
+ GL_DrawLine(GUI_Context.DrawPosX, GUI_Context.DrawPosY,
+ GUI_Context.DrawPosX + dx, GUI_Context.DrawPosY + dy);
+}
+
+/*********************************************************************
+ *
+ * GUI_DrawLineRel
+ */
+void GUI_DrawLineRel(int dx, int dy)
+{
+ GUI_LOCK();
+#if (GUI_WINSUPPORT)
+ WM_ITERATE_START(NULL);
+ {
+#endif
+ GL_DrawLineRelNM(dx, dy);
+#if (GUI_WINSUPPORT)
+ }
+ WM_ITERATE_END();
+#endif
+ GUI_MoveRel(dx, dy);
+ GUI_UNLOCK();
+}
+
+/*********************************************************************
+ *
+ * GL_DrawLineTo
+ */
+void GL_DrawLineTo(int x, int y)
+{
+ GL_DrawLine(GUI_Context.DrawPosX, GUI_Context.DrawPosY, x, y);
+ GUI_Context.DrawPosX = x;
+ GUI_Context.DrawPosY = y;
+}
+
+/*********************************************************************
+ *
+ * GL_DrawLineToNM
+ */
+static void GL_DrawLineToNM(int x, int y)
+{
+ GL_DrawLine(GUI_Context.DrawPosX, GUI_Context.DrawPosY, x, y);
+}
+
+/*********************************************************************
+ *
+ * GUI_DrawLineTo
+ */
+void GUI_DrawLineTo(int x, int y)
+{
+ GUI_LOCK();
+#if (GUI_WINSUPPORT)
+ WM_ADDORG(x, y);
+ WM_ITERATE_START(NULL);
+ {
+#endif
+ GL_DrawLineToNM(x, y);
+#if (GUI_WINSUPPORT)
+ }
+ WM_ITERATE_END();
+#endif
+ GL_MoveTo(x, y);
+ GUI_UNLOCK();
+}
+
+/*********************************************************************
+ *
+ * GUI_MoveRel
+ */
+void GUI_MoveRel(int dx, int dy)
+{ /*tbd: GL_LinePos. */
+ GUI_LOCK();
+ GUI_Context.DrawPosX += dx;
+ GUI_Context.DrawPosY += dy;
+ GUI_UNLOCK();
+}
+
+/*********************************************************************
+ *
+ * GL_MoveTo
+ */
+void GL_MoveTo(int x, int y)
+{
+ GUI_Context.DrawPosX = x;
+ GUI_Context.DrawPosY = y;
+}
+
+/*********************************************************************
+ *
+ * GUI_MoveTo
+ */
+void GUI_MoveTo(int x, int y)
+{
+ GUI_LOCK();
+#if (GUI_WINSUPPORT)
+ WM_ADDORG(x, y);
+#endif
+ GL_MoveTo(x, y);
+ GUI_UNLOCK();
+}
+
+/*********************************************************************
+ *
+ * Rectangle filling / inverting
+ *
+ **********************************************************************
+ */
+/*********************************************************************
+ *
+ * _DrawRect
+ */
+static void _DrawRect(int x0, int y0, int x1, int y1)
+{
+ LCD_DrawHLine(x0, y0, x1);
+ LCD_DrawHLine(x0, y1, x1);
+ LCD_DrawVLine(x0, y0 + 1, y1 - 1);
+ LCD_DrawVLine(x1, y0 + 1, y1 - 1);
+}
+
+/*********************************************************************
+ *
+ * GUI_DrawRect
+ */
+void GUI_DrawRect(int x0, int y0, int x1, int y1)
+{
+#if (GUI_WINSUPPORT)
+ int Off;
+ GUI_RECT r;
+#endif
+ GUI_LOCK();
+#if (GUI_WINSUPPORT)
+ Off = GUI_Context.PenSize - 1;
+ WM_ADDORG(x0, y0);
+ WM_ADDORG(x1, y1);
+ r.x0 = x0 - Off;
+ r.x1 = x1 + Off;
+ r.y0 = y0 - Off;
+ r.y1 = y1 + Off;
+ WM_ITERATE_START(&r);
+ {
+#endif
+ _DrawRect(x0, y0, x1, y1);
+#if (GUI_WINSUPPORT)
+ }
+ WM_ITERATE_END();
+#endif
+ GUI_UNLOCK();
+}
+
+/*********************************************************************
+ *
+ * DrawLine, internal, 1 pixel
+ *
+ **********************************************************************
+ */
+/*********************************************************************
+ *
+ * GL_DrawLine1
+ */
+void GL_DrawLine1(int x0, int y0, int x1, int y1)
+{
+ int xdiff = x1 - x0;
+ int ydiff = y1 - y0;
+ int xdiffby2;
+ int i;
+ char Swapped = 0;
+ /* check if no line */
+ if (!(xdiff | ydiff))
+ {
+ GL_DrawPoint(x0, y0);
+ return;
+ }
+#if 0
+/* check if horizontal line */
+ if (!xdiff) {
+ GL_DrawVLine(x0,y0,y1);
+ return;
+ }
+/* check if vertical line */
+ if (!ydiff) {
+ GL_DrawHLine(y0,x0,x1);
+ return;
+ }
+#endif
+ /* check if we swap x and y for calculation */
+ if (Abs(xdiff) < Abs(ydiff))
+ {
+ _SwapInt(&xdiff, &ydiff);
+ _SwapInt(&x0, &y0);
+ _SwapInt(&x1, &y1);
+ Swapped = 1;
+ }
+ /* make sure line direction is positive */
+ if (xdiff != Abs(xdiff))
+ {
+ xdiff = -xdiff;
+ ydiff = -ydiff;
+ _SwapInt(&x0, &x1);
+ _SwapInt(&y0, &y1);
+ }
+ xdiffby2 = xdiff / 2;
+ if (ydiff < 0)
+ xdiffby2 = -xdiffby2;
+ /* Draw pixel by pixel solid*/
+ if (GUI_Context.LineStyle == GUI_LS_SOLID)
+ {
+ for (i = 0; i <= xdiff; i++)
+ {
+ I32 l = ((I32)ydiff) * i + xdiffby2;
+ int y = (ABS(l) < 32767) ? (y0 + ((int)l) / xdiff) : (y0 + l / xdiff);
+ if (!Swapped)
+ LCD_HL_DrawPixel(x0 + i, y);
+ else
+ LCD_HL_DrawPixel(y, x0 + i);
+ }
+ /* Draw pixel by pixel with fill style */
+ }
+ else
+ {
+ for (i = 0; i <= xdiff; i++)
+ {
+ long l = ((long)ydiff) * i + xdiffby2;
+ int y = (ABS(l) < 32767) ? (y0 + ((int)l) / xdiff) : (y0 + l / xdiff);
+ if (!_SetLineColor(i))
+ {
+ if (!Swapped)
+ LCD_HL_DrawPixel(x0 + i, y);
+ else
+ LCD_HL_DrawPixel(y, x0 + i);
+ }
+ }
+ }
+}
+
+/*********************************************************************
+ *
+ * Draw point
+ *
+ **********************************************************************
+ */
+/*********************************************************************
+ *
+ * GL_DrawPoint
+ */
+void GL_DrawPoint(int x, int y)
+{
+ if (GUI_Context.PenSize == 1)
+ {
+ LCD_HL_DrawPixel(x, y);
+ }
+ else
+ {
+ GL_FillCircle(x, y, (GUI_Context.PenSize - 1) / 2);
+ }
+}
+
+/*********************************************************************
+ *
+ * GUI_DrawPoint
+ */
+void GUI_DrawPoint(int x, int y)
+{
+ GUI_LOCK();
+#if (GUI_WINSUPPORT)
+ WM_ADDORG(x, y);
+ WM_ITERATE_START(NULL);
+ {
+#endif
+ GL_DrawPoint(x, y);
+#if (GUI_WINSUPPORT)
+ }
+ WM_ITERATE_END();
+#endif
+ GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUIAlloc.c b/User/system/lib/lcd/gui/Core/GUIAlloc.c
new file mode 100644
index 0000000..b28b498
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUIAlloc.c
@@ -0,0 +1,548 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUIAlloc.C
+Purpose : Dynamic memory management
+----------------------------------------------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include /* for memcpy, memset */
+
+#include "GUI_Protected.h"
+#include "GUIDebug.h"
+
+/*********************************************************************
+*
+* Internal memory management
+*
+**********************************************************************
+*/
+
+#ifndef GUI_ALLOC_ALLOC
+
+#if GUI_ALLOC_SIZE==0
+ #error GUI_ALLOC_SIZE needs to be > 0 when using this module
+#endif
+
+/*********************************************************************
+*
+* Defines, config defaults
+*
+**********************************************************************
+*/
+
+/* Permit automatic defragmentation when necessary */
+#ifndef GUI_ALLOC_AUTDEFRAG
+ #define GUI_ALLOC_AUTDEFRAG 1
+#endif
+
+#ifndef GUI_BLOCK_ALIGN /* 2 means 4 bytes, 1 means 2 bytes */
+ #define GUI_BLOCK_ALIGN 2 /* 1 can be used on 16-bit CPUs and CPUs */
+#endif /* which do not require aligned 32-bit */
+ /* values (such as x86) */
+
+#ifndef GUI_MAXBLOCKS
+ #define GUI_MAXBLOCKS (2 + GUI_ALLOC_SIZE / 32)
+#endif
+
+#ifndef GUI_ALLOC_LOCATION
+ #define GUI_ALLOC_LOCATION
+#endif
+
+#ifndef GUI_MEM_ALLOC /* Allows us in some systems to place the GUI memory */
+ #define GUI_MEM_ALLOC /* in a different memory space ... eg "__far" */
+#endif
+
+/*********************************************************************
+*
+* Defines
+*
+**********************************************************************
+*/
+
+#define Min(v0,v1) ((v0>v1) ? v1 : v0)
+#define Max(v0,v1) ((v0>v1) ? v0 : v1)
+#define ASSIGN_IF_LESS(v0,v1) if (v1= 256
+ #define HANDLE U16
+#else
+ #define HANDLE U8
+#endif
+
+/*********************************************************************
+*
+* Types
+*
+**********************************************************************
+*/
+
+typedef union {
+ int aintHeap[GUI_ALLOC_SIZE / 4]; /* required for proper alignement */
+ U8 abHeap[GUI_ALLOC_SIZE];
+} GUI_HEAP;
+
+typedef struct {
+ GUI_ALLOC_DATATYPE Off; /* Offset of memory area */
+ GUI_ALLOC_DATATYPE Size; /* usable size of allocated block */
+ HANDLE Next; /* next handle in linked list */
+ HANDLE Prev;
+} tBlock;
+
+/*********************************************************************
+*
+* Static data
+*
+**********************************************************************
+*/
+
+GUI_MEM_ALLOC GUI_HEAP GUI_Heap GUI_ALLOC_LOCATION; /* Public for debugging only */
+
+static tBlock aBlock[GUI_MAXBLOCKS];
+
+struct {
+ int NumUsedBlocks, NumFreeBlocks, NumFreeBlocksMin; /* For statistical purposes only */
+ GUI_ALLOC_DATATYPE NumUsedBytes, NumFreeBytes, NumFreeBytesMin;
+} GUI_ALLOC;
+
+static char IsInitialized =0;
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _Size2LegalSize
+*
+* Return value:
+* Legal allocation size
+*/
+static GUI_ALLOC_DATATYPE _Size2LegalSize(GUI_ALLOC_DATATYPE size) {
+ return (size + ((1 << GUI_BLOCK_ALIGN) - 1)) & ~((1 << GUI_BLOCK_ALIGN) - 1);
+}
+
+/*********************************************************************
+*
+* _GetSize
+*/
+static GUI_ALLOC_DATATYPE _GetSize(GUI_HMEM hMem) {
+ return aBlock[hMem].Size;
+}
+
+/*********************************************************************
+*
+* _Free
+*/
+static void _Free(GUI_HMEM hMem) {
+ GUI_ALLOC_DATATYPE Size;
+ GUI_DEBUG_LOG1("\nGUI_ALLOC_Free(%d)", hMem);
+ /* Do some error checking ... */
+ #if GUI_DEBUG_LEVEL>0
+ /* Block not allocated ? */
+ if (aBlock[hMem].Size == 0) {
+ GUI_DEBUG_ERROROUT("GUI_ALLOC_Free(): Invalid hMem");
+ return;
+ }
+ #endif
+ Size = aBlock[hMem].Size;
+ #ifdef WIN32
+ GUI_MEMSET(&GUI_Heap.abHeap[aBlock[hMem].Off], 0xcc, Size);
+ #endif
+ GUI_ALLOC.NumFreeBytes += Size;
+ GUI_ALLOC.NumUsedBytes -= Size;
+ aBlock[hMem].Size = 0;
+ {
+ int Next = aBlock[hMem].Next;
+ int Prev = aBlock[hMem].Prev;
+ aBlock[Prev].Next = Next;
+ if (Next) {
+ aBlock[Next].Prev = Prev;
+ }
+ }
+ GUI_ALLOC.NumFreeBlocks++;
+ GUI_ALLOC.NumUsedBlocks--;
+}
+
+/*********************************************************************
+*
+* _FindFreeHandle
+*
+* Return value:
+* Free handle
+*/
+static GUI_HMEM _FindFreeHandle(void) {
+ int i;
+ for (i=1; i< GUI_MAXBLOCKS; i++) {
+ if (aBlock[i].Size ==0)
+ return i;
+ }
+ GUI_DEBUG_ERROROUT1("Insufficient memory handles configured (GUI_MAXBLOCKS == %d (See GUIConf.h))", GUI_MAXBLOCKS);
+ return GUI_HMEM_NULL;
+}
+
+/*********************************************************************
+*
+* _FindHole
+*
+* Return value:
+* Offset to the memory hole (if available)
+* -1 if not available
+*/
+static GUI_HMEM _FindHole(GUI_ALLOC_DATATYPE Size) {
+ int i, iNext;
+ for (i=0; (iNext = aBlock[i].Next) != 0; i = iNext) {
+ int NumFreeBytes = aBlock[iNext].Off- (aBlock[i].Off+aBlock[i].Size);
+ if (NumFreeBytes>=Size) {
+ return i;
+ }
+ }
+ /* Check last block */
+ if (GUI_ALLOC_SIZE - (aBlock[i].Off+aBlock[i].Size) >= Size) {
+ return i;
+ }
+ return -1;
+}
+
+/*********************************************************************
+*
+* _CreateHole
+*
+* Return value:
+* Offset to the memory hole (if available)
+* -1 if not available
+*/
+static GUI_HMEM _CreateHole(GUI_ALLOC_DATATYPE Size) {
+ int i, iNext;
+ int r = -1;
+ for (i=0; (iNext =aBlock[i].Next) !=0; i= iNext) {
+ GUI_ALLOC_DATATYPE NumFreeBytes = aBlock[iNext].Off- (aBlock[i].Off+aBlock[i].Size);
+ if (NumFreeBytes < Size) {
+ GUI_ALLOC_DATATYPE NumBytesBeforeBlock = aBlock[iNext].Off - (aBlock[i].Off+aBlock[i].Size);
+ if (NumBytesBeforeBlock) {
+ U8* pData = &GUI_Heap.abHeap[aBlock[iNext].Off];
+ memmove(pData-NumBytesBeforeBlock, pData, aBlock[iNext].Size);
+ aBlock[iNext].Off -=NumBytesBeforeBlock;
+ }
+ }
+ }
+ /* Check last block */
+ if (GUI_ALLOC_SIZE - (aBlock[i].Off+aBlock[i].Size) >= Size) {
+ r = i;
+ }
+ return r;
+}
+
+/*********************************************************************
+*
+* _CheckInit
+*/
+static void _CheckInit(void) {
+ if (!IsInitialized) {
+ GUI_ALLOC_Init();
+ }
+}
+
+/*********************************************************************
+*
+* _Alloc
+*/
+static GUI_HMEM _Alloc(GUI_ALLOC_DATATYPE size) {
+ GUI_HMEM hMemNew, hMemIns;
+ _CheckInit();
+ size = _Size2LegalSize(size);
+ /* Check if memory is available at all ...*/
+ if (size > GUI_ALLOC.NumFreeBytes) {
+ GUI_DEBUG_WARN1("GUI_ALLOC_Alloc: Insufficient memory configured (Trying to alloc % bytes)", size);
+ return 0;
+ }
+ /* Locate free handle */
+ if ((hMemNew = _FindFreeHandle()) == 0)
+ return 0;
+ /* Locate or Create hole of sufficient size */
+ hMemIns = _FindHole(size);
+ #if GUI_ALLOC_AUTDEFRAG
+ if (hMemIns == -1) {
+ hMemIns = _CreateHole(size);
+ }
+ #endif
+ /* Occupy hole */
+ if (hMemIns==-1) {
+ GUI_DEBUG_ERROROUT1("GUI_ALLOC_Alloc: Could not allocate %d bytes",size);
+ return 0;
+ }
+ {
+ GUI_ALLOC_DATATYPE Off = aBlock[hMemIns].Off + aBlock[hMemIns].Size;
+ int Next = aBlock[hMemIns].Next;
+ aBlock[hMemNew].Size = size;
+ aBlock[hMemNew].Off = Off;
+ if ((aBlock[hMemNew].Next = Next) >0) {
+ aBlock[Next].Prev = hMemNew;
+ }
+ aBlock[hMemNew].Prev = hMemIns;
+ aBlock[hMemIns].Next = hMemNew;
+ }
+ /* Keep track of number of blocks and av. memory */
+ GUI_ALLOC.NumUsedBlocks++;
+ GUI_ALLOC.NumFreeBlocks--;
+ if (GUI_ALLOC.NumFreeBlocksMin > GUI_ALLOC.NumFreeBlocks) {
+ GUI_ALLOC.NumFreeBlocksMin = GUI_ALLOC.NumFreeBlocks;
+ }
+ GUI_ALLOC.NumUsedBytes += size;
+ GUI_ALLOC.NumFreeBytes -= size;
+ if (GUI_ALLOC.NumFreeBytesMin > GUI_ALLOC.NumFreeBytes) {
+ GUI_ALLOC.NumFreeBytesMin = GUI_ALLOC.NumFreeBytes;
+ }
+ return hMemNew;
+}
+
+/*********************************************************************
+*
+* Exported routines
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_ALLOC_Init
+*/
+void GUI_ALLOC_Init(void) {
+ GUI_DEBUG_LOG("\nGUI_ALLOC_Init...");
+ GUI_ALLOC.NumFreeBlocksMin = GUI_ALLOC.NumFreeBlocks = GUI_MAXBLOCKS-1;
+ GUI_ALLOC.NumFreeBytesMin = GUI_ALLOC.NumFreeBytes = GUI_ALLOC_SIZE;
+ GUI_ALLOC.NumUsedBlocks = 0;
+ GUI_ALLOC.NumUsedBytes = 0;
+ aBlock[0].Size = (1< 0
+ if (!hMem) {
+ GUI_DEBUG_ERROROUT("\n"__FILE__ " GUI_ALLOC_h2p: illegal argument (0 handle)");
+ return 0;
+ }
+ if (aBlock[hMem].Size == 0) {
+ GUI_DEBUG_ERROROUT("Dereferencing free block");
+ }
+
+ #endif
+ return HMEM2PTR(hMem);
+}
+
+/*********************************************************************
+*
+* GUI_ALLOC_GetNumFreeBytes
+*/
+GUI_ALLOC_DATATYPE GUI_ALLOC_GetNumFreeBytes(void) {
+ _CheckInit();
+ return GUI_ALLOC.NumFreeBytes;
+}
+
+/*********************************************************************
+*
+* GUI_ALLOC_GetMaxSize
+*
+* Purpose:
+* Returns the biggest available blocksize (without relocation).
+*/
+GUI_ALLOC_DATATYPE GUI_ALLOC_GetMaxSize(void) {
+ GUI_ALLOC_DATATYPE r = 0;
+ GUI_ALLOC_DATATYPE NumFreeBytes;
+ int i, iNext;
+
+ GUI_LOCK();
+ _CheckInit();
+ for (i=0; (iNext =aBlock[i].Next) !=0; i= iNext) {
+ NumFreeBytes = aBlock[iNext].Off- (aBlock[i].Off+aBlock[i].Size);
+ if (NumFreeBytes > r) {
+ r = NumFreeBytes;
+ }
+ }
+ /* Check last block */
+ NumFreeBytes = (GUI_ALLOC_SIZE - (aBlock[i].Off+aBlock[i].Size));
+ if (NumFreeBytes > r) {
+ r = NumFreeBytes;
+ }
+ GUI_UNLOCK();
+ return r;
+}
+
+#else
+
+/*********************************************************************
+*
+* External memory management functions
+*
+* The functions below will generate code only if the GUI memory
+* management is not used (GUI_ALLOC_ALLOC defined).
+*
+* Note:
+* The memory block allocated is bigger than the requested one, as we
+* store some add. information (size of the memory block) there.
+*
+**********************************************************************
+*/
+
+typedef struct {
+ union {
+ GUI_ALLOC_DATATYPE Size;
+ int Dummy; /* Needed to guarantee alignment on 32 / 64 bit CPUs */
+ } Info; /* Unnamed would be best, but is not supported by all compilers */
+} INFO;
+
+/*********************************************************************
+*
+* _GetSize
+*/
+static GUI_ALLOC_DATATYPE _GetSize(GUI_HMEM hMem) {
+ INFO * pInfo;
+ pInfo = (INFO *)GUI_ALLOC_H2P(hMem);
+ return pInfo->Info.Size;
+}
+
+/*********************************************************************
+*
+* _Free
+*/
+static void _Free(GUI_HMEM hMem) {
+ GUI_ALLOC_FREE(hMem);
+}
+
+/*********************************************************************
+*
+* GUI_ALLOC_AllocNoInit
+*/
+GUI_HMEM GUI_ALLOC_AllocNoInit(GUI_ALLOC_DATATYPE Size) {
+ GUI_HMEM hMem;
+ if (Size == 0) {
+ return (GUI_HMEM)0;
+ }
+ hMem= GUI_ALLOC_ALLOC(Size + sizeof(INFO));
+ /* Init info structure */
+ if (hMem) {
+ INFO * pInfo;
+ pInfo = (INFO *)GUI_ALLOC_H2P(hMem);
+ pInfo->Info.Size = Size;
+ }
+ return hMem;
+}
+
+/*********************************************************************
+*
+* GUI_ALLOC_h2p
+*/
+void* GUI_ALLOC_h2p(GUI_HMEM hMem) {
+ U8* p = (U8*)GUI_ALLOC_H2P(hMem); /* Pointer to memory block from memory manager */
+ p += sizeof(INFO); /* Convert to pointer to usable area */
+ return p;
+}
+
+/*********************************************************************
+*
+* GUI_ALLOC_GetMaxSize
+*/
+GUI_ALLOC_DATATYPE GUI_ALLOC_GetMaxSize(void) {
+ return GUI_ALLOC_GETMAXSIZE();
+}
+
+/*********************************************************************
+*
+* GUI_ALLOC_Init
+*/
+void GUI_ALLOC_Init(void) {
+ #ifdef GUI_ALLOC_INIT
+ GUI_ALLOC_INIT();
+ #endif
+}
+
+#endif
+
+/*********************************************************************
+*
+* Public code, common memory management functions
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_ALLOC_GetSize
+*/
+GUI_ALLOC_DATATYPE GUI_ALLOC_GetSize(GUI_HMEM hMem) {
+ /* Do the error checking first */
+ #if GUI_DEBUG_LEVEL>0
+ if (!hMem) {
+ GUI_DEBUG_ERROROUT("\n"__FILE__ " GUI_ALLOC_h2p: illegal argument (0 handle)");
+ return 0;
+ }
+ #endif
+ return _GetSize(hMem);
+}
+
+/*********************************************************************
+*
+* GUI_ALLOC_Free
+*/
+void GUI_ALLOC_Free(GUI_HMEM hMem) {
+ if (hMem == GUI_HMEM_NULL) { /* Note: This is not an error, it is permitted */
+ return;
+ }
+ GUI_LOCK();
+ GUI_DEBUG_LOG1("\nGUI_ALLOC_Free(%d)", hMem);
+ _Free(hMem);
+ GUI_UNLOCK();
+}
+
+
+/*********************************************************************
+*
+* GUI_ALLOC_FreePtr
+*/
+void GUI_ALLOC_FreePtr(GUI_HMEM *ph) {
+ GUI_LOCK();
+ GUI_ALLOC_Free(*ph);
+ *ph =0;
+ GUI_UNLOCK();
+}
+
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUIArc.c b/User/system/lib/lcd/gui/Core/GUIArc.c
new file mode 100644
index 0000000..4b5fc82
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUIArc.c
@@ -0,0 +1,262 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUIARCFloat.C
+Purpose : Draw Arc routines based on floating point
+----------------------------------------------------------------------
+Version-Date---Author-Explanation
+----------------------------------------------------------------------
+2.00.00 000325 RS First release of the new algorithm
+----------------------------------------------------------------------
+Known problems or limitations with current version
+----------------------------------------------------------------------
+None.
+----------------------------------------------------------------------
+Open issues
+----------------------------------------------------------------------
+None
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "arm_math.h"
+#include "GUI_Protected.h"
+
+/*********************************************************************
+ *
+ * Static code
+ *
+ **********************************************************************
+ */
+/*********************************************************************
+ *
+ * _CalcX
+ */
+static void _CalcX(int *px, int y, U32 r2)
+{
+ int x = *px;
+ U32 y2 = (U32)y * (U32)y;
+ U32 r2y2 = r2 - y2;
+ U32 x2;
+ if (y2 >= r2)
+ {
+ *px = 0;
+ return;
+ }
+ /* x2 = r2-y2 */
+ do
+ {
+ x++;
+ x2 = (U32)x * (U32)x;
+ } while (x2 < r2y2);
+ *px = x - 1;
+}
+
+/*********************************************************************
+ *
+ * _CalcInterSectLin
+ */
+static float _CalcInterSectLin(float y, float y0, float y1, float x0, float x1)
+{
+ if (y1 == y0)
+ {
+ return y0;
+ }
+ else
+ {
+ float Slope = (x1 - x0) / (y1 - y0);
+ return (y - y0) * Slope + x0;
+ }
+}
+
+/*********************************************************************
+ *
+ * _DrawArc
+ */
+static void _DrawArc(int x0, int y0, int rx, int ry, int Angle0, int Angle1, int xMul, int yMul)
+{
+ float afx[4];
+ float afy[4];
+ float ri = rx - (GUI_Context.PenSize + 1.5) / 2;
+ float ro = rx + (GUI_Context.PenSize + 1.5) / 2;
+ float fAngle0 = Angle0 * 3.1415926 / 180;
+ float fAngle1 = Angle1 * 3.1415926 / 180;
+ float sin0 = arm_sin_f32(fAngle0);
+ float sin1 = arm_sin_f32(fAngle1);
+ float cos0 = arm_cos_f32(fAngle0);
+ float cos1 = arm_cos_f32(fAngle1);
+ U32 ri2 = ri * ri;
+ U32 ro2 = ro * ro;
+ int y, yMax, yMin;
+ afy[0] = ri * sin0;
+ afy[1] = ro * sin0;
+ afy[2] = ri * sin1;
+ afy[3] = ro * sin1;
+ afx[0] = ri * cos0;
+ afx[1] = ro * cos0;
+ afx[2] = ri * cos1;
+ afx[3] = ro * cos1;
+ yMin = ceil(afy[0]);
+ yMax = floor(afy[3]);
+ /* Use Clipping rect to reduce calculation (if possible) */
+ if (GUI_Context.pClipRect_HL)
+ {
+ if (yMul == 1)
+ {
+ if (yMax > (GUI_Context.pClipRect_HL->y1 - y0))
+ yMax = (GUI_Context.pClipRect_HL->y1 - y0);
+ if (yMin < (GUI_Context.pClipRect_HL->y0 - y0))
+ yMin = (GUI_Context.pClipRect_HL->y0 - y0);
+ }
+ if (yMul == -1)
+ {
+ if (yMin > (GUI_Context.pClipRect_HL->y1 - y0))
+ yMin = (GUI_Context.pClipRect_HL->y1 - y0);
+ if (yMax < (GUI_Context.pClipRect_HL->y0 - y0))
+ yMax = (GUI_Context.pClipRect_HL->y0 - y0);
+ }
+ }
+ /* Start drawing lines ... */
+ {
+ int xMinDisp, xMaxDisp, xMin = 0, xMax = 0;
+ for (y = yMax; y >= yMin; y--)
+ {
+ _CalcX(&xMin, y, ri2);
+ _CalcX(&xMax, y, ro2);
+ if ((float)y < afy[1])
+ {
+ xMaxDisp = _CalcInterSectLin(y, afy[0], afy[1], afx[0], afx[1]);
+ }
+ else
+ {
+ xMaxDisp = xMax;
+ }
+ if ((float)y > afy[2])
+ {
+ xMinDisp = _CalcInterSectLin(y, afy[2], afy[3], afx[2], afx[3]);
+ }
+ else
+ {
+ xMinDisp = xMin;
+ }
+ if (xMul > 0)
+ LCD_HL_DrawHLine(xMinDisp + x0, yMul * y + y0, xMaxDisp + x0);
+ else
+ LCD_HL_DrawHLine(-xMaxDisp + x0, yMul * y + y0, -xMinDisp + x0);
+ }
+ }
+#if 0 /* Test code */
+{
+ int i;
+ GUI_SetColor( GUI_WHITE );
+ for (i=0; i<4; i++)
+ LCD_HL_DrawPixel(afx[i]+x0, afy[i]+y0);
+}
+#endif
+ GUI_USE_PARA(ry);
+}
+
+/*********************************************************************
+ *
+ * Public code
+ *
+ **********************************************************************
+ */
+/*********************************************************************
+ *
+ * GL_DrawArc
+ */
+void GL_DrawArc(int x0, int y0, int rx, int ry, int a0, int a1)
+{
+ int aEnd;
+ a0 += 360;
+ a1 += 360;
+ while (a0 >= 360)
+ {
+ a0 -= 360;
+ a1 -= 360;
+ }
+/* Do first quadrant 0-90 degree */
+DoFirst:
+ if (a1 <= 0)
+ return;
+ if (a0 < 90)
+ {
+ if (a0 < 0)
+ a0 = 0;
+ aEnd = (a1 < 90) ? a1 : 90;
+ _DrawArc(x0, y0, rx, ry, a0, aEnd, 1, -1);
+ }
+ a1 -= 90;
+ a0 -= 90;
+ /* Do second quadrant 90-180 degree */
+ if (a1 <= 0)
+ return;
+ if (a0 < 90)
+ {
+ if (a0 < 0)
+ a0 = 0;
+ aEnd = (a1 < 90) ? a1 : 90;
+ _DrawArc(x0, y0, rx, ry, 90 - aEnd, 90 - a0, -1, -1);
+ }
+ a1 -= 90;
+ a0 -= 90;
+ /* Do third quadrant 180-270 degree */
+ if (a1 <= 0)
+ return;
+ if (a0 < 90)
+ {
+ if (a0 < 0)
+ a0 = 0;
+ aEnd = (a1 < 90) ? a1 : 90;
+ _DrawArc(x0, y0, rx, ry, a0, aEnd, -1, 1);
+ }
+ a1 -= 90;
+ a0 -= 90;
+ /* Do last quadrant 270-360 degree */
+ if (a1 <= 0)
+ return;
+ if (a0 < 90)
+ {
+ if (a0 < 0)
+ a0 = 0;
+ aEnd = (a1 < 90) ? a1 : 90;
+ _DrawArc(x0, y0, rx, ry, 90 - aEnd, 90 - a0, 1, 1);
+ }
+ a1 -= 90;
+ a0 -= 90;
+ goto DoFirst;
+}
+
+/*********************************************************************
+ *
+ * GUI_DrawArc
+ */
+void GUI_DrawArc(int x0, int y0, int rx, int ry, int a0, int a1)
+{
+ GUI_LOCK();
+#if (GUI_WINSUPPORT)
+ WM_ADDORG(x0, y0);
+ WM_ITERATE_START(NULL)
+ {
+#endif
+ GL_DrawArc(x0, y0, rx, ry, a0, a1);
+#if (GUI_WINSUPPORT)
+ }
+ WM_ITERATE_END();
+#endif
+ GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUIChar.c b/User/system/lib/lcd/gui/Core/GUIChar.c
new file mode 100644
index 0000000..f7328e6
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUIChar.c
@@ -0,0 +1,113 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUIChar.C
+Purpose : Implementation of character and string services
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_DispNextLine
+*/
+void GUI_DispNextLine(void) {
+ GUI_LOCK();
+ GUI_Context.DispPosY += GUI_GetFontDistY();
+ GUI_Context.DispPosX = GUI_Context.LBorder;
+ GUI_UNLOCK();
+}
+
+/*********************************************************************
+*
+* GL_DispChar
+*/
+void GL_DispChar(U16 c) {
+ /* check for control characters */
+ if (c == '\n') {
+ GUI_DispNextLine();
+ } else {
+ if (c != '\r') {
+ GUI_LOCK();
+ GUI_Context.pAFont->pfDispChar(c);
+ if (GUI_pfDispCharStyle) {
+ GUI_pfDispCharStyle(c);
+ }
+ GUI_UNLOCK();
+ }
+ }
+}
+
+/*********************************************************************
+*
+* GUI_GetYAdjust
+*
+* Returns adjustment in vertical (Y) direction
+*
+* Note: The return value needs to be subtracted from
+* the y-position of the character.
+*/
+int GUI_GetYAdjust(void) {
+ int r = 0;
+ GUI_LOCK();
+ switch (GUI_Context.TextAlign & GUI_TA_VERTICAL) {
+ case GUI_TA_BOTTOM:
+ r = GUI_Context.pAFont->YSize - 1;
+ break;
+ case GUI_TA_VCENTER:
+ r = GUI_Context.pAFont->YSize / 2;
+ break;
+ case GUI_TA_BASELINE:
+ r = GUI_Context.pAFont->YSize / 2;
+ }
+ GUI_UNLOCK();
+ return r;
+}
+
+/*********************************************************************
+*
+* GUI_GetFontDistY
+*/
+int GUI_GetFontDistY(void) {
+ int r;
+ GUI_LOCK();
+// r = GUI_Context.pAFont->YDist;
+ r = GUI_Context.pAFont->YDist * GUI_Context.pAFont->YMag;
+
+ GUI_UNLOCK();
+ return r;
+}
+
+/*********************************************************************
+*
+* GUI_GetCharDistX
+*/
+int GUI_GetCharDistX(U16 c) {
+ int r;
+ GUI_LOCK();
+ r = GUI_Context.pAFont->pfGetCharDistX(c);
+ GUI_UNLOCK();
+ return r;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUICharLine.c b/User/system/lib/lcd/gui/Core/GUICharLine.c
new file mode 100644
index 0000000..7666fda
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUICharLine.c
@@ -0,0 +1,145 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUICharLine.C
+Purpose : Implementation of character and string services
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _DispLine
+*/
+static void _DispLine(const char GUI_UNI_PTR *s, int MaxNumChars, const GUI_RECT *pRect) {
+ /* Check if we have anything to do at all ... */
+ if (GUI_Context.pClipRect_HL) {
+ if (GUI_RectsIntersect(GUI_Context.pClipRect_HL, pRect) == 0)
+ return;
+ }
+ #if GUI_COMPILER_SUPPORTS_FP
+ if (GUI_Context.pAFont->pafEncode) {
+ GUI_Context.pAFont->pafEncode->pfDispLine(s, MaxNumChars);
+ } else {
+ #else
+ {
+ #endif
+ U16 Char;
+ while (--MaxNumChars >= 0) {
+ Char = GUI_UC__GetCharCodeInc(&s);
+ GUI_Context.pAFont->pfDispChar(Char);
+ if (GUI_pfDispCharStyle) {
+ GUI_pfDispCharStyle(Char);
+ }
+ }
+ }
+}
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI__GetLineNumChars
+*/
+int GUI__GetLineNumChars(const char GUI_UNI_PTR *s, int MaxNumChars) {
+ int NumChars = 0;
+ if (s) {
+ #if GUI_COMPILER_SUPPORTS_FP
+ if (GUI_Context.pAFont->pafEncode) {
+ return GUI_Context.pAFont->pafEncode->pfGetLineLen(s, MaxNumChars);
+ }
+ #endif
+ for (; NumChars < MaxNumChars; NumChars++) {
+ U16 Data = GUI_UC__GetCharCodeInc(&s);
+ if ((Data == 0) || (Data == '\n')) {
+ break;
+ }
+ }
+ }
+ return NumChars;
+}
+
+/*********************************************************************
+*
+* GUI_GetLineDistX
+*
+* This routine is used to calculate the length of a line in pixels.
+*/
+int GUI__GetLineDistX(const char GUI_UNI_PTR *s, int MaxNumChars) {
+ int Dist = 0;
+ if (s) {
+ U16 Char;
+ #if GUI_COMPILER_SUPPORTS_FP
+ if (GUI_Context.pAFont->pafEncode) {
+ return GUI_Context.pAFont->pafEncode->pfGetLineDistX(s, MaxNumChars);
+ }
+ #endif
+ while (--MaxNumChars >= 0) {
+ Char = GUI_UC__GetCharCodeInc(&s);
+ Dist += GUI_GetCharDistX(Char);
+ }
+ }
+ return Dist;
+}
+
+/*********************************************************************
+*
+* GUI__DispLine
+*/
+void GUI__DispLine(const char GUI_UNI_PTR *s, int MaxNumChars, const GUI_RECT* pr) {
+ GUI_RECT r;
+ #if GUI_SUPPORT_ROTATION
+ if (GUI_pLCD_APIList) {
+ #if GUI_WINSUPPORT
+ WM_ITERATE_START(NULL) {
+ #endif
+ /* Do the actual drawing via routine call. */
+ _DispLine(s, MaxNumChars, &r);
+ #if GUI_WINSUPPORT
+ } WM_ITERATE_END();
+ #endif
+ } else
+ #endif
+ {
+ r = *pr;
+ #if GUI_WINSUPPORT
+ WM_ADDORG(r.x0, r.y0);
+ WM_ADDORG(r.x1, r.y1);
+ WM_ITERATE_START(&r) {
+ #endif
+ GUI_Context.DispPosX = r.x0;
+ GUI_Context.DispPosY = r.y0;
+ /* Do the actual drawing via routine call. */
+ _DispLine(s, MaxNumChars, &r);
+ #if GUI_WINSUPPORT
+ } WM_ITERATE_END();
+ WM_SUBORG(GUI_Context.DispPosX, GUI_Context.DispPosY);
+ #endif
+ }
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUICharM.c b/User/system/lib/lcd/gui/Core/GUICharM.c
new file mode 100644
index 0000000..38a04ee
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUICharM.c
@@ -0,0 +1,167 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUIChar.C
+Purpose : Implementation of memory devices
+----------------------------------------------------------------------
+Version-Date---Author-Explanation
+----------------------------------------------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI_Private.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUIMONO_DispChar
+*
+* Purpose:
+* This is the routine that displays a character. It is used by all
+* other routines which display characters as a subroutine.
+*/
+void GUIMONO_DispChar(U16P c) {
+ int c0, c1;
+ const unsigned char GUI_UNI_PTR * pd;
+ int x = GUI_Context.DispPosX;
+ int y = GUI_Context.DispPosY;
+ /* do some checking if drawing is actually necessary ... */
+ const GUI_FONT_MONO GUI_UNI_PTR * pMono = GUI_Context.pAFont->p.pMono;
+ unsigned int FirstChar = pMono->FirstChar;
+ /* translate character into 2 characters to display : c0,c1 */
+ /* Check if regular character first. */
+ if ((c >= (U16P)FirstChar) &&(c <= (U16P)pMono->LastChar)) {
+ pd = pMono->pData;
+ c0 = ((int)c) - FirstChar;
+ c1 = -1;
+ } else {
+ /* Check if character is in translation table */
+ GUI_FONT_TRANSINFO const GUI_UNI_PTR * pti = pMono->pTrans;
+ pd = pMono->pTransData;
+ if (pti) {
+ FirstChar = pti->FirstChar;
+ if ((c >= (U16P)FirstChar) && (c <= (U16P)pti->LastChar)) {
+ GUI_FONT_TRANSLIST const GUI_UNI_PTR * ptl;
+ c -= pti->FirstChar;
+ ptl = pti->pList;
+ ptl += c;
+ c0 = ptl->c0;
+ c1 = ptl->c1;
+ } else {
+ c0 = c1 = -1;
+ }
+ } else {
+ c0 = c1 = -1;
+ }
+ }
+ /* Draw first character if it is valid */
+ if (c0!=-1) {
+ int BytesPerChar = GUI_Context.pAFont->YSize*pMono->BytesPerLine;
+ GUI_DRAWMODE DrawMode;
+ int XSize = pMono->XSize;
+ int YSize = GUI_Context.pAFont->YSize;
+ /* Select the right drawing mode */
+ DrawMode = GUI_Context.TextMode;
+ /* call drawing routine */
+ {
+ U8 OldMode = LCD_SetDrawMode(DrawMode);
+ LCD_DrawBitmap( x, y,
+ XSize, YSize,
+ GUI_Context.pAFont->XMag, GUI_Context.pAFont->YMag,
+ 1, /* Bits per Pixel */
+ pMono->BytesPerLine,
+ pd + c0* BytesPerChar,
+ &LCD_BKCOLORINDEX
+ );
+ if (c1 != -1) {
+ LCD_SetDrawMode(DrawMode | LCD_DRAWMODE_TRANS);
+ LCD_DrawBitmap( x, y,
+ XSize, YSize,
+ GUI_Context.pAFont->XMag, GUI_Context.pAFont->YMag,
+ 1, /* Bits per Pixel */
+ pMono->BytesPerLine,
+ pd + c1* BytesPerChar,
+ &LCD_BKCOLORINDEX
+ );
+ }
+ /* Fill empty pixel lines */
+ if (GUI_Context.pAFont->YDist > GUI_Context.pAFont->YSize) {
+ if (DrawMode != LCD_DRAWMODE_TRANS) {
+ LCD_SetDrawMode(DrawMode ^ LCD_DRAWMODE_REV); /* Reverse so we can fill with BkColor */
+ LCD_FillRect(x,
+ y + GUI_Context.pAFont->YSize * GUI_Context.pAFont->YDist,
+ x + XSize * GUI_Context.pAFont->XMag,
+ y + GUI_Context.pAFont->YDist);
+ }
+ }
+ LCD_SetDrawMode(OldMode);
+ }
+ }
+//houhh 20061119...
+// GUI_Context.DispPosX+=pMono->XDist;
+ GUI_Context.DispPosX+=pMono->XDist * GUI_Context.pAFont->XMag;
+
+}
+
+/*********************************************************************
+*
+* GUIMONO_GetCharDistX
+*/
+int GUIMONO_GetCharDistX(U16P c) {
+ const GUI_FONT_MONO GUI_UNI_PTR * pMono = GUI_Context.pAFont->p.pMono;
+ GUI_USE_PARA(c);
+// return pMono->XDist;
+//houhh 20061119...
+ return pMono->XDist*GUI_Context.pAFont->XMag;
+
+}
+
+/*********************************************************************
+*
+* GUIMONO_GetFontInfo
+*/
+void GUIMONO_GetFontInfo(const GUI_FONT GUI_UNI_PTR * pFont, GUI_FONTINFO* pfi) {
+ GUI_USE_PARA(pFont);
+ pfi->Flags = GUI_FONTINFO_FLAG_MONO;
+}
+
+/*********************************************************************
+*
+* GUIMONO_IsInFont
+*/
+char GUIMONO_IsInFont(const GUI_FONT GUI_UNI_PTR * pFont, U16 c) {
+ const GUI_FONT_MONO GUI_UNI_PTR * pMono = pFont->p.pMono;
+ unsigned int FirstChar = pMono->FirstChar;
+ /* Check if regular character first. */
+ if ((c >= (U16P)FirstChar) &&(c <= (U16P)pMono->LastChar)) {
+ return 1; /* Yes, we have it ! */
+ } else {
+ /* Check if character is in translation table */
+ GUI_FONT_TRANSINFO const GUI_UNI_PTR * pti;
+ pti = pMono->pTrans;
+ if (pti) {
+ if ((c >= pti->FirstChar) && (c <= pti->LastChar)) {
+ return 1; /* Yes, we have it ! */
+ }
+ }
+ }
+ return 0; /* No, we can not display this character */
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUICharP.c b/User/system/lib/lcd/gui/Core/GUICharP.c
new file mode 100644
index 0000000..ddd6143
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUICharP.c
@@ -0,0 +1,121 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUICharP.C
+Purpose : Implementation of Proportional fonts
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI_Private.h"
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUIPROP_FindChar
+*/
+static const GUI_FONT_PROP GUI_UNI_PTR * GUIPROP_FindChar(const GUI_FONT_PROP GUI_UNI_PTR* pProp, U16P c) {
+ for (; pProp; pProp = pProp->pNext) {
+ if ((c>=pProp->First) && (c<=pProp->Last))
+ break;
+ }
+ return pProp;
+}
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUIPROP_DispChar
+*
+* Purpose:
+* This is the routine that displays a character. It is used by all
+* other routines which display characters as a subroutine.
+*/
+void GUIPROP_DispChar(U16P c) {
+ int BytesPerLine;
+ GUI_DRAWMODE DrawMode = GUI_Context.TextMode;
+ const GUI_FONT_PROP GUI_UNI_PTR * pProp = GUIPROP_FindChar(GUI_Context.pAFont->p.pProp, c);
+ if (pProp) {
+ GUI_DRAWMODE OldDrawMode;
+ const GUI_CHARINFO GUI_UNI_PTR * pCharInfo = pProp->paCharInfo+(c-pProp->First);
+ BytesPerLine = pCharInfo->BytesPerLine;
+ OldDrawMode = LCD_SetDrawMode(DrawMode);
+ LCD_DrawBitmap( GUI_Context.DispPosX, GUI_Context.DispPosY,
+ pCharInfo->XSize,
+ GUI_Context.pAFont->YSize,
+ GUI_Context.pAFont->XMag,
+ GUI_Context.pAFont->YMag,
+ 1, /* Bits per Pixel */
+ BytesPerLine,
+ pCharInfo->pData,
+ &LCD_BKCOLORINDEX
+ );
+ /* Fill empty pixel lines */
+ if (GUI_Context.pAFont->YDist > GUI_Context.pAFont->YSize) {
+ int YMag = GUI_Context.pAFont->YMag;
+ int YDist = GUI_Context.pAFont->YDist * YMag;
+ int YSize = GUI_Context.pAFont->YSize * YMag;
+ if (DrawMode != LCD_DRAWMODE_TRANS) {
+ LCD_COLOR OldColor = GUI_GetColor();
+ GUI_SetColor(GUI_GetBkColor());
+ LCD_FillRect(GUI_Context.DispPosX,
+ GUI_Context.DispPosY + YSize,
+ GUI_Context.DispPosX + pCharInfo->XSize,
+ GUI_Context.DispPosY + YDist);
+ GUI_SetColor(OldColor);
+ }
+ }
+ LCD_SetDrawMode(OldDrawMode); /* Restore draw mode */
+ GUI_Context.DispPosX += pCharInfo->XDist * GUI_Context.pAFont->XMag;
+ }
+}
+
+/*********************************************************************
+*
+* GUIPROP_GetCharDistX
+*/
+int GUIPROP_GetCharDistX(U16P c) {
+ const GUI_FONT_PROP GUI_UNI_PTR * pProp = GUIPROP_FindChar(GUI_Context.pAFont->p.pProp, c);
+ return (pProp) ? (pProp->paCharInfo+(c-pProp->First))->XSize * GUI_Context.pAFont->XMag : 0;
+}
+
+/*********************************************************************
+*
+* GUIPROP_GetFontInfo
+*/
+void GUIPROP_GetFontInfo(const GUI_FONT GUI_UNI_PTR * pFont, GUI_FONTINFO* pfi) {
+ GUI_USE_PARA(pFont);
+ pfi->Flags = GUI_FONTINFO_FLAG_PROP;
+}
+
+/*********************************************************************
+*
+* GUIPROP_IsInFont
+*/
+char GUIPROP_IsInFont(const GUI_FONT GUI_UNI_PTR * pFont, U16 c) {
+ const GUI_FONT_PROP GUI_UNI_PTR * pProp = GUIPROP_FindChar(pFont->p.pProp, c);
+ return (pProp==NULL) ? 0 : 1;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUICirc.c b/User/system/lib/lcd/gui/Core/GUICirc.c
new file mode 100644
index 0000000..dd3488c
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUICirc.c
@@ -0,0 +1,271 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUICirc.C
+Purpose : Circle and ellipse drawing functions
+----------------------------------------------------------------------
+Version-Date---Author-Explanation
+----------------------------------------------------------------------
+1.00.02 011115 JE a) GL_FillEllipse, GL_FillCircle, GL_DrawCircle changed
+1.00.01 011113 JE a) GL_DrawEllipse changed
+1.00.00 991206 RS First release
+----------------------------------------------------------------------
+Known problems or limitations with current version
+----------------------------------------------------------------------
+None.
+----------------------------------------------------------------------
+Open issues
+----------------------------------------------------------------------
+None
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI_Private.h"
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* Draw8Point
+*/
+static void Draw8Point(int x0,int y0, int xoff, int yoff) {
+ LCD_HL_DrawPixel(x0+xoff,y0+yoff);
+ LCD_HL_DrawPixel(x0-xoff,y0+yoff);
+ LCD_HL_DrawPixel(x0+yoff,y0+xoff);
+ LCD_HL_DrawPixel(x0+yoff,y0-xoff);
+ if (yoff) {
+ LCD_HL_DrawPixel(x0+xoff,y0-yoff);
+ LCD_HL_DrawPixel(x0-xoff,y0-yoff);
+ LCD_HL_DrawPixel(x0-yoff,y0+xoff);
+ LCD_HL_DrawPixel(x0-yoff,y0-xoff);
+ }
+}
+
+/*********************************************************************
+*
+* Public code, circle
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GL_DrawCircle
+*/
+void GL_DrawCircle(int x0, int y0, int r) {
+ I32 i;
+ int imax = ((I32)((I32)r*707))/1000+1;
+ I32 sqmax = (I32)r*(I32)r+(I32)r/2;
+ I32 y=r;
+ Draw8Point(x0,y0,r,0);
+ for (i=1; i<= imax; i++) {
+ if ((i*i+y*y) >sqmax) {
+ Draw8Point(x0,y0,i,y);
+ y--;
+ }
+ Draw8Point(x0,y0,i,y);
+ }
+}
+
+/*********************************************************************
+*
+* GUI_DrawCircle
+*/
+void GUI_DrawCircle(int x0, int y0, int r) {
+ #if (GUI_WINSUPPORT)
+ GUI_RECT Rect;
+ #endif
+ GUI_LOCK();
+ #if (GUI_WINSUPPORT)
+ WM_ADDORG(x0,y0);
+ Rect.x0 = x0-r;
+ Rect.x1 = x0+r;
+ Rect.y0 = y0-r;
+ Rect.y1 = y0+r;
+ WM_ITERATE_START(&Rect); {
+ #endif
+ GL_DrawCircle( x0, y0, r);
+ #if (GUI_WINSUPPORT)
+ } WM_ITERATE_END();
+ #endif
+ GUI_UNLOCK();
+}
+
+/*********************************************************************
+*
+* GL_FillCircle
+*/
+void GL_FillCircle(int x0, int y0, int r) {
+ I32 i;
+ int imax = ((I32)((I32)r*707))/1000+1;
+ I32 sqmax = (I32)r*(I32)r+(I32)r/2;
+ I32 x=r;
+ LCD_HL_DrawHLine(x0-r,y0,x0+r);
+ for (i=1; i<= imax; i++) {
+ if ((i*i+x*x) >sqmax) {
+ /* draw lines from outside */
+ if (x>imax) {
+ LCD_HL_DrawHLine (x0-i+1,y0+x, x0+i-1);
+ LCD_HL_DrawHLine (x0-i+1,y0-x, x0+i-1);
+ }
+ x--;
+ }
+ /* draw lines from inside (center) */
+ LCD_HL_DrawHLine(x0-x,y0+i, x0+x);
+ LCD_HL_DrawHLine(x0-x,y0-i, x0+x);
+ }
+}
+
+/*********************************************************************
+*
+* GUI_FillCircle
+*/
+void GUI_FillCircle(int x0, int y0, int r) {
+ GUI_LOCK();
+ #if (GUI_WINSUPPORT)
+ WM_ADDORG(x0,y0);
+ WM_ITERATE_START(NULL); {
+ #endif
+ GL_FillCircle(x0,y0,r);
+ #if (GUI_WINSUPPORT)
+ } WM_ITERATE_END();
+ #endif
+ GUI_UNLOCK();
+}
+
+/*********************************************************************
+*
+* Public code, ellipse
+*
+* The most efficient way to calculate the ellipse positions is using
+* the knowledge that the ellipse is just circle which has compressed
+* (or stretched) in one direction. For a circle, the following
+* equation holds true for all points located on the border of it:
+*
+* x^2 + y(x)^2 = r^2 = const
+*
+* Therefor, for an ellipse we can make use of the following equation:
+*
+* (ry*x)^2 + (rx*y(x))^2 = (ry*rx)^2 = const
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GL_FillEllipse
+*/
+void GL_FillEllipse(int x0, int y0, int rx, int ry) {
+ I32 OutConst, Sum, SumY;
+ int x,y;
+ U32 _rx = rx;
+ U32 _ry = ry;
+ OutConst = _rx*_rx*_ry*_ry /* Constant as explaint above */
+ +(_rx*_rx*_ry>>1); /* To compensate for rounding */
+ x = rx;
+ for (y=0; y<=ry; y++) {
+ SumY =((I32)(rx*rx))*((I32)(y*y)); /* Does not change in loop */
+ while (Sum = SumY + ((I32)(ry*ry))*((I32)(x*x)),
+ (x>0) && (Sum>OutConst))
+ {
+ x--;
+ }
+ LCD_HL_DrawHLine(x0-x, y0+y, x0+x);
+ if (y)
+ LCD_HL_DrawHLine(x0-x, y0-y, x0+x);
+ }
+}
+
+/*********************************************************************
+*
+* GUI_FillEllipse
+*/
+void GUI_FillEllipse(int x0, int y0, int rx, int ry) {
+ #if (GUI_WINSUPPORT)
+ GUI_RECT r;
+ #endif
+ GUI_LOCK();
+ #if (GUI_WINSUPPORT)
+ WM_ADDORG(x0,y0);
+ /* Calc rectangle in order to avoid unnecessary drawing ops. */
+ r.x0 = x0-rx; r.x1 = x0+rx; r.y0 = y0-ry; r.y1 = y0+ry;
+ WM_ITERATE_START(&r); {
+ #endif
+ GL_FillEllipse (x0,y0, rx, ry);
+ #if (GUI_WINSUPPORT)
+ } WM_ITERATE_END();
+ #endif
+ GUI_UNLOCK();
+}
+
+/*********************************************************************
+*
+* GL_DrawEllipse
+*/
+void GL_DrawEllipse(int x0, int y0, int rx, int ry) {
+ I32 OutConst, Sum, SumY;
+ int x,y;
+ int xOld;
+ U32 _rx = rx;
+ U32 _ry = ry;
+ OutConst = _rx*_rx*_ry*_ry /* Constant as explaint above */
+ +(_rx*_rx*_ry>>1); /* To compensate for rounding */
+ xOld = x = rx;
+ for (y=0; y<=ry; y++) {
+ if (y==ry) {
+ x=0;
+ } else {
+ SumY =((I32)(rx*rx))*((I32)(y*y)); /* Does not change in loop */
+ while (Sum = SumY + ((I32)(ry*ry))*((I32)(x*x)),
+ (x>0) && (Sum>OutConst)) x--;
+ }
+ /* Since we draw lines, we can not draw on the first
+ iteration
+ */
+ if (y) {
+ GL_DrawLine1(x0-xOld,y0-y+1,x0-x,y0-y);
+ GL_DrawLine1(x0-xOld,y0+y-1,x0-x,y0+y);
+ GL_DrawLine1(x0+xOld,y0-y+1,x0+x,y0-y);
+ GL_DrawLine1(x0+xOld,y0+y-1,x0+x,y0+y);
+ }
+ xOld = x;
+ }
+}
+
+/*********************************************************************
+*
+* GUI_DrawEllipse
+*/
+void GUI_DrawEllipse(int x0, int y0, int rx, int ry) {
+ #if (GUI_WINSUPPORT)
+ GUI_RECT r;
+ #endif
+ GUI_LOCK();
+ #if (GUI_WINSUPPORT)
+ WM_ADDORG(x0,y0);
+ /* Calc rectangle in order to avoid unnecessary drawing ops. */
+ r.x0 = x0-rx; r.x1 = x0+rx; r.y0 = y0-ry; r.y1 = y0+ry;
+ WM_ITERATE_START(&r); {
+ #endif
+ GL_DrawEllipse(x0, y0, rx, ry);
+ #if (GUI_WINSUPPORT)
+ } WM_ITERATE_END();
+ #endif
+ GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUIColor2Index.c b/User/system/lib/lcd/gui/Core/GUIColor2Index.c
new file mode 100644
index 0000000..ad83be0
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUIColor2Index.c
@@ -0,0 +1,40 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUIColor2Index.C
+Purpose : Converts a RGB-value to a color index
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_Color2Index
+*/
+int GUI_Color2Index(GUI_COLOR Color) {
+ int Index;
+ GUI_LOCK();
+ Index = LCD_Color2Index(Color);
+ GUI_UNLOCK();
+ return Index;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUICore.c b/User/system/lib/lcd/gui/Core/GUICore.c
new file mode 100644
index 0000000..9619f24
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUICore.c
@@ -0,0 +1,179 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUICore.C
+Purpose : Core routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+
+#define GL_CORE_C
+
+#include "GUI_Private.h"
+#include "GUIDebug.h"
+
+#if GUI_WINSUPPORT
+#include "WM_GUI.h"
+#include "WM.h"
+#endif
+
+/*********************************************************************
+ *
+ * Static data
+ *
+ **********************************************************************
+ */
+#if GUI_SUPPORT_AA
+static const tLCD_HL_APIList _HL_APIList = {
+ LCD_DrawHLine,
+ LCD_DrawPixel};
+#endif
+
+/*********************************************************************
+ *
+ * Static code
+ *
+ **********************************************************************
+ */
+/*********************************************************************
+ *
+ * _InitContext
+ *
+ * Purpose
+ * Initializes the given context.
+ *
+ * Special considerations
+ * Make sure that no GUI functions are called, because locking is
+ * not allowed here (GUITASK_INIT not yet called).
+ */
+static void _InitContext(GUI_CONTEXT *pContext)
+{
+/* memset(..,0,..) is not required, as this function is called only at startup of the GUI when data is 0 */
+#if GUI_SUPPORT_DEVICES
+ pContext->pDeviceAPI = LCD_aAPI[0]; /* &LCD_L0_APIList; */
+#endif
+ pContext->pClipRect_HL = &GUI_Context.ClipRect;
+ LCD_L0_GetRect(&pContext->ClipRect);
+#if GUI_SUPPORT_AA
+ pContext->pLCD_HL = &_HL_APIList;
+#endif
+ pContext->pAFont = GUI_DEFAULT_FONT;
+ pContext->pClipRect_HL = &GUI_Context.ClipRect;
+ pContext->PenSize = 1;
+/* Variables in WM module */
+#if GUI_WINSUPPORT
+ pContext->hAWin = WM_GetDesktopWindow();
+#endif
+/* Variables in GUI_AA module */
+#if GUI_SUPPORT_AA
+ pContext->AA_Factor = 3;
+#endif
+ pContext->Color = GUI_INVALID_COLOR;
+ pContext->BkColor = GUI_INVALID_COLOR;
+ LCD_SetBkColor(GUI_DEFAULT_BKCOLOR);
+ LCD_SetColor(GUI_DEFAULT_COLOR);
+ pContext->pUC_API = &GUI__API_TableNone;
+}
+
+/*********************************************************************
+ *
+ * Public code
+ *
+ **********************************************************************
+ */
+/*********************************************************************
+ *
+ * GUI_ClearRect
+ */
+void GUI_ClearRect(int x0, int y0, int x1, int y1)
+{
+ GUI_DRAWMODE PrevDraw;
+#if GUI_WINSUPPORT
+ GUI_RECT r;
+#endif
+ GUI_LOCK();
+ PrevDraw = LCD_SetDrawMode(GUI_DRAWMODE_REV);
+#if GUI_WINSUPPORT
+ WM_ADDORG(x0, y0);
+ WM_ADDORG(x1, y1);
+ r.x0 = x0;
+ r.x1 = x1;
+ r.y0 = y0;
+ r.y1 = y1;
+ WM_ITERATE_START(&r)
+ {
+#endif
+ LCD_FillRect(x0, y0, x1, y1);
+#if GUI_WINSUPPORT
+ }
+ WM_ITERATE_END();
+#endif
+ LCD_SetDrawMode(PrevDraw);
+ GUI_UNLOCK();
+}
+
+/*********************************************************************
+ *
+ * GUI_Clear
+ */
+void GUI_Clear(void)
+{
+ GUI_GotoXY(0, 0); /* Reset text cursor to upper left */
+ GUI_ClearRect(GUI_XMIN, GUI_YMIN, GUI_XMAX, GUI_YMAX);
+}
+
+/*********************************************************************
+ *
+ * GUI_Init
+ *
+ * Purpose:
+ * Init of GUI internal data structures & variables
+ */
+int GUI_Init(void)
+{
+ int r;
+ GUI_DEBUG_LOG("\nGUI_Init()");
+ /* Init system wide globals first */
+ GUI_DecChar = '.';
+ GUI_X_Init();
+ /* Init context */
+ _InitContext(&GUI_Context);
+ GUITASK_INIT();
+ r = LCD_Init();
+#if GUI_WINSUPPORT
+ WM_Init();
+#endif
+ GUITASK_COPY_CONTEXT();
+#if defined(GUI_TRIAL_VERSION)
+ {
+ int i;
+ for (i = 0; i < 10; i++)
+ {
+ GUI_DispString("This uC-GUI library\n"
+ "is for evaluation\n"
+ "purpose only.\n"
+ "A license is\n"
+ "required to use\n"
+ "it in a product\n\n"
+ "www.micrium.com\n");
+ GUI_GotoXY(0, 0);
+ }
+ }
+ GUI_Clear();
+#endif
+ return r;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUICurs.c b/User/system/lib/lcd/gui/Core/GUICurs.c
new file mode 100644
index 0000000..0f43a54
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUICurs.c
@@ -0,0 +1,423 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUICurs.C
+Purpose : Cursor routines of the graphics library
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI_Private.h"
+
+#if GUI_SUPPORT_CURSOR
+
+/*********************************************************************
+*
+* static data
+*
+**********************************************************************
+*/
+
+static GUI_HMEM _hBuffer;
+static GUI_RECT _Rect;
+static char _CursorIsVis; /* Currently visible ? */
+static char _CursorOn;
+static const GUI_CURSOR GUI_UNI_PTR * _pCursor;
+static U8 _CursorDeActCnt;
+static int _AllocSize;
+static int _x, _y; /* Position of hot spot */
+static GUI_RECT _ClipRect;
+static LCD_PIXELINDEX _ColorIndex[4]; /* Color-Cache */
+
+/*********************************************************************
+*
+* static code, helper functions
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _SetPixelIndex
+*
+* Purpose
+* Sets the pixel index for the Cursor.
+* Note the following:
+* - We do the clipping in this routine
+* - We do NOT call the driver directly, but thru its API table.
+* This allows others (e.g. the VNC server) to be in the loop-
+*/
+static void _SetPixelIndex(int x, int y, int Index) {
+ if ((y >= _ClipRect.y0) && (y <= _ClipRect.y1)) {
+ if ((x >= _ClipRect.x0) && (x <= _ClipRect.x1)) {
+ LCD_aAPI[0]->pfSetPixelIndex(x, y, Index);
+ }
+ }
+}
+
+/*********************************************************************
+*
+* _GetPixelIndex
+*
+* Purpose
+* Gets a pixel index for the Cursor.
+*/
+static int _GetPixelIndex(int x, int y) {
+ if ((y >= _ClipRect.y0) && (y <= _ClipRect.y1)) {
+ if ((x >= _ClipRect.x0) && (x <= _ClipRect.x1)) {
+ return LCD_L0_GetPixelIndex(x, y);
+ }
+ }
+ return 0;
+}
+
+/*********************************************************************
+*
+* _Undraw
+*
+* Purpose
+* Remove the cursors
+*/
+static void _Undraw(void) {
+ int x, y, xSize, ySize;
+ LCD_PIXELINDEX* pData;
+ /* Save bitmap data */
+ GUI_LOCK();
+ if (_hBuffer) {
+ pData = (LCD_PIXELINDEX*)GUI_ALLOC_h2p(_hBuffer);
+ xSize = _Rect.x1 - _Rect.x0 + 1;
+ ySize = _Rect.y1 - _Rect.y0 + 1;
+ for (y = 0; y < ySize; y++) {
+ for (x = 0; x < xSize; x++) {
+ _SetPixelIndex(x + _Rect.x0, y + _Rect.y0, *(pData + x));
+ }
+ pData += _pCursor->pBitmap->XSize;
+ }
+ }
+ GUI_UNLOCK();
+}
+
+/*********************************************************************
+*
+* _Log2Phys
+*/
+static int _Log2Phys(int Index) {
+ if (Index < 4) {
+ return _ColorIndex[Index];
+ } else {
+ LCD_COLOR Color = *(_pCursor->pBitmap->pPal->pPalEntries + Index);
+ return LCD_Color2Index(Color);
+ }
+}
+
+/*********************************************************************
+*
+* _Draw
+*/
+static void _Draw(void) {
+ int x, y, xSize, ySize;
+ LCD_PIXELINDEX* pData;
+ const GUI_BITMAP GUI_UNI_PTR * pBM;
+ GUI_LOCK();
+ if (_hBuffer) {
+ /* Save bitmap data */
+ pBM = _pCursor->pBitmap;
+ pData = (LCD_PIXELINDEX*)GUI_ALLOC_h2p(_hBuffer);
+ xSize = _Rect.x1 - _Rect.x0 + 1;
+ ySize = _Rect.y1 - _Rect.y0 + 1;
+ for (y = 0; y < ySize; y++) {
+ for (x = 0; x < xSize; x++) {
+ int BitmapPixel;
+ *(pData + x) = _GetPixelIndex(_Rect.x0 + x, _Rect.y0 + y);
+ BitmapPixel = GUI_GetBitmapPixelIndex(pBM, x, y);
+ if (BitmapPixel) {
+ _SetPixelIndex(_Rect.x0 + x, _Rect.y0 + y, _Log2Phys(BitmapPixel));
+ }
+ }
+ pData += pBM->XSize;
+ }
+ }
+ GUI_UNLOCK();
+}
+
+/*********************************************************************
+*
+* _CalcRect
+*/
+static void _CalcRect(void) {
+ if (_pCursor) {
+ _Rect.x0 = _x - _pCursor->xHot;
+ _Rect.y0 = _y - _pCursor->yHot;
+ _Rect.x1 = _Rect.x0 + _pCursor->pBitmap->XSize - 1;
+ _Rect.y1 = _Rect.y0 + _pCursor->pBitmap->YSize - 1;
+ }
+}
+
+/*********************************************************************
+*
+* _Hide
+*/
+static void _Hide(void) {
+ if (_CursorIsVis) {
+ _Undraw();
+ _CursorIsVis = 0;
+ }
+}
+
+/*********************************************************************
+*
+* _Show
+*/
+static void _Show(void) {
+ if (_CursorOn && (_CursorDeActCnt==0)) {
+ _CursorIsVis = 1;
+ _Draw();
+ }
+}
+
+/*********************************************************************
+*
+* _TempHide
+*
+* Purpose:
+* Hide cursor if a part of the given rectangle is located in the
+* rectangle used for the cursor. This routine is called automatically
+* by the window manager. This way the window manager can
+* automatically make sure that the cursor is always displayed
+* correctly.
+*
+* Params:
+* pRect Rectangle under consideration
+*
+* Return value:
+* 0: No action taken
+* Cursor was not visible or not affected because rectangles
+* did not overlap
+* 1: Cursor hidden -> WM needs to restore cursor after
+* drawing operation
+*/
+static char _TempHide(const GUI_RECT* pRect) {
+ if (!_CursorIsVis) {
+ return 0; /* Cursor not visible -> nothing to do */
+ }
+ if ((pRect == NULL) || GUI_RectsIntersect(pRect, &_Rect)) {
+ _Hide(); /* Cursor needs to be hidden */
+ return 1;
+ }
+ return 0; /* Cursor not affected -> nothing to do */
+}
+
+/*********************************************************************
+*
+* _TempUnhide
+*/
+static void _TempUnhide(void) {
+ _Show();
+}
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_CURSOR_Activate
+*/
+void GUI_CURSOR_Activate(void) {
+ GUI_LOCK();
+ if ((--_CursorDeActCnt) ==0) {
+ _Show();
+ }
+ GUI_UNLOCK();
+}
+
+/*********************************************************************
+*
+* GUI_CURSOR_Deactivate
+*/
+void GUI_CURSOR_Deactivate(void) {
+ GUI_LOCK();
+ if (_CursorDeActCnt++ ==0)
+ _Hide();
+ GUI_UNLOCK();
+}
+
+/*********************************************************************
+*
+* GUI_CURSOR_Select
+*/
+const GUI_CURSOR GUI_UNI_PTR * GUI_CURSOR_Select(const GUI_CURSOR GUI_UNI_PTR * pCursor) {
+ int AllocSize;
+ const GUI_BITMAP GUI_UNI_PTR * pBM;
+ const GUI_CURSOR GUI_UNI_PTR * pOldCursor;
+ GUI_LOCK();
+ pOldCursor = _pCursor;
+ if (pCursor != _pCursor) {
+ int i;
+ pBM = pCursor->pBitmap;
+ i = pBM->pPal->NumEntries > 4 ? 4 : pBM->pPal->NumEntries;
+ while (i--) {
+ LCD_COLOR Color = *(pBM->pPal->pPalEntries + i);
+ _ColorIndex[i] = LCD_Color2Index(Color);
+ }
+ _Hide();
+ AllocSize = pBM->XSize * pBM->YSize * sizeof(LCD_PIXELINDEX);
+ if (AllocSize != _AllocSize) {
+ GUI_ALLOC_Free(_hBuffer);
+ _hBuffer = 0;
+ }
+ _hBuffer = GUI_ALLOC_AllocZero(AllocSize);
+ _CursorOn = 1;
+ _pCursor = pCursor;
+ _CalcRect();
+ _Show();
+ }
+ GUI_UNLOCK();
+ return pOldCursor;
+}
+
+/*********************************************************************
+*
+* GUI_CURSOR_Hide
+*/
+void GUI_CURSOR_Hide(void) {
+ GUI_LOCK();
+ _Hide();
+ _CursorOn = 0;
+ /* Set function pointer which window manager can use */
+ GUI_CURSOR_pfTempHide = NULL;
+ GUI_CURSOR_pfTempUnhide = NULL;
+ GUI_UNLOCK();
+}
+
+/*********************************************************************
+*
+* GUI_CURSOR_Show
+*/
+void GUI_CURSOR_Show(void) {
+ GUI_LOCK();
+ LCDDEV_L0_GetRect(&_ClipRect);
+ _Hide();
+ _CursorOn = 1;
+ /* Set function pointer which window manager can use */
+ GUI_CURSOR_pfTempHide = _TempHide;
+ GUI_CURSOR_pfTempUnhide = _TempUnhide;
+ if (!_pCursor) {
+ GUI_CURSOR_Select(GUI_DEFAULT_CURSOR);
+ } else {
+ _Show();
+ }
+ GUI_UNLOCK();
+}
+
+/*********************************************************************
+*
+* GUI_CURSOR_SetPosition
+*/
+void GUI_CURSOR_SetPosition(int xNewPos, int yNewPos) {
+ int x, xStart, xStep, xEnd, xOff, xOverlapMin, xOverlapMax;
+ int y, yStart, yStep, yEnd, yOff, yOverlapMin, yOverlapMax;
+ int xSize;
+ LCD_PIXELINDEX* pData;
+ GUI_LOCK();
+ if (_hBuffer) {
+ if ((_x != xNewPos) | (_y != yNewPos)) {
+ if (_CursorOn) {
+ const GUI_BITMAP GUI_UNI_PTR * pBM = _pCursor->pBitmap;
+ /* Save & set clip rect */
+ /* Compute helper variables */
+ pData = (LCD_PIXELINDEX*)GUI_ALLOC_h2p(_hBuffer);
+ xSize = _pCursor->pBitmap->XSize;
+ xOff = xNewPos - _x;
+ if (xOff > 0) {
+ xStep = 1;
+ xStart = 0;
+ xEnd = _pCursor->pBitmap->XSize;
+ xOverlapMax = xEnd -1;
+ xOverlapMin = xOff;
+ } else {
+ xStep = -1;
+ xStart = xSize - 1;
+ xEnd = -1;
+ xOverlapMin = 0;
+ xOverlapMax = xStart + xOff;
+ }
+ yOff = yNewPos - _y;
+ if (yOff > 0) {
+ yStep = 1;
+ yStart = 0;
+ yEnd = _pCursor->pBitmap->YSize;
+ yOverlapMax = yEnd -1;
+ yOverlapMin = yOff;
+ } else {
+ yStep = -1;
+ yStart = _pCursor->pBitmap->YSize - 1;
+ yEnd = -1;
+ yOverlapMin = 0;
+ yOverlapMax = yStart + yOff;
+ }
+ /* Restore & Draw */
+ for (y = yStart; y != yEnd; y += yStep) {
+ char yOverlaps;
+ char yNewOverlaps;
+ int yNew = y + yOff;
+ yOverlaps = (y >= yOverlapMin) && (y <= yOverlapMax);
+ yNewOverlaps = (yNew >= yOverlapMin) && (yNew <= yOverlapMax);
+ for (x= xStart; x != xEnd; x += xStep) {
+ char xyOverlaps, xyNewOverlaps;
+ int BitmapPixel;
+ LCD_PIXELINDEX Pixel;
+ LCD_PIXELINDEX* pSave = pData + x + y * xSize;
+ int xNew = x + xOff;
+ BitmapPixel = GUI_GetBitmapPixelIndex(pBM, x, y);
+ xyOverlaps = (x >= xOverlapMin) && (x <= xOverlapMax) && yOverlaps;
+ xyNewOverlaps = (xNew >= xOverlapMin) && (xNew <= xOverlapMax) && yNewOverlaps;
+ /* Restore old pixel if it was not transparent */
+ if (BitmapPixel) {
+ if (!xyOverlaps || (GUI_GetBitmapPixelIndex(pBM, x - xOff, y - yOff) == 0)) {
+ _SetPixelIndex(x + _Rect.x0, y + _Rect.y0, *(pSave));
+ }
+ }
+ /* Save */
+ if (xyNewOverlaps) {
+ Pixel = *(pData + xNew + yNew * xSize);
+ } else {
+ Pixel = _GetPixelIndex(_Rect.x0 + xNew, _Rect.y0 + yNew);
+ }
+ *pSave = Pixel;
+ /* Write new ... We could write pixel by pixel here */
+ if (BitmapPixel) {
+ LCD_PIXELINDEX NewPixel = _Log2Phys(BitmapPixel);
+ _SetPixelIndex(_Rect.x0 + xNew, _Rect.y0 + yNew, NewPixel);
+ }
+ }
+ }
+ }
+ _x = xNewPos;
+ _y = yNewPos;
+ _CalcRect();
+ }
+ }
+ GUI_UNLOCK();
+}
+
+#else
+
+void GUICurs_C(void);
+void GUICurs_C(void) {} /* avoid empty object files */
+
+#endif /* GUI_SUPPORT_CURSOR */
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUIDebug.h b/User/system/lib/lcd/gui/Core/GUIDebug.h
new file mode 100644
index 0000000..044f3d0
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUIDebug.h
@@ -0,0 +1,173 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUIDebug.h
+Purpose : Debug macros
+----------------------------------------------------------------------
+ Debug macros for logging
+
+ In the GUI Simulation, all output is transferred into the log window.
+*/
+
+#ifndef GUI_DEBUG_H
+#define GUI_DEBUG_H
+
+#include "GUI.h"
+#include "GUI_X.h"
+
+#define GUI_DEBUG_LEVEL_NOCHECK 0 /* No run time checks are performed */
+#define GUI_DEBUG_LEVEL_CHECK_PARA 1 /* Parameter checks are performed to avoid crashes */
+#define GUI_DEBUG_LEVEL_CHECK_ALL 2 /* Parameter checks and consistency checks are performed */
+#define GUI_DEBUG_LEVEL_LOG_ERRORS 3 /* Errors are recorded */
+#define GUI_DEBUG_LEVEL_LOG_WARNINGS 4 /* Errors & Warnings are recorded */
+#define GUI_DEBUG_LEVEL_LOG_ALL 5 /* Errors, Warnings and Messages are recorded. */
+
+#ifndef GUI_DEBUG_LEVEL
+ #ifdef WIN32
+ // #define GUI_DEBUG_LEVEL GUI_DEBUG_LEVEL_LOG_WARNINGS /* Simulation should log all warnings */
+ #define GUI_DEBUG_LEVEL GUI_DEBUG_LEVEL_LOG_ALL /* Simulation should log all warnings */
+ #else
+ #define GUI_DEBUG_LEVEL GUI_DEBUG_LEVEL_CHECK_PARA /* For most targets, min. size is important */
+ #endif
+#endif
+
+/*******************************************************************
+*
+* Commandline
+*
+********************************************************************
+*/
+
+#ifdef WIN32
+ #define GUI_DEBUG_GETCMDLINE() SIM_GetCmdLine()
+#else
+ #define GUI_DEBUG_GETCMDLINE() 0
+#endif
+
+/*******************************************************************
+*
+* Error macros
+*
+********************************************************************
+*/
+
+/* Make sure the macros are actually defined */
+
+#if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_LOG_ERRORS
+ #define GUI_DEBUG_ERROROUT(s) GUI_ErrorOut(s)
+ #define GUI_DEBUG_ERROROUT1(s,p0) GUI_ErrorOut1(s,p0)
+ #define GUI_DEBUG_ERROROUT2(s,p0,p1) GUI_ErrorOut2(s,p0,p1)
+ #define GUI_DEBUG_ERROROUT3(s,p0,p1,p2) GUI_ErrorOut3(s,p0,p1,p2)
+ #define GUI_DEBUG_ERROROUT4(s,p0,p1,p2,p3) GUI_ErrorOut4(s,p0,p1,p2,p3)
+ #define GUI_DEBUG_ERROROUT_IF(exp,s) { if (exp) GUI_DEBUG_ERROROUT(s); }
+ #define GUI_DEBUG_ERROROUT1_IF(exp,s,p0) { if (exp) GUI_DEBUG_ERROROUT1(s,p0); }
+ #define GUI_DEBUG_ERROROUT2_IF(exp,s,p0,p1) { if (exp) GUI_DEBUG_ERROROUT2(s,p0,p1); }
+ #define GUI_DEBUG_ERROROUT3_IF(exp,s,p0,p1,p2) { if (exp) GUI_DEBUG_ERROROUT3(s,p0,p1,p2); }
+ #define GUI_DEBUG_ERROROUT4_IF(exp,s,p0,p1,p2,p3) { if (exp) GUI_DEBUG_ERROROUT4(s,p0,p1,p2,p3); }
+#else
+ #define GUI_DEBUG_ERROROUT(s)
+ #define GUI_DEBUG_ERROROUT1(s,p0)
+ #define GUI_DEBUG_ERROROUT2(s,p0,p1)
+ #define GUI_DEBUG_ERROROUT3(s,p0,p1,p2)
+ #define GUI_DEBUG_ERROROUT4(s,p0,p1,p2,p3)
+ #define GUI_DEBUG_ERROROUT_IF(exp,s)
+ #define GUI_DEBUG_ERROROUT1_IF(exp,s,p0)
+ #define GUI_DEBUG_ERROROUT2_IF(exp,s,p0,p1)
+ #define GUI_DEBUG_ERROROUT3_IF(exp,s,p0,p1,p2)
+ #define GUI_DEBUG_ERROROUT4_IF(exp,s,p0,p1,p2,p3)
+#endif
+
+/*******************************************************************
+*
+* Warning macros
+*
+********************************************************************
+*/
+
+/* Make sure the macros are actually defined */
+
+#if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_LOG_WARNINGS
+ #define GUI_DEBUG_WARN(s) GUI_Warn(s)
+ #define GUI_DEBUG_WARN1(s,p0) GUI_Warn1(s,p0)
+ #define GUI_DEBUG_WARN2(s,p0,p1) GUI_Warn2(s,p0,p1)
+ #define GUI_DEBUG_WARN3(s,p0,p1,p2) GUI_Warn3(s,p0,p1,p2)
+ #define GUI_DEBUG_WARN4(s,p0,p1,p2,p3) GUI_Warn4(s,p0,p1,p2,p3)
+ #define GUI_DEBUG_WARN_IF(exp,s) { if (exp) GUI_DEBUG_WARN(s); }
+ #define GUI_DEBUG_WARN1_IF(exp,s,p0) { if (exp) GUI_DEBUG_WARN1(s,p0); }
+ #define GUI_DEBUG_WARN2_IF(exp,s,p0,p1) { if (exp) GUI_DEBUG_WARN2(s,p0,p1); }
+ #define GUI_DEBUG_WARN3_IF(exp,s,p0,p1,p2) { if (exp) GUI_DEBUG_WARN3(s,p0,p1,p2); }
+ #define GUI_DEBUG_WARN4_IF(exp,s,p0,p1,p2,p3) { if (exp) GUI_DEBUG_WARN4(s,p0,p1,p2,p3); }
+#else
+ #define GUI_DEBUG_WARN(s)
+ #define GUI_DEBUG_WARN1(s,p0)
+ #define GUI_DEBUG_WARN2(s,p0,p1)
+ #define GUI_DEBUG_WARN3(s,p0,p1,p2)
+ #define GUI_DEBUG_WARN4(s,p0,p1,p2,p3)
+ #define GUI_DEBUG_WARN_IF(exp,s)
+ #define GUI_DEBUG_WARN1_IF(exp,s,p0)
+ #define GUI_DEBUG_WARN2_IF(exp,s,p0,p1)
+ #define GUI_DEBUG_WARN3_IF(exp,s,p0,p1,p2)
+ #define GUI_DEBUG_WARN4_IF(exp,s,p0,p1,p2,p3)
+#endif
+
+/*******************************************************************
+*
+* Logging macros
+*
+********************************************************************
+*/
+/* Make sure the macros are actually defined */
+
+#if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_LOG_ALL
+ #define GUI_DEBUG_LOG(s) GUI_Log(s)
+ #define GUI_DEBUG_LOG1(s,p0) GUI_Warn1(s,p0)
+ #define GUI_DEBUG_LOG2(s,p0,p1) GUI_Warn2(s,p0,p1)
+ #define GUI_DEBUG_LOG3(s,p0,p1,p2) GUI_Warn3(s,p0,p1,p2)
+ #define GUI_DEBUG_LOG4(s,p0,p1,p2,p3) GUI_Warn4(s,p0,p1,p2,p3)
+ #define GUI_DEBUG_LOG_IF(exp,s) { if (exp) GUI_DEBUG_LOG(s); }
+ #define GUI_DEBUG_LOG1_IF(exp,s,p0) { if (exp) GUI_DEBUG_LOG1(s,p0); }
+ #define GUI_DEBUG_LOG2_IF(exp,s,p0,p1) { if (exp) GUI_DEBUG_LOG2(s,p0,p1); }
+ #define GUI_DEBUG_LOG3_IF(exp,s,p0,p1,p2) { if (exp) GUI_DEBUG_LOG3(s,p0,p1,p2); }
+ #define GUI_DEBUG_LOG4_IF(exp,s,p0,p1,p2,p3) { if (exp) GUI_DEBUG_LOG4(s,p0,p1,p2,p3); }
+#else
+ #define GUI_DEBUG_LOG(s)
+ #define GUI_DEBUG_LOG1(s,p0)
+ #define GUI_DEBUG_LOG2(s,p0,p1)
+ #define GUI_DEBUG_LOG3(s,p0,p1,p2)
+ #define GUI_DEBUG_LOG4(s,p0,p1,p2,p3)
+ #define GUI_DEBUG_LOG_IF(exp,s)
+ #define GUI_DEBUG_LOG1_IF(exp,s,p0)
+ #define GUI_DEBUG_LOG2_IF(exp,s,p0,p1)
+ #define GUI_DEBUG_LOG3_IF(exp,s,p0,p1,p2)
+ #define GUI_DEBUG_LOG4_IF(exp,s,p0,p1,p2,p3)
+#endif
+
+/*******************************************************************
+*
+* Asserts
+*
+********************************************************************
+*/
+#if GUI_DEBUG_LEVEL >= GUI_DEBUG_LEVEL_LOG_ERRORS
+ #define GUI_DEBUG_ASSERT(exp) { if (!exp) GUI_DEBUG_ERROROUT(#exp); }
+#else
+ #define GUI_DEBUG_ASSERT(exp)
+#endif
+
+#endif /* LCD_H */
+
+
+
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUIEncJS.c b/User/system/lib/lcd/gui/Core/GUIEncJS.c
new file mode 100644
index 0000000..7c8a73f
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUIEncJS.c
@@ -0,0 +1,116 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUIEncSJ.C
+Purpose : Implementation of Shift JIS decoding
+----------------------------------------------------------------------
+Version-Date---Author-Explanation
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* DB2SJIS
+*/
+static U16 DB2SJIS(U8 Byte0, U8 Byte1) {
+ return Byte1 | (((U16)Byte0)<<8);
+}
+
+/*********************************************************************
+*
+* _GetLineDistX_SJIS
+*/
+static int _GetLineDistX_SJIS(const char GUI_UNI_PTR *s, int Len) {
+ int Dist =0;
+ if (s) {
+ U8 c0;
+ while (((c0=*(const U8*)s) !=0) && Len >=0) {
+ s++; Len--;
+ if (c0 > 127) {
+ U8 c1 = *(const U8*)s++;
+ Len--;
+ Dist += GUI_GetCharDistX(DB2SJIS(c0, c1));
+ } else {
+ Dist += GUI_GetCharDistX(c0);
+ }
+ }
+ }
+ return Dist;
+}
+
+/*********************************************************************
+*
+* _GetLineLen_SJIS
+* Purpose:
+* Returns the number of characters in a string.
+*
+* NOTE:
+* The return value can be used as offset into the
+* string, which means that double characters count double
+*/
+static int _GetLineLen_SJIS(const char GUI_UNI_PTR *s, int MaxLen) {
+ int Len =0;
+ U8 c0;
+ while (((c0=*(const U8*)s) !=0) && Len < MaxLen) {
+ s++;
+ if (c0 > 127) {
+ Len++; s++;
+ } else {
+ switch (c0) {
+ case '\n': return Len;
+ }
+ }
+ Len++;
+ }
+ return Len;
+}
+
+/*********************************************************************
+*
+* _DispLine_SJIS
+*/
+static void _DispLine_SJIS(const char GUI_UNI_PTR *s, int Len) {
+ U8 c0;
+ while (--Len >=0) {
+ c0=*(const U8*)s++;
+ if (c0 > 127) {
+ U8 c1 = *(const U8*)s++;
+ Len--;
+ GL_DispChar (DB2SJIS(c0, c1));
+ } else {
+ GL_DispChar(c0);
+ }
+ }
+}
+
+/*********************************************************************
+*
+* GUI_ENC_APIList_SJIS, API list
+*/
+const tGUI_ENC_APIList GUI_ENC_APIList_SJIS = {
+ _GetLineDistX_SJIS,
+ _GetLineLen_SJIS,
+ _DispLine_SJIS
+};
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUIIndex2Color.c b/User/system/lib/lcd/gui/Core/GUIIndex2Color.c
new file mode 100644
index 0000000..6a664e0
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUIIndex2Color.c
@@ -0,0 +1,40 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUIIndex2Color.C
+Purpose : Converts a color index to a RGB-value
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_Index2Color
+*/
+GUI_COLOR GUI_Index2Color(int Index) {
+ GUI_COLOR Color;
+ GUI_LOCK();
+ Color = LCD_Index2Color(Index);
+ GUI_UNLOCK();
+ return Color;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUIPolyE.c b/User/system/lib/lcd/gui/Core/GUIPolyE.c
new file mode 100644
index 0000000..a84f2de
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUIPolyE.c
@@ -0,0 +1,152 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUIPolyE.c
+Purpose : Polygon enlarge
+----------------------------------------------------------------------
+*/
+
+#include
+#include "GUI.h"
+#include "GUIDebug.h"
+
+/*********************************************************************
+*
+* Types
+*
+**********************************************************************
+*/
+
+typedef struct {
+ float x, y;
+} tfPoint;
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _fround
+*/
+static int _fround(float f) {
+ if (f>0)
+ return f+0.5f;
+ return f-0.5f;
+}
+
+/*********************************************************************
+*
+* _Normalize
+*/
+static void _Normalize(tfPoint* pfPoint) {
+ float fx = pfPoint->x;
+ float fy = pfPoint->y;
+ float r = sqrt(fx*fx + fy*fy);
+ if (r > 0) {
+ pfPoint->x = fx/r;
+ pfPoint->y = fy/r;
+ }
+}
+
+/*********************************************************************
+*
+* _ReverseLen
+*/
+static void _ReverseLen(tfPoint* pfPoint) {
+ float fx = pfPoint->x;
+ float fy = pfPoint->y;
+ float r = sqrt(fx*fx/2 + fy*fy/2);
+ if (r > 0) {
+ pfPoint->x = fx/r/r;
+ pfPoint->y = fy/r/r;
+ }
+}
+
+/*********************************************************************
+*
+* _GetVect
+*/
+static void _GetVect(tfPoint* pfPoint, const GUI_POINT* pSrc, int NumPoints, int Index) {
+ int Off0 = (Index + NumPoints-1) % NumPoints;
+ int Off1 = Index % NumPoints;
+ pfPoint->x = pSrc[Off1].x - pSrc[Off0].x;
+ pfPoint->y = pSrc[Off1].y - pSrc[Off0].y;
+}
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_EnlargePolygon
+*/
+#if 0
+void GUI_EnlargePolygon(GUI_POINT* pDest, const GUI_POINT* pSrc, int NumPoints, int Len) {
+ int j;
+ /* Calc destination points */
+ for (j=0; jx = (pSrc+j)->x + x;
+ (pDest+j)->y = (pSrc+j)->y + y;
+ }
+}
+
+#else
+
+void GUI_EnlargePolygon(GUI_POINT* pDest, const GUI_POINT* pSrc, int NumPoints, int Len) {
+ int j;
+ /* Calc destination points */
+ for (j=0; jx = (pSrc+j)->x + x;
+ (pDest+j)->y = (pSrc+j)->y + y;
+ }
+}
+#endif
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUIPolyM.c b/User/system/lib/lcd/gui/Core/GUIPolyM.c
new file mode 100644
index 0000000..338e927
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUIPolyM.c
@@ -0,0 +1,41 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUIPolyR.c
+Purpose : Polygon rotation
+----------------------------------------------------------------------
+*/
+
+#include
+#include "GUI.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_MagnifyPolygon
+*/
+void GUI_MagnifyPolygon(GUI_POINT* pDest, const GUI_POINT* pSrc, int NumPoints, int Mag) {
+ int j;
+ for (j=0; jx = (pSrc+j)->x * Mag;
+ (pDest+j)->y = (pSrc+j)->y * Mag;
+ }
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUIPolyR.c b/User/system/lib/lcd/gui/Core/GUIPolyR.c
new file mode 100644
index 0000000..34734b7
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUIPolyR.c
@@ -0,0 +1,47 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUIPolyR.c
+Purpose : Polygon rotation
+----------------------------------------------------------------------
+*/
+
+#include "arm_math.h"
+#include "GUI.h"
+
+/*********************************************************************
+ *
+ * Public code
+ *
+ **********************************************************************
+ */
+/*********************************************************************
+ *
+ * GUI_RotatePolygon
+ */
+void GUI_RotatePolygon(GUI_POINT *pDest, const GUI_POINT *pSrc, int NumPoints, float Angle)
+{
+ int j;
+ float fcos = arm_cos_f32(Angle);
+ float fsin = arm_sin_f32(Angle);
+ for (j = 0; j < NumPoints; j++)
+ {
+ int x = (pSrc + j)->x;
+ int y = (pSrc + j)->y;
+ (pDest + j)->x = x * fcos + y * fsin;
+ (pDest + j)->y = -x * fsin + y * fcos;
+ }
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUIRealloc.c b/User/system/lib/lcd/gui/Core/GUIRealloc.c
new file mode 100644
index 0000000..44b9859
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUIRealloc.c
@@ -0,0 +1,65 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUIRealloc.C
+Purpose : Dynamic memory management
+----------------------------------------------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include /* for memcpy, memset */
+
+#include "GUI_Protected.h"
+#include "GUIDebug.h"
+
+/*********************************************************************
+*
+* Public routines: Using internal memory management
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_ALLOC_Realloc
+*
+* Purpose:
+* Reallocate a memory block. This is typically used to grow memory
+* blocks. The contents of the old memory block are copied into the
+* new block (or as much as fits in case of shrinkage).
+* In case of error the old memory block (and its handle) remain
+* unchanged.
+*
+* Return value:
+* On success: Handle of newly allocated memory block
+* On error: 0
+*/
+GUI_HMEM GUI_ALLOC_Realloc(GUI_HMEM hOld, int NewSize) {
+ GUI_HMEM hNew;
+ hNew = GUI_ALLOC_AllocNoInit(NewSize);
+ if (hNew && hOld) {
+ void *pNew, *pOld;
+ int Size, OldSize;
+ OldSize = GUI_ALLOC_GetSize(hOld);
+ Size = (OldSize < NewSize) ? OldSize : NewSize;
+ GUI_LOCK();
+ pNew = GUI_ALLOC_h2p(hNew);
+ pOld = GUI_ALLOC_h2p(hOld);
+ memcpy(pNew, pOld, Size);
+ GUI_UNLOCK();
+ GUI_ALLOC_Free(hOld);
+ }
+ return hNew;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUIStream.c b/User/system/lib/lcd/gui/Core/GUIStream.c
new file mode 100644
index 0000000..c4d5eab
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUIStream.c
@@ -0,0 +1,48 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUIStream.c
+Purpose : Support for streamed bitmaps
+----------------------------------------------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_DrawStreamedBitmap
+*/
+void GUI_DrawStreamedBitmap(const GUI_BITMAP_STREAM *pBitmapHeader, int x, int y) {
+ GUI_BITMAP Bitmap = {0};
+ GUI_LOGPALETTE Palette;
+ Bitmap.BitsPerPixel = pBitmapHeader->BitsPerPixel;
+ Bitmap.BytesPerLine = pBitmapHeader->BytesPerLine;
+ Bitmap.pData = ((const U8*)pBitmapHeader)+16+4*pBitmapHeader->NumColors;
+ Bitmap.pPal = &Palette;
+ Bitmap.XSize = pBitmapHeader->XSize;
+ Bitmap.YSize = pBitmapHeader->YSize;
+ Palette.HasTrans = pBitmapHeader->HasTrans;
+ Palette.NumEntries = pBitmapHeader->NumColors;
+ Palette.pPalEntries = (const LCD_COLOR*)((const U8*)pBitmapHeader+16);
+ GUI_DrawBitmap(&Bitmap, x, y);
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUITask.c b/User/system/lib/lcd/gui/Core/GUITask.c
new file mode 100644
index 0000000..9679f45
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUITask.c
@@ -0,0 +1,231 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUITASK.C
+Purpose : Saves/Restores task context with supported OSs.
+ It also uses a resource semaphore.
+
+ The following externals are used and should typically be defined
+ in GUI_X.c:
+
+ U32 GUI_X_GetTaskId();
+ void GUI_X_Unlock();
+ void GUI_X_Lock();
+
+----------------------------------------------------------------------
+Version-Date---Author-Explanation
+----------------------------------------------------------------------
+3.70 031016 TQ GUI_MAXTASK set to 4
+3.60 030902 TQ GUI_MAXTASK increased to 6
+3.52 030618 RS GUI_MAX_LOCK_NESTING increased
+3.40 030228 RS GUI_MAX_LOCK_NESTING introduced
+3.02a 020722 RS Use of macro GUI_DEBUG_ERROROUT_IF in order
+ to simplify th code.
+3.02 020514 RS Avoided nested calls of GUI_X_Lock, GUI_X_Unlock
+ (because some RTOSes, such as CMX and u/C-OS
+ could not handle this easily)
+3.00 010425 RS Cleanup for Version 3.00
+ a) Dummy routines added to avoid link errors
+ in case some modules are compiled with
+ different settings
+1.00.01 990926 RS Fix in order to make sure init task has no
+ context of its own (_CurrentTaskNo =-1)
+1.00.00 990918 RS Initial version for version control purposes.
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI_Protected.h"
+#include "GUIDebug.h"
+
+/*********************************************************************
+*
+* Configuration defaults
+*
+**********************************************************************
+*/
+
+#ifndef GUI_MAXTASK
+ #define GUI_MAXTASK (4)
+#endif
+
+#ifndef GUI_MAX_LOCK_NESTING
+ #define GUI_MAX_LOCK_NESTING 48 /* If a lot of nested dialogs are used, this may not be sufficient. */
+#endif
+
+#if GUI_OS
+
+/*********************************************************************
+*
+* Static data
+*
+**********************************************************************
+*/
+
+static struct {
+ U32 TaskID;
+ GUI_CONTEXT Context;
+} _Save[GUI_MAXTASK];
+
+static int _CurrentTaskNo = -1;
+static int _EntranceCnt = 0;
+static U32 _TaskIDLock = 0;
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _GetTaskNo
+*/
+static int _GetTaskNo(void) {
+ int i;
+ for (i=0; i< GUI_MAXTASK; i++) {
+ U32 TaskId = GUI_X_GetTaskId();
+ if (_Save[i].TaskID == TaskId)
+ return i;
+ if (_Save[i].TaskID == 0) {
+ _Save[i].TaskID = TaskId;
+ return i;
+ }
+ }
+ GUI_DEBUG_ERROROUT("No Context available for task ... (increase GUI_MAXTASK)");
+ return 0;
+}
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_Unlock
+*/
+void GUI_Unlock(void) {
+ if (--_EntranceCnt == 0) {
+ GUI_X_Unlock();
+ }
+ /* Test if _EntranceCnt is in reasonable range ... Not required in release builds */
+ GUI_DEBUG_ERROROUT_IF((_EntranceCnt < 0), "GUITASK.c: GUI_Unlock() _EntranceCnt underflow ");
+}
+
+/*********************************************************************
+*
+* GUI_Lock
+*/
+void GUI_Lock(void) {
+ if (_EntranceCnt == 0) {
+ GUI_X_Lock();
+ _TaskIDLock = GUI_X_GetTaskId(); /* Save task ID */
+ } else {
+ if (_TaskIDLock != GUI_X_GetTaskId()) {
+ GUI_X_Lock();
+ _TaskIDLock = GUI_X_GetTaskId(); /* Save task ID */
+ }
+ }
+ if (++_EntranceCnt == 1) {
+ int TaskNo = _GetTaskNo();
+ if (TaskNo != _CurrentTaskNo) {
+ /* Save data of current task */
+ if (_CurrentTaskNo>=0) { /* Make sure _CurrentTaskNo is valid */
+ _Save[_CurrentTaskNo].Context = GUI_Context;
+ /* Load data of this task */
+ GUI_Context = _Save[TaskNo].Context;
+ }
+ _CurrentTaskNo = TaskNo;
+ }
+ }
+ /* Test if _EntranceCnt is in reasonable range ... Not required in release builds */
+ GUI_DEBUG_ERROROUT_IF((_EntranceCnt > GUI_MAX_LOCK_NESTING), "GUITASK.c: GUI_Lock() _EntranceCnt overflow ");
+}
+
+/*********************************************************************
+*
+* GUITASK_Init
+*/
+void GUITASK_Init(void) {
+ _CurrentTaskNo =-1; /* Invalidate */
+ GUI_X_InitOS();
+}
+
+
+/*********************************************************************
+*
+* GUITASK_CopyContext
+*/
+void GUITASK_CopyContext(void) {
+ int i;
+ for (i = 0; i < GUI_MAXTASK; i++) {
+ _Save[i].Context = GUI_Context;
+ _Save[i].TaskID = 0;
+ }
+}
+
+
+#if defined(WIN32) && defined(_DEBUG)
+
+/*********************************************************************
+*
+* GUITASK_AssertLock
+*
+*/
+void GUITASK_AssertLock(void) {
+ if (!_EntranceCnt) {
+ GUI_DEBUG_ERROROUT("GUITASK.c: GUITASK_AssertLock failed!");
+ }
+}
+
+/*********************************************************************
+*
+* GUITASK_AssertNoLock
+*
+*/
+void GUITASK_AssertNoLock(void) {
+ GUI_Lock();
+ if (_EntranceCnt > 1) {
+ GUI_DEBUG_ERROROUT("GUITASK.c: GUITASK_AssertNoLock failed!");
+ }
+ GUI_Unlock();
+}
+
+#endif
+
+#else
+
+/*********************************************************************
+*
+* Dummy Kernel routines
+*
+* The routines below are dummies in case configuration tells us not
+* to use any kernel. In this case the routines below should
+* not be required, but it can not hurt to have them. The linker
+* will eliminate them anyhow.
+*/
+void GUI_Unlock(void);
+void GUI_Unlock(void) {}
+void GUI_Lock(void);
+void GUI_Lock(void) {}
+void GUITASK_Init(void);
+void GUITASK_Init(void) {}
+void GUITASK_StoreDefaultContext(void);
+void GUITASK_StoreDefaultContext(void) {}
+
+#endif
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUITime.c b/User/system/lib/lcd/gui/Core/GUITime.c
new file mode 100644
index 0000000..5669d6f
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUITime.c
@@ -0,0 +1,51 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUITime.C
+Purpose : Time related routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_GetTime
+*/
+int GUI_GetTime(void) {
+ return GUI_X_GetTime();
+}
+
+/*********************************************************************
+*
+* GUI_Delay
+*/
+void GUI_Delay(int Period) {
+ int EndTime = GUI_GetTime()+Period;
+ int tRem; /* remaining Time */
+ GUI_ASSERT_NO_LOCK();
+ while (tRem = EndTime- GUI_GetTime(), tRem>0) {
+ GUI_Exec();
+ GUI_X_Delay((tRem >5) ? 5 : tRem);
+ }
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUITimer.c b/User/system/lib/lcd/gui/Core/GUITimer.c
new file mode 100644
index 0000000..8cbb749
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUITimer.c
@@ -0,0 +1,273 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUITimer.c
+Purpose : Supplies timers
+----------------------------------------------------------------------
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Defines
+*
+**********************************************************************
+*/
+
+#define GUI_TIMER_H2P(h) (GUI_TIMER_Obj*)GUI_ALLOC_h2p(h)
+
+/*********************************************************************
+*
+* Types
+*
+**********************************************************************
+*/
+
+typedef struct {
+ GUI_TIMER_CALLBACK* cb;
+ GUI_TIMER_HANDLE hNext;
+ int Flags;
+ U32 Context;
+ GUI_TIMER_TIME t0;
+ GUI_TIMER_TIME Period;
+} GUI_TIMER_Obj;
+
+/*********************************************************************
+*
+* Static data
+*
+**********************************************************************
+*/
+
+GUI_TIMER_HANDLE hFirstTimer;
+GUI_TIMER_HANDLE _hActiveTimer;
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _Unlink
+*/
+static void _Unlink(GUI_TIMER_HANDLE hTimer) {
+ GUI_TIMER_Obj* pTimer = GUI_TIMER_H2P(hTimer);
+ GUI_TIMER_HANDLE hi;
+ GUI_TIMER_Obj* pi;
+/* Check if it is the first element */
+ if (hFirstTimer == hTimer) {
+ hFirstTimer = pTimer->hNext;
+ return;
+ }
+ hi = hFirstTimer;
+/* Try to find it in the list ... */
+ while(hi) {
+ /* GUI_ASSERT(hi<1000,0); */
+ pi = GUI_TIMER_H2P(hi);
+ if (pi->hNext == hTimer) {
+ pi->hNext = pTimer->hNext;
+ break;
+ }
+ hi = pi->hNext;
+ }
+}
+
+/*********************************************************************
+*
+* _Link
+*
+* Purpose:
+* This routine inserts the new timer (referenced by its handle) into
+* the linked list. The linked list is sorted according to timestamps.
+* The first element is the timer which expires first.
+*/
+static void _Link(GUI_TIMER_HANDLE hNew) {
+ GUI_TIMER_Obj* pNew = GUI_TIMER_H2P(hNew);
+ GUI_TIMER_Obj* pTimer;
+ GUI_TIMER_Obj* pNext;
+ GUI_TIMER_HANDLE hNext;
+ if (hFirstTimer ==0) { /* List is empty, make it the only element */
+ hFirstTimer = hNew;
+ pNew->hNext = 0;
+ } else {
+ GUI_TIMER_Obj* pFirstTimer = GUI_TIMER_H2P(hFirstTimer);
+/* Check if we have to make it the first element */
+ if ((pNew->t0 - pFirstTimer->t0) <=0) {
+ pNew->hNext = hFirstTimer;
+ hFirstTimer = hNew;
+ return;
+ } else {
+ GUI_TIMER_HANDLE hTimer = hFirstTimer;
+/* Put it into the list */
+ do {
+ pTimer = GUI_TIMER_H2P(hTimer);
+ hNext = pTimer->hNext;
+ if (hNext ==0)
+ goto Append;
+ pNext = GUI_TIMER_H2P(hNext);
+ if ((pNew->t0 - pNext->t0) <=0) {
+ pNew->hNext = hNext;
+ pTimer->hNext= hNew;
+ return;
+ }
+ } while(1);
+/* Put it at the end of the list */
+Append:
+ pNew->hNext = hNext;
+ pTimer->hNext= hNew;
+ return;
+ }
+ }
+}
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_TIMER_Exec
+*/
+int GUI_TIMER_Exec(void) {
+ int r = 0;
+ GUI_TIMER_TIME t = GUI_GetTime();
+ GUI_LOCK(); {
+ while (hFirstTimer) {
+ GUI_TIMER_Obj* pTimer = GUI_TIMER_H2P(hFirstTimer);
+ if ((pTimer->t0-t) <=0) {
+ GUI_TIMER_MESSAGE tm;
+ tm.Time = t;
+ tm.Context = pTimer->Context;
+ _hActiveTimer = hFirstTimer;
+ hFirstTimer = pTimer->hNext;
+ pTimer->cb(&tm);
+ r = 1;
+ } else
+ break;
+ }
+ /*
+ GUI_TIMER_Obj* pObj = GUI_TIMER_H2P(hObj);
+ pObj->t0 = Time;
+ */
+ } GUI_UNLOCK();
+ return r;
+}
+
+/*********************************************************************
+*
+* GUI_TIMER_Create
+*/
+GUI_TIMER_HANDLE GUI_TIMER_Create(GUI_TIMER_CALLBACK* cb, int Time, U32 Context, int Flags) {
+ GUI_TIMER_HANDLE hObj;
+ GUI_TIMER_Obj* pObj;
+ GUI_LOCK();
+ GUI_USE_PARA(Flags);
+ GUI_USE_PARA(Time);
+ GUI_pfTimerExec = GUI_TIMER_Exec;
+ {
+ /* Alloc memory for obj */
+ hObj = GUI_ALLOC_AllocZero(sizeof(GUI_TIMER_Obj));
+ pObj = GUI_TIMER_H2P(hObj);
+ /* init member variables */
+ pObj->cb = cb;
+ pObj->Context = Context;
+ pObj->t0 = Time; //houhh 20061018...
+ /* Link it */
+ _Link(hObj);
+ } GUI_UNLOCK();
+ return hObj;
+}
+
+/*********************************************************************
+*
+* GUI_TIMER_Delete
+*/
+void GUI_TIMER_Delete(GUI_TIMER_HANDLE hObj) {
+/* Unlink Timer */
+ GUI_LOCK();
+ _Unlink(hObj);
+ GUI_ALLOC_Free(hObj);
+ GUI_UNLOCK();
+}
+
+/*********************************************************************
+*
+* GUI_TIMER_SetPeriod
+*/
+void GUI_TIMER_SetPeriod(GUI_TIMER_HANDLE hObj, GUI_TIMER_TIME Period) {
+ GUI_LOCK(); {
+ GUI_TIMER_Obj* pObj = GUI_TIMER_H2P(hObj);
+ pObj->Period = Period;
+ } GUI_UNLOCK();
+}
+
+/*********************************************************************
+*
+* GUI_TIMER_SetTime
+*/
+void GUI_TIMER_SetTime(GUI_TIMER_HANDLE hObj, GUI_TIMER_TIME Time) {
+ GUI_LOCK(); {
+ GUI_TIMER_Obj* pObj = GUI_TIMER_H2P(hObj);
+ pObj->t0 = Time;
+ } GUI_UNLOCK();
+}
+
+//////
+void GUI_TIMER_Context(GUI_TIMER_HANDLE hObj, U32 Context) {
+ GUI_LOCK(); {
+ GUI_TIMER_Obj* pObj = GUI_TIMER_H2P(hObj);
+ pObj->Context = Context;
+ } GUI_UNLOCK();
+}
+//////
+
+/*********************************************************************
+*
+* GUI_TIMER_SetDelay
+*/
+void GUI_TIMER_SetDelay(GUI_TIMER_HANDLE hObj, GUI_TIMER_TIME Delay) {
+ GUI_LOCK(); {
+ GUI_TIMER_Obj* pObj = GUI_TIMER_H2P(hObj);
+ pObj->t0 = Delay;
+ _Unlink(hObj);
+ _Link(hObj);
+ } GUI_UNLOCK();
+}
+
+/*********************************************************************
+*
+* GUI_TIMER_Restart
+*/
+void GUI_TIMER_Restart(GUI_TIMER_HANDLE hObj) {
+ GUI_TIMER_Obj* pObj;
+ GUI_LOCK();
+ {
+ if (hObj == 0) {
+ hObj = _hActiveTimer;
+ }
+ pObj = GUI_TIMER_H2P(hObj);
+ pObj->t0 = GUI_GetTime() +pObj->Period;
+ _Unlink(hObj);
+ _Link(hObj);
+ } GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUIType.h b/User/system/lib/lcd/gui/Core/GUIType.h
new file mode 100644
index 0000000..de22bc3
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUIType.h
@@ -0,0 +1,385 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUIType.h
+Purpose : Include file define the types used for GUI
+---------------------------END-OF-HEADER------------------------------
+
+Attention : Do not modify this file ! If you do, you will not
+ be able do update to a later GUI version !
+
+*/
+
+#ifndef GUITYPE_H_INCLUDED
+#define GUITYPE_H_INCLUDED
+
+#include "LCD.h"
+#include "GUIConf.h"
+
+/* *************************************************************
+ * *
+ * Simple types *
+ * *
+ *************************************************************
+*/
+
+typedef const char * GUI_ConstString;
+
+
+/* *************************************************************
+ * *
+ * Structures *
+ * *
+ *************************************************************
+*/
+
+typedef LCD_COLOR GUI_COLOR;
+typedef LCD_LOGPALETTE GUI_LOGPALETTE;
+typedef LCD_DRAWMODE GUI_DRAWMODE;
+typedef LCD_RECT GUI_RECT;
+
+typedef struct {
+ void (* pfDraw)(int x0,int y0,int xsize, int ysize, const U8 GUI_UNI_PTR * pPixel, const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal, int xMag, int yMag);
+ GUI_COLOR (* pfIndex2Color)(int Index);
+} GUI_BITMAP_METHODS;
+
+typedef struct {
+ U16P XSize;
+ U16P YSize;
+ U16P BytesPerLine;
+ U16P BitsPerPixel;
+ const U8 GUI_UNI_PTR * pData;
+ const GUI_LOGPALETTE GUI_UNI_PTR * pPal;
+ const GUI_BITMAP_METHODS * pMethods;
+} GUI_BITMAP;
+
+/* This structure may not be changed because the data that it
+ expects is read in binary form (via any kind of interface,
+ at runtime).
+ This structure should therefor not be changed.
+*/
+typedef struct {
+ U16 ID; /* Version 1.00 => 100*/
+ U16 Version;
+ U16 XSize;
+ U16 YSize;
+ U16 BytesPerLine;
+ U16 BitsPerPixel;
+ U16 NumColors;
+ U16 HasTrans;
+} GUI_BITMAP_STREAM;
+
+typedef struct {
+ int x,y;
+ unsigned char Pressed;
+} GUI_PID_STATE;
+
+/*
+ ****************************************
+ * *
+ * FONT structures (new in V1.10) *
+ * *
+ ****************************************
+*/
+
+/* Translation list. Translates a character code into up to 2
+ indices of images to display on top of each other;
+ '' -> index('a'), index('') */
+typedef struct {
+ I16P c0;
+ I16P c1;
+} GUI_FONT_TRANSLIST;
+
+typedef struct {
+ U16P FirstChar;
+ U16P LastChar;
+ const GUI_FONT_TRANSLIST GUI_UNI_PTR * pList;
+} GUI_FONT_TRANSINFO;
+
+typedef struct {
+ U8 XSize;
+ U8 XDist;
+ U8 BytesPerLine;
+ const unsigned char GUI_UNI_PTR * pData;
+} GUI_CHARINFO;
+
+typedef struct GUI_FONT_PROP {
+ U16P First; /* first character */
+ U16P Last; /* last character */
+ const GUI_CHARINFO GUI_UNI_PTR * paCharInfo; /* address of first character */
+ const struct GUI_FONT_PROP GUI_UNI_PTR * pNext; /* pointer to next */
+} GUI_FONT_PROP;
+
+typedef struct {
+ const unsigned char GUI_UNI_PTR * pData;
+ const U8 GUI_UNI_PTR * pTransData;
+ const GUI_FONT_TRANSINFO GUI_UNI_PTR * pTrans;
+ U16P FirstChar;
+ U16P LastChar;
+ U8 XSize;
+ U8 XDist;
+ U8 BytesPerLine;
+} GUI_FONT_MONO;
+
+
+typedef struct GUI_FONT_INFO {
+ U16P First; /* first character */
+ U16P Last; /* last character */
+ const GUI_CHARINFO* paCharInfo; /* address of first character */
+ const struct GUI_FONT_INFO* pNext; /* pointer to next */
+} GUI_FONT_INFO;
+
+/*
+ ****************************************
+ * *
+ * FONT info structure *
+ * *
+ ****************************************
+
+This structure is used when retrieving information about a font.
+It is designed for future expansion without incompatibilities.
+*/
+typedef struct {
+ U16 Flags;
+ U8 Baseline;
+ U8 LHeight; /* height of a small lower case character (a,x) */
+ U8 CHeight; /* height of a small upper case character (A,X) */
+} GUI_FONTINFO;
+
+#define GUI_FONTINFO_FLAG_PROP (1<<0) /* Is proportional */
+#define GUI_FONTINFO_FLAG_MONO (1<<1) /* Is monospaced */
+#define GUI_FONTINFO_FLAG_AA (1<<2) /* Is an antialiased font */
+#define GUI_FONTINFO_FLAG_AA2 (1<<3) /* Is an antialiased font, 2bpp */
+#define GUI_FONTINFO_FLAG_AA4 (1<<4) /* Is an antialiased font, 4bpp */
+
+
+/**********************************************************************
+*
+* UNICODE Encoding
+*
+***********************************************************************
+*/
+typedef U16 tGUI_GetCharCode(const char GUI_UNI_PTR *s);
+typedef int tGUI_GetCharSize(const char GUI_UNI_PTR *s);
+typedef int tGUI_CalcSizeOfChar(U16 Char);
+typedef int tGUI_Encode(char *s, U16 Char);
+
+typedef struct {
+ tGUI_GetCharCode* pfGetCharCode;
+ tGUI_GetCharSize* pfGetCharSize;
+ tGUI_CalcSizeOfChar* pfCalcSizeOfChar;
+ tGUI_Encode* pfEncode;
+} GUI_UC_ENC_APILIST;
+
+/**********************************************************************
+*
+* FONT Encoding
+*
+***********************************************************************
+*/
+
+typedef int tGUI_GetLineDistX(const char GUI_UNI_PTR *s, int Len);
+typedef int tGUI_GetLineLen(const char GUI_UNI_PTR *s, int MaxLen);
+typedef void tGL_DispLine(const char GUI_UNI_PTR *s, int Len);
+
+typedef struct {
+ tGUI_GetLineDistX* pfGetLineDistX;
+ tGUI_GetLineLen* pfGetLineLen;
+ tGL_DispLine* pfDispLine;
+} tGUI_ENC_APIList;
+
+extern const tGUI_ENC_APIList GUI_ENC_APIList_SJIS;
+
+
+/*
+ ****************************************
+ * *
+ * FONT methods *
+ * *
+ ****************************************
+
+The parameter to the methods called pFont should be of type
+GUI_FONT, but unfortunately a lot of compilers can not handle
+forward declarations right ...
+So it ends up to be a void pointer.
+*/
+
+typedef struct GUI_FONT GUI_FONT;
+
+typedef void GUI_DISPCHAR(U16 c);
+typedef int GUI_GETCHARDISTX(U16P c);
+typedef void GUI_GETFONTINFO(const GUI_FONT GUI_UNI_PTR * pFont, GUI_FONTINFO * pfi);
+typedef char GUI_ISINFONT (const GUI_FONT GUI_UNI_PTR * pFont, U16 c);
+
+#define DECLARE_FONT(Type) \
+void GUI##Type##_DispChar (U16P c); \
+int GUI##Type##_GetCharDistX(U16P c); \
+void GUI##Type##_GetFontInfo (const GUI_FONT GUI_UNI_PTR * pFont, GUI_FONTINFO * pfi); \
+char GUI##Type##_IsInFont (const GUI_FONT GUI_UNI_PTR * pFont, U16 c)
+
+#if defined(__cplusplus)
+extern "C" { /* Make sure we have C-declarations in C++ programs */
+#endif
+
+/* MONO: Monospaced fonts */
+DECLARE_FONT(MONO);
+#define GUI_FONTTYPE_MONO \
+ GUIMONO_DispChar, \
+ GUIMONO_GetCharDistX, \
+ GUIMONO_GetFontInfo, \
+ GUIMONO_IsInFont, \
+ (tGUI_ENC_APIList*)0
+
+/* PROP: Proportional fonts */
+DECLARE_FONT(PROP);
+#define GUI_FONTTYPE_PROP \
+ GUIPROP_DispChar, \
+ GUIPROP_GetCharDistX, \
+ GUIPROP_GetFontInfo, \
+ GUIPROP_IsInFont, \
+ (tGUI_ENC_APIList*)0
+
+/* PROP: Proportional fonts SJIS */
+DECLARE_FONT(PROP);
+#define GUI_FONTTYPE_PROP_SJIS \
+ GUIPROP_DispChar, \
+ GUIPROP_GetCharDistX, \
+ GUIPROP_GetFontInfo, \
+ GUIPROP_IsInFont, \
+ &GUI_ENC_APIList_SJIS
+
+/* PROPAA: Proportional, antialiased fonts */
+DECLARE_FONT(PROPAA);
+#define GUI_FONTTYPE_PROPAA \
+ GUIPROPAA_DispChar, \
+ GUIPROPAA_GetCharDistX, \
+ GUIPROPAA_GetFontInfo, \
+ GUIPROPAA_IsInFont, \
+ (tGUI_ENC_APIList*)0
+
+/* PROPAA: Proportional, antialiased fonts, 2bpp */
+DECLARE_FONT(PROP_AA2);
+#define GUI_FONTTYPE_PROP_AA2 \
+ GUIPROP_AA2_DispChar, \
+ GUIPROP_AA2_GetCharDistX, \
+ GUIPROP_AA2_GetFontInfo, \
+ GUIPROP_AA2_IsInFont, \
+ (tGUI_ENC_APIList*)0
+
+/* PROPAA: Proportional, antialiased fonts, 2bpp, SJIS encoding */
+DECLARE_FONT(PROP_AA2);
+#define GUI_FONTTYPE_PROP_AA2_SJIS \
+ GUIPROP_AA2_DispChar, \
+ GUIPROP_AA2_GetCharDistX, \
+ GUIPROP_AA2_GetFontInfo, \
+ GUIPROP_AA2_IsInFont, \
+ GUI_ENCODE_SJIS
+
+/* PROPAA: Proportional, antialiased fonts, 4bpp */
+DECLARE_FONT(PROP_AA4);
+#define GUI_FONTTYPE_PROP_AA4 \
+ GUIPROP_AA4_DispChar, \
+ GUIPROP_AA4_GetCharDistX, \
+ GUIPROP_AA4_GetFontInfo, \
+ GUIPROP_AA4_IsInFont, \
+ (tGUI_ENC_APIList*)0
+
+/* PROPAA: Proportional, antialiased fonts, 4bpp, SJIS encoding */
+DECLARE_FONT(PROP_AA4);
+#define GUI_FONTTYPE_PROP_AA4_SJIS \
+ GUIPROP_AA4_DispChar, \
+ GUIPROP_AA4_GetCharDistX, \
+ GUIPROP_AA4_GetFontInfo, \
+ GUIPROP_AA4_IsInFont, \
+ GUI_ENCODE_SJIS
+
+#if defined(__cplusplus)
+ }
+#endif
+
+struct GUI_FONT {
+ GUI_DISPCHAR* pfDispChar;
+ GUI_GETCHARDISTX* pfGetCharDistX;
+ GUI_GETFONTINFO* pfGetFontInfo;
+ GUI_ISINFONT* pfIsInFont;
+ const tGUI_ENC_APIList* pafEncode;
+ U8 YSize;
+ U8 YDist;
+ char XMag;
+ char YMag;
+ union {
+ const void GUI_UNI_PTR * pFontData;
+ const GUI_FONT_MONO GUI_UNI_PTR * pMono;
+ const GUI_FONT_PROP GUI_UNI_PTR * pProp;
+ } p;
+ U8 Baseline;
+ U8 LHeight; /* height of a small lower case character (a,x) */
+ U8 CHeight; /* height of a small upper case character (A,X) */
+};
+
+/*********************************************************************
+*
+* Position independent font structures
+*/
+typedef struct {
+ U32 ID; /* Font file ID */
+ U16 YSize; /* Height of font */
+ U16 YDist; /* Space of font Y */
+ U16 Baseline; /* Index of baseline */
+ U16 LHeight; /* Height of a small lower case character (a) */
+ U16 CHeight; /* Height of a upper case character (A) */
+ U16 NumAreas; /* Number of character areas */
+} GUI_SI_FONT;
+
+typedef struct {
+ U16 First; /* Index of first character */
+ U16 Last; /* Index of last character */
+} GUI_SIF_CHAR_AREA;
+
+typedef struct {
+ U16 XSize; /* Size of bitmap data in X */
+ U16 XDist; /* Number of pixels for increment cursor in X */
+ U16 BytesPerLine; /* Number of bytes per line */
+ U16 Dummy;
+ U32 OffData; /* Offset of pixel data */
+} GUI_SIF_CHARINFO;
+
+typedef struct tGUI_SIF_APIList_struct {
+ GUI_DISPCHAR * pDispChar;
+ GUI_GETCHARDISTX * pGetCharDistX;
+ GUI_GETFONTINFO * pGetFontInfo;
+ GUI_ISINFONT * pIsInFont;
+} tGUI_SIF_APIList;
+
+#define GUI_SIF_TYPE tGUI_SIF_APIList
+#define GUI_SIF_TYPE_PROP &GUI_SIF_APIList_Prop
+
+extern const tGUI_SIF_APIList GUI_SIF_APIList_Prop;
+
+/*
+ *********************************
+ * *
+ * Typedefs *
+ * *
+ *********************************
+*/
+
+#ifndef GUI_HMEM
+ #define GUI_HMEM I16P
+#endif
+#define GUI_HMEM_NULL (0)
+typedef GUI_HMEM GUI_HWIN;
+#endif /* GUITYPE_H_INCLUDED */
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUIUC0.c b/User/system/lib/lcd/gui/Core/GUIUC0.c
new file mode 100644
index 0000000..87059c9
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUIUC0.c
@@ -0,0 +1,74 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUIUC0.C
+Purpose : Implementation of character and string services
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_UC2DB
+*
+* Purpose:
+* Convert Convert UNICODE 16-bit value into double byte version
+* - Byte0: First byte, msb
+* - Byte1: Last byte, lsb
+*/
+void GUI_UC2DB(U16 Code, U8* pOut) {
+/* move regular ASCII to (unused) 0xE000-0xE0ff area */
+ if (Code < 0x100) {
+ if (Code !=0) /* end marker ? */
+ Code += 0xe000;
+ } else {
+/* If Low byte 0: Move to (unused) 0xE100-0xE1ff area */
+ if ((Code&0xff) == 0) {
+ Code = (Code>>8) +0xe100;
+ }
+ }
+/* Convert into double byte, putting msb first*/
+ *pOut++ = Code >> 8; /* Save msb first */
+ *pOut = Code & 0xff;
+}
+
+/*********************************************************************
+*
+* GUI_DB2UC
+*
+* Purpose:
+* Convert Unicode double byte into UNICODE.
+* - Byte0: First byte, msb
+* - Byte1: Last byte, lsb
+*/
+U16 GUI_DB2UC(U8 Byte0, U8 Byte1) {
+ if (Byte0==0)
+ return 0;
+ if ((Byte0&0xfe) == 0xe0) {
+ if (Byte0 == 0xe0) /* ASCII */
+ return Byte1;
+ return ((U16)Byte1)<<8; /* low byte was zero */
+ }
+ return Byte1 | (((U16)Byte0)<<8);
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUIVal.c b/User/system/lib/lcd/gui/Core/GUIVal.c
new file mode 100644
index 0000000..b845481
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUIVal.c
@@ -0,0 +1,111 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUIVAL.C
+Purpose : Routines to display values as dec, binary or hex
+----------------------------------------------------------------------
+*/
+
+#include "GUI_Protected.h"
+#include "GUIDebug.h"
+#include "string.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_DispDecShift
+*/
+void GUI_DispDecShift(I32 v, U8 Len, U8 Shift) {
+ char ac[12];
+ char* s = ac;
+ GUI_AddDecShift(v, Len, Shift, &s);
+ GUI_DispString(ac);
+}
+
+/*********************************************************************
+*
+* GUI_DispSDecShift
+*/
+void GUI_DispSDecShift(I32 v, U8 Len, U8 Shift) {
+ char ac[12];
+ char* s = ac;
+ v = GUI_AddSign(v, &s);
+ GUI_AddDecShift(v, --Len, Shift, &s);
+ GUI_DispString(ac);
+}
+
+/*********************************************************************
+*
+* GUI_DispDecMin
+*/
+void GUI_DispDecMin(I32 v) {
+ char ac[12];
+ char* s = ac;
+ GUI_AddDecMin(v, &s);
+ GUI_DispString(ac);
+}
+
+/*********************************************************************
+*
+* GUI_DispDecSpace
+*/
+void GUI_DispDecSpace(I32 v, U8 MaxDigits) {
+ char ac[12];
+ char* s = ac;
+ U8 Len;
+ if (v < 0) {
+ v = GUI_AddSign(v, &s);
+ MaxDigits--;
+ }
+ Len = GUI_Long2Len(v);
+ while (Len++ < MaxDigits) {
+ *s++ = ' ';
+ }
+ GUI_AddDecMin(v, &s);
+ GUI_DispString(ac);
+}
+
+/*********************************************************************
+*
+* GUI_DispSDec
+*/
+void GUI_DispSDec(I32 v, U8 Len) {
+ GUI_DispSDecShift(v,Len,0);
+}
+
+/*********************************************************************
+*
+* GUI_DispDec
+*/
+void GUI_DispDec(I32 v, U8 Len) {
+ GUI_DispDecShift(v, Len,0);
+}
+
+/*********************************************************************
+*
+* GUI_DispDecAt
+*/
+void GUI_DispDecAt(I32 v, I16P x, I16P y, U8 Len) {
+ char ac[12];
+ char* s = ac;
+ GUI_AddDecShift(v, Len, 0, &s);
+ GUI_DispStringAt(ac, x, y);
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUIValf.c b/User/system/lib/lcd/gui/Core/GUIValf.c
new file mode 100644
index 0000000..9e714f6
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUIValf.c
@@ -0,0 +1,110 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUIValF.C
+Purpose : Displaying floating point values
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+#include "math.h"
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _DispFloatFix
+*/
+static void _DispFloatFix(float f, char Len, char Decs, int DrawPlusSign) {
+ f *= GUI_Pow10[(unsigned)Decs];
+ f += 0.5f;
+ f = (float) floor (f);
+ if (DrawPlusSign) {
+ GUI_DispSDecShift((long)f, Len, Decs);
+ } else {
+ GUI_DispDecShift((long)f, Len, Decs);
+ }
+}
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_DispFloatFix
+*/
+void GUI_DispFloatFix(float f, char Len, char Decs) {
+ _DispFloatFix(f, Len, Decs, 0);
+}
+
+/*********************************************************************
+*
+* GUI_DispFloatMin
+*/
+void GUI_DispFloatMin(float f, char Fract) {
+ char Len;
+ Len = GUI_Long2Len((long)f);
+ if ((f < 0) && (f > -1)) { /* If value < 0 and > -1 (e.g. -0.123) increment length by 1 */
+ Len++;
+ }
+ _DispFloatFix(f, (char)(Len + Fract + (Fract ? 1 : 0)), (char)Fract, 0);
+}
+
+/*********************************************************************
+*
+* GUI_DispFloat
+*/
+void GUI_DispFloat(float f, char Len) {
+ int Decs;
+ Decs = Len - GUI_Long2Len((long)f)-1;
+ if ((f < 0) && (f > -1)) { /* If value < 0 and > -1 (e.g. -0.123) decrement Decs */
+ Decs--;
+ }
+ if (Decs<0)
+ Decs =0;
+ _DispFloatFix(f, Len, (char)Decs, 0);
+}
+
+/*********************************************************************
+*
+* GUI_DispSFloatFix
+*/
+void GUI_DispSFloatFix(float f, char Len, char Fract) {
+ _DispFloatFix (f, Len, Fract, 1);
+}
+
+/*********************************************************************
+*
+* GUI_DispSFloatMin
+*/
+void GUI_DispSFloatMin(float f, char Fract) {
+ char Len;
+ Len = GUI_Long2Len((long)f);
+ if ((f < 0) && (f > -1)) { /* If value < 0 and > -1 (e.g. -0.123) increment length by 1 */
+ Len++;
+ }
+ if (f>0) {
+ Len++;
+ }
+ _DispFloatFix(f, (char)(Len + Fract + (Fract ? 1 : 0)), (char)Fract, 1);
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUIVersion.h b/User/system/lib/lcd/gui/Core/GUIVersion.h
new file mode 100644
index 0000000..bb3fa3b
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUIVersion.h
@@ -0,0 +1,27 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUIVersion.h
+Purpose : Include file defining current GUI version
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#ifndef GUI_VERSION_H
+#define GUI_VERSION_H
+
+#define GUI_VERSION 39001
+
+#endif /* Avoid multiple inclusion */
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_ALLOC_AllocInit.c b/User/system/lib/lcd/gui/Core/GUI_ALLOC_AllocInit.c
new file mode 100644
index 0000000..5f44ff4
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_ALLOC_AllocInit.c
@@ -0,0 +1,61 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUIAlloc.C
+Purpose : Dynamic memory management
+----------------------------------------------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include /* for memcpy, memset */
+
+#include "GUI_Protected.h"
+#include "GUIDebug.h"
+
+/*********************************************************************
+*
+* Internal memory management
+*
+**********************************************************************
+*/
+
+/*********************************************************************
+*
+* GUI_ALLOC_AllocInit
+*
+* Purpose:
+* Alloc memory block of the given size and initialize from the given pointer.
+* If the pointer is a NULL pointer, zeroinit
+*/
+GUI_HMEM GUI_ALLOC_AllocInit(const void *pInitData, GUI_ALLOC_DATATYPE Size) {
+ GUI_HMEM hMem;
+ GUI_LOCK();
+ if (Size == 0) {
+ return (GUI_HMEM)0;
+ }
+ hMem = GUI_ALLOC_AllocNoInit(Size);
+ if (hMem) {
+ void *pMem;
+ pMem = GUI_ALLOC_h2p(hMem);
+ if (pInitData) {
+ memcpy(pMem, pInitData, Size);
+ } else {
+ GUI_MEMSET((U8*)pMem, 0, Size);
+ }
+ }
+ GUI_UNLOCK();
+ return hMem;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_ALLOC_AllocZero.c b/User/system/lib/lcd/gui/Core/GUI_ALLOC_AllocZero.c
new file mode 100644
index 0000000..69bc100
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_ALLOC_AllocZero.c
@@ -0,0 +1,49 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUIAlloc.C
+Purpose : Dynamic memory management
+----------------------------------------------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include /* for memcpy, memset */
+
+#include "GUI_Protected.h"
+#include "GUIDebug.h"
+
+/*********************************************************************
+*
+* Internal memory management
+*
+**********************************************************************
+*/
+
+/*********************************************************************
+*
+* GUI_ALLOC_AllocZero
+*/
+GUI_HMEM GUI_ALLOC_AllocZero(GUI_ALLOC_DATATYPE Size) {
+ GUI_HMEM hMem;
+ GUI_LOCK();
+ GUI_DEBUG_LOG2("\nGUI_ALLOC_Alloc... requesting %d, %d avail", Size, GUI_ALLOC_GetMaxSize());
+ hMem = GUI_ALLOC_AllocNoInit(Size);
+ if (hMem) {
+ GUI_MEMSET((U8*)GUI_ALLOC_h2p(hMem), 0, Size); /* Zeroinit ! */
+ }
+ GUI_UNLOCK();
+ return hMem;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_AddBin.c b/User/system/lib/lcd/gui/Core/GUI_AddBin.c
new file mode 100644
index 0000000..6159e7e
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_AddBin.c
@@ -0,0 +1,49 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_AddBin.c
+Purpose : Converts binary value 2 string
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+#include "GUIDebug.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_AddBin
+*/
+void GUI_AddBin(U32 v, U8 Len, char** ps) {
+ char *s = *ps;
+#if GUI_DEBUG_LEVEL >1
+ if (Len > 32) {
+ GUI_DEBUG_WARN("Can not display more than 32 bin. digits");
+ Len = 32;
+ }
+#endif
+ (*ps) += Len;
+ **ps = '\0'; /* Make sure string is 0-terminated */
+ while(Len--) {
+ *(s + Len) = (char)('0' + (v & 1));
+ v >>= 1;
+ }
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_AddDec.c b/User/system/lib/lcd/gui/Core/GUI_AddDec.c
new file mode 100644
index 0000000..aecc5f5
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_AddDec.c
@@ -0,0 +1,38 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_AddDec.c
+Purpose : Routines to display values in decimal form
+----------------------------------------------------------------------
+*/
+
+#include "GUI_Protected.h"
+#include "GUIDebug.h"
+#include "string.h"
+
+/*********************************************************************
+*
+* Public routines
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_AddDec
+*/
+void GUI_AddDec(I32 v, U8 Len, char**ps) {
+ GUI_AddDecShift(v, Len, 0, ps);
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_AddDecMin.c b/User/system/lib/lcd/gui/Core/GUI_AddDecMin.c
new file mode 100644
index 0000000..81cf36a
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_AddDecMin.c
@@ -0,0 +1,39 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_AddDecMin.c
+Purpose : Routines to display values in decimal form
+----------------------------------------------------------------------
+*/
+
+#include "GUI_Protected.h"
+#include "GUIDebug.h"
+#include "string.h"
+
+/*********************************************************************
+*
+* Public routines
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_AddDecMin
+*/
+void GUI_AddDecMin(I32 v, char**ps) {
+ U8 Len = GUI_Long2Len(v);
+ GUI_AddDecShift(v, Len, 0, ps);
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_AddDecShift.c b/User/system/lib/lcd/gui/Core/GUI_AddDecShift.c
new file mode 100644
index 0000000..1471e96
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_AddDecShift.c
@@ -0,0 +1,137 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_AddDecShift.c
+Purpose : Routines to display values as dec
+----------------------------------------------------------------------
+*/
+
+#include "GUI_Protected.h"
+#include "GUIDebug.h"
+#include "string.h"
+
+/*********************************************************************
+*
+* Public data
+*
+**********************************************************************
+*/
+
+const U32 GUI_Pow10[10] = {
+ 1 , 10, 100, 1000, 10000,
+ 100000, 1000000, 10000000, 100000000, 1000000000
+};
+
+/*********************************************************************
+*
+* Static routines
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _Check_NegLong
+*/
+static int _Check_NegLong(I32 *pv, char**ps) {
+ if (*pv < 0) {
+ *(*ps)++ = '-';
+ *pv = -*pv;
+ return 1;
+ }
+ return 0;
+}
+
+/*********************************************************************
+*
+* Module internal routines
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_Long2Len
+*/
+int GUI_Long2Len(I32 vSign) {
+ int Len = 1;
+ I32 v = (vSign > 0) ? vSign : -vSign;
+ while (( ((U32)v) >= GUI_Pow10[Len]) && (Len < 9)) {
+ Len++;
+ }
+ if (vSign < 0) {
+ Len++;
+ }
+ return Len;
+}
+
+/*********************************************************************
+*
+* GUI_AddSign
+*/
+long GUI_AddSign(long v, char**ps) {
+ char c;
+ if (v < 0) {
+ c = '-';
+ v = -v;
+ } else {
+ c = '+';
+ }
+ *(*ps)++ = c;
+ **ps = '\0';
+ return v;
+}
+
+/*********************************************************************
+*
+* Public routines
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_AddDecShift
+*/
+void GUI_AddDecShift(I32 v, U8 Len, U8 Shift, char**ps) {
+ char c;
+ long d;
+ #ifndef _CM16C
+ Len -= _Check_NegLong(&v, ps); /* TASKING: Tool internal error S003: asertion failed - please report */
+ #else
+ if (v < 0) {
+ *(*ps)++ = '-';
+ v = -v;
+ }
+ #endif
+ if (Shift) {
+ Len--;
+ }
+#if GUI_DEBUG_LEVEL >1
+ if (Len > 9) {
+ Len = 9;
+ GUI_DEBUG_ERROROUT("Can not display more than 9 dec. digits");
+ }
+#endif
+ if ((U32)v >= GUI_Pow10[Len])
+ v = GUI_Pow10[Len] - 1;
+ while (Len) {
+ if (Len-- == Shift)
+ *(*ps)++ = GUI_DecChar;
+ d = GUI_Pow10[Len];
+ c = (char) (v / d);
+ v -= c * d;
+ *(*ps)++ = c + '0';
+ }
+ **ps = 0;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_AddHex.c b/User/system/lib/lcd/gui/Core/GUI_AddHex.c
new file mode 100644
index 0000000..90a54ab
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_AddHex.c
@@ -0,0 +1,54 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_AddHex.c
+Purpose : Converts hex value 2 string
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Static data
+*
+**********************************************************************
+*/
+
+static const char acHex[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_AddHex
+*/
+void GUI_AddHex(U32 v, U8 Len, char**ps) {
+ char *s = *ps;
+ if (Len > 8) {
+ return;
+ }
+ (*ps) += Len;
+ **ps = '\0'; /* Make sure string is 0-terminated */
+ while(Len--) {
+ *(s + Len) = acHex[v & 15];
+ v >>= 4;
+ }
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_AddKeyMsgHook.c b/User/system/lib/lcd/gui/Core/GUI_AddKeyMsgHook.c
new file mode 100644
index 0000000..57bef5d
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_AddKeyMsgHook.c
@@ -0,0 +1,40 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_SetKeyMsgHook.c
+Purpose : Implementation of GUI_SetKeyMsgHook
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+#include "GUIDebug.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_SetKeyMsgHook
+*/
+GUI_KEY_MSG_HOOK* GUI_SetKeyMsgHook(GUI_KEY_MSG_HOOK* pHook) {
+ GUI_KEY_MSG_HOOK* r;
+ r = GUI_pfKeyMsgHook;
+ GUI_pfKeyMsgHook = pHook;
+ return r;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_BMP.c b/User/system/lib/lcd/gui/Core/GUI_BMP.c
new file mode 100644
index 0000000..52a6852
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_BMP.c
@@ -0,0 +1,214 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_BMP.c
+Purpose : Implementation of GUI_BMP... functions
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+
+#include "GUI_Private.h"
+
+/*********************************************************************
+*
+* Static functions
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _GetStep
+*/
+static int _GetStep(int * pYSize, int * pY) {
+ if (*pYSize > 0) {
+ *pY = *pYSize - 1;
+ return -1;
+ } else if (*pYSize < 0) {
+ *pYSize = -*pYSize;
+ *pY = 0;
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+/*********************************************************************
+*
+* _DrawBitmap_Pal
+*/
+static int _DrawBitmap_Pal(const U8 * pData, int x0, int y0, int XSize, int YSize, int Bpp, int NumColors) {
+ int i, y, Step;
+ int BytesPerLine = 0;
+ Step = _GetStep(&YSize, &y);
+ if (!Step) {
+ return 1;
+ }
+ for (i = 0; i < NumColors; i++) {
+ U8 r, g, b;
+ b = *(pData);
+ g = *(pData + 1);
+ r = *(pData + 2);
+ pData += 4;
+ LCD__aConvTable[i] = LCD_Color2Index(((U32)b << 16) | (g << 8) | r);
+ }
+ switch (Bpp) {
+ case 1:
+ BytesPerLine = ((XSize + 31) >> 5) << 2;
+ break;
+ case 4:
+ BytesPerLine = (((XSize << 2) + 31) >> 5) << 2;
+ break;
+ case 8:
+ BytesPerLine = ((XSize + 3) >> 2) << 2;
+ break;
+ }
+ for (; (y < YSize) && (y >= 0); y += Step) {
+ LCD_DrawBitmap(x0, y0 + y, XSize, 1, 1, 1, Bpp, XSize, pData, LCD__aConvTable);
+ pData += BytesPerLine;
+ }
+ return 0;
+}
+
+/*********************************************************************
+*
+* _DrawBitmap_24bpp
+*/
+static int _DrawBitmap_24bpp(const U8 * pData, int x0, int y0, int XSize, int YSize) {
+ int x, y, BytesPerLine, Step;
+ Step = _GetStep(&YSize, &y);
+ if (!Step) {
+ return 1;
+ }
+ BytesPerLine = ((24 * XSize + 31) >> 5) << 2;
+ for (; (y < YSize) && (y >= 0); y += Step) {
+ for (x = 0; x < XSize; x++) {
+ const U8 * pColor = pData + 3 * x;
+ U8 r, g, b;
+ b = *(pColor);
+ g = *(pColor + 1);
+ r = *(pColor + 2);
+ LCD_SetPixelIndex(x0 + x, y0 + y, LCD_Color2Index(((U32)b << 16) | (g << 8) | r));
+ }
+ pData += BytesPerLine;
+ }
+ return 0;
+}
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_BMP_GetXSize
+*/
+int GUI_BMP_GetXSize(const void * pBMP) {
+ const U8 * pSrc = (const U8 *)pBMP;
+ if (!pBMP) {
+ return 0;
+ }
+ pSrc += 18; /* skip rest of BITMAPFILEHEADER */
+ return GUI__Read32(&pSrc);
+}
+
+/*********************************************************************
+*
+* GUI_BMP_GetYSize
+*/
+int GUI_BMP_GetYSize(const void * pBMP) {
+ const U8 * pSrc = (const U8 *)pBMP;
+ if (!pBMP) {
+ return 0;
+ }
+ pSrc += 22;
+ return labs((int)GUI__Read32(&pSrc));
+}
+
+/*********************************************************************
+*
+* GUI_BMP_Draw
+*/
+int GUI_BMP_Draw(const void * pBMP, int x0, int y0) {
+ #if (GUI_WINSUPPORT)
+ GUI_RECT r;
+ #endif
+ int Ret = 0;
+ I32 Width, Height;
+ U16 BitCount, Type;
+ U32 ClrUsed, Compression;
+ int NumColors;
+ const U8 * pSrc = (const U8 *)pBMP;
+ Type = GUI__Read16(&pSrc); /* get type from BITMAPFILEHEADER */
+ pSrc += 12; /* skip rest of BITMAPFILEHEADER */
+ /* get values from BITMAPINFOHEADER */
+ pSrc += 4;
+ Width = GUI__Read32(&pSrc);
+ Height = GUI__Read32(&pSrc);
+ pSrc += 2;
+ BitCount = GUI__Read16(&pSrc);
+ Compression = GUI__Read32(&pSrc);
+ pSrc += 12;
+ ClrUsed = GUI__Read32(&pSrc);
+ pSrc += 4;
+ /* calculate number of colors */
+ switch (BitCount) {
+ case 0: return 1; /* biBitCount = 0 (JPEG format) not supported. Please convert image ! */
+ case 1: NumColors = 2; break;
+ case 4: NumColors = 16; break;
+ case 8: NumColors = 256; break;
+ case 24: NumColors = 0; break;
+ default:
+ return 1; /* biBitCount should be 1, 4, 8 or 24 */
+ }
+ if (NumColors && ClrUsed) {
+ NumColors = ClrUsed;
+ }
+ /* check validity of bmp */
+ if ((NumColors > LCD_MAX_LOG_COLORS) ||
+ (Type != 0x4d42) || /* 'BM' */
+ (Compression) || /* only uncompressed bitmaps */
+ (Width > 1024) ||
+ (Height > 1024)) {
+ return 1;
+ }
+ /* start output */
+ GUI_LOCK();
+ #if (GUI_WINSUPPORT)
+ WM_ADDORG(x0,y0);
+ r.x1 = (r.x0 = x0) + Width - 1;
+ r.y1 = (r.y0 = y0) + Height - 1;
+ WM_ITERATE_START(&r) {
+ #endif
+ /* Show bitmap */
+ switch (BitCount) {
+ case 1:
+ case 4:
+ case 8:
+ Ret = _DrawBitmap_Pal(pSrc, x0, y0, Width, Height, BitCount, NumColors);
+ break;
+ case 24:
+ Ret = _DrawBitmap_24bpp(pSrc, x0, y0, Width, Height);
+ break;
+ }
+ #if (GUI_WINSUPPORT)
+ } WM_ITERATE_END();
+ #endif
+ GUI_UNLOCK();
+ return Ret;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_BMP_Serialize.c b/User/system/lib/lcd/gui/Core/GUI_BMP_Serialize.c
new file mode 100644
index 0000000..dc2824e
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_BMP_Serialize.c
@@ -0,0 +1,133 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_BMP_Serialize.c
+Purpose : Implementation of GUI_BMP_Serialize
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI.h"
+
+/*********************************************************************
+*
+* Defines
+*
+**********************************************************************
+*/
+
+#define DIB_HEADER_MARKER ((U16) ('M' << 8) | 'B') /* DIB Header Marker - used in writing DIBs to files */
+
+#define SIZEOF_BITMAPFILEHEADER 14
+#define SIZEOF_BITMAPINFOHEADER 40
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _SendU16
+*/
+static void _SendU16(GUI_CALLBACK_VOID_U8_P * pfSerialize, U16 Data, void * p) {
+ (*pfSerialize)((U8)Data, p);
+ (*pfSerialize)(Data >> 8, p);
+}
+
+/*********************************************************************
+*
+* _SendU32
+*/
+static void _SendU32(GUI_CALLBACK_VOID_U8_P * pfSerialize, U32 Data, void * p) {
+ _SendU16(pfSerialize, (U16)Data, p);
+ _SendU16(pfSerialize, Data >> 16, p);
+}
+
+/*********************************************************************
+*
+* Exported routines
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_BMP_SerializeEx
+*/
+void GUI_BMP_SerializeEx(GUI_CALLBACK_VOID_U8_P * pfSerialize, int x0, int y0, int xSize, int ySize, void * p) {
+ int x, y, i;
+ U32 BitmapOffset, FileSize;
+ int BPP = LCD_GetBitsPerPixel();
+ int BytesPerLine = ((BPP > 8) ? (2 * xSize + 2) : (xSize + 3)) & ~3;
+ int NumColors = (BPP > 8) ? 0 : (1 << BPP);
+ /* Write BITMAPFILEHEADER */
+ BitmapOffset = SIZEOF_BITMAPFILEHEADER
+ + SIZEOF_BITMAPINFOHEADER
+ + NumColors * 4;
+ FileSize = BitmapOffset
+ + ySize * BytesPerLine;
+ _SendU16(pfSerialize, DIB_HEADER_MARKER, p); /* bfType */
+ _SendU32(pfSerialize, FileSize, p); /* bfSize */
+ _SendU32(pfSerialize, 0, p); /* bfReserved1, bfReserved2 */
+ _SendU32(pfSerialize, BitmapOffset, p); /* bfOffBits */
+ /* Write BITMAPINFOHEADER */
+ _SendU32(pfSerialize, SIZEOF_BITMAPINFOHEADER, p); /* biSize */
+ _SendU32(pfSerialize, xSize, p); /* biWidth */
+ _SendU32(pfSerialize, ySize, p); /* biHeighth */
+ _SendU16(pfSerialize, 1, p); /* biPlanes */
+ _SendU16(pfSerialize, (BPP <= 8) ? 8 : 16, p); /* biBitCount */
+ _SendU32(pfSerialize, 0, p); /* biCompression */
+ _SendU32(pfSerialize, 0, p); /* biSizeImage */
+ _SendU32(pfSerialize, 0, p); /* biXPelsPerMeter */
+ _SendU32(pfSerialize, 0, p); /* biYPelsPerMeter */
+ _SendU32(pfSerialize, NumColors, p); /* biClrUsed */
+ _SendU32(pfSerialize, 0, p); /* biClrImportant */
+ /* Write palette */
+ for (i = 0; i < NumColors; i++) {
+ U32 Color;
+ Color = GUI_Index2Color(i);
+ Color = ((Color >> 16) & 255) | (Color & 0xff00) | ((Color & 0xff) << 16);
+ _SendU32(pfSerialize, Color, p);
+ }
+ /* Write pixels */
+ for (y = ySize - 1; y >= 0; y--) {
+ for (x = 0; x < xSize; x++) {
+ if (BPP <= 8) {
+ pfSerialize(LCD_GetPixelIndex(x0 + x, y0 + y), p);
+ } else {
+ U16 Color16;
+ U32 Color = LCD_GetPixelColor(x0 + x, y0 + y);
+ int b = ((Color >> 16) * 31 + 127) / 255;
+ int g = (((Color >> 8) & 255) * 31 + 127) / 255;
+ int r = ((Color & 255) * 31 + 127) / 255;
+ Color16 = (r << 10) | (g << 5) | b; /* 16 bpp Bitmaps in windows are 555: rrrrrgggggbbbbb */
+ _SendU16(pfSerialize, Color16, p);
+ }
+ }
+ /* Align pointer to next U32 */
+ for (i = BytesPerLine & 3; i > 0; i--) {
+ pfSerialize(0, p);
+ }
+ }
+}
+
+/*********************************************************************
+*
+* GUI_BMP_Serialize
+*/
+void GUI_BMP_Serialize(GUI_CALLBACK_VOID_U8_P * pfSerialize, void * p) {
+ GUI_BMP_SerializeEx(pfSerialize, 0, 0, LCD_GetXSize(), LCD_GetYSize(), p);
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_CalcColorDist.c b/User/system/lib/lcd/gui/Core/GUI_CalcColorDist.c
new file mode 100644
index 0000000..bc957dd
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_CalcColorDist.c
@@ -0,0 +1,81 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_CalcColorDist
+Purpose : Color conversion routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+#include "GUI.h"
+
+/*********************************************************************
+*
+* defines
+*
+**********************************************************************
+*/
+
+#if 1 /* Normaly calculate square values */
+
+ #define SQUARE(Dist) ((U16)Dist) * ((U16)Dist)
+
+#else
+
+ #define S(x) ((x)*(x))
+ #define SQUARES(Base) S(Base+0), S(Base+1), S(Base+2), S(Base+3), S(Base+4), S(Base+5), \
+ S(Base+6), S(Base+7), S(Base+8), S(Base+9), S(Base+10), S(Base+11), \
+ S(Base+12), S(Base+13), S(Base+14), S(Base+15)
+
+ static const U16 aSquare[] = {
+ SQUARES(0*16)
+ ,SQUARES(1*16), SQUARES(2*16), SQUARES(3*16)
+ ,SQUARES(4*16) ,SQUARES(5*16), SQUARES(6*16), SQUARES(7*16)
+ ,SQUARES(8*16) ,SQUARES(9*16), SQUARES(10*16),SQUARES(11*16)
+ ,SQUARES(12*16),SQUARES(13*16),SQUARES(14*16),SQUARES(15*16)
+ };
+
+ #define SQUARE(Dist) aSquare[Dist]
+
+#endif
+
+/*********************************************************************
+*
+* public code, color conversions for palette based displays
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_CalcColorDist
+*/
+U32 GUI_CalcColorDist (LCD_COLOR PalColor, LCD_COLOR Color) {
+/* This routine does not use abs() because we are optimizing for speed ! */
+ I16 Dist;
+ U32 Sum;
+ Dist = (PalColor&0xff) - (Color&0xff);
+ if (Dist < 0)
+ Dist = -Dist;
+ Sum = SQUARE(Dist);
+ Dist = ((PalColor>>8)&0xff) - ((Color>>8)&0xff);
+ if (Dist < 0)
+ Dist = -Dist;
+ Sum += SQUARE(Dist);
+ Dist = (PalColor>>16) - (Color>>16);
+ if (Dist < 0)
+ Dist = -Dist;
+ return Sum + SQUARE(Dist);
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_ClearRectEx.c b/User/system/lib/lcd/gui/Core/GUI_ClearRectEx.c
new file mode 100644
index 0000000..48d3410
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_ClearRectEx.c
@@ -0,0 +1,36 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_ClearRectEx.c
+Purpose : Implementation of said function
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_ClearRectEx
+*/
+void GUI_ClearRectEx(const GUI_RECT* pRect) {
+ GUI_ClearRect(pRect->x0, pRect->y0, pRect->x1, pRect->y1);
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_Color2VisColor.c b/User/system/lib/lcd/gui/Core/GUI_Color2VisColor.c
new file mode 100644
index 0000000..450dad8
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_Color2VisColor.c
@@ -0,0 +1,58 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_Color2VisColor.C
+Purpose : Implementation of GUI_Color2VisColor
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_Color2VisColor
+*/
+GUI_COLOR GUI_Color2VisColor(GUI_COLOR color) {
+ I16 Index;
+ GUI_COLOR r;
+ GUI_LOCK();
+ Index = LCD_Color2Index(color);
+ r = LCD_Index2Color(Index);
+ GUI_UNLOCK();
+ return r;
+}
+
+/*********************************************************************
+*
+* GUI_ColorIsAvailable
+*/
+char GUI_ColorIsAvailable(GUI_COLOR color) {
+ return (GUI_Color2VisColor(color) == color) ? 1 : 0;
+}
+
+/*********************************************************************
+*
+* GUI_CalcVisColorError
+*/
+U32 GUI_CalcVisColorError(GUI_COLOR color) {
+ return GUI_CalcColorDist(color, GUI_Color2VisColor(color));
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_ConfDefaults.h b/User/system/lib/lcd/gui/Core/GUI_ConfDefaults.h
new file mode 100644
index 0000000..19655c6
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_ConfDefaults.h
@@ -0,0 +1,155 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_ConfDefaults.h
+Purpose : Defaults for GUI config switches.
+---------------------------END-OF-HEADER------------------------------
+
+Attention : Do not modify this file ! If you do, you will not
+ be able do update to a later GUI version !
+
+*/
+
+#ifndef GUI_CONFDEFAULTS_H
+#define GUI_CONFDEFAULTS_H
+
+#include "GUIConf.h"
+
+/**********************************************************************
+*
+* Defaults for config switches
+*
+***********************************************************************
+*/
+
+/* Define "universal pointer". Normally, this is not needed (define will expand to nothing)
+ However, on some systems (AVR - IAR compiler) it can be necessary ( -> __generic),
+ since a default pointer can access RAM only, not the built-in Flash
+*/
+#ifndef GUI_UNI_PTR
+ #define GUI_UNI_PTR
+ #define GUI_UNI_PTR_USED 0
+#else
+ #define GUI_UNI_PTR_USED 1
+#endif
+
+/* Define const storage. Normally, this is not needed (define will expand to const)
+ However, on some systems (AVR - IAR compiler) it can be necessary ( -> __flash const),
+ since otherwise constants are copied into RAM
+*/
+#ifndef GUI_ALLOC_SIZE
+ #define GUI_ALLOC_SIZE 1000
+#endif
+
+#ifndef GUI_CONST_STORAGE
+ #define GUI_CONST_STORAGE const
+#endif
+
+#ifndef GUI_SUPPORT_TOUCH
+ #define GUI_SUPPORT_TOUCH 0
+#endif
+
+#ifndef GUI_SUPPORT_MOUSE
+ #define GUI_SUPPORT_MOUSE 0
+#endif
+
+#ifndef GUI_SUPPORT_MEMDEV
+ #define GUI_SUPPORT_MEMDEV 0
+#endif
+
+#ifndef GUI_SUPPORT_AA
+ #define GUI_SUPPORT_AA 0
+#endif
+
+#ifndef GUI_OS
+ #define GUI_OS 0
+#endif
+
+#ifndef GUI_SUPPORT_LARGE_BITMAPS
+ #if GUI_ALLOC_SIZE > 65535
+ #define GUI_SUPPORT_LARGE_BITMAPS 1
+ #else
+ #define GUI_SUPPORT_LARGE_BITMAPS 0
+ #endif
+#endif
+
+#ifndef GUI_COMPATIBLE_MODE
+ #define GUI_COMPATIBLE_MODE 1
+#endif
+
+#ifndef GUI_NUM_LAYERS
+ #define GUI_NUM_LAYERS 1
+#endif
+
+#ifndef GUI_SUPPORT_CURSOR
+ #define GUI_SUPPORT_CURSOR (GUI_SUPPORT_MOUSE | GUI_SUPPORT_TOUCH)
+#endif
+
+#ifndef GUI_SUPPORT_DEVICES
+ #ifdef __C51__ /* Keil C51 limitation ... Indirect function calls are limited */
+ #define GUI_SUPPORT_DEVICES 0
+ #else
+ #define GUI_SUPPORT_DEVICES (GUI_SUPPORT_MEMDEV | (GUI_NUM_LAYERS > 1))
+ #endif
+#endif
+
+/* Some compilers for very simple chips can not generate code for function pointers
+with parameters. In this case, we do not use function pointers, but limit the functionality slightly */
+#ifndef GUI_COMPILER_SUPPORTS_FP
+ #ifdef __C51__
+ #define GUI_COMPILER_SUPPORTS_FP 0
+ #else
+ #define GUI_COMPILER_SUPPORTS_FP 1
+ #endif
+#endif
+
+#ifndef GUI_SUPPORT_ROTATION
+ #if GUI_COMPILER_SUPPORTS_FP
+ #define GUI_SUPPORT_ROTATION 1
+ #else
+ #define GUI_SUPPORT_ROTATION 0
+ #endif
+#endif
+
+/* In order to avoid warnings for undefined parameters */
+#ifndef GUI_USE_PARA
+ #if defined (__BORLANDC__) || defined(NC30) || defined(NC308)
+ #define GUI_USE_PARA(para)
+ #else
+ #define GUI_USE_PARA(para) para=para;
+ #endif
+#endif
+
+/* Default for types */
+#ifndef GUI_TIMER_TIME
+ #define GUI_TIMER_TIME int /* default is to use 16 bits for 16 bit CPUs,
+ 32 bits on 32 bit CPUs for timing */
+#endif
+
+/* Types used for memory allocation */
+#if GUI_ALLOC_SIZE <32767
+ #define GUI_ALLOC_DATATYPE I16
+ #define GUI_ALLOC_DATATYPE_U U16
+#else
+ #define GUI_ALLOC_DATATYPE I32
+ #define GUI_ALLOC_DATATYPE_U U32
+#endif
+
+#ifndef GUI_MEMSET
+ #define GUI_MEMSET GUI__memset
+#endif
+
+
+#endif /* ifdef GUI_CONFDEFAULTS_H */
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorArrowL.c b/User/system/lib/lcd/gui/Core/GUI_CursorArrowL.c
new file mode 100644
index 0000000..546e047
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_CursorArrowL.c
@@ -0,0 +1,36 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_CursorArrowL.C
+Purpose : Defines the arrow cursor, large
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+#include "GUI_Protected.h"
+
+GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapArrowL = {
+ 18, /* XSize */
+ 30, /* YSize */
+ 5, /* BytesPerLine */
+ 2, /* BitsPerPixel */
+ GUI_Pixels_ArrowL, /* Pointer to picture data (indices) */
+ &GUI_CursorPal /* Pointer to palette */
+};
+
+GUI_CONST_STORAGE GUI_CURSOR GUI_CursorArrowL = {
+ &GUI_BitmapArrowL, 0, 0
+};
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorArrowLI.c b/User/system/lib/lcd/gui/Core/GUI_CursorArrowLI.c
new file mode 100644
index 0000000..1bf8e8b
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_CursorArrowLI.c
@@ -0,0 +1,36 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_CursorArrowLI.c
+Purpose : Defines the arrow cursor, large inverted
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+#include "GUI_Protected.h"
+
+GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapArrowLI = {
+ 18, /* XSize */
+ 30, /* YSize */
+ 5, /* BytesPerLine */
+ 2, /* BitsPerPixel */
+ GUI_Pixels_ArrowL, /* Pointer to picture data (indices) */
+ &GUI_CursorPalI /* Pointer to palette */
+};
+
+GUI_CONST_STORAGE GUI_CURSOR GUI_CursorArrowLI = {
+ &GUI_BitmapArrowLI, 0, 0
+};
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorArrowLPx.c b/User/system/lib/lcd/gui/Core/GUI_CursorArrowLPx.c
new file mode 100644
index 0000000..e4bc95b
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_CursorArrowLPx.c
@@ -0,0 +1,55 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_CursorArrowLPx.C
+Purpose : Defines the pixel offset of the arrow cursor, large
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+GUI_CONST_STORAGE unsigned char GUI_Pixels_ArrowL[150] = {
+ 0x40, 0x00, 0x00, 0x00, 0x00,
+ 0x50, 0x00, 0x00, 0x00, 0x00,
+ 0x64, 0x00, 0x00, 0x00, 0x00,
+ 0x69, 0x00, 0x00, 0x00, 0x00,
+ 0x6A, 0x40, 0x00, 0x00, 0x00,
+ 0x6A, 0x90, 0x00, 0x00, 0x00,
+ 0x6A, 0xA4, 0x00, 0x00, 0x00,
+ 0x6A, 0xA9, 0x00, 0x00, 0x00,
+ 0x6A, 0xAA, 0x40, 0x00, 0x00,
+ 0x6A, 0xAA, 0x90, 0x00, 0x00,
+ 0x6A, 0xAA, 0xA4, 0x00, 0x00,
+ 0x6A, 0xAA, 0xA9, 0x00, 0x00,
+ 0x6A, 0xAA, 0xAA, 0x40, 0x00,
+ 0x6A, 0xAA, 0xAA, 0x90, 0x00,
+ 0x6A, 0xAA, 0xAA, 0xA4, 0x00,
+ 0x6A, 0xAA, 0xAA, 0xA9, 0x00,
+ 0x6A, 0xAA, 0xAA, 0xAA, 0x40,
+ 0x6A, 0xAA, 0x95, 0x55, 0x50,
+ 0x6A, 0x9A, 0x90, 0x00, 0x00,
+ 0x6A, 0x46, 0xA4, 0x00, 0x00,
+ 0x69, 0x06, 0xA4, 0x00, 0x00,
+ 0x64, 0x01, 0xA9, 0x00, 0x00,
+ 0x50, 0x01, 0xA9, 0x00, 0x00,
+ 0x40, 0x00, 0x6A, 0x40, 0x00,
+ 0x00, 0x00, 0x6A, 0x40, 0x00,
+ 0x00, 0x00, 0x1A, 0x90, 0x00,
+ 0x00, 0x00, 0x1A, 0x90, 0x00,
+ 0x00, 0x00, 0x06, 0xA4, 0x00,
+ 0x00, 0x00, 0x06, 0xA4, 0x00,
+ 0x00, 0x00, 0x01, 0x50, 0x00
+};
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorArrowM.c b/User/system/lib/lcd/gui/Core/GUI_CursorArrowM.c
new file mode 100644
index 0000000..61a1c50
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_CursorArrowM.c
@@ -0,0 +1,36 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_CursorArrowM.C
+Purpose : Defines the arrow cursor, medium
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+#include "GUI_Protected.h"
+
+GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapArrowM = {
+ 12, /* XSize */
+ 20, /* YSize */
+ 3, /* BytesPerLine */
+ 2, /* BitsPerPixel */
+ GUI_Pixels_ArrowM, /* Pointer to picture data (indices) */
+ &GUI_CursorPal /* Pointer to palette */
+};
+
+GUI_CONST_STORAGE GUI_CURSOR GUI_CursorArrowM = {
+ &GUI_BitmapArrowM, 0, 0
+};
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorArrowMI.c b/User/system/lib/lcd/gui/Core/GUI_CursorArrowMI.c
new file mode 100644
index 0000000..db0c4bd
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_CursorArrowMI.c
@@ -0,0 +1,36 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_CursorArrowMI.C
+Purpose : Defines the arrow cursor, medium inverted
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+#include "GUI_Protected.h"
+
+GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapArrowMI = {
+ 12, /* XSize */
+ 20, /* YSize */
+ 3, /* BytesPerLine */
+ 2, /* BitsPerPixel */
+ GUI_Pixels_ArrowM, /* Pointer to picture data (indices) */
+ &GUI_CursorPalI /* Pointer to palette */
+};
+
+GUI_CONST_STORAGE GUI_CURSOR GUI_CursorArrowMI = {
+ &GUI_BitmapArrowMI, 0, 0
+};
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorArrowMPx.c b/User/system/lib/lcd/gui/Core/GUI_CursorArrowMPx.c
new file mode 100644
index 0000000..fb6d532
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_CursorArrowMPx.c
@@ -0,0 +1,45 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_CursorArrowMPx.C
+Purpose : Defines the pixel offset of the arrow cursor, medium
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+GUI_CONST_STORAGE unsigned char GUI_Pixels_ArrowM[60] = {
+ 0x40, 0x00, 0x00,
+ 0x50, 0x00, 0x00,
+ 0x64, 0x00, 0x00,
+ 0x69, 0x00, 0x00,
+ 0x6A, 0x40, 0x00,
+ 0x6A, 0x90, 0x00,
+ 0x6A, 0xA4, 0x00,
+ 0x6A, 0xA9, 0x00,
+ 0x6A, 0xAA, 0x40,
+ 0x6A, 0xAA, 0x90,
+ 0x6A, 0xAA, 0xA4,
+ 0x6A, 0xA9, 0x55,
+ 0x69, 0xA9, 0x00,
+ 0x64, 0x6A, 0x40,
+ 0x50, 0x6A, 0x40,
+ 0x40, 0x1A, 0x90,
+ 0x00, 0x1A, 0x90,
+ 0x00, 0x06, 0xA4,
+ 0x00, 0x06, 0xA4,
+ 0x00, 0x01, 0x50
+};
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorArrowS.c b/User/system/lib/lcd/gui/Core/GUI_CursorArrowS.c
new file mode 100644
index 0000000..0f7fb59
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_CursorArrowS.c
@@ -0,0 +1,36 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_CursorArrowS.C
+Purpose : Defines the arrow cursor, small
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+#include "GUI_Protected.h"
+
+GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapArrowS = {
+ 9, /* XSize */
+ 15, /* YSize */
+ 3, /* BytesPerLine */
+ 2, /* BitsPerPixel */
+ GUI_Pixels_ArrowS, /* Pointer to picture data (indices) */
+ &GUI_CursorPal /* Pointer to palette */
+};
+
+GUI_CONST_STORAGE GUI_CURSOR GUI_CursorArrowS = {
+ &GUI_BitmapArrowS, 0, 0
+};
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorArrowSI.c b/User/system/lib/lcd/gui/Core/GUI_CursorArrowSI.c
new file mode 100644
index 0000000..b7ccc9a
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_CursorArrowSI.c
@@ -0,0 +1,36 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_CursorArrowSI.c
+Purpose : Defines the arrow cursor, small inverted
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+#include "GUI_Protected.h"
+
+GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapArrowSI = {
+ 9, /* XSize */
+ 15, /* YSize */
+ 3, /* BytesPerLine */
+ 2, /* BitsPerPixel */
+ GUI_Pixels_ArrowS, /* Pointer to picture data (indices) */
+ &GUI_CursorPalI /* Pointer to palette */
+};
+
+GUI_CONST_STORAGE GUI_CURSOR GUI_CursorArrowSI = {
+ &GUI_BitmapArrowSI, 0, 0
+};
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorArrowSPx.c b/User/system/lib/lcd/gui/Core/GUI_CursorArrowSPx.c
new file mode 100644
index 0000000..ad36d77
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_CursorArrowSPx.c
@@ -0,0 +1,39 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_CursorArrowSPx.C
+Purpose : Defines the pixel offset of the arrow cursor, small
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+GUI_CONST_STORAGE unsigned char GUI_Pixels_ArrowS[45] = {
+ 0x40, 0x00, 0x00,
+ 0x50, 0x00, 0x00,
+ 0x64, 0x00, 0x00,
+ 0x69, 0x00, 0x00,
+ 0x6A, 0x40, 0x00,
+ 0x6A, 0x90, 0x00,
+ 0x6A, 0xA4, 0x00,
+ 0x6A, 0xA9, 0x00,
+ 0x6A, 0x95, 0x40,
+ 0x66, 0x90, 0x00,
+ 0x51, 0xA4, 0x00,
+ 0x41, 0xA4, 0x00,
+ 0x00, 0x69, 0x00,
+ 0x00, 0x69, 0x00,
+ 0x00, 0x14, 0x00
+};
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorCrossL.c b/User/system/lib/lcd/gui/Core/GUI_CursorCrossL.c
new file mode 100644
index 0000000..179e2fa
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_CursorCrossL.c
@@ -0,0 +1,38 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_CursorCrossL.c
+Purpose : Defines the cross cursor, large
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+#include "GUI_Protected.h"
+
+GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapCrossL = {
+ 31, /* XSize */
+ 31, /* YSize */
+ 8, /* BytesPerLine */
+ 2, /* BitsPerPixel */
+ GUI_Pixels_CrossL, /* Pointer to picture data (indices) */
+ &GUI_CursorPal /* Pointer to palette */
+};
+
+
+GUI_CONST_STORAGE GUI_CURSOR GUI_CursorCrossL = {
+ &GUI_BitmapCrossL, 15, 15
+};
+
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorCrossLI.c b/User/system/lib/lcd/gui/Core/GUI_CursorCrossLI.c
new file mode 100644
index 0000000..26c75be
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_CursorCrossLI.c
@@ -0,0 +1,38 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_CursorCrossLI.c
+Purpose : Defines the cross cursor, large
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+#include "GUI_Protected.h"
+
+GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapCrossLI = {
+ 31, /* XSize */
+ 31, /* YSize */
+ 8, /* BytesPerLine */
+ 2, /* BitsPerPixel */
+ GUI_Pixels_CrossL, /* Pointer to picture data (indices) */
+ &GUI_CursorPalI /* Pointer to palette */
+};
+
+
+GUI_CONST_STORAGE GUI_CURSOR GUI_CursorCrossLI = {
+ &GUI_BitmapCrossLI, 15, 15
+};
+
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorCrossLPx.c b/User/system/lib/lcd/gui/Core/GUI_CursorCrossLPx.c
new file mode 100644
index 0000000..c80feaa
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_CursorCrossLPx.c
@@ -0,0 +1,57 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_CursorCrossLPx.C
+Purpose : Defines the pixel offset of the cross cursor, large
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+#include "GUI_Protected.h"
+
+GUI_CONST_STORAGE unsigned char GUI_Pixels_CrossL[248] = {
+ 0x00, 0x00, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00,
+ 0x55, 0x55, 0x55, 0x56, 0x55, 0x55, 0x55, 0x54,
+ 0x6A, 0xAA, 0xAA, 0xA9, 0xAA, 0xAA, 0xAA, 0xA4,
+ 0x55, 0x55, 0x55, 0x56, 0x55, 0x55, 0x55, 0x54,
+ 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x06, 0x40, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x05, 0x40, 0x00, 0x00, 0x00
+};
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorCrossM.c b/User/system/lib/lcd/gui/Core/GUI_CursorCrossM.c
new file mode 100644
index 0000000..0f89417
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_CursorCrossM.c
@@ -0,0 +1,38 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_CursorCrossM.C
+Purpose : Defines the cross cursor, medium
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+#include "GUI_Protected.h"
+
+GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapCrossM = {
+ 21, /* XSize */
+ 21, /* YSize */
+ 6, /* BytesPerLine */
+ 2, /* BitsPerPixel */
+ GUI_Pixels_CrossM, /* Pointer to picture data (indices) */
+ &GUI_CursorPal /* Pointer to palette */
+};
+
+
+GUI_CONST_STORAGE GUI_CURSOR GUI_CursorCrossM = {
+ &GUI_BitmapCrossM, 10, 10
+};
+
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorCrossMI.c b/User/system/lib/lcd/gui/Core/GUI_CursorCrossMI.c
new file mode 100644
index 0000000..f8979e3
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_CursorCrossMI.c
@@ -0,0 +1,38 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_CursorCrossMI.c
+Purpose : Defines the cross cursor, medium
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+#include "GUI_Protected.h"
+
+GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapCrossMI = {
+ 21, /* XSize */
+ 21, /* YSize */
+ 6, /* BytesPerLine */
+ 2, /* BitsPerPixel */
+ GUI_Pixels_CrossM, /* Pointer to picture data (indices) */
+ &GUI_CursorPalI /* Pointer to palette */
+};
+
+
+GUI_CONST_STORAGE GUI_CURSOR GUI_CursorCrossMI = {
+ &GUI_BitmapCrossMI, 10, 10
+};
+
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorCrossMPx.c b/User/system/lib/lcd/gui/Core/GUI_CursorCrossMPx.c
new file mode 100644
index 0000000..aca8897
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_CursorCrossMPx.c
@@ -0,0 +1,47 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_CursorCrossMPx.C
+Purpose : Defines the pixel offset of the cross cursor, large
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+#include "GUI_Protected.h"
+
+GUI_CONST_STORAGE unsigned char GUI_Pixels_CrossM[126] = {
+ 0x00, 0x00, 0x15, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
+ 0x55, 0x55, 0x59, 0x55, 0x55, 0x40,
+ 0x6A, 0xAA, 0xA6, 0xAA, 0xAA, 0x40,
+ 0x55, 0x55, 0x59, 0x55, 0x55, 0x40,
+ 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x19, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x15, 0x00, 0x00, 0x00
+};
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorCrossS.c b/User/system/lib/lcd/gui/Core/GUI_CursorCrossS.c
new file mode 100644
index 0000000..b5f2867
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_CursorCrossS.c
@@ -0,0 +1,39 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_CursorCrossS.C
+Purpose : Defines the cross cursor, small
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+#include "GUI_Protected.h"
+
+GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapCrossS = {
+ 11, /* XSize */
+ 11, /* YSize */
+ 3, /* BytesPerLine */
+ 2, /* BitsPerPixel */
+ GUI_Pixels_CrossS, /* Pointer to picture data (indices) */
+ &GUI_CursorPal /* Pointer to palette */
+};
+
+
+GUI_CONST_STORAGE GUI_CURSOR GUI_CursorCrossS = {
+ &GUI_BitmapCrossS, 5, 5
+};
+
+
+/*************************** End of file ****************************/
+
diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorCrossSI.c b/User/system/lib/lcd/gui/Core/GUI_CursorCrossSI.c
new file mode 100644
index 0000000..2cb8b34
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_CursorCrossSI.c
@@ -0,0 +1,38 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_CursorCrossSI.c
+Purpose : Defines the cross cursor, small inverted
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+#include "GUI_Protected.h"
+
+GUI_CONST_STORAGE GUI_BITMAP GUI_BitmapCrossSI = {
+ 11, /* XSize */
+ 11, /* YSize */
+ 3, /* BytesPerLine */
+ 2, /* BitsPerPixel */
+ GUI_Pixels_CrossS, /* Pointer to picture data (indices) */
+ &GUI_CursorPalI /* Pointer to palette */
+};
+
+
+GUI_CONST_STORAGE GUI_CURSOR GUI_CursorCrossSI = {
+ &GUI_BitmapCrossSI, 5, 5
+};
+
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorCrossSPx.c b/User/system/lib/lcd/gui/Core/GUI_CursorCrossSPx.c
new file mode 100644
index 0000000..660db8a
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_CursorCrossSPx.c
@@ -0,0 +1,37 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_CursorCrossSPx.C
+Purpose : Defines the pixel offset of the cross cursor, small
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+#include "GUI_Protected.h"
+
+GUI_CONST_STORAGE unsigned char GUI_Pixels_CrossS[33] = {
+ 0x00, 0x54, 0x00,
+ 0x00, 0x64, 0x00,
+ 0x00, 0x64, 0x00,
+ 0x00, 0x64, 0x00,
+ 0x55, 0x65, 0x54,
+ 0x6A, 0x9A, 0xA4,
+ 0x55, 0x65, 0x54,
+ 0x00, 0x64, 0x00,
+ 0x00, 0x64, 0x00,
+ 0x00, 0x64, 0x00,
+ 0x00, 0x54, 0x00
+};
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorHeaderM.c b/User/system/lib/lcd/gui/Core/GUI_CursorHeaderM.c
new file mode 100644
index 0000000..438a0ea
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_CursorHeaderM.c
@@ -0,0 +1,49 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_CursorHeaderM.c
+Purpose : Defines the header cursor, medium size
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* static data, cursor bitmap
+*
+**********************************************************************
+*/
+
+static GUI_CONST_STORAGE GUI_BITMAP _BitmapHeaderM = {
+ 17, /* XSize */
+ 17, /* YSize */
+ 5, /* BytesPerLine */
+ 2, /* BitsPerPixel */
+ GUI_PixelsHeaderM, /* Pointer to picture data (indices) */
+ &GUI_CursorPal /* Pointer to palette */
+};
+
+
+/*********************************************************************
+*
+* Public data
+*
+**********************************************************************
+*/
+GUI_CONST_STORAGE GUI_CURSOR GUI_CursorHeaderM = {
+ &_BitmapHeaderM, 8, 8
+};
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorHeaderMI.c b/User/system/lib/lcd/gui/Core/GUI_CursorHeaderMI.c
new file mode 100644
index 0000000..77bb62b
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_CursorHeaderMI.c
@@ -0,0 +1,49 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_CursorHeaderMI.c
+Purpose : Defines the header cursor, medium size, invers
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* static data, cursor bitmap
+*
+**********************************************************************
+*/
+
+static GUI_CONST_STORAGE GUI_BITMAP _Bitmap = {
+ 17, /* XSize */
+ 17, /* YSize */
+ 5, /* BytesPerLine */
+ 2, /* BitsPerPixel */
+ GUI_PixelsHeaderM, /* Pointer to picture data (indices) */
+ &GUI_CursorPalI /* Pointer to palette */
+};
+
+
+/*********************************************************************
+*
+* Public data
+*
+**********************************************************************
+*/
+GUI_CONST_STORAGE GUI_CURSOR GUI_CursorHeaderMI = {
+ &_Bitmap, 8, 8
+};
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorHeaderMPx.c b/User/system/lib/lcd/gui/Core/GUI_CursorHeaderMPx.c
new file mode 100644
index 0000000..2bf796b
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_CursorHeaderMPx.c
@@ -0,0 +1,49 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_CursorHeaderMPx.c
+Purpose : Defines the pixels of the header cursor, medium
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public (internal) data
+*
+**********************************************************************
+*/
+
+GUI_CONST_STORAGE unsigned char GUI_PixelsHeaderM[5 * 17] = {
+ 0x00, 0x01, 0x90, 0x00, 0x00,
+ 0x00, 0x01, 0x90, 0x00, 0x00,
+ 0x00, 0x01, 0x90, 0x00, 0x00,
+ 0x00, 0x01, 0x90, 0x00, 0x00,
+ 0x00, 0x01, 0x90, 0x00, 0x00,
+ 0x00, 0x01, 0x90, 0x00, 0x00,
+ 0x04, 0x01, 0x90, 0x04, 0x00,
+ 0x19, 0x55, 0x95, 0x59, 0x00,
+ 0x6a, 0xaa, 0xaa, 0xaa, 0x40,
+ 0x19, 0x55, 0x95, 0x59, 0x00,
+ 0x04, 0x01, 0x90, 0x04, 0x00,
+ 0x00, 0x01, 0x90, 0x00, 0x00,
+ 0x00, 0x01, 0x90, 0x00, 0x00,
+ 0x00, 0x01, 0x90, 0x00, 0x00,
+ 0x00, 0x01, 0x90, 0x00, 0x00,
+ 0x00, 0x01, 0x90, 0x00, 0x00,
+ 0x00, 0x01, 0x90, 0x00, 0x00,
+};
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorPal.c b/User/system/lib/lcd/gui/Core/GUI_CursorPal.c
new file mode 100644
index 0000000..6614c6f
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_CursorPal.c
@@ -0,0 +1,40 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_CursorPal.C
+Purpose : Defines the colors for most cursors
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Static data
+*
+**********************************************************************
+*/
+
+static GUI_CONST_STORAGE GUI_COLOR _aColor[] = {
+ 0x0000FF, 0x000000, 0xFFFFFF
+};
+
+GUI_CONST_STORAGE GUI_LOGPALETTE GUI_CursorPal = {
+ 3, /* number of entries */
+ 1, /* Has transparency */
+ &_aColor[0]
+};
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_CursorPalI.c b/User/system/lib/lcd/gui/Core/GUI_CursorPalI.c
new file mode 100644
index 0000000..b499ada
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_CursorPalI.c
@@ -0,0 +1,40 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_CursorPalI.C
+Purpose : Defines the colors for most inverted cursors
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Static data
+*
+**********************************************************************
+*/
+
+static GUI_CONST_STORAGE GUI_COLOR _aColor[] = {
+ 0x0000FF, 0xFFFFFF, 0x000000
+};
+
+GUI_CONST_STORAGE GUI_LOGPALETTE GUI_CursorPalI = {
+ 3, /* number of entries */
+ 1, /* Has transparency */
+ &_aColor[0]
+};
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_DispBin.c b/User/system/lib/lcd/gui/Core/GUI_DispBin.c
new file mode 100644
index 0000000..ec57ff7
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_DispBin.c
@@ -0,0 +1,52 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_DispBin.c
+Purpose : Routines to display values as binary
+----------------------------------------------------------------------
+*/
+
+#include "GUI_Protected.h"
+#include "GUIDebug.h"
+#include "string.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_DispBin
+*/
+void GUI_DispBin(U32 v, U8 Len) {
+ char ac[33];
+ char* s = ac;
+ GUI_AddBin(v, Len, &s);
+ GUI_DispString(ac);
+}
+
+/*********************************************************************
+*
+* GUI_DispBinAt
+*/
+void GUI_DispBinAt(U32 v, I16P x, I16P y, U8 Len) {
+ char ac[33];
+ char* s = ac;
+ GUI_AddBin(v, Len, &s);
+ GUI_DispStringAt(ac, x, y);
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_DispCEOL.c b/User/system/lib/lcd/gui/Core/GUI_DispCEOL.c
new file mode 100644
index 0000000..c316302
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_DispCEOL.c
@@ -0,0 +1,40 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_DispBin.c
+Purpose : Routines to display values as binary
+----------------------------------------------------------------------
+*/
+
+#include "GUI_Protected.h"
+#include "GUIDebug.h"
+#include "string.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_DispCEOL
+*/
+void GUI_DispCEOL(void) {
+ int y = GUI_Context.DispPosY - GUI_GetYAdjust();
+ GUI_ClearRect(GUI_Context.DispPosX, y, 4000, /* Max pos x */
+ y + GUI_Context.pAFont->YDist - 1);
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_DispChar.c b/User/system/lib/lcd/gui/Core/GUI_DispChar.c
new file mode 100644
index 0000000..6eb2914
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_DispChar.c
@@ -0,0 +1,84 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_DispChar.c
+Purpose : Implementation of optional routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* CL_DispChar
+*/
+#if (GUI_WINSUPPORT)
+static void CL_DispChar(U16 c) {
+ GUI_RECT r;
+ WM_ADDORG(GUI_Context.DispPosX, GUI_Context.DispPosY);
+ r.x1 = (r.x0 = GUI_Context.DispPosX) + GUI_GetCharDistX(c) - 1;
+ r.y1 = (r.y0 = GUI_Context.DispPosY) + GUI_GetFontSizeY() - 1;
+ WM_ITERATE_START(&r) {
+ GL_DispChar(c);
+ } WM_ITERATE_END();
+ if (c != '\n') {
+ GUI_Context.DispPosX = r.x1 + 1;
+ }
+ WM_SUBORG(GUI_Context.DispPosX, GUI_Context.DispPosY);
+}
+#endif
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_DispChar
+*/
+void GUI_DispChar(U16 c) {
+ GUI_LOCK();
+ #if (GUI_WINSUPPORT)
+ CL_DispChar(c);
+ #else
+ GL_DispChar(c);
+ #endif
+ GUI_UNLOCK();
+}
+
+/*********************************************************************
+*
+* GUI_DispCharAt
+*/
+void GUI_DispCharAt(U16 c, I16P x, I16P y) {
+ GUI_LOCK();
+ GUI_Context.DispPosX = x;
+ GUI_Context.DispPosY = y;
+ #if (GUI_WINSUPPORT)
+ CL_DispChar(c);
+ #else
+ GL_DispChar(c);
+ #endif
+ GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_DispChars.c b/User/system/lib/lcd/gui/Core/GUI_DispChars.c
new file mode 100644
index 0000000..866fdc7
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_DispChars.c
@@ -0,0 +1,38 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_DispChars.c
+Purpose : Implementation of optional routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_DispChars
+*/
+void GUI_DispChars(U16P c, int NumChars) {
+ while (--NumChars >= 0) {
+ GUI_DispChar(c);
+ }
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_DispHex.c b/User/system/lib/lcd/gui/Core/GUI_DispHex.c
new file mode 100644
index 0000000..b7f75a6
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_DispHex.c
@@ -0,0 +1,52 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_DispHex.C
+Purpose : Routines to display hex
+----------------------------------------------------------------------
+*/
+
+#include "GUI_Protected.h"
+#include "GUIDebug.h"
+
+/*********************************************************************
+*
+* Public routines
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_DispHex
+*/
+void GUI_DispHex(U32 v, U8 Len) {
+ char ac[9];
+ char* s = ac;
+ GUI_AddHex(v, Len, &s);
+ GUI_DispString(ac);
+}
+
+/*********************************************************************
+*
+* GUI_DispHexAt
+*/
+void GUI_DispHexAt(U32 v, I16P x, I16P y, U8 Len) {
+ char ac[9];
+ char* s = ac;
+ GUI_AddHex(v, Len, &s);
+ GUI_DispStringAt(ac, x, y);
+}
+
+/*************************** End of file ****************************/
+
diff --git a/User/system/lib/lcd/gui/Core/GUI_DispString.c b/User/system/lib/lcd/gui/Core/GUI_DispString.c
new file mode 100644
index 0000000..926f0b1
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_DispString.c
@@ -0,0 +1,85 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_DispString.C
+Purpose : Implementation of GUI_DispString function.
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_DispString
+*/
+void GUI_DispString(const char GUI_UNI_PTR *s) {
+ int xAdjust, yAdjust, xOrg;
+ int FontSizeY;
+ if (!s)
+ return;
+ GUI_LOCK();
+ FontSizeY = GUI_GetFontDistY();
+ xOrg = GUI_Context.DispPosX;
+ /* Adjust vertical position */
+ yAdjust = GUI_GetYAdjust();
+ GUI_Context.DispPosY -= yAdjust;
+ for (; *s; s++) {
+ GUI_RECT r;
+ int LineNumChars = GUI__GetLineNumChars(s, 0x7fff);
+ int xLineSize = GUI__GetLineDistX(s, LineNumChars);
+ /* Check if x-position needs to be changed due to h-alignment */
+ switch (GUI_Context.TextAlign & GUI_TA_HORIZONTAL) {
+ case GUI_TA_CENTER: xAdjust = xLineSize / 2; break;
+ case GUI_TA_RIGHT: xAdjust = xLineSize; break;
+ default: xAdjust = 0;
+ }
+ r.x0 = GUI_Context.DispPosX -= xAdjust;
+ r.x1 = r.x0 + xLineSize - 1;
+ r.y0 = GUI_Context.DispPosY;
+ r.y1 = r.y0 + FontSizeY - 1;
+ GUI__DispLine(s, LineNumChars, &r);
+ GUI_Context.DispPosY = r.y0;
+ s += GUI_UC__NumChars2NumBytes(s, LineNumChars);
+ if ((*s == '\n') || (*s == '\r')) {
+ switch (GUI_Context.TextAlign & GUI_TA_HORIZONTAL) {
+ case GUI_TA_CENTER:
+ case GUI_TA_RIGHT:
+ GUI_Context.DispPosX = xOrg;
+ break;
+ default:
+ GUI_Context.DispPosX = GUI_Context.LBorder;
+ break;
+ }
+ if (*s == '\n')
+ GUI_Context.DispPosY += FontSizeY;
+ } else {
+ GUI_Context.DispPosX = r.x0 + xLineSize;
+ }
+ if (*s == 0) /* end of string (last line) reached ? */
+ break;
+ }
+ GUI_Context.DispPosY += yAdjust;
+ GUI_Context.TextAlign &= ~GUI_TA_HORIZONTAL;
+ GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_DispStringAt.c b/User/system/lib/lcd/gui/Core/GUI_DispStringAt.c
new file mode 100644
index 0000000..93d357e
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_DispStringAt.c
@@ -0,0 +1,40 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_DispStringAt.c
+Purpose : Implementation of optional routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_DispStringAt
+*/
+void GUI_DispStringAt(const char GUI_UNI_PTR *s, int x, int y) {
+ GUI_LOCK();
+ GUI_Context.DispPosX = x;
+ GUI_Context.DispPosY = y;
+ GUI_DispString(s);
+ GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_DispStringAtCEOL.c b/User/system/lib/lcd/gui/Core/GUI_DispStringAtCEOL.c
new file mode 100644
index 0000000..cbea15b
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_DispStringAtCEOL.c
@@ -0,0 +1,37 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_DispStringAtCEOL.c
+Purpose : Implementation of optional routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_DispStringAtCEOL
+*/
+void GUI_DispStringAtCEOL(const char GUI_UNI_PTR *s, int x, int y) {
+ GUI_DispStringAt(s,x,y);
+ GUI_DispCEOL();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_DispStringHCenter.c b/User/system/lib/lcd/gui/Core/GUI_DispStringHCenter.c
new file mode 100644
index 0000000..f584398
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_DispStringHCenter.c
@@ -0,0 +1,41 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_DispStringHCenter.c
+Purpose : Implementation of optional routine
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_DispStringHCenterAt
+*/
+void GUI_DispStringHCenterAt(const char GUI_UNI_PTR *s, int x, int y) {
+ int Align;
+ Align = GUI_SetTextAlign((GUI_Context.TextAlign & ~GUI_TA_LEFT) | GUI_TA_CENTER);
+ GUI_DispStringAt(s, x, y);
+ GUI_SetTextAlign(Align);
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_DispStringInRect.c b/User/system/lib/lcd/gui/Core/GUI_DispStringInRect.c
new file mode 100644
index 0000000..49b0613
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_DispStringInRect.c
@@ -0,0 +1,169 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_DispStringInRect.c
+Purpose : Implementation of GUI_DispStringInRect
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include
+#include "GUI_Protected.h"
+#if GUI_WINSUPPORT
+#include "WM.h"
+#endif
+
+/*********************************************************************
+ *
+ * Public code
+ *
+ **********************************************************************
+ */
+/*********************************************************************
+ *
+ * GUI__DispStringInRect
+ */
+void GUI__DispStringInRect(const char GUI_UNI_PTR *s, GUI_RECT *pRect, int TextAlign, int MaxNumChars)
+{
+ GUI_RECT r;
+ GUI_RECT rLine;
+ int y = 0;
+ const char GUI_UNI_PTR *sOrg = s;
+ int FontYSize;
+ int xLine = 0;
+ int LineLen;
+ int NumCharsRem; /* Number of remaining characters */
+ FontYSize = GUI_GetFontSizeY();
+ if (pRect)
+ {
+ r = *pRect;
+ }
+ else
+ {
+ GUI_GetClientRect(&r);
+ }
+ /* handle vertical alignment */
+ if ((TextAlign & GUI_TA_VERTICAL) == GUI_TA_TOP)
+ {
+ y = r.y0;
+ }
+ else
+ {
+ int NumLines;
+ /* Count the number of lines */
+ for (NumCharsRem = MaxNumChars, NumLines = 1; NumCharsRem; NumLines++)
+ {
+ LineLen = GUI__GetLineNumChars(s, NumCharsRem);
+ NumCharsRem -= LineLen;
+ s += GUI_UC__NumChars2NumBytes(s, LineLen);
+ if (GUI__HandleEOLine(&s))
+ break;
+ }
+ /* Do the vertical alignment */
+ switch (TextAlign & GUI_TA_VERTICAL)
+ {
+ case GUI_TA_BASELINE:
+ case GUI_TA_BOTTOM:
+ y = r.y1 - NumLines * FontYSize + 1;
+ break;
+ case GUI_TA_VCENTER:
+ y = r.y0 + (r.y1 - r.y0 + 1 - NumLines * FontYSize) / 2;
+ break;
+ }
+ }
+ /* Output string */
+ for (NumCharsRem = MaxNumChars, s = sOrg; NumCharsRem;)
+ {
+ int xLineSize;
+ LineLen = GUI__GetLineNumChars(s, NumCharsRem);
+ NumCharsRem -= LineLen;
+ xLineSize = GUI__GetLineDistX(s, LineLen);
+ switch (TextAlign & GUI_TA_HORIZONTAL)
+ {
+ case GUI_TA_HCENTER:
+ xLine = r.x0 + (r.x1 - r.x0 - xLineSize) / 2;
+ break;
+ case GUI_TA_LEFT:
+ xLine = r.x0;
+ break;
+ case GUI_TA_RIGHT:
+ xLine = r.x1 - xLineSize + 1;
+ }
+ rLine.x0 = GUI_Context.DispPosX = xLine;
+ rLine.x1 = rLine.x0 + xLineSize - 1;
+ rLine.y0 = GUI_Context.DispPosY = y;
+ rLine.y1 = y + FontYSize - 1;
+ GUI__DispLine(s, LineLen, &rLine);
+ s += GUI_UC__NumChars2NumBytes(s, LineLen);
+ y += GUI_GetFontDistY();
+ if (GUI__HandleEOLine(&s))
+ break;
+ }
+}
+
+/*********************************************************************
+ *
+ * GUI_DispStringInRectMax
+ */
+#if (GUI_WINSUPPORT)
+void GUI_DispStringInRectMax(const char GUI_UNI_PTR *s, GUI_RECT *pRect, int TextAlign, int MaxLen)
+{
+ if (s)
+ {
+ const GUI_RECT *pOldClipRect = NULL;
+ GUI_RECT r;
+ GUI_LOCK();
+ if (pRect)
+ {
+ pOldClipRect = WM_SetUserClipRect(pRect);
+ if (pOldClipRect)
+ {
+ GUI__IntersectRects(&r, pRect, pOldClipRect);
+ WM_SetUserClipRect(&r);
+ }
+ }
+ GUI__DispStringInRect(s, pRect, TextAlign, MaxLen);
+ WM_SetUserClipRect(pOldClipRect);
+ GUI_UNLOCK();
+ }
+}
+
+#else
+
+void GUI_DispStringInRectMax(const char GUI_UNI_PTR *s, GUI_RECT *pRect, int TextAlign, int MaxLen)
+{
+ GUI_RECT Rect_Old, r;
+ if (s && pRect)
+ {
+ GUI_LOCK();
+ Rect_Old = GUI_Context.ClipRect;
+ GUI__IntersectRects(&r, pRect, &Rect_Old);
+ LCD_SetClipRectEx(&r);
+ GUI__DispStringInRect(s, pRect, TextAlign, MaxLen);
+ LCD_SetClipRectEx(&Rect_Old);
+ GUI_UNLOCK();
+ }
+}
+#endif
+
+/*********************************************************************
+ *
+ * GUI_DispStringInRect
+ */
+void GUI_DispStringInRect(const char GUI_UNI_PTR *s, GUI_RECT *pRect, int TextAlign)
+{
+ GUI_DispStringInRectMax(s, pRect, TextAlign, 0x7fff);
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_DispStringInRectEx.c b/User/system/lib/lcd/gui/Core/GUI_DispStringInRectEx.c
new file mode 100644
index 0000000..dda6c93
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_DispStringInRectEx.c
@@ -0,0 +1,115 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_DispStringInRectEx.c
+Purpose : Implementation of GUI_DispStringInRectEx
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+#include "GUI_Private.h"
+#if GUI_WINSUPPORT
+ #include "WM.h"
+#endif
+
+#if GUI_SUPPORT_ROTATION
+
+/*********************************************************************
+*
+* Global data
+*
+**********************************************************************
+*/
+
+GUI_RECT GUI_RectDispString; /* Used by LCD_Rotate... */
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+static const GUI_ROTATION * _SetRotation(const GUI_ROTATION* pLCD_Api) {
+ const GUI_ROTATION * pLCD_ApiOld;
+ GUI_LOCK();
+ pLCD_ApiOld = GUI_pLCD_APIList;
+ if (pLCD_Api) {
+ GUI_Context.pClipRect_HL = NULL; /* Do not perform high level clipping in rotated mode */
+ } else {
+ GUI_Context.pClipRect_HL = &GUI_Context.ClipRect;
+ }
+ GUI_pLCD_APIList = pLCD_Api;
+ GUI_UNLOCK();
+ return pLCD_ApiOld;
+}
+
+/*********************************************************************
+*
+* Exported code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_DispStringInRectEx
+*/
+void GUI_DispStringInRectEx(const char GUI_UNI_PTR *s, GUI_RECT* pRect, int TextAlign, int MaxLen, const GUI_ROTATION * pLCD_Api) {
+ const GUI_ROTATION * pLCD_ApiOld;
+ if (pLCD_Api == GUI_ROTATE_0) {
+ /* Do nothing else but calling GUI_DispStringInRectMax if pLCD_Api == GUI_ROTATE_0 */
+ GUI_DispStringInRectMax(s, pRect, TextAlign, MaxLen);
+ } else {
+ #if (!GUI_WINSUPPORT)
+ GUI_RECT Rect_Old;
+ #else
+ const GUI_RECT * pOldClipRect = NULL;
+ #endif
+ GUI_RECT rClip, rText = {0};
+ GUI_LOCK();
+ /* Set the clip rectangle */
+ if (pRect) {
+ rText = *pRect;
+ GUI_RectDispString = rText;
+ #if (GUI_WINSUPPORT)
+ pOldClipRect = WM_SetUserClipRect(pRect);
+ if (pOldClipRect) {
+ GUI__IntersectRects(&rClip, pRect, pOldClipRect);
+ WM_SetUserClipRect(&rClip);
+ }
+ #else
+ Rect_Old = GUI_Context.ClipRect;
+ GUI__IntersectRects(&rClip, pRect, &Rect_Old);
+ LCD_SetClipRectEx(&rClip);
+ #endif
+ }
+ pLCD_ApiOld = _SetRotation(pLCD_Api); /* Set the new function pointer for rotating text */
+ pLCD_Api->pfRect2TextRect(&rText); /* Calculate the text rectangle */
+ GUI__DispStringInRect(s, &rText, TextAlign, MaxLen); /* Display the string */
+ /* Restore old clipping rectangle */
+ #if (GUI_WINSUPPORT)
+ WM_SetUserClipRect(pOldClipRect);
+ #else
+ LCD_SetClipRectEx(&Rect_Old);
+ #endif
+ _SetRotation(pLCD_ApiOld);
+ GUI_UNLOCK();
+ }
+}
+
+#else /* Avoid empty object files */
+void GUI_DispStringInRectEx_C(void);
+void GUI_DispStringInRectEx_C(void) {}
+#endif
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_DispStringInRectMax.c b/User/system/lib/lcd/gui/Core/GUI_DispStringInRectMax.c
new file mode 100644
index 0000000..0c9dadd
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_DispStringInRectMax.c
@@ -0,0 +1,40 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_DispStringInRectMax.c
+Purpose : Implementation of GUI_DispStringInRectMax
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include
+#include "GUI_Protected.h"
+#if GUI_WINSUPPORT
+ #include "WM.h"
+#endif
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_DispStringLen.c b/User/system/lib/lcd/gui/Core/GUI_DispStringLen.c
new file mode 100644
index 0000000..b4a12c3
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_DispStringLen.c
@@ -0,0 +1,45 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_DispStringLen.c
+Purpose : Implementation of optional routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_DispStringLen
+*/
+void GUI_DispStringLen(const char GUI_UNI_PTR *s, int MaxNumChars) {
+ U16 Char;
+ GUI_LOCK();
+ while (MaxNumChars && ((Char = GUI_UC__GetCharCodeInc(&s)) != 0)) {
+ GUI_DispChar(Char);
+ MaxNumChars--;
+ }
+ while (MaxNumChars--) {
+ GUI_DispChar(' ');
+ }
+ GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_DrawBitmap.c b/User/system/lib/lcd/gui/Core/GUI_DrawBitmap.c
new file mode 100644
index 0000000..9c6c893
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_DrawBitmap.c
@@ -0,0 +1,88 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_DrawBitmap.C
+Purpose : Implementation of GUI_DrawBitmap
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+#include "GUI_Private.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GL_DrawBitmap
+*
+* Purpose:
+* Translates the external bitmap format into an internal
+* format. This turned out to be necessary as the internal
+* format is easier to create and more flexible for routines
+* that draw text-bitmaps.
+*/
+void GL_DrawBitmap(const GUI_BITMAP GUI_UNI_PTR * pBitmap, int x0, int y0) {
+ GUI_DRAWMODE PrevDraw;
+ const GUI_LOGPALETTE GUI_UNI_PTR * pPal;
+ pPal = pBitmap->pPal;
+ PrevDraw = GUI_SetDrawMode(0); /* No Get... at this point */
+ GUI_SetDrawMode((pPal && pPal->HasTrans) ? (PrevDraw|GUI_DRAWMODE_TRANS) : PrevDraw &(~GUI_DRAWMODE_TRANS));
+ if (pBitmap->pMethods) {
+ #if GUI_COMPILER_SUPPORTS_FP /* Do not support this on VERY simple chips and compilers */
+ pBitmap->pMethods->pfDraw(x0, y0, pBitmap->XSize ,pBitmap->YSize, (U8 const *)pBitmap->pData, pBitmap->pPal, 1, 1);
+ #endif
+ } else {
+ const LCD_PIXELINDEX* pTrans;
+ pTrans = LCD_GetpPalConvTable(pBitmap->pPal);
+ if (!pTrans) {
+ pTrans = (pBitmap->BitsPerPixel != 1) ? NULL : &LCD_BKCOLORINDEX;
+ }
+ LCD_DrawBitmap( x0,y0
+ ,pBitmap->XSize ,pBitmap->YSize
+ ,1,1
+ ,pBitmap->BitsPerPixel
+ ,pBitmap->BytesPerLine
+ ,pBitmap->pData
+ ,pTrans);
+ }
+ GUI_SetDrawMode(PrevDraw);
+}
+
+/*********************************************************************
+*
+* GUI_DrawBitmap
+*/
+void GUI_DrawBitmap(const GUI_BITMAP GUI_UNI_PTR * pBitmap, int x0, int y0) {
+ #if (GUI_WINSUPPORT)
+ GUI_RECT r;
+ #endif
+ GUI_LOCK();
+ #if (GUI_WINSUPPORT)
+ WM_ADDORG(x0,y0);
+ r.x1 = (r.x0 = x0) + pBitmap->XSize-1;
+ r.y1 = (r.y0 = y0) + pBitmap->YSize-1;
+ WM_ITERATE_START(&r) {
+ #endif
+ GL_DrawBitmap(pBitmap, x0, y0);
+ #if (GUI_WINSUPPORT)
+ } WM_ITERATE_END();
+ #endif
+ GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_DrawBitmapEx.c b/User/system/lib/lcd/gui/Core/GUI_DrawBitmapEx.c
new file mode 100644
index 0000000..708da4d
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_DrawBitmapEx.c
@@ -0,0 +1,155 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_DrawBitmapEx.c
+Purpose : Draws a bitmap with free magnification
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Private.h"
+#include "stdlib.h"
+
+/*********************************************************************
+*
+* static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GL_DrawBitmapEx
+*/
+static void GL_DrawBitmapEx(const GUI_BITMAP GUI_UNI_PTR * pBitmap, int x0, int y0,
+ int xCenter, int yCenter, int xMag, int yMag) {
+ LCD_PIXELINDEX Index, IndexPrev = 0;
+ LCD_COLOR Color;
+ int x, y, xi, yi, xSize, ySize, xAct, xStart, xMagAbs, xiMag, yMin, yMax, yEnd, yPrev, yStep;
+ char Cached, HasTrans = 0;
+ /* Use clipping rect to reduce calculation */
+ yMin = GUI_Context.ClipRect.y0;
+ yMax = GUI_Context.ClipRect.y1;
+ /* Init some values */
+ xSize = pBitmap->XSize;
+ ySize = pBitmap->YSize;
+ xMagAbs = ((xMag < 0) ? -xMag : xMag);
+ x0 -= (I32)((xMag < 0) ? xSize - xCenter - 1 : xCenter) * (I32)(xMagAbs) / (I32)(1000);
+ yEnd = y0 + GUI__DivideRound32(((I32)(-yCenter) * (I32)(yMag)), 1000);
+ yPrev = yEnd + 1;
+ yStep = (yMag < 0) ? -1 : 1;
+ if (pBitmap->pPal) {
+ if (pBitmap->pPal->HasTrans) {
+ HasTrans = 1;
+ }
+ }
+ for (yi = 0; yi < ySize; yi++) {
+ y = yEnd;
+ yEnd = y0 + GUI__DivideRound32(((I32)(yi + 1 - yCenter) * (I32)(yMag)), 1000);
+ if (y != yPrev) {
+ yPrev = y;
+ do {
+ if ((y >= yMin) && (y <= yMax)) {
+ xStart = -1;
+ x = 0;
+ xiMag = 0;
+ Cached = 0;
+ for (xi = 0; xi < xSize; xi++) {
+ xiMag += xMagAbs;
+ if (xiMag >= 1000) {
+ xAct = (xMag > 0) ? xi : xSize - xi - 1;
+ Index = GUI_GetBitmapPixelIndex(pBitmap, xAct, yi);
+ if (Index != IndexPrev || xStart == -1) {
+ if ((Index == 0) && HasTrans) {
+ /* Transparent color ... clear cache */
+ if (Cached) {
+ LCD_DrawHLine(x0 + xStart, y, x0 + x - 1);
+ Cached = 0;
+ }
+ } else {
+ /* Another color ... draw contents of cache */
+ if (Cached && xStart != -1) {
+ LCD_DrawHLine(x0 + xStart, y, x0 + x - 1);
+ }
+ xStart = x;
+ Cached = 1;
+ if (pBitmap->pMethods) {
+ Color = pBitmap->pMethods->pfIndex2Color(Index);
+ } else {
+ Color = pBitmap->pPal->pPalEntries[Index];
+ }
+ LCD_SetColorIndex(LCDDEV_L0_Color2Index(Color));
+ }
+ IndexPrev = Index;
+ }
+ do {
+ x++;
+ xiMag -= 1000;
+ } while (xiMag >= 1000);
+ }
+ }
+ /* Clear cache */
+ if (Cached) {
+ LCD_DrawHLine(x0 + xStart, y, x0 + x - 1);
+ }
+ }
+ y += yStep;
+ } while ((yMag < 0) ? (y > yEnd) : (y < yEnd));
+ }
+ }
+}
+
+/*********************************************************************
+*
+* public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_DrawBitmapEx
+*/
+void GUI_DrawBitmapEx(const GUI_BITMAP GUI_UNI_PTR * pBitmap, int x0, int y0,
+ int xCenter, int yCenter, int xMag, int yMag) {
+ GUI_COLOR OldColor;
+ #if (GUI_WINSUPPORT)
+ GUI_RECT r;
+ #endif
+ GUI_LOCK();
+ OldColor = GUI_GetColor();
+ #if (GUI_WINSUPPORT)
+ WM_ADDORG(x0, y0);
+ if (xMag >= 0) {
+ r.x0 = x0 + GUI__DivideRound32(((I32)(-xCenter) * (I32)(xMag)), 1000);
+ r.x1 = x0 + GUI__DivideRound32(((I32)(pBitmap->XSize - xCenter - 1) * (I32)(xMag)), 1000);
+ } else {
+ r.x1 = x0 + GUI__DivideRound32(((I32)(-xCenter) * (I32)(xMag)), 1000);
+ r.x0 = x0 + GUI__DivideRound32(((I32)(pBitmap->XSize - xCenter - 1) * (I32)(xMag)), 1000);
+ }
+ if (yMag >= 0) {
+ r.y0 = y0 + GUI__DivideRound32(((I32)(-yCenter) * (I32)(yMag)), 1000);
+ r.y1 = y0 + GUI__DivideRound32(((I32)(pBitmap->YSize - yCenter - 1) * (I32)(yMag)), 1000);
+ } else {
+ r.y1 = y0 + GUI__DivideRound32(((I32)(-yCenter) * (I32)(yMag)), 1000);
+ r.y0 = y0 + GUI__DivideRound32(((I32)(pBitmap->YSize - yCenter - 1) * (I32)(yMag)), 1000);
+ }
+ WM_ITERATE_START(&r) {
+ #endif
+ GL_DrawBitmapEx(pBitmap, x0, y0, xCenter, yCenter, xMag, yMag);
+ #if (GUI_WINSUPPORT)
+ } WM_ITERATE_END();
+ #endif
+ GUI_SetColor(OldColor);
+ GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_DrawBitmapExp.c b/User/system/lib/lcd/gui/Core/GUI_DrawBitmapExp.c
new file mode 100644
index 0000000..4996d8a
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_DrawBitmapExp.c
@@ -0,0 +1,62 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_DrawBitmapExp.C
+Purpose : Implementation of GUI_DrawBitmapExp
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI_Private.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_DrawBitmapExp
+*/
+void GUI_DrawBitmapExp(int x0, int y0, int XSize, int YSize, int XMul, int YMul,
+ int BitsPerPixel, int BytesPerLine, const U8 GUI_UNI_PTR * pData,
+ const GUI_LOGPALETTE GUI_UNI_PTR * pPal)
+{
+ GUI_DRAWMODE PrevDraw;
+ const LCD_PIXELINDEX* pTrans;
+ GUI_LOCK();
+ pTrans = LCD_GetpPalConvTable(pPal);
+ PrevDraw = GUI_SetDrawMode((pPal && pPal->HasTrans) ? GUI_DRAWMODE_TRANS : 0);
+ #if (GUI_WINSUPPORT)
+ WM_ADDORG(x0,y0);
+ {
+ GUI_RECT r;
+ r.x0 = x0;
+ r.x1 = x0 + XSize * XMul -1;
+ r.y0 = y0;
+ r.y1 = y0 + YSize * YMul -1;
+ WM_ITERATE_START(&r); {
+ #endif
+ LCD_DrawBitmap( x0, y0 ,XSize ,YSize, XMul, YMul
+ ,BitsPerPixel, BytesPerLine, pData, pTrans);
+ #if (GUI_WINSUPPORT)
+ } WM_ITERATE_END();
+ }
+ #endif
+ GUI_SetDrawMode(PrevDraw);
+ GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_DrawBitmapMag.c b/User/system/lib/lcd/gui/Core/GUI_DrawBitmapMag.c
new file mode 100644
index 0000000..901a1de
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_DrawBitmapMag.c
@@ -0,0 +1,74 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_DrawBitmapMag.C
+Purpose : Implementation file for GUI_DrawBitmapMag
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI_Private.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_DrawBitmapMag
+*/
+void GUI_DrawBitmapMag(const GUI_BITMAP GUI_UNI_PTR *pBitmap, int x0, int y0, int xMul, int yMul) {
+ GUI_DRAWMODE PrevDraw;
+ int xSize, ySize;
+ const GUI_LOGPALETTE GUI_UNI_PTR * pPal;
+ const LCD_PIXELINDEX* pTrans;
+ GUI_LOCK();
+ pPal = pBitmap->pPal;
+ xSize = pBitmap->XSize;
+ ySize = pBitmap->YSize;
+ pTrans = LCD_GetpPalConvTable(pPal);
+ if (!pTrans) {
+ pTrans = (pBitmap->BitsPerPixel != 1) ? NULL : &LCD_BKCOLORINDEX;
+ }
+ PrevDraw = GUI_SetDrawMode((pPal && pPal->HasTrans) ? GUI_DRAWMODE_TRANS : 0);
+ #if (GUI_WINSUPPORT)
+ WM_ADDORG(x0,y0);
+ {
+ GUI_RECT r;
+ r.x0 = x0;
+ r.x1 = x0 + xSize * xMul -1;
+ r.y0 = y0;
+ r.y1 = y0 + ySize * yMul -1;
+ WM_ITERATE_START(&r);
+ #endif
+ if (pBitmap->pMethods) {
+ #if GUI_COMPILER_SUPPORTS_FP /* Do not support this on VERY simple chips and compilers */
+ pBitmap->pMethods->pfDraw(x0, y0, pBitmap->XSize ,pBitmap->YSize, (U8 const *)pBitmap->pData, pBitmap->pPal, xMul, yMul);
+ #endif
+ } else {
+ LCD_DrawBitmap(x0, y0, xSize, ySize, xMul, yMul
+ ,pBitmap->BitsPerPixel, pBitmap->BytesPerLine
+ ,pBitmap->pData, pTrans);
+ }
+ #if (GUI_WINSUPPORT)
+ WM_ITERATE_END();
+ }
+ #endif
+ GUI_SetDrawMode(PrevDraw);
+ GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_DrawFocusRect.c b/User/system/lib/lcd/gui/Core/GUI_DrawFocusRect.c
new file mode 100644
index 0000000..57d9dcc
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_DrawFocusRect.c
@@ -0,0 +1,69 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_DrawFocusRect.C
+Purpose : Implementation of GUI_DrawFocusRect
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _DrawFocusRect
+*/
+static void _DrawFocusRect(const GUI_RECT* pr) {
+ int i;
+ for (i = pr->x0; i <= pr->x1; i += 2) {
+ LCD_DrawPixel(i, pr->y0);
+ LCD_DrawPixel(i, pr->y1);
+ }
+ for (i = pr->y0; i <= pr->y1; i += 2) {
+ LCD_DrawPixel(pr->x0, i);
+ LCD_DrawPixel(pr->x1, i);
+ }
+}
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_DrawFocusRect
+*/
+void GUI_DrawFocusRect(const GUI_RECT *pRect, int Dist) {
+ GUI_RECT r;
+ GUI__ReduceRect(&r, pRect, Dist);
+ GUI_LOCK();
+ #if (GUI_WINSUPPORT)
+ WM_ADDORG(r.x0, r.y0);
+ WM_ADDORG(r.x1, r.y1);
+ WM_ITERATE_START(&r); {
+ #endif
+ _DrawFocusRect(&r);
+ #if (GUI_WINSUPPORT)
+ } WM_ITERATE_END();
+ #endif
+ GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_DrawGraph.c b/User/system/lib/lcd/gui/Core/GUI_DrawGraph.c
new file mode 100644
index 0000000..9de2c48
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_DrawGraph.c
@@ -0,0 +1,95 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_DrawPolyline.c
+Purpose : Implementation of GUI_DrawPolyline
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _DrawGraph
+*/
+static void _DrawGraph(I16 *pay, int NumPoints, int xOff, int yOff) {
+ int i;
+ int y0, y1;
+ int yClip0, yClip1;
+ /* Perform high level clipping in x */
+ yClip0 = GUI_Context.pClipRect_HL->y0;
+ yClip1 = GUI_Context.pClipRect_HL->y1;
+ i=0;
+ if (GUI_Context.pClipRect_HL) {
+ if (xOff < GUI_Context.pClipRect_HL->x0)
+ i = GUI_Context.pClipRect_HL->x0 - xOff;
+ if (xOff+NumPoints-1 > GUI_Context.pClipRect_HL->x1)
+ NumPoints = GUI_Context.pClipRect_HL->x1 - xOff + 1;
+ }
+ /* Start drawing if there is something left to do after x-clipping */
+ if (i < NumPoints) {
+ y0 = *(pay + i++) + yOff;
+ /* Iterate */
+ for (; i < NumPoints; i++) {
+ /* Perform high level clipping in y */
+ y1 = *(pay + i) + yOff;
+ if ((y0 >= yClip0) || (y1 >= yClip0)) {
+ if ((y0 <= yClip1) || (y1 <= yClip1)) {
+ int y01;
+ y01 = (y1 + y0) / 2;
+ if (y0 <= y1) {
+ LCD_DrawVLine(i + xOff - 1, y0, y01);
+ LCD_DrawVLine(i + xOff, y01, y1);
+ } else {
+ LCD_DrawVLine(i + xOff - 1, y01, y0);
+ LCD_DrawVLine(i + xOff, y1, y01);
+ }
+ }
+ }
+ y0 = y1;
+ }
+ }
+}
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_DrawGraph
+*/
+void GUI_DrawGraph(I16 *pay, int NumPoints, int x0, int y0) {
+ GUI_LOCK();
+ #if (GUI_WINSUPPORT)
+ WM_ADDORG(x0,y0);
+ WM_ITERATE_START(NULL); {
+ #endif
+ _DrawGraph(pay, NumPoints, x0, y0);
+ #if (GUI_WINSUPPORT)
+ } WM_ITERATE_END();
+ #endif
+ GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_DrawHLine.c b/User/system/lib/lcd/gui/Core/GUI_DrawHLine.c
new file mode 100644
index 0000000..07c3259
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_DrawHLine.c
@@ -0,0 +1,52 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_DrawHLine.C
+Purpose : Implementation of GUI_DrawHLine
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_DrawHLine
+*/
+void GUI_DrawHLine(int y0, int x0, int x1) {
+ #if (GUI_WINSUPPORT)
+ GUI_RECT r;
+ #endif
+ GUI_LOCK();
+ #if (GUI_WINSUPPORT)
+ WM_ADDORG(x0,y0);
+ WM_ADDORGX(x1);
+ r.x0 = x0;
+ r.x1 = x1;
+ r.y1 = r.y0 = y0;
+ WM_ITERATE_START(&r) {
+ #endif
+ LCD_HL_DrawHLine(x0, y0, x1);
+ #if (GUI_WINSUPPORT)
+ } WM_ITERATE_END();
+ #endif
+ GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_DrawPie.c b/User/system/lib/lcd/gui/Core/GUI_DrawPie.c
new file mode 100644
index 0000000..2dbfd25
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_DrawPie.c
@@ -0,0 +1,66 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUIARCFloat.C
+Purpose : Draw Arc routines based on floating point
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _DrawPie
+*/
+static void _DrawPie(int x0, int y0, unsigned int r, int Angle0, int Angle1, int Type) {
+ int PenSizeOld;
+ PenSizeOld = GUI_GetPenSize();
+ GUI_SetPenSize(r);
+ r /= 2;
+ GL_DrawArc(x0,y0,r,r,Angle0, Angle1);
+ GUI_SetPenSize(PenSizeOld);
+ GUI_USE_PARA(Type);
+}
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_DrawPie
+*/
+void GUI_DrawPie(int x0, int y0, int r, int a0, int a1, int Type) {
+ GUI_LOCK();
+ #if GUI_WINSUPPORT
+ WM_ADDORG(x0,y0);
+ WM_ITERATE_START(NULL) {
+ #endif
+ _DrawPie( x0, y0, r, a0, a1, Type);
+ #if GUI_WINSUPPORT
+ } WM_ITERATE_END();
+ #endif
+ GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_DrawPixel.c b/User/system/lib/lcd/gui/Core/GUI_DrawPixel.c
new file mode 100644
index 0000000..171f7de
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_DrawPixel.c
@@ -0,0 +1,50 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_DrawPixel.c
+Purpose : Implementation of GUI_DrawPixel
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_DrawPixel
+*/
+void GUI_DrawPixel(int x, int y) {
+ #if (GUI_WINSUPPORT)
+ GUI_RECT r;
+ #endif
+ GUI_LOCK();
+ #if (GUI_WINSUPPORT)
+ WM_ADDORG(x,y);
+ r.x0 = r.x1 = x;
+ r.y0 = r.y1 = y;
+ WM_ITERATE_START(&r); {
+ #endif
+ LCD_HL_DrawPixel(x,y);
+ #if (GUI_WINSUPPORT)
+ } WM_ITERATE_END();
+ #endif
+ GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_DrawPolyline.c b/User/system/lib/lcd/gui/Core/GUI_DrawPolyline.c
new file mode 100644
index 0000000..d2cf6ac
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_DrawPolyline.c
@@ -0,0 +1,66 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_DrawPolyLine.c
+Purpose : Implementation of GUI_DrawPolyline
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _DrawPolyLine
+*
+* Draw Poly line, which does not have to be a closed shape
+*/
+static void _DrawPolyLine(const GUI_POINT*pPoints, int NumPoints, int x0, int y0) {
+ GL_MoveTo(pPoints->x+x0, pPoints->y+y0);
+ while (--NumPoints >0) {
+ pPoints++;
+ GL_DrawLineTo(pPoints->x+x0, pPoints->y+y0);
+ }
+}
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_DrawPolyLine
+*/
+void GUI_DrawPolyLine(const GUI_POINT* pPoints, int NumPoints, int x0, int y0) {
+ GUI_LOCK();
+ #if (GUI_WINSUPPORT)
+ WM_ADDORG(x0,y0);
+ WM_ITERATE_START(NULL); {
+ #endif
+ _DrawPolyLine (pPoints, NumPoints, x0, y0);
+ #if (GUI_WINSUPPORT)
+ } WM_ITERATE_END();
+ #endif
+ GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_DrawRectEx.c b/User/system/lib/lcd/gui/Core/GUI_DrawRectEx.c
new file mode 100644
index 0000000..d242c6c
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_DrawRectEx.c
@@ -0,0 +1,36 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_DrawRectEx.C
+Purpose : Implementation of GUI_DrawRectEx
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_DrawRectEx
+*/
+void GUI_DrawRectEx(const GUI_RECT* pRect) {
+ GUI_DrawRect(pRect->x0, pRect->y0, pRect->x1, pRect->y1);
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_DrawVLine.c b/User/system/lib/lcd/gui/Core/GUI_DrawVLine.c
new file mode 100644
index 0000000..a413273
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_DrawVLine.c
@@ -0,0 +1,52 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_DrawVLine.C
+Purpose : Implementation of GUI_DrawVLine
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_DrawVLine
+*/
+void GUI_DrawVLine(int x0, int y0, int y1) {
+ #if (GUI_WINSUPPORT)
+ GUI_RECT r;
+ #endif
+ GUI_LOCK();
+ #if (GUI_WINSUPPORT)
+ WM_ADDORG(x0,y0);
+ WM_ADDORGY(y1);
+ r.x1 = r.x0 = x0;
+ r.y0 = y0;
+ r.y1 = y1;
+ WM_ITERATE_START(&r); {
+ #endif
+ LCD_DrawVLine(x0, y0, y1);
+ #if (GUI_WINSUPPORT)
+ } WM_ITERATE_END();
+ #endif
+ GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_ErrorOut.c b/User/system/lib/lcd/gui/Core/GUI_ErrorOut.c
new file mode 100644
index 0000000..749e61b
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_ErrorOut.c
@@ -0,0 +1,126 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_ErrorOut.C
+Purpose : Logging (used only at higher debug levels)
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+#include
+#include "GUI_Protected.h"
+#include "GUI_X.h"
+
+/*********************************************************************
+*
+* Defines
+*
+**********************************************************************
+*/
+
+#define MAXLEN 50
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _CopyString
+*/
+static void _CopyString(char*d, const char*s, int MaxLen) {
+ while ((MaxLen > 0) && *s) {
+ *d++ = *s++;
+ MaxLen--;
+ }
+ *d = 0;
+}
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_ErrorOut
+*/
+void GUI_ErrorOut(const char *s) { GUI_X_ErrorOut(s); }
+
+/*********************************************************************
+*
+* GUI_ErrorOut1
+*/
+void GUI_ErrorOut1(const char *s, int p0) {
+ char ac[MAXLEN + 10];
+ char* sOut = ac;
+ GUI_MEMSET((U8*)ac, 0, sizeof(ac));
+ _CopyString(ac, s, MAXLEN);
+ sOut += strlen(sOut);
+ GUI__AddSpaceHex(p0, 8, &sOut);
+ GUI_ErrorOut(ac);
+}
+
+/*********************************************************************
+*
+* GUI_ErrorOut2
+*/
+void GUI_ErrorOut2(const char *s, int p0, int p1) {
+ char ac[MAXLEN + 20];
+ char* sOut = ac;
+ GUI_MEMSET((U8*)ac, 0, sizeof(ac));
+ _CopyString(ac, s, MAXLEN);
+ sOut += strlen(sOut);
+ GUI__AddSpaceHex(p0, 8, &sOut);
+ GUI__AddSpaceHex(p1, 8, &sOut);
+ GUI_ErrorOut(ac);
+}
+
+/*********************************************************************
+*
+* GUI_ErrorOut3
+*/
+void GUI_ErrorOut3(const char *s, int p0, int p1, int p2) {
+ char ac[MAXLEN + 30];
+ char* sOut = ac;
+ GUI_MEMSET((U8*)ac, 0, sizeof(ac));
+ _CopyString(ac, s, MAXLEN);
+ sOut += strlen(sOut);
+ GUI__AddSpaceHex(p0, 8, &sOut);
+ GUI__AddSpaceHex(p1, 8, &sOut);
+ GUI__AddSpaceHex(p2, 8, &sOut);
+ GUI_ErrorOut(ac);
+}
+
+/*********************************************************************
+*
+* GUI_ErrorOut4
+*/
+void GUI_ErrorOut4(const char *s, int p0, int p1, int p2, int p3) {
+ char ac[MAXLEN + 40] = {0};
+ char* sOut = ac;
+ GUI_MEMSET((U8*)ac, 0, sizeof(ac));
+ _CopyString(ac, s, MAXLEN);
+ sOut += strlen(sOut);
+ GUI__AddSpaceHex(p0, 8, &sOut);
+ GUI__AddSpaceHex(p1, 8, &sOut);
+ GUI__AddSpaceHex(p2, 8, &sOut);
+ GUI__AddSpaceHex(p3, 8, &sOut);
+ GUI_ErrorOut(ac);
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_Exec.c b/User/system/lib/lcd/gui/Core/GUI_Exec.c
new file mode 100644
index 0000000..9a1210e
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_Exec.c
@@ -0,0 +1,62 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_Exec.c
+Purpose : Implementation of GUI_Exec
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+#if GUI_WINSUPPORT
+#include "WM.h"
+#endif
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_Exec1
+*/
+int GUI_Exec1(void) {
+ int r = 0;
+ /* Execute background jobs */
+ if (GUI_pfTimerExec) {
+ if ((*GUI_pfTimerExec)()) {
+ r = 1; /* We have done something */
+ }
+ }
+ #if GUI_WINSUPPORT /* If 0, WM will not generate any code */
+ if (WM_Exec())
+ r = 1;
+ #endif
+ return r;
+}
+
+/*********************************************************************
+*
+* GUI_Exec
+*/
+int GUI_Exec(void) {
+ int r = 0;
+ while (GUI_Exec1()) {
+ r = 1; /* We have done something */
+ }
+ return r;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_FillPolygon.c b/User/system/lib/lcd/gui/Core/GUI_FillPolygon.c
new file mode 100644
index 0000000..10ed2e3
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_FillPolygon.c
@@ -0,0 +1,275 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_FillPolygon.C
+Purpose : Fill polygon routine
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI_Protected.h"
+#include "GUIDebug.h"
+
+/*********************************************************************
+*
+* defines, Configs
+*
+**********************************************************************
+*/
+
+#define GUI_FP_MAXCOUNT 12
+
+/*********************************************************************
+*
+* static data
+*
+**********************************************************************
+*/
+
+static int GL_FP_Cnt;
+static I16 _aX[GUI_FP_MAXCOUNT];
+
+/*********************************************************************
+*
+* static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _DrawHLine
+*/
+static void _DrawHLine(int x0, int y, int x1) {
+ if (x0 < x1) {
+ LCD_HL_DrawHLine(x0, y, x1);
+ } else {
+ LCD_HL_DrawHLine(x1, y, x0);
+ }
+}
+
+/*********************************************************************
+*
+* _CheckYInterSect
+*
+* This function returns the x-coordinate of the intersection
+* of the given line at the given y-coordinate.
+* If there is no intersection, GUI_XMAX is returned.
+* This routine does not work for horizontal lines, as there
+* would be more than a single point as intersection. This situation
+* needs to be checked prior to calling the routine.
+* Returns:
+* 0 if no intersection
+* 1 if we have an intersection
+*/
+static int _CheckYInterSect(int y, int* px, const GUI_POINT*paPoint0, const GUI_POINT*paPoint1) {
+ int x0, y0, x1, y1;
+ if (paPoint0->y <= (paPoint1)->y) {
+ y0 = paPoint0->y;
+ if (y0 > y) /* Check if there is an intersection ... (early out) */
+ return 0;
+ y1 = paPoint1->y;
+ if (y1 < y) /* Check if there is an intersection ... (early out) */
+ return 0;
+ x0 = paPoint0->x;
+ x1 = paPoint1->x;
+ } else {
+ y0 = paPoint1->y;
+ if (y0 > y) /* Check if there is an intersection ... (early out) */
+ return 0;
+ y1 = paPoint0->y;
+ if (y1 < y) /* Check if there is an intersection ... (early out) */
+ return 0;
+ x0 = paPoint1->x;
+ x1 = paPoint0->x;
+ }
+/* Calculate intersection */
+ {
+ I32 Mul = (I32)(x1 - x0) * (I32)(y - y0);
+ if (Mul > 0) {
+ Mul += (y1 - y0) >> 1; /* for proper rounding */
+ } else {
+ Mul -= ((y1 - y0) >> 1) - 1; /* for proper rounding */
+ }
+ x0 += Mul / (y1 - y0);
+ }
+ *px = x0;
+ return 1;
+}
+
+/*********************************************************************
+*
+* _Add
+*
+* This function adds a point into the sorted array
+*/
+static void _Add(int x) {
+ if (GL_FP_Cnt < GUI_FP_MAXCOUNT) {
+ int i;
+ /* Move all entries to the right (bigger x-value) */
+ for (i=GL_FP_Cnt; i ; i--) {
+ if (_aX[i-1] < x)
+ break;
+ _aX[i] = _aX[i-1];
+ }
+ /* Insert new entry */
+ _aX[i] = x;
+ GL_FP_Cnt++;
+ }
+}
+
+/*********************************************************************
+*
+* _Init
+*
+* This function initialise the sorted array
+*/
+static void _Init(void) {
+ GL_FP_Cnt = 0;
+}
+
+/*********************************************************************
+*
+* _Flush
+*
+* This function draw lines between points in the array
+*/
+static void _Flush(int x0, int y) {
+ int i, x = 0;
+ char On=0;
+ for (i=0; i= 0) {
+ x += xOff;
+ LCD_HL_DrawHLine(x, y + yOff, x); /* V-point, not crossing the polygon */
+ } else {
+ _Add(x);
+ }
+}
+
+/*********************************************************************
+*
+* _GetPrevPointDiffy
+*
+* Find previous point which is not on the same height
+*/
+static int _GetPrevPointDiffy(const GUI_POINT* paPoint, int i,
+ const int NumPoints, const int y0) {
+ int j, y1;
+ for (j = 0; j < (NumPoints - 1) ; j++) {
+ i = (i != 0) ? i - 1 : NumPoints - 1;
+ y1 = (paPoint + i)->y;
+ if (y1 != y0) {
+ return y1;
+ }
+ }
+ return y0;
+}
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GL_FillPolygon
+*
+* This function calculates the polygon
+*/
+void GL_FillPolygon (const GUI_POINT*paPoint, int NumPoints, int xOff, int yOff) {
+ int i, y;
+ int yMin = GUI_YMAX;
+ int yMax = GUI_YMIN;
+/* First step : find uppermost and lowermost coordinates */
+ for (i=0; iy;
+ if (y < yMin)
+ yMin = y;
+ if (y > yMax)
+ yMax = y;
+ }
+/* Use Clipping rect to reduce calculation (if possible) */
+ if (GUI_Context.pClipRect_HL) {
+ if (yMax > (GUI_Context.pClipRect_HL->y1 - yOff))
+ yMax = (GUI_Context.pClipRect_HL->y1 - yOff);
+ if (yMin < (GUI_Context.pClipRect_HL->y0 - yOff))
+ yMin = (GUI_Context.pClipRect_HL->y0 - yOff);
+ }
+/* Second step: Calculate and draw horizontal lines */
+ for (y=yMin; y<=yMax; y++) {
+ _Init();
+ /* find next intersection and count lines*/
+ for (i=0; iy;
+ int y1 = (paPoint + i1)->y;
+ /* Check if starting point is on line */
+ if (y0 == y) {
+ if (y1 == y) { /* Add the entire line */
+ _DrawHLine((paPoint + i )->x + xOff , y + yOff, (paPoint + i1)->x + xOff);
+ } else { /* Add only one point */
+ int yPrev = _GetPrevPointDiffy(paPoint, i, NumPoints, y);
+ if (yPrev != y) {
+ _AddPoint((paPoint + i)->x, y, yPrev - y, y1 - y, xOff, yOff);
+ }
+ }
+ } else if (y1 != y) { /* Ignore if end-point is on the line */
+ if (((y1 >= y) && (y0 <= y)) || ((y0 >= y) && (y1 <= y))) {
+ int xIntersect;
+ if (_CheckYInterSect(y, &xIntersect, paPoint + i, paPoint + i1)) {
+ _Add(xIntersect);
+ }
+ }
+ }
+ }
+ _Flush(xOff, y + yOff);
+ }
+}
+
+/*********************************************************************
+*
+* GUI_FillPolygon
+*/
+void GUI_FillPolygon(const GUI_POINT* pPoints, int NumPoints, int x0, int y0) {
+ GUI_LOCK();
+ #if (GUI_WINSUPPORT)
+ WM_ADDORG(x0, y0);
+ WM_ITERATE_START(NULL); {
+ #endif
+ GL_FillPolygon (pPoints, NumPoints, x0, y0);
+ #if (GUI_WINSUPPORT)
+ } WM_ITERATE_END();
+ #endif
+ GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_FillRect.c b/User/system/lib/lcd/gui/Core/GUI_FillRect.c
new file mode 100644
index 0000000..acb370d
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_FillRect.c
@@ -0,0 +1,51 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_FillRect.C
+Purpose : Implementation of GUI_FillRect
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_FillRect
+*/
+void GUI_FillRect(int x0, int y0, int x1, int y1) {
+ #if (GUI_WINSUPPORT)
+ GUI_RECT r;
+ #endif
+ GUI_LOCK();
+ #if (GUI_WINSUPPORT)
+ WM_ADDORG(x0,y0);
+ WM_ADDORG(x1,y1);
+ r.x0 = x0; r.x1 = x1;
+ r.y0 = y0; r.y1 = y1;
+ WM_ITERATE_START(&r); {
+ #endif
+ LCD_FillRect(x0,y0,x1,y1);
+ #if (GUI_WINSUPPORT)
+ } WM_ITERATE_END();
+ #endif
+ GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_FillRectEx.c b/User/system/lib/lcd/gui/Core/GUI_FillRectEx.c
new file mode 100644
index 0000000..d38cc7a
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_FillRectEx.c
@@ -0,0 +1,37 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_FillRectEx.c
+Purpose : Implementation of GUI_FillRectEx
+---------------------------END-OF-HEADER------------------------------
+*/
+
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_FillRectEx
+*/
+void GUI_FillRectEx(const GUI_RECT* pRect) {
+ GUI_FillRect(pRect->x0, pRect->y0, pRect->x1, pRect->y1);
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_FontIntern.h b/User/system/lib/lcd/gui/Core/GUI_FontIntern.h
new file mode 100644
index 0000000..96a9c2c
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_FontIntern.h
@@ -0,0 +1,67 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_FontIntern.h
+Purpose : Internal decalrations used in font files
+---------------------------END-OF-HEADER------------------------------
+
+Attention : Do not modify this file ! If you do, you will not
+ be able do update to a later GUI version !
+
+*/
+
+
+#ifndef GUI_FONTINTERN_H /* Guard against multiple inclusion */
+#define GUI_FONTINTERN_H
+
+#include "GUI.h"
+
+#if defined(__cplusplus)
+extern "C" { /* Make sure we have C-declarations in C++ programs */
+#endif
+
+
+extern GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font8ASCII_Prop;
+extern GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font10S_ASCII_FontProp1;
+extern GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font10ASCIIProp1;
+extern GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font16ASCIIProp1;
+
+extern GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font16_1_FontProp1;
+extern GUI_CONST_STORAGE GUI_FONT_PROP FontComic24BProp_ASCII;
+
+extern GUI_CONST_STORAGE GUI_CHARINFO GUI_Font24B_ASCII_CharInfo[95];
+extern GUI_CONST_STORAGE GUI_CHARINFO GUI_Font24_ASCII_CharInfo[95];
+extern GUI_CONST_STORAGE GUI_CHARINFO GUI_Font32B_ASCII_CharInfo[95];
+
+extern GUI_CONST_STORAGE GUI_CHARINFO GUI_Font32_ASCII_CharInfo[95];
+extern GUI_CONST_STORAGE GUI_CHARINFO GUI_CharInfoF8x13_ASCII[96];
+extern GUI_CONST_STORAGE GUI_CHARINFO GUI_CharInfoF8x15B_ASCII[96];
+extern GUI_CONST_STORAGE GUI_CHARINFO CharInfo18B_ASCII[97];
+extern GUI_CONST_STORAGE GUI_CHARINFO CharInfo24B_ASCII[96];
+extern GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font13ASCII_Prop1;
+extern GUI_CONST_STORAGE GUI_FONT_PROP GUI_Font13B_ASCII_Prop1;
+extern GUI_CONST_STORAGE GUI_CHARINFO GUI_Font13H_ASCII_CharInfo[95];
+extern GUI_CONST_STORAGE GUI_CHARINFO GUI_Font13HB_ASCII_CharInfo[95];
+extern GUI_CONST_STORAGE GUI_CHARINFO GUI_Font16_HK_CharInfo[169];
+extern GUI_CONST_STORAGE GUI_CHARINFO GUI_Font16B_ASCII_CharInfo[95];
+
+
+#if defined(__cplusplus)
+ }
+#endif
+
+
+#endif /* Guard against multiple inclusion */
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_GetBitmapPixelColor.c b/User/system/lib/lcd/gui/Core/GUI_GetBitmapPixelColor.c
new file mode 100644
index 0000000..90daa8e
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_GetBitmapPixelColor.c
@@ -0,0 +1,40 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_GetBitmapPixelColor.c
+Purpose : Gets the color from one pixel of a bitmap
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Private.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_GetBitmapPixelColor
+*/
+GUI_COLOR GUI_GetBitmapPixelColor(const GUI_BITMAP GUI_UNI_PTR * pBMP, unsigned x, unsigned y) {
+ int Index = GUI_GetBitmapPixelIndex(pBMP, x, y);
+ if (pBMP->pPal->HasTrans && (Index == 0)) {
+ return GUI_INVALID_COLOR;
+ }
+ return pBMP->pPal->pPalEntries[Index];
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_GetBitmapPixelIndex.c b/User/system/lib/lcd/gui/Core/GUI_GetBitmapPixelIndex.c
new file mode 100644
index 0000000..df28f4a
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_GetBitmapPixelIndex.c
@@ -0,0 +1,64 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_GetBitmapPixelIndex.c
+Purpose : Implementation of GUI_GetBitmapPixelIndex
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Private.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_GetBitmapPixelIndex
+*/
+int GUI_GetBitmapPixelIndex(const GUI_BITMAP GUI_UNI_PTR * pBMP, unsigned x, unsigned y) {
+ unsigned Off, Value;
+ switch (pBMP->BitsPerPixel) {
+ case 1:
+ Off = (x >> 3) + (y * pBMP->BytesPerLine);
+ Value = *(pBMP->pData + Off);
+ Value = Value >> (7 - (x & 0x7)) & 0x1;
+ break;
+ case 2:
+ Off = (x >> 2) + (y * pBMP->BytesPerLine);
+ Value = *(pBMP->pData + Off);
+ Value = Value >> (6 - ((x << 1) & 0x6)) & 0x3;
+ break;
+ case 4:
+ Off = (x >> 1) + (y * pBMP->BytesPerLine);
+ Value = *(pBMP->pData + Off);
+ Value = (x & 1) ? (Value & 0xF) : (Value >> 4);
+ break;
+ case 8:
+ Off = x + y * pBMP->BytesPerLine;
+ Value = *(pBMP->pData + Off);
+ break;
+ case 16:
+ Off = (x << 1) + y * pBMP->BytesPerLine;
+ Value = *(pBMP->pData + Off) | (*(pBMP->pData + Off + 1) << 8);
+ break;
+ default:
+ Value = 0;
+ }
+ return Value;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_GetClientRect.c b/User/system/lib/lcd/gui/Core/GUI_GetClientRect.c
new file mode 100644
index 0000000..8ce6c2b
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_GetClientRect.c
@@ -0,0 +1,51 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_GetClientRect.c
+Purpose : Implementation of GUI_GetClientRect
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI_Protected.h"
+#include "GUIDebug.h"
+
+#if GUI_WINSUPPORT
+ #include "WM.h"
+#endif
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_GetClientRect
+*/
+void GUI_GetClientRect(GUI_RECT* pRect) {
+ if (!pRect)
+ return;
+ #if GUI_WINSUPPORT
+ WM_GetClientRect(pRect);
+ #else
+ pRect->x0 = 0;
+ pRect->y0 = 0;
+ pRect->x1 = LCD_GET_XSIZE();
+ pRect->y1 = LCD_GET_YSIZE();
+ #endif
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_GetColor.c b/User/system/lib/lcd/gui/Core/GUI_GetColor.c
new file mode 100644
index 0000000..988d11c
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_GetColor.c
@@ -0,0 +1,76 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_GetColor.C
+Purpose : Implementation of different GUI_GetColor routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_GetBkColorIndex
+*/
+int GUI_GetBkColorIndex(void) {
+ int r;
+ GUI_LOCK();
+ r = LCD_GetBkColorIndex();
+ GUI_UNLOCK();
+ return r;
+}
+
+/*********************************************************************
+*
+* GUI_GetBkColor
+*/
+GUI_COLOR GUI_GetBkColor(void) {
+ GUI_COLOR r;
+ GUI_LOCK();
+ r = LCD_Index2Color(LCD_GetBkColorIndex());
+ GUI_UNLOCK();
+ return r;
+}
+
+/*********************************************************************
+*
+* GUI_GetColorIndex
+*/
+int GUI_GetColorIndex(void) {
+ int r;
+ GUI_LOCK();
+ r = LCD_GetColorIndex();
+ GUI_UNLOCK();
+ return r;
+}
+
+/*********************************************************************
+*
+* GUI_GetColor
+*/
+GUI_COLOR GUI_GetColor(void) {
+ GUI_COLOR r;
+ GUI_LOCK();
+ r = LCD_Index2Color(LCD_GetColorIndex());
+ GUI_UNLOCK();
+ return r;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_GetDispPos.c b/User/system/lib/lcd/gui/Core/GUI_GetDispPos.c
new file mode 100644
index 0000000..e185498
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_GetDispPos.c
@@ -0,0 +1,58 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_GetDispPos.c
+Purpose : Implementation of optional routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_GetDispPosX
+*
+* Purpose:
+* Return X-component of current display position
+*/
+int GUI_GetDispPosX(void) {
+ int r;
+ GUI_LOCK();
+ r = GUI_Context.DispPosX;
+ GUI_UNLOCK();
+ return r;
+}
+
+/*********************************************************************
+*
+* GUI_GetDispPosY
+*
+* Purpose:
+* Return Y-component of current display position
+*/
+int GUI_GetDispPosY(void) {
+ int r;
+ GUI_LOCK();
+ r = GUI_Context.DispPosY;
+ GUI_UNLOCK();
+ return r;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_GetFont.c b/User/system/lib/lcd/gui/Core/GUI_GetFont.c
new file mode 100644
index 0000000..b481a23
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_GetFont.c
@@ -0,0 +1,40 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_GetFont.c
+Purpose : Implementation of optional routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_GetFont
+*/
+const GUI_FONT GUI_UNI_PTR* GUI_GetFont(void) {
+ const GUI_FONT GUI_UNI_PTR * r;
+ GUI_LOCK();
+ r = GUI_Context.pAFont;
+ GUI_UNLOCK();
+ return r;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_GetFontInfo.c b/User/system/lib/lcd/gui/Core/GUI_GetFontInfo.c
new file mode 100644
index 0000000..fff4402
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_GetFontInfo.c
@@ -0,0 +1,49 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_GetFontInfo.C
+Purpose : Get GUI_FONTINFO structure
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+#include
+
+#if GUI_COMPILER_SUPPORTS_FP
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_GetFontInfo
+*/
+void GUI_GetFontInfo(const GUI_FONT GUI_UNI_PTR * pFont, GUI_FONTINFO * pFontInfo) {
+ GUI_LOCK();
+ if (pFont == NULL) {
+ pFont = GUI_Context.pAFont;
+ }
+ pFontInfo->Baseline = pFont->Baseline;
+ pFontInfo->CHeight = pFont->CHeight;
+ pFontInfo->LHeight = pFont->LHeight;
+ pFont->pfGetFontInfo(pFont, pFontInfo);
+ GUI_UNLOCK();
+}
+
+#endif
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_GetFontSizeY.c b/User/system/lib/lcd/gui/Core/GUI_GetFontSizeY.c
new file mode 100644
index 0000000..d0ae9bd
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_GetFontSizeY.c
@@ -0,0 +1,40 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_GetFontSizeY.c
+Purpose : Implementation of optional routine
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_GetFontSizeY
+*/
+int GUI_GetFontSizeY(void) {
+ int r;
+ GUI_LOCK();
+ r = GUI__GetFontSizeY();
+ GUI_UNLOCK();
+ return r;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_GetLineStyle.c b/User/system/lib/lcd/gui/Core/GUI_GetLineStyle.c
new file mode 100644
index 0000000..e8f814a
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_GetLineStyle.c
@@ -0,0 +1,40 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_GetLineStyle.c
+Purpose : Implementation of optional routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_GetLineStyle
+*/
+U8 GUI_GetLineStyle(void) {
+ U8 r;
+ GUI_LOCK();
+ r = GUI_Context.LineStyle;
+ GUI_UNLOCK();
+ return r;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_GetStringDistX.c b/User/system/lib/lcd/gui/Core/GUI_GetStringDistX.c
new file mode 100644
index 0000000..391a11a
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_GetStringDistX.c
@@ -0,0 +1,37 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_GetStringDistX.C
+Purpose : Implementation of optional routine
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+#include
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_GetStringDistX
+*/
+int GUI_GetStringDistX(const char GUI_UNI_PTR * s) {
+ return GUI__GetLineDistX(s, GUI__strlen(s));
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_GetTextAlign.c b/User/system/lib/lcd/gui/Core/GUI_GetTextAlign.c
new file mode 100644
index 0000000..36752b2
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_GetTextAlign.c
@@ -0,0 +1,40 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_GetTextAlign.c
+Purpose : Implementation of optional routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_GetTextAlign
+*/
+int GUI_GetTextAlign(void) {
+ int r;
+ GUI_LOCK();
+ r = GUI_Context.TextAlign;
+ GUI_UNLOCK();
+ return r;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_GetTextExtend.c b/User/system/lib/lcd/gui/Core/GUI_GetTextExtend.c
new file mode 100644
index 0000000..5258c8e
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_GetTextExtend.c
@@ -0,0 +1,64 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_GetTextExtend.c
+Purpose : Implementation of GUI_GetTextExtend
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_GetTextExtend
+*/
+void GUI_GetTextExtend(GUI_RECT* pRect, const char GUI_UNI_PTR * s, int MaxNumChars) {
+ int xMax = 0;
+ int NumLines = 0;
+ int LineSizeX = 0;
+ U16 Char;
+ pRect->x0 = GUI_Context.DispPosX;
+ pRect->y0 = GUI_Context.DispPosY;
+ while (MaxNumChars--) {
+ Char = GUI_UC__GetCharCodeInc(&s);
+ if ((Char == '\n') || (Char == 0)) {
+ if (LineSizeX > xMax) {
+ xMax = LineSizeX;
+ }
+ LineSizeX = 0;
+ NumLines++;
+ if (!Char) {
+ break;
+ }
+ } else {
+ LineSizeX += GUI_GetCharDistX(Char);
+ }
+ }
+ if (LineSizeX > xMax) {
+ xMax = LineSizeX;
+ }
+ if (!NumLines) {
+ NumLines = 1;
+ }
+ pRect->x1 = pRect->x0 + xMax - 1;
+ pRect->y1 = pRect->y0 + GUI__GetFontSizeY() * NumLines - 1;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_GetTextMode.c b/User/system/lib/lcd/gui/Core/GUI_GetTextMode.c
new file mode 100644
index 0000000..3cab5e4
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_GetTextMode.c
@@ -0,0 +1,40 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_GetTextMode.c
+Purpose : Implementation of optional routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_GetTextMode
+*/
+int GUI_GetTextMode(void) {
+ int r;
+ GUI_LOCK();
+ r = GUI_Context.TextMode;
+ GUI_UNLOCK();
+ return r;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_GetVersionString.c b/User/system/lib/lcd/gui/Core/GUI_GetVersionString.c
new file mode 100644
index 0000000..eb0359c
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_GetVersionString.c
@@ -0,0 +1,52 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_GetVersionString.c
+Purpose : Version information functions
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Static data
+*
+**********************************************************************
+*/
+
+static char _acVersion[] = {"X.XX\0\0"};
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_GetVersionString
+*/
+const char* GUI_GetVersionString(void) {
+ _acVersion[0] = '0' + (GUI_VERSION / 10000);
+ _acVersion[2] = '0' + (GUI_VERSION / 1000) % 10;
+ _acVersion[3] = '0' + (GUI_VERSION / 100) % 10;
+ #if GUI_VERSION%100
+ _acVersion[4] = 'a' - 1 + (GUI_VERSION % 100);
+ #endif
+ return _acVersion;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_GetYSizeOfFont.c b/User/system/lib/lcd/gui/Core/GUI_GetYSizeOfFont.c
new file mode 100644
index 0000000..0b7f3d7
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_GetYSizeOfFont.c
@@ -0,0 +1,44 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_GetYSizeOfFont.c
+Purpose : Implementation of optional routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_GetYSizeOfFont
+*/
+int GUI_GetYSizeOfFont(const GUI_FONT GUI_UNI_PTR * pFont) {
+ return pFont->YSize * pFont->YMag;
+}
+
+/*********************************************************************
+*
+* GUI_GetYDistOfFont
+*/
+int GUI_GetYDistOfFont(const GUI_FONT GUI_UNI_PTR * pFont) {
+ return pFont->YDist * pFont->YMag;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_Goto.c b/User/system/lib/lcd/gui/Core/GUI_Goto.c
new file mode 100644
index 0000000..975eb19
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_Goto.c
@@ -0,0 +1,92 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_Goto.c
+Purpose : Implementation of GUI_Goto... routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include
+#include
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _GotoY
+*/
+static char _GotoY(int y) {
+ GUI_Context.DispPosY = y;
+ return 0;
+}
+
+/*********************************************************************
+*
+* _GotoX
+*/
+static char _GotoX(int x) {
+ GUI_Context.DispPosX = x;
+ return 0;
+}
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_GotoY
+*/
+char GUI_GotoY(int y) {
+ char r;
+ GUI_LOCK();
+ r = _GotoY(y);
+ GUI_UNLOCK();
+ return r;
+}
+
+/*********************************************************************
+*
+* GUI_GotoX
+*/
+char GUI_GotoX(int x) {
+ char r;
+ GUI_LOCK();
+ r = _GotoX(x);
+ GUI_UNLOCK();
+ return r;
+}
+
+/*********************************************************************
+*
+* GUI_GotoXY
+*/
+char GUI_GotoXY(int x, int y) {
+ char r;
+ GUI_LOCK();
+ r = _GotoX(x);
+ r |= _GotoY(y);
+ GUI_UNLOCK();
+ return r;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_InitLUT.c b/User/system/lib/lcd/gui/Core/GUI_InitLUT.c
new file mode 100644
index 0000000..5a87efd
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_InitLUT.c
@@ -0,0 +1,38 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_InitLUT.c
+Purpose : Implementation of GUI_InitLUT
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_InitLUT
+*/
+void GUI_InitLUT(void) {
+ GUI_LOCK();
+ LCD_InitLUT();
+ GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_InvertRect.c b/User/system/lib/lcd/gui/Core/GUI_InvertRect.c
new file mode 100644
index 0000000..e3cef40
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_InvertRect.c
@@ -0,0 +1,56 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_InvertRect.C
+Purpose : Implementation file for GUI_InvertRect
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_InvertRect
+*/
+void GUI_InvertRect(int x0, int y0, int x1, int y1) {
+ GUI_DRAWMODE PrevDraw;
+ #if (GUI_WINSUPPORT)
+ GUI_RECT r;
+ #endif
+ GUI_LOCK();
+ PrevDraw = GUI_SetDrawMode(GUI_DRAWMODE_XOR);
+ #if (GUI_WINSUPPORT)
+ WM_ADDORG(x0, y0);
+ WM_ADDORG(x1, y1);
+ r.x0 = x0;
+ r.x1 = x1;
+ r.y0 = y0;
+ r.y1 = y1;
+ WM_ITERATE_START(&r); {
+ #endif
+ LCD_FillRect(x0, y0, x1, y1);
+ #if (GUI_WINSUPPORT)
+ } WM_ITERATE_END();
+ #endif
+ GUI_SetDrawMode(PrevDraw);
+ GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_IsInFont.c b/User/system/lib/lcd/gui/Core/GUI_IsInFont.c
new file mode 100644
index 0000000..7ff850f
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_IsInFont.c
@@ -0,0 +1,40 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_IsInFont.c
+Purpose : Implementation of optional routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_IsInFont
+*/
+char GUI_IsInFont(const GUI_FONT GUI_UNI_PTR *pFont, U16 c) {
+ if (pFont == NULL) {
+ pFont = GUI_Context.pAFont;
+ }
+ return pFont->pfIsInFont(pFont, c);
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_Log.c b/User/system/lib/lcd/gui/Core/GUI_Log.c
new file mode 100644
index 0000000..4e88f56
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_Log.c
@@ -0,0 +1,126 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_Log.C
+Purpose : Logging (used only at higher debug levels)
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+#include
+#include "GUI_Protected.h"
+#include "GUI_X.h"
+
+/*********************************************************************
+*
+* defines
+*
+**********************************************************************
+*/
+
+#define MAXLEN 50
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _CopyString
+*/
+static void _CopyString(char* d, const char* s, int MaxLen) {
+ while ((MaxLen > 0) && *s) {
+ *d++ = *s++;
+ MaxLen--;
+ }
+ *d = 0;
+}
+
+/*********************************************************************
+*
+* Public code
+*
+* Note: These routines are needed only in higher debug levels.
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_Log
+*/
+void GUI_Log(const char *s) {
+ GUI_X_Log(s);
+}
+
+/*********************************************************************
+*
+* GUI_Log1
+*/
+void GUI_Log1(const char *s, int p0) {
+ char ac[MAXLEN + 10];
+ char* sOut = ac;
+ _CopyString(ac, s, MAXLEN);
+ sOut += strlen(sOut);
+ GUI__AddSpaceHex(p0, 8, &sOut);
+ GUI_Log(ac);
+}
+
+/*********************************************************************
+*
+* GUI_Log2
+*/
+void GUI_Log2(const char *s, int p0, int p1) {
+ char ac[MAXLEN + 20];
+ char* sOut = ac;
+ _CopyString(ac, s, MAXLEN);
+ sOut += strlen(sOut);
+ GUI__AddSpaceHex(p0, 8, &sOut);
+ GUI__AddSpaceHex(p1, 8, &sOut);
+ GUI_Log(ac);
+}
+
+/*********************************************************************
+*
+* GUI_Log3
+*/
+void GUI_Log3(const char *s, int p0, int p1, int p2) {
+ char ac[MAXLEN + 30];
+ char* sOut = ac;
+ _CopyString(ac, s, MAXLEN);
+ sOut += strlen(sOut);
+ GUI__AddSpaceHex(p0, 8, &sOut);
+ GUI__AddSpaceHex(p1, 8, &sOut);
+ GUI__AddSpaceHex(p2, 8, &sOut);
+ GUI_Log(ac);
+}
+
+/*********************************************************************
+*
+* GUI_Log4
+*/
+void GUI_Log4(const char *s, int p0, int p1, int p2, int p3) {
+ char ac[MAXLEN + 40];
+ char* sOut = ac;
+ _CopyString(ac, s, MAXLEN);
+ sOut += strlen(sOut);
+ GUI__AddSpaceHex(p0, 8, &sOut);
+ GUI__AddSpaceHex(p1, 8, &sOut);
+ GUI__AddSpaceHex(p2, 8, &sOut);
+ GUI__AddSpaceHex(p3, 8, &sOut);
+ GUI_Log(ac);
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_MOUSE.c b/User/system/lib/lcd/gui/Core/GUI_MOUSE.c
new file mode 100644
index 0000000..98e5da3
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_MOUSE.c
@@ -0,0 +1,60 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_MOUSE.C
+Purpose : Generic mouse routines
+----------------------------------------------------------------------
+*/
+
+#include /* memcmp */
+#include "LCD_Private.h" /* private modul definitions & config */
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Static data
+*
+**********************************************************************
+*/
+
+static GUI_PID_STATE _State;
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_MOUSE_GetState
+*/
+int GUI_MOUSE_GetState(GUI_PID_STATE *pState) {
+ *pState = _State;
+ return (_State.Pressed != 0) ? 1 : 0;
+}
+
+/*********************************************************************
+*
+* GUI_MOUSE_StoreState
+*/
+void GUI_MOUSE_StoreState(const GUI_PID_STATE *pState) {
+ if (memcmp(pState, &_State, sizeof(_State))) {
+ _State = *pState;
+ GUI_PID_StoreState(pState);
+ }
+}
+
+/*************************** End of file ****************************/
+
diff --git a/User/system/lib/lcd/gui/Core/GUI_MOUSE_DriverPS2.c b/User/system/lib/lcd/gui/Core/GUI_MOUSE_DriverPS2.c
new file mode 100644
index 0000000..682e8ba
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_MOUSE_DriverPS2.c
@@ -0,0 +1,135 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUITOUCH.C
+Purpose : Touch screen manager
+----------------------------------------------------------------------
+This module handles the touch screen. It is configured in the file
+GUITouch.conf.h (Should be located in the Config\ directory).
+----------------------------------------------------------------------
+*/
+
+#include "LCD_Private.h" /* private modul definitions & config */
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Static data
+*
+**********************************************************************
+*/
+
+static int _ScreenX = 0; /* x-pos */
+static int _ScreenY = 0; /* y-pos */
+static int _NumBytesInBuffer = 0; /* bytes in rx buffer */
+static U8 _Buttons = 0; /* button status */
+static U8 _abInBuffer[3]; /* mouse rx buffer */
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _EvaPacket
+*
+* Purpose:
+* Process data packet from mouse:
+*
+* | D7 D6 D5 D4 D3 D2 D1 D0
+* ----------+----------------------------------------------
+* 1st byte | -- -- Y- X- 1 -- LB RB
+* 2nd byte | X7 X6 X5 X4 X3 X2 X1 X0
+* 3rd byte | Y7 Y6 Y5 Y4 Y3 Y2 Y1 Y0
+*/
+static void _EvaPacket(void) {
+ char a;
+ GUI_PID_STATE State;
+ _Buttons = _abInBuffer[0] & 0x03;
+ a = _abInBuffer[1];
+ /* test x move sign. */
+ if(_abInBuffer[0] & 0x10) {
+ a=-a;
+ _ScreenX -= a;
+ } /* direction is negative, move left */
+ else {
+ _ScreenX += a;
+ }
+ a = _abInBuffer[2];
+ /* test y move sign. */
+ if(_abInBuffer[0] & 0x20) {
+ a=-a;
+ _ScreenY += a;
+ } /* direction is negative, move down */ else {
+ _ScreenY -= a;
+ }
+ /* check min/max positions */
+ if (_ScreenX < 0) {
+ _ScreenX = 0;
+ } else if (_ScreenX > LCD_XSIZE-1) {
+ _ScreenX = LCD_XSIZE-1;
+ } if (_ScreenY < 0) {
+ _ScreenY = 0;
+ } else if (_ScreenY > LCD_YSIZE-1) {
+ _ScreenY = LCD_YSIZE-1;
+ }
+ /* signal new mouse data */
+ State.x = _ScreenX;
+ State.y = _ScreenY;
+ State.Pressed = _Buttons;
+ GUI_MOUSE_StoreState(&State);
+}
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_MOUSE_DRIVER_PS2_OnRx
+*
+* Purpose:
+* Mouse receive interrupt handler. The PS2 mouse interrupt gets
+* in three bytes from the mouse, then wakes up the mouse LSR.
+*/
+void GUI_MOUSE_DRIVER_PS2_OnRx(unsigned char Data) {
+ if (!_NumBytesInBuffer) {
+ /* check for start frame */
+ if ((Data & 0x0c) == 0x08) {
+ _abInBuffer[0] = Data;
+ _NumBytesInBuffer++;
+ }
+ } else {
+ _abInBuffer[_NumBytesInBuffer] = Data;
+ _NumBytesInBuffer++;
+ if (_NumBytesInBuffer >= 3) {
+ _EvaPacket();
+ _NumBytesInBuffer = 0;
+ }
+ }
+}
+
+/*********************************************************************
+*
+* GUI_MOUSE_DRIVER_PS2_Init
+*/
+void GUI_MOUSE_DRIVER_PS2_Init(void) {
+ _NumBytesInBuffer = 0;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_MergeRect.c b/User/system/lib/lcd/gui/Core/GUI_MergeRect.c
new file mode 100644
index 0000000..88caea5
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_MergeRect.c
@@ -0,0 +1,59 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_MergeRect.c
+Purpose : Implementation of GUI_MergeRect
+----------------------------------------------------------------------
+*/
+
+#include "GUI.h"
+#include "GUIDebug.h"
+
+/*********************************************************************
+*
+* Defines
+*
+**********************************************************************
+*/
+
+#define Min(v0,v1) ((v0>v1) ? v1 : v0)
+#define Max(v0,v1) ((v0>v1) ? v0 : v1)
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_MergeRect
+*
+* Purpose:
+* Calc smalles rectangles containing both rects.
+*/
+void GUI_MergeRect(GUI_RECT* pDest, const GUI_RECT* pr0, const GUI_RECT* pr1) {
+ if (pDest) {
+ if (pr0 && pr1) {
+ pDest->x0 = Min(pr0->x0, pr1->x0);
+ pDest->y0 = Min(pr0->y0, pr1->y0);
+ pDest->x1 = Max(pr0->x1, pr1->x1);
+ pDest->y1 = Max(pr0->y1, pr1->y1);
+ return;
+ }
+ *pDest = *(pr0 ? pr0 : pr1);
+ }
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_MoveRect.c b/User/system/lib/lcd/gui/Core/GUI_MoveRect.c
new file mode 100644
index 0000000..1c8aac5
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_MoveRect.c
@@ -0,0 +1,41 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_MoveRect.c
+Purpose : Implementation of GUI_MoveRect
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_MoveRect
+*/
+void GUI_MoveRect(GUI_RECT *pRect, int dx, int dy) {
+ if (pRect) {
+ pRect->x0 += dx;
+ pRect->x1 += dx;
+ pRect->y0 += dy;
+ pRect->y1 += dy;
+ }
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_OnKey.c b/User/system/lib/lcd/gui/Core/GUI_OnKey.c
new file mode 100644
index 0000000..d64bd70
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_OnKey.c
@@ -0,0 +1,147 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_OnKey.c
+Purpose : Implementation of GUI_StoreKeyMsg
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+#if GUI_WINSUPPORT
+ #include "WM.h"
+#endif
+
+/*********************************************************************
+*
+* Static data
+*
+**********************************************************************
+*/
+
+#if GUI_WINSUPPORT
+
+static int _KeyMsgCnt;
+static struct {
+ int Key;
+ int PressedCnt;
+} _KeyMsg;
+
+#endif
+
+static int _Key;
+
+/*********************************************************************
+*
+* Public data
+*
+**********************************************************************
+*/
+
+GUI_KEY_MSG_HOOK* GUI_pfKeyMsgHook;
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_GetKey
+*/
+int GUI_GetKey(void) {
+ int r = _Key;
+ _Key = 0;
+ return r;
+}
+
+/*********************************************************************
+*
+* GUI_StoreKey
+*/
+void GUI_StoreKey(int Key) {
+ if (!_Key) {
+ _Key = Key;
+ }
+ GUI_X_SIGNAL_EVENT();
+}
+
+/*********************************************************************
+*
+* GUI_ClearKeyBuffer
+*/
+void GUI_ClearKeyBuffer(void) {
+ while (GUI_GetKey());
+}
+
+/*********************************************************************
+*
+* GUI_StoreKeyMsg
+*/
+void GUI_StoreKeyMsg(int Key, int PressedCnt) {
+ #if GUI_WINSUPPORT /* If 0, WM will not generate any code */
+ _KeyMsg.Key = Key;
+ _KeyMsg.PressedCnt = PressedCnt;
+ _KeyMsgCnt = 1;
+ GUI_X_SIGNAL_EVENT();
+ #else
+ GUI_USE_PARA(PressedCnt);
+ GUI_StoreKey(Key);
+ #endif
+}
+
+/*********************************************************************
+*
+* GUI_PollKeyMsg
+*/
+#if GUI_WINSUPPORT /* If 0, WM will not generate any code */
+int GUI_PollKeyMsg(void) {
+ int r = 0;
+ GUI_LOCK();
+ if (_KeyMsgCnt) {
+ int Key;
+ _KeyMsgCnt--;
+ Key = _KeyMsg.Key;
+ WM_OnKey(Key, _KeyMsg.PressedCnt);
+ if (_KeyMsg.PressedCnt == 1) {
+ GUI_StoreKey(Key);
+ }
+ r = 1; /* We have done something */
+ }
+ GUI_UNLOCK();
+ return r;
+}
+#endif
+
+/*********************************************************************
+*
+* GUI_SendKeyMsg
+*
+* Purpose:
+* Send the key to a window using the window manager (if available).
+* If no window is ready to take the input, we call the store routine
+* and wait for somebody to poll the buffer.
+*/
+void GUI_SendKeyMsg(int Key, int PressedCnt) {
+ #if GUI_WINSUPPORT /* If 0, WM will not generate any code */
+ if (!WM_OnKey(Key, PressedCnt)) {
+ GUI_StoreKeyMsg(Key, PressedCnt);
+ }
+ #else
+ GUI_StoreKeyMsg(Key, PressedCnt);
+ #endif
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_PID.c b/User/system/lib/lcd/gui/Core/GUI_PID.c
new file mode 100644
index 0000000..ed7c974
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_PID.c
@@ -0,0 +1,86 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_PID.C
+Purpose : PID (Pointer input device) management
+----------------------------------------------------------------------
+*/
+
+#include
+#include
+#include
+#include "LCD_Private.h" /* private modul definitions & config */
+#include "GUI_Protected.h"
+
+#if GUI_WINSUPPORT
+ #include "WM.h"
+#endif
+
+/*********************************************************************
+*
+* Static data
+*
+**********************************************************************
+*/
+
+static GUI_PID_STATE _State;
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _PID_Load
+*
+* Purpose:
+* If the window manager is available, write the function pointer for
+* the PID handler.
+*/
+static void _PID_Load(void) {
+ #if (GUI_WINSUPPORT)
+ WM_pfHandlePID = WM_HandlePID;
+ #endif
+}
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_PID_GetState
+*/
+int GUI_PID_GetState(GUI_PID_STATE *pState) {
+ *pState = _State;
+ return (pState->Pressed != 0) ? 1 : 0;
+}
+
+/*********************************************************************
+*
+* GUI_PID_StoreState
+*/
+void GUI_PID_StoreState(const GUI_PID_STATE *pState) {
+ _PID_Load();
+ if (memcmp(&_State, pState, sizeof(_State))) {
+ _State = *pState;
+ GUI_X_SIGNAL_EVENT();
+ }
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_Pen.c b/User/system/lib/lcd/gui/Core/GUI_Pen.c
new file mode 100644
index 0000000..615c3d6
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_Pen.c
@@ -0,0 +1,78 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_Pen.C
+Purpose : Getting / Setting pen attributes
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_GetPenSize
+*/
+U8 GUI_GetPenSize(void) {
+ U8 r;
+ GUI_LOCK();
+ r = GUI_Context.PenSize;
+ GUI_UNLOCK();
+ return r;
+}
+
+/*********************************************************************
+*
+* GUI_GetPenShape
+*/
+U8 GUI_GetPenShape(void) {
+ U8 r;
+ GUI_LOCK();
+ r = GUI_Context.PenShape;
+ GUI_UNLOCK();
+ return r;
+}
+
+/*********************************************************************
+*
+* GUI_SetPenSize
+*/
+U8 GUI_SetPenSize(U8 PenSize) {
+ U8 r;
+ GUI_LOCK();
+ r = GUI_Context.PenSize;
+ GUI_Context.PenSize = PenSize;
+ GUI_UNLOCK();
+ return r;
+}
+
+/*********************************************************************
+*
+* GUI_SetPenShape
+*/
+U8 GUI_SetPenShape(U8 PenShape) {
+ U8 r;
+ GUI_LOCK();
+ r = GUI_Context.PenShape;
+ GUI_Context.PenShape = PenShape;
+ GUI_UNLOCK();
+ return r;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_Private.h b/User/system/lib/lcd/gui/Core/GUI_Private.h
new file mode 100644
index 0000000..0cf3dc1
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_Private.h
@@ -0,0 +1,94 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_Private.h
+Purpose : GUI internal declarations
+---------------------------END-OF-HEADER------------------------------
+
+Attention : Do not modify this file ! If you do, you will not
+ be able do update to a later GUI version !
+
+*/
+
+#ifndef GUI_PRIVATE_H
+#define GUI_PRIVATE_H
+
+#include "GUI_Protected.h"
+#include "LCD_Private.h" /* Required because of LCD_PIXELINDEX, which depends on LCDConf */
+
+#if GUI_SUPPORT_DEVICES
+ #define LCDDEV_L0_Color2Index GUI_Context.pDeviceAPI->pfColor2Index
+ #define LCDDEV_L0_DrawBitmap GUI_Context.pDeviceAPI->pfDrawBitmap
+ #define LCDDEV_L0_DrawHLine GUI_Context.pDeviceAPI->pfDrawHLine
+ #define LCDDEV_L0_DrawVLine GUI_Context.pDeviceAPI->pfDrawVLine
+ #define LCDDEV_L0_DrawPixel GUI_Context.pDeviceAPI->pfDrawPixel
+ #define LCDDEV_L0_FillRect GUI_Context.pDeviceAPI->pfFillRect
+ #define LCDDEV_L0_GetPixel GUI_Context.pDeviceAPI->pfGetPixel
+ #define LCDDEV_L0_GetRect GUI_Context.pDeviceAPI->pfGetRect
+ #define LCDDEV_L0_GetPixelIndex GUI_Context.pDeviceAPI->pfGetPixelIndex
+ #define LCDDEV_L0_Index2Color GUI_Context.pDeviceAPI->pfIndex2Color
+ #define LCDDEV_L0_SetPixelIndex GUI_Context.pDeviceAPI->pfSetPixelIndex
+ #define LCDDEV_L0_XorPixel GUI_Context.pDeviceAPI->pfXorPixel
+#else
+ #define LCDDEV_L0_Color2Index LCD_L0_Color2Index
+ #define LCDDEV_L0_DrawBitmap LCD_L0_DrawBitmap
+ #define LCDDEV_L0_DrawHLine LCD_L0_DrawHLine
+ #define LCDDEV_L0_DrawVLine LCD_L0_DrawVLine
+ #define LCDDEV_L0_DrawPixel LCD_L0_DrawPixel
+ #define LCDDEV_L0_FillRect LCD_L0_FillRect
+ #define LCDDEV_L0_GetPixel LCD_L0_GetPixel
+ #define LCDDEV_L0_GetRect LCD_L0_GetRect
+ #define LCDDEV_L0_GetPixelIndex LCD_L0_GetPixelIndex
+ #define LCDDEV_L0_Index2Color LCD_L0_Index2Color
+ #define LCDDEV_L0_SetPixelIndex LCD_L0_SetPixelIndex
+ #define LCDDEV_L0_XorPixel LCD_L0_XorPixel
+#endif
+
+void LCD_L0_DrawBitmap (int x0, int y0, int xsize, int ysize,
+ int BitsPerPixel, int BytesPerLine,
+ const U8 GUI_UNI_PTR * pData, int Diff, const LCD_PIXELINDEX* pTrans);
+void LCD_L0_1_DrawBitmap (int x0, int y0, int xsize, int ysize,
+ int BitsPerPixel, int BytesPerLine,
+ const U8 GUI_UNI_PTR * pData, int Diff, const LCD_PIXELINDEX* pTrans);
+void LCD_L0_2_DrawBitmap (int x0, int y0, int xsize, int ysize,
+ int BitsPerPixel, int BytesPerLine,
+ const U8 GUI_UNI_PTR * pData, int Diff, const LCD_PIXELINDEX* pTrans);
+void LCD_L0_3_DrawBitmap (int x0, int y0, int xsize, int ysize,
+ int BitsPerPixel, int BytesPerLine,
+ const U8 GUI_UNI_PTR * pData, int Diff, const LCD_PIXELINDEX* pTrans);
+void LCD_L0_4_DrawBitmap (int x0, int y0, int xsize, int ysize,
+ int BitsPerPixel, int BytesPerLine,
+ const U8 GUI_UNI_PTR * pData, int Diff, const LCD_PIXELINDEX* pTrans);
+void LCD_L0_MAG_DrawBitmap(int x0, int y0, int xsize, int ysize,
+ int BitsPerPixel, int BytesPerLine,
+ const U8 GUI_UNI_PTR * pData, int Diff, const LCD_PIXELINDEX* pTrans);
+void LCD_L0_DELTA_DrawBitmap(int x0, int y0, int xsize, int ysize,
+ int BitsPerPixel, int BytesPerLine,
+ const U8 GUI_UNI_PTR * pData, int Diff, const LCD_PIXELINDEX* pTrans);
+
+LCD_PIXELINDEX* LCD_GetpPalConvTable(const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal);
+LCD_PIXELINDEX* LCD_GetpPalConvTableUncached(const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal);
+
+
+#define GUI_POS_AUTO -4095 /* Position value for auto-pos */
+
+#if GUI_SUPPORT_MEMDEV
+ void* GUI_MEMDEV__XY2PTR (int x,int y);
+ void* GUI_MEMDEV__XY2PTREx(GUI_MEMDEV* pDev, int x,int y);
+ void GUI_MEMDEV__WriteToActiveAt(GUI_MEMDEV_Handle hMem,int x, int y);
+#endif
+
+#endif /* ifdef GUI_H */
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_Protected.h b/User/system/lib/lcd/gui/Core/GUI_Protected.h
new file mode 100644
index 0000000..7ca0876
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_Protected.h
@@ -0,0 +1,404 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_Protected.h
+Purpose : GUI internal declarations
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#ifndef GUI_PROTECTED_H
+#define GUI_PROTECTED_H
+
+#include "GUI.h"
+#include "LCD_Protected.h"
+#include "GUIDebug.h"
+#if GUI_WINSUPPORT
+ #include "WM_GUI.h"
+#endif
+
+#if defined(__cplusplus)
+extern "C" { /* Make sure we have C-declarations in C++ programs */
+#endif
+
+/**********************************************************************
+*
+* Defaults for config switches
+*
+***********************************************************************
+
+ The config switches below do not affect the interface in GUI.h and
+ are therefor not required to be in GUI.h.
+*/
+
+/* Short address area.
+ For most compilers, this is "near" or "__near"
+ We do not use this except for some CPUs which we know to always have some
+ near memory, because the GUI_Context ans some other data will be declared
+ to be in this short address (near) memory area as it has a major effect
+ on performance.
+ Please define in GUIConf.h (if you want to use it)
+*/
+#ifndef GUI_SADDR
+ #define GUI_SADDR
+#endif
+
+#ifndef GUI_DEFAULT_FONT
+ #define GUI_DEFAULT_FONT &GUI_Font6x8
+#endif
+
+#ifndef GUI_DEFAULT_CURSOR
+ #define GUI_DEFAULT_CURSOR &GUI_CursorArrowM
+#endif
+
+#ifndef GUI_DEFAULT_BKCOLOR
+ #define GUI_DEFAULT_BKCOLOR GUI_BLACK
+#endif
+
+#ifndef GUI_DEFAULT_COLOR
+ #define GUI_DEFAULT_COLOR GUI_WHITE
+#endif
+
+#ifndef GUI_X_SIGNAL_EVENT
+ #define GUI_X_SIGNAL_EVENT()
+#endif
+
+#ifndef GUI_X_WAIT_EVENT
+ #define GUI_X_WAIT_EVENT() GUI_X_ExecIdle()
+#endif
+
+
+/* *********************************
+ * *
+ * Angles *
+ * *
+ *********************************
+*/
+
+#define GUI_45DEG 512
+#define GUI_90DEG (2*GUI_45DEG)
+#define GUI_180DEG (4*GUI_45DEG)
+#define GUI_360DEG (8*GUI_45DEG)
+
+
+
+
+
+/*****************************************************
+*
+* Locking checks
+*
+******************************************************
+*/
+
+#if defined (WIN32) && defined (_DEBUG) && GUI_OS
+ #define GUI_ASSERT_LOCK() GUITASK_AssertLock()
+ #define GUI_ASSERT_NO_LOCK() GUITASK_AssertNoLock()
+ void GUITASK_AssertLock(void);
+ void GUITASK_AssertNoLock(void);
+#else
+ #define GUI_ASSERT_LOCK()
+ #define GUI_ASSERT_NO_LOCK()
+#endif
+
+/*****************************************************
+*
+* Usage internals
+*
+******************************************************
+*/
+
+typedef enum { GUI_WRAPMODE_NONE, GUI_WRAPMODE_WORD, GUI_WRAPMODE_CHAR } GUI_WRAPMODE;
+
+typedef GUI_HMEM GUI_USAGE_Handle;
+typedef struct tsUSAGE_APIList tUSAGE_APIList;
+typedef struct GUI_Usage GUI_USAGE;
+#define GUI_USAGE_h GUI_USAGE_Handle
+
+
+
+typedef GUI_USAGE_h tUSAGE_CreateCompatible(GUI_USAGE* p);
+typedef void tUSAGE_AddPixel (GUI_USAGE* p, int x, int y);
+typedef void tUSAGE_AddHLine (GUI_USAGE* p, int x0, int y0, int len);
+typedef void tUSAGE_Clear (GUI_USAGE* p);
+typedef void tUSAGE_Delete (GUI_USAGE_h h);
+typedef int tUSAGE_GetNextDirty (GUI_USAGE* p, int *pxOff, int yOff);
+#define GUI_USAGE_H2P(h) ((GUI_USAGE*)GUI_ALLOC_h2p(h))
+
+
+void GUI_USAGE_DecUseCnt(GUI_USAGE_Handle hUsage);
+
+GUI_USAGE_Handle GUI_USAGE_BM_Create(int x0, int y0, int xsize, int ysize, int Flags);
+void GUI_USAGE_Select(GUI_USAGE_Handle hUsage);
+void GUI_USAGE_AddRect(GUI_USAGE* pUsage, int x0, int y0, int xSize, int ySize);
+#define GUI_USAGE_AddPixel(p, x,y) p->pAPI->pfAddPixel(p,x,y)
+#define GUI_USAGE_AddHLine(p,x,y,len) p->pAPI->pfAddHLine(p,x,y,len)
+#define GUI_USAGE_Clear(p) p->pAPI->pfClear(p)
+#define GUI_USAGE_Delete(p) p->pAPI->pfDelete(p)
+#define GUI_USAGE_GetNextDirty(p,pxOff, yOff) p->pAPI->pfGetNextDirty(p,pxOff, yOff)
+
+struct tsUSAGE_APIList {
+ tUSAGE_AddPixel* pfAddPixel;
+ tUSAGE_AddHLine* pfAddHLine;
+ tUSAGE_Clear* pfClear;
+ tUSAGE_CreateCompatible* pfCreateCompatible;
+ tUSAGE_Delete* pfDelete;
+ tUSAGE_GetNextDirty* pfGetNextDirty;
+} ;
+
+struct GUI_Usage {
+ I16P x0, y0, XSize, YSize;
+ const tUSAGE_APIList *pAPI;
+ I16 UseCnt;
+};
+
+/*****************************************************
+*
+* GUI_MEMDEV
+*
+******************************************************
+*/
+
+#if GUI_SUPPORT_MEMDEV
+ typedef struct /*GUI_MEMDEV*/ {
+ I16P x0, y0, XSize, YSize;
+ int NumColors;
+ unsigned BytesPerLine;
+ unsigned BitsPerPixel;
+ unsigned LayerIndex;
+ GUI_HMEM hUsage;
+ tLCDDEV_Color2Index* pfColor2Index;
+ tLCDDEV_Index2Color* pfIndex2Color;
+ tLCDDEV_GetIndexMask* pfGetIndexMask;
+ const tLCDDEV_APIList* pAPIList;
+ } GUI_MEMDEV;
+
+ #define GUI_MEMDEV_H2P(h) ((GUI_MEMDEV*)GUI_ALLOC_h2p(h))
+
+ void GUI_MEMDEV__CopyFromLCD (GUI_MEMDEV_Handle hMem);
+ void GUI_MEMDEV__GetRect (GUI_RECT* pRect);
+ unsigned GUI_MEMDEV__Color2Index (LCD_COLOR Color);
+ LCD_COLOR GUI_MEMDEV__Index2Color (int Index);
+ unsigned int GUI_MEMDEV__GetIndexMask(void);
+
+ GUI_MEMDEV_Handle GUI_MEMDEV__CreateFixed(int x0, int y0, int xsize, int ysize, int Flags
+ ,const tLCDDEV_APIList * pMemDevAPI
+ ,tLCDDEV_Color2Index* pfColor2Index
+ ,tLCDDEV_Index2Color* pfIndex2Color
+ ,tLCDDEV_GetIndexMask* pfGetIndexMask);
+
+#endif
+
+/*******************************************************************
+*
+* LCD_HL_ level defines
+*
+********************************************************************
+*/
+
+#if GUI_SUPPORT_AA
+ #define LCD_HL_DrawHLine GUI_Context.pLCD_HL->pfDrawHLine
+ #define LCD_HL_DrawPixel GUI_Context.pLCD_HL->pfDrawPixel
+#else
+ #define LCD_HL_DrawHLine LCD_DrawHLine
+ #define LCD_HL_DrawPixel LCD_DrawPixel
+#endif
+
+
+/*********************************************************************
+*
+* Helper functions
+*
+***********************************************************************
+*/
+
+#define GUI_ZEROINIT(Obj) GUI_MEMSET(Obj, 0, sizeof(Obj))
+int GUI_cos(int angle);
+int GUI_sin(int angle);
+void GL_DrawLine1(int x0, int y0, int x1, int y1);
+extern const U32 GUI_Pow10[10];
+
+/* GUIAALib.c --- direct anti-aliased drawing */
+int GUI_AA_Init(int x0, int x1);
+int GUI_AA_Init_HiRes(int x0, int x1);
+void GUI_AA_Exit(void);
+I16 GUI_AA_HiRes2Pixel(int HiRes);
+
+void GL_FillCircleAA_HiRes(int x0, int y0, int r);
+
+/* Conversion routines */
+void GUI_AddHex (U32 v, U8 Len, char**ps);
+void GUI_AddBin (U32 v, U8 Len, char**ps);
+void GUI_AddDecMin (I32 v, char**ps);
+void GUI_AddDec (I32 v, U8 Len, char**ps);
+void GUI_AddDecShift(I32 v, U8 Len, U8 Shift, char**ps);
+long GUI_AddSign (long v, char**ps);
+int GUI_Long2Len (I32 v);
+
+#define GUI_UC__GetCharSize(sText) GUI_Context.pUC_API->pfGetCharSize(sText)
+#define GUI_UC__GetCharCode(sText) GUI_Context.pUC_API->pfGetCharCode(sText)
+
+int GUI_UC__CalcSizeOfChar (U16 Char);
+U16 GUI_UC__GetCharCodeInc (const char GUI_UNI_PTR ** ps);
+int GUI_UC__NumChars2NumBytes(const char GUI_UNI_PTR * s, int NumChars);
+int GUI_UC__NumBytes2NumChars(const char GUI_UNI_PTR * s, int NumBytes);
+
+int GUI__GetLineNumChars (const char GUI_UNI_PTR *s, int MaxNumChars);
+int GUI__GetNumChars (const char GUI_UNI_PTR *s);
+int GUI__GetLineDistX (const char GUI_UNI_PTR *s, int Len);
+int GUI__GetFontSizeY (void);
+int GUI__HandleEOLine (const char GUI_UNI_PTR **ps);
+void GUI__DispLine (const char GUI_UNI_PTR *s, int Len, const GUI_RECT* pr);
+void GUI__AddSpaceHex (U32 v, U8 Len, char**ps);
+void GUI__CalcTextRect (const char GUI_UNI_PTR* pText, const GUI_RECT* pTextRectIn, GUI_RECT* pTextRectOut, int TextAlign);
+
+int GUI__WrapGetNumCharsDisp (const char GUI_UNI_PTR * pText, int xSize, GUI_WRAPMODE WrapMode);
+int GUI__WrapGetNumCharsToNextLine (const char GUI_UNI_PTR * pText, int xSize, GUI_WRAPMODE WrapMode);
+int GUI__WrapGetNumBytesToNextLine (const char GUI_UNI_PTR * pText, int xSize, GUI_WRAPMODE WrapMode);
+void GUI__memset (U8 * p, U8 Fill, int NumBytes);
+void GUI__memset16 (U16* p, U16 Fill, int NumWords);
+int GUI__strlen (const char GUI_UNI_PTR * s);
+int GUI__strcmp (const char GUI_UNI_PTR * s0, const char GUI_UNI_PTR * s1);
+int GUI__strcmp_hp (GUI_HMEM hs0, const char GUI_UNI_PTR * s1);
+
+/* Reading data routines */
+U16 GUI__Read16(const U8 ** ppData);
+U32 GUI__Read32(const U8 ** ppData);
+
+/*********************************************************************
+*
+* 2d - GL
+*
+**********************************************************************
+*/
+
+void GL_DispChar (U16 c);
+void GL_DrawArc (int x0, int y0, int rx, int ry, int a0, int a1);
+void GL_DrawBitmap (const GUI_BITMAP GUI_UNI_PTR * pBM, int x0, int y0);
+void GL_DrawCircle (int x0, int y0, int r);
+void GL_DrawEllipse (int x0, int y0, int rx, int ry);
+void GL_DrawHLine (int y0, int x0, int x1);
+void GL_DrawPolygon (const GUI_POINT* pPoints, int NumPoints, int x0, int y0);
+void GL_DrawPoint (int x, int y);
+void GL_DrawLineRel (int dx, int dy);
+void GL_DrawLineTo (int x, int y);
+void GL_DrawLine (int x0, int y0, int x1, int y1);
+void GL_MoveTo (int x, int y);
+void GL_FillCircle (int x0, int y0, int r);
+void GL_FillCircleAA (int x0, int y0, int r);
+void GL_FillEllipse (int x0, int y0, int rx, int ry);
+void GL_FillPolygon (const GUI_POINT* pPoints, int NumPoints, int x0, int y0);
+void GL_SetDefault (void);
+
+/************************************************************
+*
+* Callback pointers for dynamic linkage
+*
+*************************************************************
+Dynamic linkage pointers reduces configuration hassles.
+*/
+typedef int GUI_tfTimer(void);
+typedef char GUI_CURSOR_tfTempHide (const GUI_RECT* pRect);
+typedef void GUI_CURSOR_tfTempUnhide(void);
+typedef int WM_tfHandlePID(void);
+
+
+/************************************************************
+*
+* Cursors
+*
+*************************************************************
+*/
+
+extern GUI_CONST_STORAGE unsigned char GUI_Pixels_ArrowS[45];
+extern GUI_CONST_STORAGE unsigned char GUI_Pixels_ArrowM[60];
+extern GUI_CONST_STORAGE unsigned char GUI_Pixels_ArrowL[150];
+extern GUI_CONST_STORAGE unsigned char GUI_Pixels_CrossS[33];
+extern GUI_CONST_STORAGE unsigned char GUI_Pixels_CrossM[126];
+extern GUI_CONST_STORAGE unsigned char GUI_Pixels_CrossL[248];
+extern GUI_CONST_STORAGE unsigned char GUI_PixelsHeaderM[5 * 17];
+
+
+extern GUI_CONST_STORAGE GUI_LOGPALETTE GUI_CursorPal;
+extern GUI_CONST_STORAGE GUI_LOGPALETTE GUI_CursorPalI;
+
+/************************************************************
+*
+* Text rotation
+*
+*************************************************************
+*/
+
+extern GUI_RECT GUI_RectDispString; /* Used by LCD_Rotate...() and GUI_DispStringInRect() */
+
+/*********************************************************************
+*
+* Bitmap related functions
+*
+**********************************************************************
+*/
+
+int GUI_GetBitmapPixelIndex(const GUI_BITMAP GUI_UNI_PTR * pBMP, unsigned x, unsigned y);
+GUI_COLOR GUI_GetBitmapPixelColor(const GUI_BITMAP GUI_UNI_PTR * pBMP, unsigned x, unsigned y);
+
+#if defined(__cplusplus)
+}
+#endif
+
+#endif /* Avoid multiple inclusion */
+
+/************************************************************
+*
+* GUI_EXTERN declartions/definitions
+*
+*************************************************************
+*/
+
+#ifdef GL_CORE_C
+ #define GUI_EXTERN
+#else
+ #if defined(__cplusplus)
+ #define GUI_EXTERN extern "C"
+ #else
+ #define GUI_EXTERN extern
+ #endif
+#endif
+
+GUI_EXTERN GUI_SADDR GUI_CONTEXT GUI_Context; /* Thread wide globals */
+GUI_EXTERN GUI_SADDR char GUI_DecChar;
+GUI_EXTERN GUI_tfTimer* GUI_pfTimerExec;
+GUI_EXTERN WM_tfHandlePID* WM_pfHandlePID;
+GUI_EXTERN void (*GUI_pfDispCharStyle)(U16 Char);
+
+#if GUI_COMPILER_SUPPORTS_FP && GUI_SUPPORT_ROTATION
+ GUI_EXTERN const tLCD_APIList * GUI_pLCD_APIList; /* Used for rotating text */
+#endif
+
+#if GUI_SUPPORT_CURSOR
+ GUI_EXTERN GUI_CURSOR_tfTempHide* GUI_CURSOR_pfTempHide;
+ GUI_EXTERN GUI_CURSOR_tfTempUnhide* GUI_CURSOR_pfTempUnhide;
+#endif
+
+#if defined(__cplusplus)
+extern "C" { /* Make sure we have C-declarations in C++ programs */
+#endif
+
+extern const GUI_UC_ENC_APILIST GUI__API_TableNone;
+
+#if defined(__cplusplus)
+ }
+#endif
+
+#undef GUI_EXTERN
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_RectsIntersect.c b/User/system/lib/lcd/gui/Core/GUI_RectsIntersect.c
new file mode 100644
index 0000000..25036a4
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_RectsIntersect.c
@@ -0,0 +1,53 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_RectsIntersect.C
+Purpose : Implementation of GUI_RectsIntersect
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_RectsIntersect
+*
+* Purpose:
+* Check if rectangle do intersect.
+*
+* Return value:
+* 0 if they do not.
+* 1 if they do.
+*/
+int GUI_RectsIntersect(const GUI_RECT* pr0, const GUI_RECT* pr1) {
+ if (pr0->y0 <= pr1->y1) {
+ if (pr1->y0 <= pr0->y1) {
+ if (pr0->x0 <= pr1->x1) {
+ if (pr1->x0 <= pr0->x1) {
+ return 1;
+ }
+ }
+ }
+ }
+ return 0;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_SIF.c b/User/system/lib/lcd/gui/Core/GUI_SIF.c
new file mode 100644
index 0000000..e36f039
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_SIF.c
@@ -0,0 +1,69 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_SIF.c
+Purpose : Implementation of system independend fonts
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Private.h"
+
+/*********************************************************************
+*
+* Exported code
+*
+**********************************************************************
+*/
+
+/*********************************************************************
+*
+* GUI_SIF_CreateFont
+*/
+void GUI_SIF_CreateFont(void * pFontData, GUI_FONT * pFont, const GUI_SIF_TYPE * pFontType) {
+ const U8 * pSrc = (const U8 *)pFontData;
+ U32 ID;
+ /* Set pFontData of GUI_FONT structure to the first byte */
+ pFont->p.pFontData = pFontData;
+ /* Check ID */
+ ID = GUI__Read32(&pSrc);
+ if (ID != 0x50495547) { /* 'GUIP' */
+ GUI_DEBUG_ERROROUT("ID of downloaded font wrong!");
+ return;
+ }
+ /* Read properties of the font */
+ pFont->YSize = GUI__Read16(&pSrc);
+ pFont->YDist = GUI__Read16(&pSrc);
+ pFont->Baseline = GUI__Read16(&pSrc);
+ pFont->LHeight = GUI__Read16(&pSrc);
+ pFont->CHeight = GUI__Read16(&pSrc);
+ /* Magnification is always 1 */
+ pFont->XMag = 1;
+ pFont->YMag = 1;
+ /* Set function pointers */
+ pFont->pfDispChar = pFontType->pDispChar;
+ pFont->pfGetCharDistX = pFontType->pGetCharDistX;
+ pFont->pfGetFontInfo = pFontType->pGetFontInfo;
+ pFont->pfIsInFont = pFontType->pIsInFont;
+ pFont->pafEncode = 0;
+ /* Use the new font */
+ GUI_SetFont(pFont);
+}
+
+/*********************************************************************
+*
+* GUI_SIF_DeleteFont
+*/
+void GUI_SIF_DeleteFont(GUI_FONT * pFont) {
+ GUI_USE_PARA(pFont);
+}
diff --git a/User/system/lib/lcd/gui/Core/GUI_SIF_Prop.c b/User/system/lib/lcd/gui/Core/GUI_SIF_Prop.c
new file mode 100644
index 0000000..21b92bf
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_SIF_Prop.c
@@ -0,0 +1,168 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_SIF_Prop.c
+Purpose : Implementation of system independend fonts
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Private.h"
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+
+/*********************************************************************
+*
+* _GetNumCharAreas
+*/
+static int _GetNumCharAreas(const GUI_FONT GUI_UNI_PTR * pFont) {
+ U16 NumCharAreas;
+ const U8 * pData;
+ pData = (const U8 *)pFont->p.pFontData + 14 /* Skip ID, YSize, YDist, Baseline, LHeight and CHeight */;
+ NumCharAreas = GUI__Read16(&pData);
+ return NumCharAreas;
+}
+
+/*********************************************************************
+*
+* _GetpCharInfo
+*/
+static const U8 * _GetpCharInfo(const GUI_FONT GUI_UNI_PTR * pFont, U16P c) {
+ const U8 * pCharArea, * pCharInfo;
+ int NumCharAreas;
+ NumCharAreas = _GetNumCharAreas(pFont); /* Get # of char areas */
+ pCharArea = (const U8 *)pFont->p.pFontData
+ + sizeof(GUI_SI_FONT); /* Set char area pointer to first char area */
+ pCharInfo = pCharArea
+ + sizeof(GUI_SIF_CHAR_AREA) * NumCharAreas; /* Set char info pointer to first character info */
+ do {
+ GUI_SIF_CHAR_AREA CharArea;
+ CharArea.First = GUI__Read16(&pCharArea);
+ CharArea.Last = GUI__Read16(&pCharArea);
+ if ((c >= CharArea.First) && (c <= CharArea.Last)) {
+ pCharInfo += sizeof(GUI_SIF_CHARINFO) * (c - CharArea.First);
+ return pCharInfo;
+ }
+ pCharInfo += sizeof(GUI_SIF_CHARINFO) * (CharArea.Last - CharArea.First + 1);
+ } while(--NumCharAreas);
+ return 0;
+}
+
+/*********************************************************************
+*
+* Exported code
+*
+**********************************************************************
+*/
+
+/*********************************************************************
+*
+* GUI_SIF_DispChar
+*/
+static void _GUI_SIF_DispChar(U16P c) {
+ const U8 * pCharInfo, * pData;
+ pCharInfo = _GetpCharInfo(GUI_Context.pAFont, c);
+ if (pCharInfo) {
+ GUI_DRAWMODE DrawMode, OldDrawMode;
+ GUI_SIF_CHARINFO CharInfo;
+ CharInfo.XSize = GUI__Read16(&pCharInfo);
+ CharInfo.XDist = GUI__Read16(&pCharInfo);
+ CharInfo.BytesPerLine = GUI__Read16(&pCharInfo);
+ GUI__Read16(&pCharInfo); /* Dummy */
+ CharInfo.OffData = GUI__Read32(&pCharInfo);
+ pData = (const U8 *)GUI_Context.pAFont->p.pFontData + CharInfo.OffData;
+ DrawMode = GUI_Context.TextMode;
+ OldDrawMode = LCD_SetDrawMode(DrawMode);
+ LCD_DrawBitmap(GUI_Context.DispPosX, GUI_Context.DispPosY,
+ CharInfo.XSize,
+ GUI_Context.pAFont->YSize,
+ GUI_Context.pAFont->XMag,
+ GUI_Context.pAFont->YMag,
+ 1,
+ CharInfo.BytesPerLine,
+ pData,
+ &LCD_BKCOLORINDEX);
+ /* Fill empty pixel lines */
+ if (GUI_Context.pAFont->YDist > GUI_Context.pAFont->YSize) {
+ int YMag = GUI_Context.pAFont->YMag;
+ int YDist = GUI_Context.pAFont->YDist * YMag;
+ int YSize = GUI_Context.pAFont->YSize * YMag;
+ if (DrawMode != LCD_DRAWMODE_TRANS) {
+ LCD_COLOR OldColor = GUI_GetColor();
+ GUI_SetColor(GUI_GetBkColor());
+ LCD_FillRect(GUI_Context.DispPosX,
+ GUI_Context.DispPosY + YSize,
+ GUI_Context.DispPosX + CharInfo.XSize,
+ GUI_Context.DispPosY + YDist);
+ GUI_SetColor(OldColor);
+ }
+ }
+ LCD_SetDrawMode(OldDrawMode); /* Restore draw mode */
+ GUI_Context.DispPosX += CharInfo.XDist;
+ }
+}
+
+/*********************************************************************
+*
+* GUI_SIF_GetCharDistX
+*/
+static int _GUI_SIF_GetCharDistX(U16P c) {
+ const U8 * pCharInfo;
+ U16 DistX = 0;
+ pCharInfo = _GetpCharInfo(GUI_Context.pAFont, c); /* Get pointer to char info data */
+ if (pCharInfo) {
+ pCharInfo += 2 /* Skip XSize */;
+ DistX = GUI__Read16(&pCharInfo);
+ }
+ return DistX;
+}
+
+/*********************************************************************
+*
+* GUI_SIF_GetFontInfo
+*/
+static void _GUI_SIF_GetFontInfo(const GUI_FONT GUI_UNI_PTR * pFont, GUI_FONTINFO * pfi) {
+ const U8 * pData;
+ pData = (const U8 *)pFont->p.pFontData + 4 /* Skip XSize and XDist */;
+ pfi->Baseline = GUI__Read16(&pData);
+ pfi->LHeight = GUI__Read16(&pData);
+ pfi->CHeight = GUI__Read16(&pData);
+ pfi->Flags = GUI_FONTINFO_FLAG_PROP;
+}
+
+/*********************************************************************
+*
+* GUI_SIF_IsInFont
+*/
+static char _GUI_SIF_IsInFont(const GUI_FONT GUI_UNI_PTR * pFont, U16 c) {
+ const U8 * pCharInfo;
+ GUI_USE_PARA(pFont);
+ pCharInfo = _GetpCharInfo(GUI_Context.pAFont, c);
+ return (pCharInfo) ? 1 : 0;
+}
+
+/*********************************************************************
+*
+* GUI_SIF_TYPE_PROP
+*/
+const tGUI_SIF_APIList GUI_SIF_APIList_Prop = {
+ _GUI_SIF_DispChar,
+ _GUI_SIF_GetCharDistX,
+ _GUI_SIF_GetFontInfo,
+ _GUI_SIF_IsInFont
+};
diff --git a/User/system/lib/lcd/gui/Core/GUI_SaveContext.c b/User/system/lib/lcd/gui/Core/GUI_SaveContext.c
new file mode 100644
index 0000000..157bd70
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_SaveContext.c
@@ -0,0 +1,45 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_SaveContext.c
+Purpose : Code to save and restore GUI context
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+#include "GUIDebug.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_SaveContext
+*/
+void GUI_SaveContext(GUI_CONTEXT* pContext) {
+ *pContext = GUI_Context;
+}
+
+/*********************************************************************
+*
+* GUI_RestoreContext
+*/
+void GUI_RestoreContext(const GUI_CONTEXT* pContext) {
+ GUI_Context = *pContext;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_SelectLCD.c b/User/system/lib/lcd/gui/Core/GUI_SelectLCD.c
new file mode 100644
index 0000000..f4ebe67
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_SelectLCD.c
@@ -0,0 +1,49 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_SelectLCD.c
+Purpose : Implementation of said routine
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI_Private.h"
+
+#if GUI_WINSUPPORT
+ #include "WM.h"
+#endif
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_SelectLCD
+*/
+void GUI_SelectLCD(void) {
+ GUI_LOCK();
+ #if GUI_SUPPORT_DEVICES
+ LCD_SelectLCD();
+ LCD_UpdateColorIndices();
+ #if GUI_WINSUPPORT
+ WM_Activate();
+ #endif
+ #endif
+ GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_SelectLayer.c b/User/system/lib/lcd/gui/Core/GUI_SelectLayer.c
new file mode 100644
index 0000000..ae03808
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_SelectLayer.c
@@ -0,0 +1,45 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_SelectLayer.c.C
+Purpose : Selection of Layer
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI_Private.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_SelectLayer
+*/
+unsigned int GUI_SelectLayer(unsigned int Index) {
+ unsigned int OldIndex;
+ GUI_LOCK();
+ OldIndex = GUI_Context.SelLayer;
+ if (Index < GUI_NUM_LAYERS) {
+ GUI_Context.SelLayer = Index;
+ GUI_SelectLCD();
+ }
+ GUI_UNLOCK();
+ return OldIndex;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_SetColor.c b/User/system/lib/lcd/gui/Core/GUI_SetColor.c
new file mode 100644
index 0000000..5ae0412
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_SetColor.c
@@ -0,0 +1,48 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_SetColor.c
+Purpose : Implementation of optional routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_SetBkColor
+*/
+void GUI_SetBkColor(GUI_COLOR color) {
+ GUI_LOCK(); {
+ LCD_SetBkColor(color);
+ } GUI_UNLOCK();
+}
+
+/*********************************************************************
+*
+* GUI_SetColor
+*/
+void GUI_SetColor(GUI_COLOR color) {
+ GUI_LOCK(); {
+ LCD_SetColor(color);
+ } GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_SetColorIndex.c b/User/system/lib/lcd/gui/Core/GUI_SetColorIndex.c
new file mode 100644
index 0000000..5a1853c
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_SetColorIndex.c
@@ -0,0 +1,50 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_DrawBitmap.C
+Purpose : Implementation of GUI_DrawBitmap
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_SetBkColorIndex
+*/
+void GUI_SetBkColorIndex(int Index) {
+ GUI_LOCK(); {
+ GUI_Context.BkColor = GUI_INVALID_COLOR;
+ LCD_SetBkColorIndex(Index);
+ } GUI_UNLOCK();
+}
+
+/*********************************************************************
+*
+* GUI_SetColorIndex
+*/
+void GUI_SetColorIndex(int Index) {
+ GUI_LOCK(); {
+ GUI_Context.Color = GUI_INVALID_COLOR;
+ LCD_SetColorIndex(Index);
+ } GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_SetDecChar.c b/User/system/lib/lcd/gui/Core/GUI_SetDecChar.c
new file mode 100644
index 0000000..9074be4
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_SetDecChar.c
@@ -0,0 +1,47 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_SetDecChar.C
+Purpose : Routines to set the character used for decimal point
+----------------------------------------------------------------------
+*/
+
+#include "GUI_Protected.h"
+#include "GUIDebug.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_SetDecChar
+*/
+char GUI_SetDecChar(char c) {
+ char r = GUI_DecChar;
+ GUI_DecChar = c;
+ return r;
+}
+
+/*********************************************************************
+*
+* GUI_GetDecChar
+*/
+char GUI_GetDecChar(void) {
+ return GUI_DecChar;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_SetDefault.c b/User/system/lib/lcd/gui/Core/GUI_SetDefault.c
new file mode 100644
index 0000000..9b28dc9
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_SetDefault.c
@@ -0,0 +1,53 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_SetDefault.c
+Purpose : Implementation of GUI_SetDefault
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GL_SetDefault
+*/
+void GL_SetDefault(void) {
+ GUI_SetBkColor(GUI_DEFAULT_BKCOLOR);
+ GUI_SetColor (GUI_DEFAULT_COLOR);
+ GUI_SetPenSize(1);
+ GUI_SetTextAlign(0);
+ GUI_SetTextMode(0);
+ GUI_SetDrawMode(0);
+ GUI_SetFont(GUI_DEFAULT_FONT);
+ GUI_SetLineStyle(GUI_LS_SOLID);
+}
+
+/*********************************************************************
+*
+* GUI_SetDefault
+*/
+void GUI_SetDefault(void) {
+ GUI_LOCK();
+ GL_SetDefault();
+ GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_SetDrawMode.c b/User/system/lib/lcd/gui/Core/GUI_SetDrawMode.c
new file mode 100644
index 0000000..9a046ad
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_SetDrawMode.c
@@ -0,0 +1,43 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_SetDrawMode.C
+Purpose : Implementation of optional routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+
+#include "GUI_Protected.h"
+#include "GUIDebug.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_SetDrawMode
+*/
+GUI_DRAWMODE GUI_SetDrawMode(GUI_DRAWMODE dm) {
+ GUI_DRAWMODE OldMode;
+ GUI_LOCK(); {
+ OldMode = LCD_SetDrawMode(dm);
+ } GUI_UNLOCK();
+ return OldMode;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_SetFont.c b/User/system/lib/lcd/gui/Core/GUI_SetFont.c
new file mode 100644
index 0000000..b6a5fb4
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_SetFont.c
@@ -0,0 +1,42 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_SetFont.C
+Purpose : Optional routines
+----------------------------------------------------------------------
+*/
+
+#include "GUI_Protected.h"
+#include "GUIDebug.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_SetFont
+*/
+const GUI_FONT GUI_UNI_PTR* GUI_SetFont(const GUI_FONT GUI_UNI_PTR * pNewFont) {
+ const GUI_FONT GUI_UNI_PTR* pOldFont = GUI_Context.pAFont;
+ GUI_LOCK();
+ if (pNewFont)
+ GUI_Context.pAFont = pNewFont;
+ GUI_UNLOCK();
+ return pOldFont;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_SetLBorder.c b/User/system/lib/lcd/gui/Core/GUI_SetLBorder.c
new file mode 100644
index 0000000..1fb60d6
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_SetLBorder.c
@@ -0,0 +1,47 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_SetLBorder.C
+Purpose : Implementation of optional routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+
+#include "GUI_Protected.h"
+#include "GUIDebug.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_SetLBorder
+*
+* Purpose:
+* Sets the left border (for carriage return).
+*/
+int GUI_SetLBorder(int x) {
+ int r;
+ GUI_LOCK();
+ r = GUI_Context.LBorder;
+ GUI_Context.LBorder = x;
+ GUI_UNLOCK();
+ return r;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_SetLUTColor.c b/User/system/lib/lcd/gui/Core/GUI_SetLUTColor.c
new file mode 100644
index 0000000..375a9ef
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_SetLUTColor.c
@@ -0,0 +1,45 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_SetLUTColor.c
+Purpose : Implementation of GUI_SetLUTColor
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+#include "LCD_Private.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_SetLUTColor
+*/
+void GUI_SetLUTColor(U8 Pos, LCD_COLOR Color) {
+ #if LCD_PHYSCOLORS_IN_RAM
+ GUI_LOCK();
+ LCD_PhysColors[Pos] = Color;
+ LCD_SetLUTEntry(Pos, Color);
+ GUI_UNLOCK();
+ #else
+ GUI_USE_PARA(Pos);
+ GUI_USE_PARA(Color);
+ #endif
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_SetLUTColorEx.c b/User/system/lib/lcd/gui/Core/GUI_SetLUTColorEx.c
new file mode 100644
index 0000000..6b0987c
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_SetLUTColorEx.c
@@ -0,0 +1,108 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_SetLUTColorEx.c
+Purpose : Implementation of GUI_SetLUTColorEx
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+#include "GUI_Private.h"
+#include "LCD_Private.h" /* Required for configuration, APIList */
+
+#if GUI_COMPILER_SUPPORTS_FP
+
+/*********************************************************************
+*
+* Static data
+*
+**********************************************************************
+*/
+
+static const LCD_LUT_INFO _aLutInfo[GUI_NUM_LAYERS] = {
+ #if GUI_NUM_LAYERS > 1
+ {
+ #if (LCD_FIXEDPALETTE == 0) && (LCD_PHYSCOLORS_IN_RAM)
+ LCD_PhysColors, (I16)(1 << LCD_BITSPERPIXEL_0)
+ #else
+ NULL, 0
+ #endif
+ },
+ {
+ #if (LCD_FIXEDPALETTE_1 == 0) && (LCD_PHYSCOLORS_IN_RAM)
+ LCD_PhysColors_1, (I16)(1 << LCD_BITSPERPIXEL_1)
+ #else
+ NULL, 0
+ #endif
+ },
+ #if GUI_NUM_LAYERS > 2
+ {
+ #if (LCD_FIXEDPALETTE_1 == 0) && (LCD_PHYSCOLORS_IN_RAM)
+ LCD_PhysColors_2, (I16)(1 << LCD_BITSPERPIXEL_2)
+ #else
+ NULL, 0
+ #endif
+ },
+ #endif
+ #if GUI_NUM_LAYERS > 3
+ {
+ #if (LCD_FIXEDPALETTE_3 == 0) && (LCD_PHYSCOLORS_IN_RAM)
+ LCD_PhysColors_3, (I16)(1 << LCD_BITSPERPIXEL_3)
+ #else
+ NULL, 0
+ #endif
+ },
+ #endif
+ #if GUI_NUM_LAYERS > 4
+ {
+ #if (LCD_FIXEDPALETTE_4 == 0) && (LCD_PHYSCOLORS_IN_RAM)
+ LCD_PhysColors_4, (I16)(1 << LCD_BITSPERPIXEL_4)
+ #else
+ NULL, 0
+ #endif
+ },
+ #endif
+ #else
+ {
+ #if (LCD_FIXEDPALETTE == 0) && (LCD_PHYSCOLORS_IN_RAM)
+ LCD_PhysColors, 1 << LCD_BITSPERPIXEL
+ #else
+ NULL, 0
+ #endif
+ }
+ #endif
+};
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_SetLUTColorEx
+*/
+void GUI_SetLUTColorEx(U8 Pos, LCD_COLOR Color, unsigned int LayerIndex) {
+ if (LayerIndex < GUI_NUM_LAYERS) {
+ if (Pos < _aLutInfo[LayerIndex].NumEntries) {
+ LCD_aAPI[LayerIndex]->pfSetLUTEntry(Pos, Color);
+ _aLutInfo[LayerIndex].paColor[Pos] = Color;
+ }
+ }
+}
+
+#endif
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_SetLUTEntry.c b/User/system/lib/lcd/gui/Core/GUI_SetLUTEntry.c
new file mode 100644
index 0000000..3b116ed
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_SetLUTEntry.c
@@ -0,0 +1,38 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_SetLUTEntry.c
+Purpose : Implementation of GUI_SetLUTEntry
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_SetLUTEntry
+*/
+void GUI_SetLUTEntry(U8 Pos, LCD_COLOR Color) {
+ GUI_LOCK();
+ LCD_SetLUTEntry(Pos, Color);
+ GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_SetLineStyle.c b/User/system/lib/lcd/gui/Core/GUI_SetLineStyle.c
new file mode 100644
index 0000000..42596c0
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_SetLineStyle.c
@@ -0,0 +1,41 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_SetLineStyle.c
+Purpose : Implementation of optional routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_SetLineStyle
+*/
+U8 GUI_SetLineStyle(U8 LineStyle) {
+ U8 r;
+ GUI_LOCK();
+ r = GUI_Context.LineStyle;
+ GUI_Context.LineStyle = LineStyle;
+ GUI_UNLOCK();
+ return r;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_SetOrg.c b/User/system/lib/lcd/gui/Core/GUI_SetOrg.c
new file mode 100644
index 0000000..c3c3b48
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_SetOrg.c
@@ -0,0 +1,41 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_SetOrg.C
+Purpose : Defines the GUI_SetOrg function
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+
+#include "GUI_Protected.h"
+#include "GUIDebug.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_SetOrg
+*/
+void GUI_SetOrg(int x, int y) {
+ GUI_LOCK();
+ LCD_L0_SetOrg(x, y);
+ GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_SetPixelIndex.c b/User/system/lib/lcd/gui/Core/GUI_SetPixelIndex.c
new file mode 100644
index 0000000..dbe7fcf
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_SetPixelIndex.c
@@ -0,0 +1,58 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCD_SetPixelIndex.c
+Purpose : Implementation of optional routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+#include "GUI_Private.h"
+#include "LCD_Private.h"
+
+/*********************************************************************
+*
+* Defines
+*
+**********************************************************************
+*/
+
+#define RETURN_IF_Y_OUT() \
+ if (y < GUI_Context.ClipRect.y0) return; \
+ if (y > GUI_Context.ClipRect.y1) return;
+
+#define RETURN_IF_X_OUT() \
+ if (x < GUI_Context.ClipRect.x0) return; \
+ if (x > GUI_Context.ClipRect.x1) return;
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_SetPixelIndex
+*
+* Purpose:
+* Writes 1 pixel into the display.
+*/
+void LCD_SetPixelIndex(int x, int y, int ColorIndex) {
+ RETURN_IF_X_OUT();
+ RETURN_IF_Y_OUT();
+ LCDDEV_L0_SetPixelIndex(x, y, ColorIndex);
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_SetTextAlign.c b/User/system/lib/lcd/gui/Core/GUI_SetTextAlign.c
new file mode 100644
index 0000000..c2cd8a4
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_SetTextAlign.c
@@ -0,0 +1,41 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_SetTextAlign.c
+Purpose : Implementation of optional routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_SetTextAlign
+*/
+int GUI_SetTextAlign(int Align) {
+ int r;
+ GUI_LOCK();
+ r = GUI_Context.TextAlign;
+ GUI_Context.TextAlign = Align;
+ GUI_UNLOCK();
+ return r;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_SetTextMode.c b/User/system/lib/lcd/gui/Core/GUI_SetTextMode.c
new file mode 100644
index 0000000..901966c
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_SetTextMode.c
@@ -0,0 +1,41 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_SetTextMode.c
+Purpose : Implementation of optional routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_SetTextMode
+*/
+int GUI_SetTextMode(int Mode) {
+ int r;
+ GUI_LOCK();
+ r = GUI_Context.TextMode;
+ GUI_Context.TextMode = Mode;
+ GUI_UNLOCK();
+ return r;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_SetTextStyle.c b/User/system/lib/lcd/gui/Core/GUI_SetTextStyle.c
new file mode 100644
index 0000000..222d73c
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_SetTextStyle.c
@@ -0,0 +1,81 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_SetTextStyle.C
+Purpose : Implementation of various text styles
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI__cbDrawTextStyle
+*/
+static void GUI__cbDrawTextStyle(U16 Char) {
+ int x0, x1;
+ x1 = GUI_Context.DispPosX - 1;
+ x0 = x1 - GUI_Context.pAFont->pfGetCharDistX(Char) + 1;
+ /* Handle Underline */
+ if (GUI_Context.TextStyle & GUI_TS_UNDERLINE) {
+ int yOff = GUI_Context.pAFont->Baseline;
+ if (yOff >= GUI_Context.pAFont->YSize) {
+ yOff = GUI_Context.pAFont->YSize - 1;
+ }
+ LCD_DrawHLine(x0, GUI_Context.DispPosY + yOff, x1);
+ }
+ /* Handle strike thru */
+ if (GUI_Context.TextStyle & GUI_TS_STRIKETHRU) {
+ int yOff = GUI_Context.pAFont->Baseline - ((GUI_Context.pAFont->CHeight + 1) / 2);
+ LCD_DrawHLine(x0, GUI_Context.DispPosY + yOff, x1);
+ }
+ /* Handle over line */
+ if (GUI_Context.TextStyle & GUI_TS_OVERLINE) {
+ int yOff = GUI_Context.pAFont->Baseline - GUI_Context.pAFont->CHeight - 1;
+ if (yOff < 0) {
+ yOff = 0;
+ }
+ LCD_DrawHLine(x0, GUI_Context.DispPosY + yOff, x1);
+ }
+}
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_SetTextStyle
+*/
+char GUI_SetTextStyle(char Style) {
+ char OldStyle;
+ GUI_LOCK();
+ OldStyle = GUI_Context.TextStyle;
+ GUI_pfDispCharStyle = GUI__cbDrawTextStyle; /* Init function pointer (function in this module) */
+ GUI_Context.TextStyle = Style;
+ GUI_UNLOCK();
+ return OldStyle;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_TOUCH.c b/User/system/lib/lcd/gui/Core/GUI_TOUCH.c
new file mode 100644
index 0000000..c06e397
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_TOUCH.c
@@ -0,0 +1,59 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUITOUCH.C
+Purpose : Generic touch screen routines
+----------------------------------------------------------------------
+*/
+
+#include
+#include "LCD_Private.h" /* private modul definitions & config */
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Static data
+*
+**********************************************************************
+*/
+
+static GUI_PID_STATE _State;
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_TOUCH_GetState
+*/
+int GUI_TOUCH_GetState(GUI_PID_STATE *pState) {
+ *pState = _State;
+ return (_State.Pressed != 0) ? 1 : 0;
+}
+
+/*********************************************************************
+*
+* GUI_TOUCH_StoreStateEx
+*/
+void GUI_TOUCH_StoreStateEx(const GUI_PID_STATE *pState) {
+ if (memcmp(pState, &_State, sizeof(_State))) {
+ _State = *pState;
+ GUI_PID_StoreState(pState);
+ }
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_TOUCH_DriverAnalog.c b/User/system/lib/lcd/gui/Core/GUI_TOUCH_DriverAnalog.c
new file mode 100644
index 0000000..d963dd0
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_TOUCH_DriverAnalog.c
@@ -0,0 +1,299 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUITOUCH.C
+Purpose : Touch screen manager
+----------------------------------------------------------------------
+This module handles the touch screen. It is configured in the file
+GUITouch.conf.h (Should be located in the Config\ directory).
+----------------------------------------------------------------------
+*/
+
+#include
+#include
+#include
+#include "LCD_Private.h" /* private modul definitions & config */
+#include "GUI_Protected.h"
+
+/* Generate code only if configuration says so ! */
+#if GUI_SUPPORT_TOUCH
+
+#include "GUITouchConf.h" /* Located in GUIx, will include GUITouchConf.h */
+
+/*********************************************************************
+*
+* Defines, config defaults
+*
+**********************************************************************
+*/
+
+#ifndef GUI_TOUCH_AD_LEFT /* max value returned by AD-converter */
+ #define GUI_TOUCH_AD_LEFT 30
+#endif
+
+#ifndef GUI_TOUCH_AD_RIGHT /* min value returned by AD-converter */
+ #define GUI_TOUCH_AD_RIGHT 220
+#endif
+
+#ifndef GUI_TOUCH_AD_TOP /* max value returned by AD-converter */
+ #define GUI_TOUCH_AD_TOP 30
+#endif
+
+#ifndef GUI_TOUCH_AD_BOTTOM /* min value returned by AD-converter */
+ #define GUI_TOUCH_AD_BOTTOM 220
+#endif
+
+#ifndef GUI_TOUCH_SWAP_XY /* Is XY of touch swapped ? */
+ #define GUI_TOUCH_SWAP_XY 0
+#endif
+
+#ifndef GUI_TOUCH_MIRROR_X
+ #define GUI_TOUCH_MIRROR_X 0
+#endif
+
+#ifndef GUI_TOUCH_MIRROR_Y
+ #define GUI_TOUCH_MIRROR_Y 0
+#endif
+
+#ifndef GUI_TOUCH_YSIZE
+ #define GUI_TOUCH_YSIZE LCD_YSIZE
+#endif
+
+#ifndef GUI_TOUCH_XSIZE
+ #define GUI_TOUCH_XSIZE LCD_XSIZE
+#endif
+
+/*********************************************************************
+*
+* Types
+*
+**********************************************************************
+*/
+
+typedef struct {int Min; int Max; } tMinMax;
+
+/*********************************************************************
+*
+* Static data
+*
+**********************************************************************
+*/
+
+static int xPhys, yPhys;
+
+static tMinMax xyMinMax[2] = {
+#if ((GUI_TOUCH_SWAP_XY==0) && (GUI_TOUCH_MIRROR_X==0)) || ((GUI_TOUCH_SWAP_XY) && (GUI_TOUCH_MIRROR_Y==0))
+ { GUI_TOUCH_AD_LEFT, GUI_TOUCH_AD_RIGHT },
+#else
+ { GUI_TOUCH_AD_RIGHT, GUI_TOUCH_AD_LEFT },
+#endif
+#if ((GUI_TOUCH_SWAP_XY==0) && (GUI_TOUCH_MIRROR_Y==0)) || ((GUI_TOUCH_SWAP_XY) && (GUI_TOUCH_MIRROR_X==0))
+ { GUI_TOUCH_AD_TOP, GUI_TOUCH_AD_BOTTOM }
+#else
+ { GUI_TOUCH_AD_BOTTOM, GUI_TOUCH_AD_TOP }
+#endif
+};
+
+#ifndef WIN32
+static int xMin;
+static int xMax;
+static int yMin;
+static int yMax;
+#endif
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _AD2X
+*
+* Purpose:
+* Convert physical value into (logical) coordinates.
+*/
+#ifndef WIN32
+static int _AD2X(int adx) {
+ I32 r = adx - xyMinMax[GUI_COORD_X].Min;
+ r *= GUI_TOUCH_XSIZE - 1;
+ return r / (xyMinMax[GUI_COORD_X].Max - xyMinMax[GUI_COORD_X].Min);
+}
+
+/*********************************************************************
+*
+* _AD2Y
+*
+* Purpose:
+* Convert physical value into (logical) coordinates.
+*/
+static int _AD2Y(int ady) {
+ I32 r = ady - xyMinMax[GUI_COORD_Y].Min;
+ r *= GUI_TOUCH_YSIZE - 1;
+ return r/(xyMinMax[GUI_COORD_Y].Max - xyMinMax[GUI_COORD_Y].Min);
+}
+#endif
+
+/*********************************************************************
+*
+* _Log2Phys
+*/
+static int _Log2Phys(int l, I32 l0, I32 l1, I32 p0, I32 p1) {
+ return p0+ ((p1 - p0) * (l - l0)) / (l1 - l0);
+}
+
+/*********************************************************************
+*
+* _StoreUnstable
+*/
+static void _StoreUnstable(int x, int y) {
+ static int _xLast = -1;
+ static int _yLast = -1;
+ int xOut, yOut;
+
+ if ((x != -1) && (y != -1) && (_xLast != -1) && (_yLast != -1)) {
+ xOut = _xLast;
+ yOut = _yLast;
+ } else {
+ xOut = -1;
+ yOut = -1;
+ }
+ _xLast = x;
+ _yLast = y;
+ GUI_TOUCH_StoreUnstable(xOut, yOut);
+}
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_TOUCH_GetxPhys
+*/
+int GUI_TOUCH_GetxPhys(void) {
+ return xPhys;
+}
+
+/*********************************************************************
+*
+* GUI_TOUCH_GetyPhys
+*/
+int GUI_TOUCH_GetyPhys(void) {
+ return yPhys;
+}
+
+/*********************************************************************
+*
+* GUI_TOUCH_SetDefaultCalibration
+*/
+void GUI_TOUCH_SetDefaultCalibration(void) {
+ xyMinMax[0].Min = GUI_TOUCH_AD_LEFT;
+ xyMinMax[0].Max = GUI_TOUCH_AD_RIGHT;
+ xyMinMax[1].Min = GUI_TOUCH_AD_TOP;
+ xyMinMax[1].Max = GUI_TOUCH_AD_BOTTOM;
+}
+
+/*********************************************************************
+*
+* GUI_TOUCH_Calibrate
+*/
+int GUI_TOUCH_Calibrate(int Coord, int Log0, int Log1, int Phys0, int Phys1) {
+ int l0 = 0;
+ int l1 = (Coord == GUI_COORD_X) ? LCD_XSIZE - 1 : LCD_YSIZE - 1;
+ if (labs(Phys0 - Phys1) < 20) {
+ return 1;
+ }
+ if (labs(Log0 - Log1) < 20) {
+ return 1;
+ }
+ xyMinMax[Coord].Min = _Log2Phys(l0, Log0, Log1, Phys0, Phys1);
+ xyMinMax[Coord].Max = _Log2Phys(l1, Log0, Log1, Phys0, Phys1);
+ return 0;
+}
+
+/*********************************************************************
+*
+* GUI_TOUCH_GetCalData
+*/
+void GUI_TOUCH_GetCalData(int Coord, int* pMin,int* pMax) {
+ *pMin = xyMinMax[Coord].Min;
+ *pMax = xyMinMax[Coord].Max;
+}
+
+/*********************************************************************
+*
+* GUI_TOUCH_Exec
+*/
+void GUI_TOUCH_Exec(void) {
+ #ifndef WIN32
+ static U8 ReadState;
+ int x,y;
+ /* calculate Min / Max values */
+ if (xyMinMax[GUI_COORD_X].Min < xyMinMax[GUI_COORD_X].Max) {
+ xMin = xyMinMax[GUI_COORD_X].Min;
+ xMax = xyMinMax[GUI_COORD_X].Max;
+ } else {
+ xMax = xyMinMax[GUI_COORD_X].Min;
+ xMin = xyMinMax[GUI_COORD_X].Max;
+ }
+ if (xyMinMax[GUI_COORD_Y].Min < xyMinMax[GUI_COORD_Y].Max) {
+ yMin = xyMinMax[GUI_COORD_Y].Min;
+ yMax = xyMinMax[GUI_COORD_Y].Max;
+ } else {
+ yMax = xyMinMax[GUI_COORD_Y].Min;
+ yMin = xyMinMax[GUI_COORD_Y].Max;
+ }
+ /* Execute the state machine which reads the touch */
+ switch (ReadState) {
+ case 0:
+ yPhys = TOUCH_X_MeasureY();
+ TOUCH_X_ActivateY(); /* Prepare X- measurement */
+ ReadState++;
+ break;
+ default:
+ xPhys = TOUCH_X_MeasureX();
+ TOUCH_X_ActivateX(); /* Prepare Y- measurement */
+ /* Convert values into logical values */
+ #if !GUI_TOUCH_SWAP_XY /* Is X/Y swapped ? */
+ x = xPhys;
+ y = yPhys;
+ #else
+ x = yPhys;
+ y = xPhys;
+ #endif
+ if ((x < xMin) || (x > xMax) || (y < yMin) || (y > yMax)) {
+ _StoreUnstable(-1, -1);
+ } else {
+ x = _AD2X(x);
+ y = _AD2Y(y);
+ _StoreUnstable(x, y);
+ }
+ /* Reset state machine */
+ ReadState = 0;
+ break;
+ }
+ #endif /* WIN32 */
+}
+
+#else
+
+void GUI_TOUCH_DriverAnalog_C(void); /* Avoid "no prototype" warnings */
+void GUI_TOUCH_DriverAnalog_C(void) {}
+
+#endif /* defined(GUI_SUPPORT_TOUCH) && GUI_SUPPORT_TOUCH */
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_TOUCH_StoreState.c b/User/system/lib/lcd/gui/Core/GUI_TOUCH_StoreState.c
new file mode 100644
index 0000000..ee3ae6e
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_TOUCH_StoreState.c
@@ -0,0 +1,47 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUITOUCH_StoreState.C
+Purpose : Implementation of GUITOUCH_StoreState
+----------------------------------------------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_TOUCH_StoreState
+*
+* NOTE:
+* This is the older version. Prefer GUI_TOUCH_StoreStateEx in new code
+*/
+void GUI_TOUCH_StoreState(int x, int y) {
+ static GUI_PID_STATE _State; /* static so we retain coordinates when touch is released */
+ if ((x >= 0) && (y >= 0)) {
+ _State.Pressed = 1;
+ _State.x = x;
+ _State.y = y;
+ } else {
+ _State.Pressed = 0;
+ }
+ GUI_TOUCH_StoreStateEx(&_State);
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_TOUCH_StoreUnstable.c b/User/system/lib/lcd/gui/Core/GUI_TOUCH_StoreUnstable.c
new file mode 100644
index 0000000..e9eb53b
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_TOUCH_StoreUnstable.c
@@ -0,0 +1,62 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUITOUCH_StoreUnstable.C
+Purpose : Implementation of GUITOUCH_StoreUnstable
+----------------------------------------------------------------------
+*/
+
+#include
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Static data
+*
+**********************************************************************
+*/
+
+static int _x, _y;
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_TOUCH_StoreUnstable
+*/
+void GUI_TOUCH_StoreUnstable(int x, int y) {
+ int xDiff, yDiff;
+ xDiff = abs (x - _x);
+ yDiff = abs (y - _y);
+ if (xDiff + yDiff > 2) {
+ _x = x;
+ _y = y;
+ GUI_TOUCH_StoreState(x, y);
+ }
+}
+
+/*********************************************************************
+*
+* GUI_TOUCH_GetUnstable
+*/
+void GUI_TOUCH_GetUnstable(int* px, int* py) {
+ *px = _x;
+ *py = _y;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_UC.c b/User/system/lib/lcd/gui/Core/GUI_UC.c
new file mode 100644
index 0000000..bd40386
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_UC.c
@@ -0,0 +1,120 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_UC_EncodeUTF8.c
+Purpose : Encoding routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_UC_GetCharSize
+*/
+int GUI_UC_GetCharSize(const char GUI_UNI_PTR * s) {
+ int r;
+ GUI_LOCK();
+ r = GUI_Context.pUC_API->pfGetCharSize(s);
+ GUI_UNLOCK();
+ return r;
+}
+
+/*********************************************************************
+*
+* GUI_UC_GetCharCode
+*/
+U16 GUI_UC_GetCharCode(const char GUI_UNI_PTR * s) {
+ U16 r;
+ GUI_LOCK();
+ r = GUI_Context.pUC_API->pfGetCharCode(s);
+ GUI_UNLOCK();
+ return r;
+}
+
+/*********************************************************************
+*
+* GUI_UC_Encode
+*/
+int GUI_UC_Encode(char* s, U16 Char) {
+ #if GUI_COMPILER_SUPPORTS_FP
+ int r;
+ GUI_LOCK();
+ r = GUI_Context.pUC_API->pfEncode(s, Char);
+ GUI_UNLOCK();
+ return r;
+ #else
+ GUI_USE_PARA(s);
+ GUI_USE_PARA(Char);
+ return 0;
+ #endif
+}
+
+/*********************************************************************
+*
+* GUI_UC__CalcSizeOfChar
+*/
+int GUI_UC__CalcSizeOfChar(U16 Char) {
+ return GUI_Context.pUC_API->pfCalcSizeOfChar(Char);
+}
+
+/*********************************************************************
+*
+* GUI_UC__GetCharCodeInc
+*/
+U16 GUI_UC__GetCharCodeInc(const char GUI_UNI_PTR ** ps) {
+ const char GUI_UNI_PTR * s;
+ U16 r;
+ s = *ps;
+ r = GUI_UC__GetCharCode(s);
+ s += GUI_UC__GetCharSize(s);
+ *ps = s;
+ return r;
+}
+
+/*********************************************************************
+*
+* GUI_UC__NumChars2NumBytes
+*/
+int GUI_UC__NumChars2NumBytes(const char GUI_UNI_PTR * s, int NumChars) {
+ int CharSize, NumBytes = 0;
+ while (NumChars--) {
+ CharSize = GUI_UC__GetCharSize(s);
+ s += CharSize;
+ NumBytes += CharSize;
+ }
+ return NumBytes;
+}
+
+/*********************************************************************
+*
+* GUI_UC__NumBytes2NumChars
+*/
+int GUI_UC__NumBytes2NumChars(const char GUI_UNI_PTR * s, int NumBytes) {
+ int CharSize, Chars = 0, Bytes = 0;
+ while (NumBytes > Bytes) {
+ CharSize = GUI_UC__GetCharSize(s + Bytes);
+ Bytes += CharSize;
+ Chars++;
+ }
+ return Chars;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_UC_DispString.c b/User/system/lib/lcd/gui/Core/GUI_UC_DispString.c
new file mode 100644
index 0000000..d2f50dd
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_UC_DispString.c
@@ -0,0 +1,161 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_UC_DispString.c
+Purpose : Implementation of GUI_UC_DispString
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _GetLineDistX
+*/
+static int _GetLineDistX(const U16 GUI_UNI_PTR *s, int MaxNumChars) {
+ int Dist =0;
+ if (s) {
+ U16 Char;
+ while (((Char = *s) != 0) && MaxNumChars >= 0) {
+ s++;
+ MaxNumChars--;
+ Dist += GUI_GetCharDistX(Char);
+ }
+ }
+ return Dist;
+}
+
+/*********************************************************************
+*
+* _GetLineLen
+*/
+static int _GetLineLen(const U16 GUI_UNI_PTR *s, int MaxLen) {
+ int Len =0;
+ if (!s)
+ return 0;
+ {
+ while ((*s !=0) && Len < MaxLen) {
+ Len++; s++;
+ }
+ }
+ return Len;
+}
+
+/*********************************************************************
+*
+* _DispLine_UC
+*/
+static void _DispLine_UC(const U16 GUI_UNI_PTR *s, int Len, const GUI_RECT *pRect) {
+ if (GUI_Context.pClipRect_HL) {
+ if (GUI_RectsIntersect(GUI_Context.pClipRect_HL, pRect) == 0)
+ return;
+ }
+ {
+ U16 c0;
+ while (--Len >=0) {
+ c0=*s++;
+ GL_DispChar(c0);
+ }
+ }
+}
+
+/*********************************************************************
+*
+* _DispLine
+*/
+static void _DispLine(const U16 GUI_UNI_PTR *s, int Len, const GUI_RECT* pr) {
+ GUI_RECT r;
+ r = *pr;
+ #if GUI_WINSUPPORT
+ WM_ADDORG(r.x0,r.y0);
+ WM_ADDORG(r.x1,r.y1);
+ WM_ITERATE_START(&r) {
+ #endif
+ GUI_Context.DispPosX = r.x0;
+ GUI_Context.DispPosY = r.y0;
+ _DispLine_UC(s, Len, &r); /* Do the actual drawing via routine call. */
+ #if GUI_WINSUPPORT
+ } WM_ITERATE_END();
+ WM_SUBORG(GUI_Context.DispPosX, GUI_Context.DispPosY);
+ #endif
+}
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_UC_DispString
+*/
+void GUI_UC_DispString(const U16 GUI_UNI_PTR *s) {
+ int xAdjust, yAdjust, xOrg;
+ int FontSizeY;
+ if (!s)
+ return;
+ GUI_LOCK();
+ FontSizeY = GUI_Context.pAFont->YSize;
+ xOrg = GUI_Context.DispPosX;
+ /* Adjust vertical position */
+ yAdjust = GUI_GetYAdjust();
+ GUI_Context.DispPosY -= yAdjust;
+ for (; *s; s++) {
+ GUI_RECT r;
+ int LineLen= _GetLineLen(s,0x7fff);
+ int xLineSize = _GetLineDistX(s, LineLen);
+ /* Check if x-position needs to be changed due to h-alignment */
+ switch (GUI_Context.TextAlign & GUI_TA_HORIZONTAL) {
+ case GUI_TA_CENTER: xAdjust= xLineSize/2; break;
+ case GUI_TA_RIGHT: xAdjust= xLineSize; break;
+ default: xAdjust= 0;
+ }
+ r.x0 = GUI_Context.DispPosX -= xAdjust;
+ r.x1 = r.x0 + xLineSize-1;
+ r.y0 = GUI_Context.DispPosY;
+ r.y1 = r.y0 + FontSizeY-1;
+ _DispLine(s, LineLen, &r);
+ GUI_Context.DispPosY = r.y0;
+ s += LineLen;
+ if (*s=='\n') {
+ switch (GUI_Context.TextAlign & GUI_TA_HORIZONTAL) {
+ case GUI_TA_CENTER:
+ case GUI_TA_RIGHT:
+ GUI_Context.DispPosX = xOrg;
+ break;
+ default:
+ GUI_Context.DispPosX = GUI_Context.LBorder;
+ break;
+ }
+ GUI_Context.DispPosY += GUI_GetFontDistY();
+ } else {
+ GUI_Context.DispPosX = r.x0+xLineSize;
+ }
+ if (*s==0) /* end of string (last line) reached ? */
+ break;
+ }
+ GUI_Context.DispPosY += yAdjust;
+ GUI_Context.TextAlign &= ~GUI_TA_HORIZONTAL;
+ GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_UC_EncodeNone.c b/User/system/lib/lcd/gui/Core/GUI_UC_EncodeNone.c
new file mode 100644
index 0000000..f1173cc
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_UC_EncodeNone.c
@@ -0,0 +1,108 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_UC_EncodeNone.c
+Purpose : Encoding routines for non unicode systems (default)
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _GetCharCode
+*
+* Purpose:
+* Return the UNICODE character code of the current character.
+*/
+static U16 _GetCharCode(const char GUI_UNI_PTR * s) {
+ return *(const U8 GUI_UNI_PTR *)s;
+}
+
+/*********************************************************************
+*
+* _GetCharSize
+*
+* Purpose:
+* Return the number of bytes of the current character.
+*/
+static int _GetCharSize(const char GUI_UNI_PTR * s) {
+ GUI_USE_PARA(s);
+ return 1;
+}
+
+/*********************************************************************
+*
+* _CalcSizeOfChar
+*
+* Purpose:
+* Return the number of bytes needed for the given character.
+*/
+static int _CalcSizeOfChar(U16 Char) {
+ GUI_USE_PARA(Char);
+ return 1;
+}
+
+/*********************************************************************
+*
+* _Encode
+*
+* Purpose:
+* Encode character into 1/2/3 bytes.
+*/
+static int _Encode(char *s, U16 Char) {
+ *s = (U8)(Char);
+ return 1;
+}
+
+/*********************************************************************
+*
+* Static data
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _API_Table
+*/
+const GUI_UC_ENC_APILIST GUI__API_TableNone = {
+ _GetCharCode, /* return character code as U16 */
+ _GetCharSize, /* return size of character: 1 */
+ _CalcSizeOfChar, /* return size of character: 1 */
+ _Encode /* Encode character */
+};
+
+/*********************************************************************
+*
+* Exported code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_UC_SetEncodeNone
+*/
+void GUI_UC_SetEncodeNone(void) {
+ GUI_LOCK();
+ GUI_Context.pUC_API = &GUI__API_TableNone;
+ GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_UC_EncodeUTF8.c b/User/system/lib/lcd/gui/Core/GUI_UC_EncodeUTF8.c
new file mode 100644
index 0000000..cc0e1bf
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_UC_EncodeUTF8.c
@@ -0,0 +1,153 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_UC_EncodeUTF8.c
+Purpose : Encoding routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _GetCharCode
+*
+* Purpose:
+* Return the UNICODE character code of the current character.
+*/
+static U16 _GetCharCode(const char GUI_UNI_PTR * s) {
+ U16 r;
+ U8 Char = *(const U8*)s;
+ if ((Char & 0x80) == 0) { /* Single byte (ASCII) */
+ r = Char;
+ } else if ((Char & 0xe0) == 0xc0) { /* Double byte sequence */
+ r = (Char & 0x1f) << 6;
+ Char = *(++s);
+ Char &= 0x3f;
+ r |= Char;
+ } else if ((Char & 0xf0) == 0xe0) { /* 3 byte sequence */
+ r = (Char & 0x0f) << 12;
+ Char = *(++s);
+ Char &= 0x3f;
+ r |= (Char << 6);
+ Char = *(++s);
+ Char &= 0x3f;
+ r |= Char;
+ } else {
+ GUI_DEBUG_ERROROUT("Illegal character during UTF-8 decoding!");
+ r = 1; /* Illegal character. To avoid endless loops in upper layers, we return 1 rather than 0. */
+ }
+ return r;
+}
+
+/*********************************************************************
+*
+* _GetCharSize
+*
+* Purpose:
+* Return the number of bytes of the current character.
+*/
+static int _GetCharSize(const char GUI_UNI_PTR * s) {
+ U8 Char = *s;
+ if ((Char & 0x80) == 0) {
+ return 1;
+ } else if ((Char & 0xe0) == 0xc0) {
+ return 2;
+ } else if ((Char & 0xf0) == 0xe0) {
+ return 3;
+ }
+ GUI_DEBUG_ERROROUT("Illegal character during UTF-8 decoding!");
+ return 1; /* Illegal character. To avoid endless loops in upper layers, we return 1 rather than 0. */
+}
+
+/*********************************************************************
+*
+* _CalcSizeOfChar
+*
+* Purpose:
+* Return the number of bytes needed for the given character.
+*/
+static int _CalcSizeOfChar(U16 Char) {
+ int r;
+ if (Char & 0xF800) { /* Single byte (ASCII) */
+ r = 3;
+ } else if (Char & 0xFF80) { /* Double byte sequence */
+ r = 2;
+ } else { /* 3 byte sequence */
+ r = 1;
+ }
+ return r;
+}
+
+/*********************************************************************
+*
+* _Encode
+*
+* Purpose:
+* Encode character into 1/2/3 bytes.
+*/
+static int _Encode(char *s, U16 Char) {
+ int r;
+ r = _CalcSizeOfChar(Char);
+ switch (r) {
+ case 1:
+ *s = (char)Char;
+ break;
+ case 2:
+ *s++ = 0xC0 | (Char >> 6);
+ *s = 0x80 | (Char & 0x3F);
+ break;
+ case 3:
+ *s++ = 0xE0 | (Char >> 12);
+ *s++ = 0x80 | ((Char >> 6) & 0x3F);
+ *s = 0x80 | (Char & 0x3F);
+ break;
+ }
+ return r;
+}
+
+/*********************************************************************
+*
+* _API_Table
+*/
+static const GUI_UC_ENC_APILIST _API_Table = {
+ _GetCharCode, /* return character code as U16 (Unicode) */
+ _GetCharSize, /* return size of character: 1/2/3 */
+ _CalcSizeOfChar, /* return size of character: 1/2/3 */
+ _Encode /* Encode character into 1/2/3 bytes */
+};
+
+/*********************************************************************
+*
+* Exported code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_UC_SetEncodeUTF8
+*/
+void GUI_UC_SetEncodeUTF8(void) {
+ GUI_LOCK();
+ GUI_Context.pUC_API = &_API_Table;
+ GUI_UNLOCK();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_VNC.h b/User/system/lib/lcd/gui/Core/GUI_VNC.h
new file mode 100644
index 0000000..f1d9a9d
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_VNC.h
@@ -0,0 +1,95 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_VNC.h
+Purpose : Publics for the VNC server
+---------------------------END-OF-HEADER------------------------------
+
+Attention : Do not modify this file ! If you do, you will not
+ be able do update to a later GUI version !
+
+*/
+
+#ifndef GUI_VNC_H
+#define GUI_VNC_H
+
+#include "GUI.h"
+#include "LCD_Private.h" /* Required because the Driver API depends on Config currently */
+
+#if GUI_SUPPORT_DEVICES
+
+
+#if defined(__cplusplus)
+extern "C" { /* Make sure we have C-declarations in C++ programs */
+#endif
+
+
+/*********************************************************************
+*
+* defines
+*
+**********************************************************************
+*/
+#define GUI_VNC_NO_ERROR 0
+#define GUI_VNC_ERROR_MISC 1
+#define GUI_VNC_ERROR_WRONGFORMAT 2
+
+/*********************************************************************
+*
+* types
+*
+**********************************************************************
+*/
+typedef int (*GUI_tSend) (const U8 * pData, int len, void* pConnectInfo);
+typedef int (*GUI_tReceive)( U8 * pData, int len, void* pConnectInfo);
+
+typedef struct GUI_VNC_CONTEXT {
+ struct GUI_VNC_CONTEXT * pNext;
+ int LayerIndex;
+ /* Connection related data */
+ GUI_tSend pfSend;
+ GUI_tReceive pfReceive;
+ void* pConnectInfo;
+ U16 ServerIndex;
+ /* Display related info */
+ const tLCDDEV_APIList* pLayerAPIOrig;
+ tLCDDEV_APIList VNC_LayerAPI;
+ int x0Dirty, y0Dirty, x1Dirty, y1Dirty;
+ int XSize, YSize;
+ /* Status */
+ char ClientSupportsHextile;
+ char IsBigEndian;
+} GUI_VNC_CONTEXT;
+
+/*********************************************************************
+*
+* functions
+*
+**********************************************************************
+*/
+int GUI_VNC_Process (GUI_VNC_CONTEXT* pContext, GUI_tSend pfSend, GUI_tReceive pfReceive, void* pConnectInfo);
+void GUI_VNC_AttachToLayer(GUI_VNC_CONTEXT* pContext, int LayerIndex);
+int GUI_VNC_GetNumConnections(void);
+
+/**** External routine to link the server to the system ... USER defined ! ****/
+int GUI_VNC_X_StartServer(int LayerIndex, int ServerIndex);
+
+#if defined(__cplusplus)
+ }
+#endif
+
+#endif /* GUI_SUPPORT_DEVICES */
+#endif /* Avoid multiple inclusion */
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_WaitEvent.c b/User/system/lib/lcd/gui/Core/GUI_WaitEvent.c
new file mode 100644
index 0000000..1523c4b
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_WaitEvent.c
@@ -0,0 +1,40 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_WaitEvent.c
+Purpose : Implementation of said function
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+#if GUI_WINSUPPORT
+ #include "WM.h"
+#endif
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_WaitEvent
+*/
+void GUI_WaitEvent(void) {
+ GUI_X_WAIT_EVENT();
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_WaitKey.c b/User/system/lib/lcd/gui/Core/GUI_WaitKey.c
new file mode 100644
index 0000000..bb48e61
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_WaitKey.c
@@ -0,0 +1,46 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_WaitKey.c
+Purpose : Implementation of GUI_WaitKey
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_WaitKey
+*/
+int GUI_WaitKey(void) {
+ int r;
+ do {
+ r = GUI_GetKey();
+ if (r) {
+ break;
+ }
+ if (!GUI_Exec()) {
+ GUI_X_WAIT_EVENT(); /* Wait for event (keyboard, mouse or whatever) */
+ }
+ } while (1);
+ return r;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_Warn.c b/User/system/lib/lcd/gui/Core/GUI_Warn.c
new file mode 100644
index 0000000..0abc4ed
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_Warn.c
@@ -0,0 +1,126 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_Warn.C
+Purpose : Logging (used only at higher debug levels)
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+#include
+#include "GUI_Protected.h"
+#include "GUI_X.h"
+
+/*********************************************************************
+*
+* Defines
+*
+**********************************************************************
+*/
+
+#define MAXLEN 50
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _CopyString
+*/
+static void _CopyString(char*d, const char*s, int MaxLen) {
+ while ((MaxLen > 0) && *s) {
+ *d++ = *s++;
+ MaxLen--;
+ }
+ *d = 0;
+}
+
+/*********************************************************************
+*
+* Public code
+*
+* Note: These routines are needed only in higher debug levels.
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_Warn
+*/
+void GUI_Warn(const char *s) {
+ GUI_X_Warn(s);
+}
+
+/*********************************************************************
+*
+* GUI_Warn1
+*/
+void GUI_Warn1(const char *s, int p0) {
+ char ac[MAXLEN + 10];
+ char* sOut = ac;
+ _CopyString(ac, s, MAXLEN);
+ sOut += strlen(sOut);
+ GUI__AddSpaceHex(p0, 8, &sOut);
+ GUI_Warn(ac);
+}
+
+/*********************************************************************
+*
+* GUI_Warn2
+*/
+void GUI_Warn2(const char *s, int p0, int p1) {
+ char ac[MAXLEN + 20];
+ char* sOut = ac;
+ _CopyString(ac, s, MAXLEN);
+ sOut += strlen(sOut);
+ GUI__AddSpaceHex(p0, 8, &sOut);
+ GUI__AddSpaceHex(p1, 8, &sOut);
+ GUI_Warn(ac);
+}
+
+/*********************************************************************
+*
+* GUI_Warn3
+*/
+void GUI_Warn3(const char *s, int p0, int p1, int p2) {
+ char ac[MAXLEN + 30];
+ char* sOut = ac;
+ _CopyString(ac, s, MAXLEN);
+ sOut += strlen(sOut);
+ GUI__AddSpaceHex(p0, 8, &sOut);
+ GUI__AddSpaceHex(p1, 8, &sOut);
+ GUI__AddSpaceHex(p2, 8, &sOut);
+ GUI_Warn(ac);
+}
+
+/*********************************************************************
+*
+* GUI_Warn4
+*/
+void GUI_Warn4(const char *s, int p0, int p1, int p2, int p3) {
+ char ac[MAXLEN + 40];
+ char* sOut = ac;
+ _CopyString(ac, s, MAXLEN);
+ sOut += strlen(sOut);
+ GUI__AddSpaceHex(p0, 8, &sOut);
+ GUI__AddSpaceHex(p1, 8, &sOut);
+ GUI__AddSpaceHex(p2, 8, &sOut);
+ GUI__AddSpaceHex(p3, 8, &sOut);
+ GUI_Warn(ac);
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI_X.h b/User/system/lib/lcd/gui/Core/GUI_X.h
new file mode 100644
index 0000000..850d46c
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI_X.h
@@ -0,0 +1,79 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_X.h
+Purpose : Declarations for GUI_X module
+---------------------------END-OF-HEADER------------------------------
+
+Attention : Do not modify this file ! If you do, you will not
+ be able do update to a later GUI version !
+
+*/
+
+#ifndef GUI_X_H
+#define GUI_X_H
+
+#include "GUI.h"
+
+#if defined(__cplusplus)
+extern "C" { /* Make sure we have C-declarations in C++ programs */
+#endif
+
+/************************************************************
+*
+* GUI_X_
+*
+* externals, to be defined by application
+*
+*************************************************************
+
+The externals defined below should be defined by the
+application. They are per default contained in the module
+GUI_X.c.
+Note that a lot if not all of these are not required in most target
+systems.
+For this module, samples are available for configurations
+with or without operating system.
+*/
+
+/**** Init ****/
+void GUI_X_Init(void);
+
+/**** ExecIdle - called if nothing else is left to do ****/
+void GUI_X_ExecIdle(void);
+
+/**** Timing routines - required for blinking ****/
+int GUI_X_GetTime(void);
+void GUI_X_Delay(int Period);
+
+/**** Multitask routines - required only if multitasking is used (#define GUI_OS 1) ****/
+void GUI_X_Unlock(void);
+void GUI_X_Lock(void);
+U32 GUI_X_GetTaskId(void);
+void GUI_X_InitOS(void);
+
+/**** Event driving (optional with multitasking) ****/
+void GUI_X_WaitEvent(void);
+void GUI_X_SignalEvent(void);
+/**** Recording (logs/warnings and errors) - required only for higher levels ****/
+void GUI_X_Log(const char *s);
+void GUI_X_Warn(const char *s);
+void GUI_X_ErrorOut(const char *s);
+
+#if defined(__cplusplus)
+ }
+#endif
+#endif /* ifdef GUI_X_H */
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI__AddSpaceHex.c b/User/system/lib/lcd/gui/Core/GUI__AddSpaceHex.c
new file mode 100644
index 0000000..c0de245
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI__AddSpaceHex.c
@@ -0,0 +1,40 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI__AddSpaceHex.C
+Purpose : Internal function
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI.h"
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code (module internal)
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI__AddSpaceHex
+*/
+void GUI__AddSpaceHex(U32 v, U8 Len, char** ps) {
+ char* s = *ps;
+ *s++ = ' ';
+ *ps = s;
+ GUI_AddHex(v, Len, ps);
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI__CalcTextRect.c b/User/system/lib/lcd/gui/Core/GUI__CalcTextRect.c
new file mode 100644
index 0000000..220b27c
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI__CalcTextRect.c
@@ -0,0 +1,75 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI__CalcTextRect.c
+Purpose : Implementation of gui function
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+#include "GUI_Protected.h"
+#include "GUI.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI__CalcTextRect
+*/
+void GUI__CalcTextRect(const char GUI_UNI_PTR* pText, const GUI_RECT* pTextRectIn, GUI_RECT* pTextRectOut, int TextAlign) {
+ if (pText) {
+ int xPos, yPos, TextWidth, TextHeight;
+
+ /* Calculate X-pos of text */
+ TextWidth = GUI_GetStringDistX(pText);
+ switch (TextAlign & GUI_TA_HORIZONTAL) {
+ case GUI_TA_HCENTER:
+ xPos = pTextRectIn->x0 + ((pTextRectIn->x1 - pTextRectIn->x0 + 1) - TextWidth) / 2;
+ break;
+ case GUI_TA_RIGHT:
+ xPos = pTextRectIn->x1 - TextWidth + 1;
+ break;
+ default:
+ xPos = pTextRectIn->x0;
+ }
+
+ /* Calculate Y-pos of text*/
+ TextHeight = GUI_GetFontDistY();
+ switch (TextAlign & GUI_TA_VERTICAL) {
+ case GUI_TA_VCENTER:
+ yPos = pTextRectIn->y0 + ((pTextRectIn->y1 - pTextRectIn->y0 + 1) - TextHeight) / 2;
+ break;
+ case GUI_TA_BOTTOM:
+ yPos = pTextRectIn->y1 - TextHeight + 1;
+ break;
+ case GUI_TA_BASELINE:
+ default:
+ yPos = pTextRectIn->y0;
+ }
+
+ /* Return text rectangle */
+ pTextRectOut->x0 = xPos;
+ pTextRectOut->y0 = yPos;
+ pTextRectOut->x1 = xPos + TextWidth - 1;
+ pTextRectOut->y1 = yPos + TextHeight - 1;
+ } else {
+ *pTextRectOut = *pTextRectIn;
+ }
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI__DivideRound.c b/User/system/lib/lcd/gui/Core/GUI__DivideRound.c
new file mode 100644
index 0000000..14a5303
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI__DivideRound.c
@@ -0,0 +1,44 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI__DivideRound.C
+Purpose : Implementation of GUI__DivideRound
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI__DivideRound
+*
+* This routine is used internally for computations. Primary goal is
+* to minimize the effects of rounding which occur if we simply
+* divide.
+*/
+int GUI__DivideRound(int a, int b) {
+ int r = 0;
+ if (b) {
+ r = ((a + b / 2) / b);
+ }
+ return r;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI__DivideRound32.c b/User/system/lib/lcd/gui/Core/GUI__DivideRound32.c
new file mode 100644
index 0000000..da2aa39
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI__DivideRound32.c
@@ -0,0 +1,47 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI__DivideRound32.C
+Purpose : Implementation of GUI__DivideRound32
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI__DivideRound32
+*
+* This routine is used internally for computations. Primary goal is
+* to minimize the effects of rounding which occur if we simply
+* divide.
+*/
+I32 GUI__DivideRound32(I32 a, I32 b) {
+ if (b) {
+ if (a < 0) {
+ return (a - (b >> 1)) / b;
+ } else {
+ return (a + (b >> 1)) / b;
+ }
+ }
+ return 0;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI__GetFontSizeY.c b/User/system/lib/lcd/gui/Core/GUI__GetFontSizeY.c
new file mode 100644
index 0000000..bb78054
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI__GetFontSizeY.c
@@ -0,0 +1,36 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI__GetFontSizeY.c
+Purpose : Implementation of optional routine
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_GetFontSizeY
+*/
+int GUI__GetFontSizeY(void) {
+ return GUI_Context.pAFont->YSize * GUI_Context.pAFont->YMag;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI__GetNumChars.c b/User/system/lib/lcd/gui/Core/GUI__GetNumChars.c
new file mode 100644
index 0000000..c235983
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI__GetNumChars.c
@@ -0,0 +1,44 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI__GetNumChars.c
+Purpose : Implementation of character and string services
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI__GetNumChars
+*/
+int GUI__GetNumChars(const char GUI_UNI_PTR *s) {
+ int NumChars = 0;
+ if (s) {
+ while (GUI_UC__GetCharCodeInc(&s)) {
+ NumChars++;
+ }
+ }
+ return NumChars;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI__HandleEOLine.c b/User/system/lib/lcd/gui/Core/GUI__HandleEOLine.c
new file mode 100644
index 0000000..1420433
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI__HandleEOLine.c
@@ -0,0 +1,47 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI__HandleEOLine.C
+Purpose : Implementation of optional routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+
+#include "GUI_Protected.h"
+#include "GUIDebug.h"
+
+
+/*********************************************************************
+*
+* GUI__HandleEOLine
+*
+* Is called when processing strings which may consist of
+* multiple lines after a line has been processed. It will
+* a) Swall the line feed character (if it is there)
+* b) Return 1 if end of string, otherwise 0
+*/
+int GUI__HandleEOLine(const char GUI_UNI_PTR **ps) {
+ const char GUI_UNI_PTR *s = *ps;
+ char c = *s++;
+ if (c == 0) {
+ return 1;
+ }
+ if (c == '\n') {
+ *ps = s;
+ }
+ return 0;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI__IntersectRect.c b/User/system/lib/lcd/gui/Core/GUI__IntersectRect.c
new file mode 100644
index 0000000..1580604
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI__IntersectRect.c
@@ -0,0 +1,59 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_IntersectRect.c
+Purpose : Implementation of GUI_IntersectRect
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI__IntersectRects
+*
+* Purpose:
+* Calc intersection of rectangles
+*
+* Add. info:
+* Rectangles are passed as pointers. These pointers need to be valid;
+* a NULL pointer may not be passed. There is no check for NULL pointers
+* implemented in order to avoid avoid performance penalty.
+* There is a similar function available, GUI__IntersectRects(),
+* which takes 3 parameters and
+* has a return value. Note that this one should be preferred because
+* it is considerably faster and the call requires one parameter less.
+*/
+void GUI__IntersectRect(GUI_RECT* pDest, const GUI_RECT* pr0) {
+ if (pDest->x0 < pr0->x0) {
+ pDest->x0 = pr0->x0;
+ }
+ if (pDest->y0 < pr0->y0) {
+ pDest->y0 = pr0->y0;
+ }
+ if (pDest->x1 > pr0->x1) {
+ pDest->x1 = pr0->x1;
+ }
+ if (pDest->y1 > pr0->y1) {
+ pDest->y1 = pr0->y1;
+ }
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI__IntersectRects.c b/User/system/lib/lcd/gui/Core/GUI__IntersectRects.c
new file mode 100644
index 0000000..47151f7
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI__IntersectRects.c
@@ -0,0 +1,68 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI_IntersectRects.c
+Purpose : Implementation of GUI_IntersectRects
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Macros
+*
+**********************************************************************
+*/
+
+#define MIN(v0,v1) ((v0>v1) ? v1 : v0)
+#define MAX(v0,v1) ((v0>v1) ? v0 : v1)
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI__IntersectRects
+*
+* Purpose:
+* Calc intersection of rectangles
+*
+* Return value:
+* 1 if they do intersect,
+* 0 if there is no intersection
+*
+* Add. info:
+* Rectangles are passed as pointers. These pointers need to be valid;
+* a NULL pointer may not be passed. There is no check for NULL pointers
+* implemented in order to avoid avoid performance penalty.
+*/
+int GUI__IntersectRects(GUI_RECT* pDest, const GUI_RECT* pr0, const GUI_RECT* pr1) {
+ pDest->x0 = MAX (pr0->x0, pr1->x0);
+ pDest->y0 = MAX (pr0->y0, pr1->y0);
+ pDest->x1 = MIN (pr0->x1, pr1->x1);
+ pDest->y1 = MIN (pr0->y1, pr1->y1);
+ if (pDest->x1 < pDest->x0) {
+ return 0;
+ }
+ if (pDest->y1 < pDest->y0) {
+ return 0;
+ }
+ return 1;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI__Read.c b/User/system/lib/lcd/gui/Core/GUI__Read.c
new file mode 100644
index 0000000..fb888e5
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI__Read.c
@@ -0,0 +1,59 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI__ReadData.c
+Purpose : Implementation of reading data
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Exported code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI__Read16
+*/
+U16 GUI__Read16(const U8 ** ppData) {
+ const U8 * pData;
+ U16 Value;
+ pData = *ppData;
+ Value = *pData;
+ Value |= (U16)(*(pData + 1) << 8);
+ pData += 2;
+ *ppData = pData;
+ return Value;
+}
+
+/*********************************************************************
+*
+* GUI__Read32
+*/
+U32 GUI__Read32(const U8 ** ppData) {
+ const U8 * pData;
+ U32 Value;
+ pData = *ppData;
+ Value = *pData;
+ Value |= ( *(pData + 1) << 8);
+ Value |= ((U32)*(pData + 2) << 16);
+ Value |= ((U32)*(pData + 3) << 24);
+ pData += 4;
+ *ppData = pData;
+ return Value;
+}
+
diff --git a/User/system/lib/lcd/gui/Core/GUI__ReduceRect.c b/User/system/lib/lcd/gui/Core/GUI__ReduceRect.c
new file mode 100644
index 0000000..b69dfdb
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI__ReduceRect.c
@@ -0,0 +1,39 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI__ReduceRect.C
+Purpose : Implementation of GUI__ReduceRect
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI__ReduceRect
+*/
+void GUI__ReduceRect(GUI_RECT* pDest, const GUI_RECT *pRect, int Dist) {
+ pDest->x0 = pRect->x0 + Dist;
+ pDest->x1 = pRect->x1 - Dist;
+ pDest->y0 = pRect->y0 + Dist;
+ pDest->y1 = pRect->y1 - Dist;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI__SetText.c b/User/system/lib/lcd/gui/Core/GUI__SetText.c
new file mode 100644
index 0000000..153b92f
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI__SetText.c
@@ -0,0 +1,51 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI__SetText.C
+Purpose : Implementation of said function
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+#include
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI__SetText
+*/
+int GUI__SetText(GUI_HMEM* phText, const char* s) {
+ int r = 0;
+ if (GUI__strcmp_hp(*phText, s) != 0) { /* Make sure we have a quick out if nothing changes */
+ GUI_HMEM hMem;
+ hMem = GUI_ALLOC_AllocNoInit(GUI__strlen(s) + 1);
+ if (hMem) {
+ char* pMem;
+ pMem = (char*) GUI_ALLOC_h2p(hMem);
+ strcpy(pMem, s);
+ GUI_ALLOC_FreePtr(phText);
+ *phText = hMem;
+ r = 1;
+ }
+ }
+ return r;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI__Wrap.c b/User/system/lib/lcd/gui/Core/GUI__Wrap.c
new file mode 100644
index 0000000..2672ff4
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI__Wrap.c
@@ -0,0 +1,161 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI__WRAP.c
+Purpose : Implementation of wrap routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _IsLineEnd
+*/
+static int _IsLineEnd(U16 Char) {
+ if (!Char || (Char == '\n')) {
+ return 1;
+ }
+ return 0;
+}
+
+/*********************************************************************
+*
+* _GetWordWrap
+*/
+static int _GetWordWrap(const char GUI_UNI_PTR * s, int xSize) {
+ int xDist = 0, NumChars = 0, WordWrap = 0;
+ U16 Char, PrevChar = 0;
+ while (1) {
+ Char = GUI_UC__GetCharCodeInc(&s); /* Similar to: *s++ */
+ /* Let's first check if the line end is reached. In this case we are done. */
+ if (_IsLineEnd(Char)) {
+ WordWrap = NumChars;
+ break;
+ }
+ /* If current character is a space, we found a wrap position */
+ if ((Char == ' ') && (Char != PrevChar)) {
+ WordWrap = NumChars;
+ }
+ PrevChar = Char;
+ xDist += GUI_GetCharDistX(Char);
+ if ((xDist <= xSize) || (NumChars == 0)) {
+ NumChars++;
+ } else {
+ break;
+ }
+ }
+ if (!WordWrap) {
+ WordWrap = NumChars;
+ }
+ return WordWrap;
+}
+
+/*********************************************************************
+*
+* _GetCharWrap
+*/
+static int _GetCharWrap(const char GUI_UNI_PTR * s, int xSize) {
+ int xDist = 0, NumChars = 0;
+ U16 Char;
+ while ((Char = GUI_UC__GetCharCodeInc(&s)) != 0) {
+ xDist += GUI_GetCharDistX(Char);
+ if ((NumChars && (xDist > xSize)) || (Char == '\n')) {
+ break;
+ }
+ NumChars++;
+ }
+ return NumChars;
+}
+
+/*********************************************************************
+*
+* _GetNoWrap
+*/
+static int _GetNoWrap(const char GUI_UNI_PTR * s) {
+ return GUI__GetLineNumChars(s, 0x7FFF);
+}
+
+/*********************************************************************
+*
+* puplic code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI__WrapGetNumCharsDisp
+*
+* Returns:
+* Number of characters to display in the line.
+* Trailing spaces and line end character are
+* not counted
+*/
+int GUI__WrapGetNumCharsDisp(const char GUI_UNI_PTR * pText, int xSize, GUI_WRAPMODE WrapMode) {
+ int r;
+ switch (WrapMode) {
+ case GUI_WRAPMODE_WORD:
+ r = _GetWordWrap(pText, xSize);
+ break;
+ case GUI_WRAPMODE_CHAR:
+ r = _GetCharWrap(pText, xSize);
+ break;
+ default:
+ r = _GetNoWrap(pText);
+ }
+ return r;
+}
+
+/*********************************************************************
+*
+* GUI__WrapGetNumCharsToNextLine
+*/
+int GUI__WrapGetNumCharsToNextLine(const char GUI_UNI_PTR * pText, int xSize, GUI_WRAPMODE WrapMode) {
+ int NumChars;
+ U16 Char;
+ NumChars = GUI__WrapGetNumCharsDisp(pText, xSize, WrapMode);
+ pText += GUI_UC__NumChars2NumBytes(pText, NumChars);
+ Char = GUI_UC__GetCharCodeInc(&pText);
+ if (Char == '\n') {
+ NumChars++;
+ } else {
+ if (WrapMode == GUI_WRAPMODE_WORD) {
+ while (Char == ' ') {
+ NumChars++;
+ Char = GUI_UC__GetCharCodeInc(&pText);
+ }
+ }
+ }
+ return NumChars;
+}
+
+/*********************************************************************
+*
+* GUI__WrapGetNumBytesToNextLine
+*/
+int GUI__WrapGetNumBytesToNextLine(const char GUI_UNI_PTR * pText, int xSize, GUI_WRAPMODE WrapMode) {
+ int NumChars, NumBytes;
+ NumChars = GUI__WrapGetNumCharsToNextLine(pText, xSize, WrapMode);
+ NumBytes = GUI_UC__NumChars2NumBytes(pText, NumChars);
+ return NumBytes;
+}
+
+/*************************** End of file ****************************/
+
diff --git a/User/system/lib/lcd/gui/Core/GUI__memset.c b/User/system/lib/lcd/gui/Core/GUI__memset.c
new file mode 100644
index 0000000..f89908c
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI__memset.c
@@ -0,0 +1,81 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI__memset.c
+Purpose : Implementation of said function
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include /* needed for definition of NULL */
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI__memset
+*
+* Purpose:
+* Replacement for the memset function. The advantage is high speed
+* on all systems (sometime up to 10 times as fast as the one
+* in the library)
+* Main idea is to write int-wise.
+*/
+void GUI__memset(U8* p, U8 Fill, int NumBytes) {
+ int NumInts;
+ /* Write bytes until we are done or have reached an int boundary */
+ while (NumBytes && ((sizeof(int) - 1) & (U32)p)) {
+ *p++ = Fill;
+ NumBytes--;
+ }
+ /* Write Ints */
+ NumInts = (unsigned)NumBytes / sizeof(int);
+ if (NumInts) {
+ int FillInt;
+ int *pInt;
+ NumBytes &= (sizeof(int) - 1);
+ if (sizeof(int) == 2) { /* May some compilers generate a warning at this line: Condition is alwaws true/false */
+ FillInt = Fill * 0x101; /* May some compilers generate a warning at this line: Unreachable code */
+ } else if (sizeof(int) == 4) { /* May some compilers generate a warning at this line: Condition is alwaws true/false */
+ FillInt = Fill * 0x1010101; /* May some compilers generate a warning at this line: Unreachable code */
+ }
+ pInt = (int*)p;
+ /* Fill large amount of data at a time */
+ while (NumInts >= 4) {
+ *pInt++ = FillInt;
+ *pInt++ = FillInt;
+ *pInt++ = FillInt;
+ *pInt++ = FillInt;
+ NumInts -= 4;
+ }
+ /* Fill one int at a time */
+ while (NumInts) {
+ *pInt++ = FillInt;
+ NumInts--;
+ }
+ p = (U8*)pInt;
+ }
+ /* Fill the remainder byte wise */
+ while (NumBytes) {
+ *p++ = Fill;
+ NumBytes--;
+ }
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI__memset16.c b/User/system/lib/lcd/gui/Core/GUI__memset16.c
new file mode 100644
index 0000000..e160651
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI__memset16.c
@@ -0,0 +1,93 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI__memset16.c
+Purpose : Implementation of said function
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI__memset
+*
+* Purpose:
+* Equivalent to the memset function, for 16 bit Data.
+*/
+void GUI__memset16(U16 * p, U16 Fill, int NumWords) {
+ /* Code for 16 bit CPUs */
+ if (sizeof(int) == 2) { /* May some compilers generate a warning at this line: Condition is alwaws true/false */
+ if (NumWords >= 8) { /* May some compilers generate a warning at this line: Unreachable code */
+ *p++ = Fill;
+ *p++ = Fill;
+ *p++ = Fill;
+ *p++ = Fill;
+ *p++ = Fill;
+ *p++ = Fill;
+ *p++ = Fill;
+ *p++ = Fill;
+ NumWords -= 8;
+ }
+ while (NumWords) {
+ *p++ = Fill;
+ NumWords--;
+ }
+ } else {
+ int NumInts; /* May some compilers generate a warning at this line: Unreachable code */
+ /* Write 16 bit until we are done or have reached an int boundary */
+ if (2 & (U32)p) {
+ *p++ = Fill;
+ NumWords--;
+ }
+ /* Write Ints */
+ NumInts = (unsigned)NumWords / (sizeof(int) / 2);
+ if (NumInts) {
+ int FillInt;
+ int *pInt;
+ FillInt = Fill * 0x10001;
+
+ pInt = (int*)p;
+ /* Fill large amount of data at a time */
+ if (NumInts >= 4) {
+ do {
+ *pInt = FillInt;
+ *(pInt + 1) = FillInt;
+ *(pInt + 2) = FillInt;
+ *(pInt + 3) = FillInt;
+ pInt += 4;
+ } while ((NumInts -= 4) >= 4);
+ }
+ /* Fill one int at a time */
+ while (NumInts) {
+ *pInt++ = FillInt;
+ NumInts--;
+ }
+ p = (U16*)pInt;
+ }
+ /* Fill the remainder */
+ if (NumWords & 1) {
+ *p = Fill;
+ }
+ }
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI__strcmp.c b/User/system/lib/lcd/gui/Core/GUI__strcmp.c
new file mode 100644
index 0000000..eca49f7
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI__strcmp.c
@@ -0,0 +1,80 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI__strcmp.c
+Purpose : Implementation of said function
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI__strcmp
+*
+* Purpose:
+* Replacement for the strcmp function. The advantage is that it can
+* be called with NULL pointer(s).
+* A NULL string is treated as a an empty string ("").
+* Return value:
+* 0 if identical
+* 1 else
+*/
+int GUI__strcmp(const char GUI_UNI_PTR * s0, const char GUI_UNI_PTR * s1) {
+ if (s0 == NULL) {
+ s0 = "";
+ }
+ if (s1 == NULL) {
+ s1 = "";
+ }
+ do {
+ if (*s0 != *s1) {
+ return 1;
+ }
+ s1++;
+ } while (*++s0);
+ if (*s1) {
+ return 1; /* Not equal, since s1 is longer than s0 */
+ }
+ return 0; /* Equal ! */
+}
+
+/*********************************************************************
+*
+* GUI__strcmp_hp
+*
+* Purpose:
+* Replacement for the strcmp function. The advantage is that it can
+* be called with NULL pointer or 0 handle.
+* A NULL string is treated as a an empty string ("").
+* Return value:
+* 0 if identical
+* 1 else
+*/
+int GUI__strcmp_hp(GUI_HMEM hs0, const char GUI_UNI_PTR * s1) {
+ const char* s0 = NULL;
+ if (hs0) {
+ s0 = (const char*)GUI_ALLOC_h2p(hs0);
+ }
+ return GUI__strcmp(s0, s1);
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/GUI__strlen.c b/User/system/lib/lcd/gui/Core/GUI__strlen.c
new file mode 100644
index 0000000..2d74333
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/GUI__strlen.c
@@ -0,0 +1,46 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : GUI__strlen.c
+Purpose : Implementation of GUI__strlen
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI__strlen
+*
+* Purpose:
+* Replacement for the strlen function. The advantage is that it can
+* be called with a NULL pointer, in which case -1 is returned.
+*/
+int GUI__strlen(const char GUI_UNI_PTR * s) {
+ int r = -1;
+ if (s) {
+ do {
+ r++;
+ } while (*s++);
+ }
+ return r;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/LCD.c b/User/system/lib/lcd/gui/Core/LCD.c
new file mode 100644
index 0000000..4f4977f
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/LCD.c
@@ -0,0 +1,415 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCD.c
+Purpose : Link between GUI and LCD_L0
+ Performs most of the clipping.
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#define LCD_C
+
+#include
+#include "GUI_Private.h"
+#include "LCD_Private.h"
+#include "GUIDebug.h"
+
+/*********************************************************************
+ *
+ * Defines
+ *
+ **********************************************************************
+ */
+
+#define RETURN_IF_Y_OUT() \
+ if (y < GUI_Context.ClipRect.y0) \
+ return; \
+ if (y > GUI_Context.ClipRect.y1) \
+ return;
+
+#define RETURN_IF_X_OUT() \
+ if (x < GUI_Context.ClipRect.x0) \
+ return; \
+ if (x > GUI_Context.ClipRect.x1) \
+ return;
+
+#define CLIP_X() \
+ if (x0 < GUI_Context.ClipRect.x0) \
+ { \
+ x0 = GUI_Context.ClipRect.x0; \
+ } \
+ if (x1 > GUI_Context.ClipRect.x1) \
+ { \
+ x1 = GUI_Context.ClipRect.x1; \
+ }
+
+#define CLIP_Y() \
+ if (y0 < GUI_Context.ClipRect.y0) \
+ { \
+ y0 = GUI_Context.ClipRect.y0; \
+ } \
+ if (y1 > GUI_Context.ClipRect.y1) \
+ { \
+ y1 = GUI_Context.ClipRect.y1; \
+ }
+
+/*********************************************************************
+ *
+ * Static code
+ *
+ **********************************************************************
+ */
+/*********************************************************************
+ *
+ * _GetColorIndex
+ */
+static int _GetColorIndex(int i) /* i is 0 or 1 */
+{
+ return (GUI_Context.DrawMode & LCD_DRAWMODE_REV) ? i - 1 : i;
+}
+
+/*********************************************************************
+ *
+ * Public code
+ *
+ **********************************************************************
+ */
+/*********************************************************************
+ *
+ * LCD_SetColorIndex
+ */
+void LCD_SetColorIndex(int Index)
+{
+ LCD_ACOLORINDEX[_GetColorIndex(1)] = Index;
+}
+
+/*********************************************************************
+ *
+ * LCD_SetBkColorIndex
+ */
+void LCD_SetBkColorIndex(int Index)
+{
+ LCD_ACOLORINDEX[_GetColorIndex(0)] = Index;
+}
+
+/*********************************************************************
+ *
+ * LCD_SetDrawMode
+ */
+LCD_DRAWMODE LCD_SetDrawMode(LCD_DRAWMODE dm)
+{
+ LCD_DRAWMODE OldDM = GUI_Context.DrawMode;
+ if ((GUI_Context.DrawMode ^ dm) & LCD_DRAWMODE_REV)
+ {
+ LCD_PIXELINDEX temp = LCD_BKCOLORINDEX;
+ LCD_BKCOLORINDEX = LCD_COLORINDEX;
+ LCD_COLORINDEX = temp;
+ }
+ GUI_Context.DrawMode = dm;
+ return OldDM;
+}
+
+/*********************************************************************
+ *
+ * LCD_DrawPixel
+ */
+void LCD_DrawPixel(int x, int y)
+{
+ RETURN_IF_Y_OUT();
+ RETURN_IF_X_OUT();
+ if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR)
+ {
+ LCDDEV_L0_XorPixel(x, y);
+ }
+ else
+ {
+ LCDDEV_L0_SetPixelIndex(x, y, LCD_COLORINDEX);
+ }
+}
+
+/*********************************************************************
+ *
+ * LCD_DrawHLine
+ */
+void LCD_DrawHLine(int x0, int y, int x1)
+{
+ /* Perform clipping and check if there is something to do */
+ RETURN_IF_Y_OUT();
+ CLIP_X();
+ if (x1 < x0)
+ return;
+ /* Call driver to draw */
+ LCDDEV_L0_DrawHLine(x0, y, x1);
+}
+
+/*********************************************************************
+ *
+ * LCD_FillRect
+ */
+void LCD_FillRect(int x0, int y0, int x1, int y1)
+{
+ /* Perform clipping and check if there is something to do */
+ CLIP_X();
+ if (x1 < x0)
+ return;
+ CLIP_Y();
+ if (y1 < y0)
+ return;
+ /* Call driver to draw */
+ LCDDEV_L0_FillRect(x0, y0, x1, y1);
+}
+
+/*********************************************************************
+ *
+ * LCD_DrawBitmap
+ */
+void LCD_DrawBitmap(int x0, int y0, int xsize, int ysize, int xMul, int yMul,
+ int BitsPerPixel, int BytesPerLine,
+ const U8 GUI_UNI_PTR *pPixel, const LCD_PIXELINDEX *pTrans)
+{
+ U8 Data = 0;
+ int x1, y1;
+/* Handle rotation if necessary */
+#if GUI_SUPPORT_ROTATION
+ if (GUI_pLCD_APIList)
+ {
+ GUI_pLCD_APIList->pfDrawBitmap(x0, y0, xsize, ysize, xMul, yMul, BitsPerPixel, BytesPerLine, pPixel, pTrans);
+ return;
+ }
+#endif
+ /* Handle the optional Y-magnification */
+ y1 = y0 + ysize - 1;
+ x1 = x0 + xsize - 1;
+ /* Handle BITMAP without magnification */
+ if ((xMul | yMul) == 1)
+ {
+ int Diff;
+ /* Clip y0 (top) */
+ Diff = GUI_Context.ClipRect.y0 - y0;
+ if (Diff > 0)
+ {
+ ysize -= Diff;
+ if (ysize <= 0)
+ {
+ return;
+ }
+ y0 = GUI_Context.ClipRect.y0;
+#if GUI_SUPPORT_LARGE_BITMAPS /* Required only for 16 bit CPUs if some bitmaps are >64kByte */
+ pPixel += (U32)Diff * (U32)BytesPerLine;
+#else
+ pPixel += (unsigned)Diff * (unsigned)BytesPerLine;
+#endif
+ }
+ /* Clip y1 (bottom) */
+ Diff = y1 - GUI_Context.ClipRect.y1;
+ if (Diff > 0)
+ {
+ ysize -= Diff;
+ if (ysize <= 0)
+ {
+ return;
+ }
+ }
+ /* Clip right side */
+ Diff = x1 - GUI_Context.ClipRect.x1;
+ if (Diff > 0)
+ {
+ xsize -= Diff;
+ }
+ /* Clip left side ... (The difficult side ...) */
+ Diff = 0;
+ if (x0 < GUI_Context.ClipRect.x0)
+ {
+ Diff = GUI_Context.ClipRect.x0 - x0;
+ xsize -= Diff;
+ switch (BitsPerPixel)
+ {
+ case 1:
+ pPixel += (Diff >> 3);
+ x0 += (Diff >> 3) << 3;
+ Diff &= 7;
+ break;
+ case 2:
+ pPixel += (Diff >> 2);
+ x0 += (Diff >> 2) << 2;
+ Diff &= 3;
+ break;
+ case 4:
+ pPixel += (Diff >> 1);
+ x0 += (Diff >> 1) << 1;
+ Diff &= 1;
+ break;
+ case 8:
+ pPixel += Diff;
+ x0 += Diff;
+ Diff = 0;
+ break;
+ case 16:
+ pPixel += (Diff << 1);
+ x0 += Diff;
+ Diff = 0;
+ break;
+ }
+ }
+ if (xsize <= 0)
+ {
+ return;
+ }
+ LCDDEV_L0_DrawBitmap(x0, y0, xsize, ysize, BitsPerPixel, BytesPerLine, pPixel, Diff, pTrans);
+ }
+ else
+ {
+ /**** Handle BITMAP with magnification ***/
+ int x, y;
+ int yi;
+ int Shift = 8 - BitsPerPixel;
+ for (y = y0, yi = 0; yi < ysize; yi++, y += yMul, pPixel += BytesPerLine)
+ {
+ int yMax = y + yMul - 1;
+ /* Draw if within clip area (Optimization ... "if" is not required !) */
+ if ((yMax >= GUI_Context.ClipRect.y0) && (y <= GUI_Context.ClipRect.y1))
+ {
+ int BitsLeft = 0;
+ int xi;
+ const U8 GUI_UNI_PTR *pDataLine = pPixel;
+ for (x = x0, xi = 0; xi < xsize; xi++, x += xMul)
+ {
+ U8 Index;
+ if (!BitsLeft)
+ {
+ Data = *pDataLine++;
+ BitsLeft = 8;
+ }
+ Index = Data >> Shift;
+ Data <<= BitsPerPixel;
+ BitsLeft -= BitsPerPixel;
+ if (Index || ((GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) == 0))
+ {
+ LCD_PIXELINDEX OldColor = LCD_COLORINDEX;
+ if (pTrans)
+ {
+ LCD_COLORINDEX = *(pTrans + Index);
+ }
+ else
+ {
+ LCD_COLORINDEX = Index;
+ }
+ LCD_FillRect(x, y, x + xMul - 1, yMax);
+ LCD_COLORINDEX = OldColor;
+ }
+ }
+ }
+ }
+ }
+}
+
+/*********************************************************************
+ *
+ * LCD_SetClipRectMax
+ */
+void LCD_SetClipRectMax(void)
+{
+ LCDDEV_L0_GetRect(&GUI_Context.ClipRect);
+}
+
+/*********************************************************************
+ *
+ * LCD_Init
+ */
+int LCD_Init(void)
+{
+ int r = 0;
+ GUI_DEBUG_LOG("\nLCD_Init...");
+ LCD_SetClipRectMax();
+ r |= LCD_L0_Init();
+#if GUI_NUM_LAYERS > 1
+ r |= LCD_L0_1_Init();
+#endif
+#if GUI_NUM_LAYERS > 2
+ r |= LCD_L0_2_Init();
+#endif
+#if GUI_NUM_LAYERS > 3
+ r |= LCD_L0_3_Init();
+#endif
+#if GUI_NUM_LAYERS > 4
+ r |= LCD_L0_4_Init();
+#endif
+ LCD_InitLUT();
+ {
+#if GUI_NUM_LAYERS > 1
+ int i;
+ for (i = GUI_NUM_LAYERS - 1; i >= 0; i--)
+ {
+ GUI_SelectLayer(i);
+#else
+ {
+#endif
+#if (GUI_DEFAULT_BKCOLOR != GUI_INVALID_COLOR)
+ /* Clear video memory */
+ LCD_SetDrawMode(GUI_DRAWMODE_REV);
+ // LCD_FillRect(0,0, GUI_XMAX, GUI_YMAX); // xsh:??????????????????
+ LCD_SetDrawMode(0);
+#endif
+ }
+ }
+ /* Switch LCD on */
+ LCD_On();
+ return r;
+}
+
+/*********************************************************************
+ *
+ * LCD_Color2Index
+ */
+int LCD_Color2Index(LCD_COLOR Color)
+{
+ return LCDDEV_L0_Color2Index(Color);
+}
+
+/*********************************************************************
+ *
+ * LCD_Index2Color
+ */
+LCD_COLOR LCD_Index2Color(int Index)
+{
+ return LCDDEV_L0_Index2Color(Index);
+}
+
+/*********************************************************************
+ *
+ * LCD_SetBkColor
+ */
+void LCD_SetBkColor(GUI_COLOR color)
+{
+ if (GUI_Context.BkColor != color)
+ {
+ GUI_Context.BkColor = color;
+ LCD_SetBkColorIndex(LCD_Color2Index(color));
+ }
+}
+
+/*********************************************************************
+ *
+ * LCD_SetColor
+ */
+void LCD_SetColor(GUI_COLOR color)
+{
+ if (GUI_Context.Color != color)
+ {
+ GUI_Context.Color = color;
+ LCD_SetColorIndex(LCD_Color2Index(color));
+ }
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/LCD.h b/User/system/lib/lcd/gui/Core/LCD.h
new file mode 100644
index 0000000..e39a27f
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/LCD.h
@@ -0,0 +1,538 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCD.h
+Purpose : Declares LCD interface functions
+----------------------------------------------------------------------
+*/
+
+#ifndef LCD_H
+#define LCD_H
+
+#include "GUI_ConfDefaults.h" /* Used for GUI_UNI_PTR */
+
+#if defined(__cplusplus)
+extern "C" { /* Make sure we have C-declarations in C++ programs */
+#endif
+
+/*
+ ********************************************************************
+ * *
+ * Basic type defines *
+ * *
+ ********************************************************************
+
+The follwing are defines for types used in the LCD-driver and the
+GUI layers on top of that. Since "C" does not provide data types of
+fixed length which are identical on all platforms, this is done here.
+For most 16/32 controllers, the settings will work fine. However, if
+you have similar defines in other sections of your program, you might
+want to change or relocate these defines, e.g. in a TYPE.h file.
+*/
+
+#define I8 signed char
+#define U8 unsigned char /* unsigned 8 bits. */
+#define I16 signed short /* signed 16 bits. */
+#define U16 unsigned short /* unsigned 16 bits. */
+#define I32 signed long /* signed 32 bits. */
+#define U32 unsigned long /* unsigned 32 bits. */
+#define I16P I16 /* signed 16 bits OR MORE ! */
+#define U16P U16 /* unsigned 16 bits OR MORE ! */
+
+/*
+ ********************************************************************
+ * *
+ * Settings for windows simulation *
+ * *
+ ********************************************************************
+
+Some settings in the configuration may conflict with the values required
+in the Simulation. This is why we ignore the target settings for data
+types and use the correct settings for the simulation.
+(U32 could be defined as long, which would yield a 64 bit type on
+the PC)
+*/
+
+#ifdef WIN32
+ #pragma warning( disable : 4244 ) // Disable warning messages in simulation
+ #pragma warning( disable : 4761 ) // Disable warning "integral size mismatch in argument; conversion supplied"
+#endif
+
+
+/* *************************************************************
+ * *
+ * Constants *
+ * *
+ *************************************************************
+*/
+#define LCD_ERR0 (0x10)
+#define LCD_ERR_CONTROLLER_NOT_FOUND (LCD_ERR0+1)
+#define LCD_ERR_MEMORY (LCD_ERR0+2)
+
+/*
+ *********************************
+ * *
+ * Drawing modes *
+ * *
+ *********************************
+*/
+
+#define LCD_DRAWMODE_NORMAL (0)
+#define LCD_DRAWMODE_XOR (1<<0)
+#define LCD_DRAWMODE_TRANS (1<<1)
+#define LCD_DRAWMODE_REV (1<<2)
+
+
+
+/* *************************************************************
+ * *
+ * Typedefs *
+ * *
+ *************************************************************
+*/
+
+typedef int LCD_DRAWMODE;
+typedef U32 LCD_COLOR;
+
+
+/********************************************************
+*
+* Data structures
+*
+*********************************************************
+*/
+
+typedef struct { I16P x,y; } GUI_POINT;
+typedef struct { I16 x0,y0,x1,y1; } LCD_RECT;
+/*typedef struct { GUI_POINT P0, P1; } LCD_RECT; */
+
+typedef struct {
+ int NumEntries;
+ char HasTrans;
+ const LCD_COLOR GUI_UNI_PTR * pPalEntries;
+} LCD_LOGPALETTE;
+
+/* This is used for the simulation only ! */
+typedef struct {
+ int x,y;
+ unsigned char KeyStat;
+} LCD_tMouseState;
+
+/*********************************************************************
+*
+* Index2Color
+
+ This function needs to be int the public part of the software
+ since it is needed by the simulation. Most other driver
+ functions are hidden in the private header file.
+*/
+
+typedef LCD_COLOR tLCDDEV_Index2Color (int Index);
+typedef unsigned int tLCDDEV_Color2Index (LCD_COLOR Color);
+typedef unsigned int tLCDDEV_GetIndexMask (void);
+LCD_COLOR LCD_L0_Index2Color (int Index);
+LCD_COLOR LCD_L0_1_Index2Color(int Index);
+LCD_COLOR LCD_L0_2_Index2Color(int Index);
+LCD_COLOR LCD_L0_3_Index2Color(int Index);
+LCD_COLOR LCD_L0_4_Index2Color(int Index);
+unsigned int LCD_L0_Color2Index (LCD_COLOR Color);
+unsigned int LCD_L0_1_Color2Index(LCD_COLOR Color);
+unsigned int LCD_L0_2_Color2Index(LCD_COLOR Color);
+unsigned int LCD_L0_3_Color2Index(LCD_COLOR Color);
+unsigned int LCD_L0_4_Color2Index(LCD_COLOR Color);
+unsigned int LCD_L0_GetIndexMask (void);
+unsigned int LCD_L0_1_GetIndexMask(void);
+unsigned int LCD_L0_2_GetIndexMask(void);
+unsigned int LCD_L0_3_GetIndexMask(void);
+unsigned int LCD_L0_4_GetIndexMask(void);
+
+
+/*********************************************************************
+*
+* Color conversion API tables
+*/
+
+typedef struct {
+ tLCDDEV_Color2Index* pfColor2Index;
+ tLCDDEV_Index2Color* pfIndex2Color;
+ tLCDDEV_GetIndexMask* pfGetIndexMask;
+} LCD_API_COLOR_CONV;
+
+extern const LCD_API_COLOR_CONV LCD_API_ColorConv_1;
+extern const LCD_API_COLOR_CONV LCD_API_ColorConv_2;
+extern const LCD_API_COLOR_CONV LCD_API_ColorConv_4;
+extern const LCD_API_COLOR_CONV LCD_API_ColorConv_8666;
+
+#define GUI_COLOR_CONV_1 &LCD_API_ColorConv_1
+#define GUI_COLOR_CONV_2 &LCD_API_ColorConv_2
+#define GUI_COLOR_CONV_4 &LCD_API_ColorConv_4
+#define GUI_COLOR_CONV_8666 &LCD_API_ColorConv_8666
+
+/*********************************************************************
+*
+* LCDDEV function table
+*
+**********************************************************************
+
+ Below the routines which need to in an LCDDEV routine table are
+ defined. All of these routines have to be in the low-level driver
+ (LCD_L0) or in the memory device which can be used to replace the
+ driver.
+ The one exception to this is the SetClipRect routine, which would
+ be identical for all drivers and is therefor contained in the
+ level above (LCD).
+*/
+typedef void tLCDDEV_DrawHLine (int x0, int y0, int x1);
+typedef void tLCDDEV_DrawVLine (int x , int y0, int y1);
+typedef void tLCDDEV_FillRect (int x0, int y0, int x1, int y1);
+typedef unsigned int tLCDDEV_GetPixelIndex(int x, int y);
+typedef void tLCDDEV_SetPixelIndex(int x, int y, int ColorIndex);
+typedef void tLCDDEV_XorPixel (int x, int y);
+typedef void tLCDDEV_FillPolygon (const GUI_POINT* pPoints, int NumPoints, int x0, int y0);
+typedef void tLCDDEV_FillPolygonAA(const GUI_POINT* pPoints, int NumPoints, int x0, int y0);
+typedef void tLCDDEV_GetRect (LCD_RECT*pRect);
+typedef int tLCDDEV_Init (void);
+typedef void tLCDDEV_On (void);
+typedef void tLCDDEV_Off (void);
+typedef void tLCDDEV_SetLUTEntry (U8 Pos, LCD_COLOR color);
+
+/*********************************************************************
+*
+* Memory device API tables
+*/
+#if GUI_COMPILER_SUPPORTS_FP
+ typedef struct tLCDDEV_APIList_struct tLCDDEV_APIList;
+#endif
+
+typedef void tLCDDEV_DrawBitmap (int x0, int y0, int xsize, int ysize,
+ int BitsPerPixel, int BytesPerLine,
+ const U8 GUI_UNI_PTR * pData, int Diff,
+ const void* pTrans); /* Really LCD_PIXELINDEX, but is void to avoid compiler warnings*/
+
+struct tLCDDEV_APIList_struct {
+ tLCDDEV_Color2Index* pfColor2Index;
+ tLCDDEV_Index2Color* pfIndex2Color;
+ tLCDDEV_GetIndexMask* pfGetIndexMask;
+ tLCDDEV_DrawBitmap* pfDrawBitmap;
+ tLCDDEV_DrawHLine* pfDrawHLine;
+ tLCDDEV_DrawVLine* pfDrawVLine;
+ tLCDDEV_FillRect* pfFillRect;
+ tLCDDEV_GetPixelIndex* pfGetPixelIndex;
+ tLCDDEV_GetRect* pfGetRect;
+ tLCDDEV_SetPixelIndex* pfSetPixelIndex;
+ tLCDDEV_XorPixel* pfXorPixel;
+ tLCDDEV_SetLUTEntry* pfSetLUTEntry;
+ #if GUI_SUPPORT_MEMDEV
+ tLCDDEV_FillPolygon* pfFillPolygon;
+ tLCDDEV_FillPolygonAA* pfFillPolygonAA;
+ const tLCDDEV_APIList* pMemDevAPI;
+ unsigned BitsPerPixel;
+ #endif
+};
+#if GUI_COMPILER_SUPPORTS_FP
+ extern const struct tLCDDEV_APIList_struct GUI_MEMDEV__APIList1;
+ extern const struct tLCDDEV_APIList_struct GUI_MEMDEV__APIList8;
+ extern const struct tLCDDEV_APIList_struct GUI_MEMDEV__APIList16;
+
+ #define GUI_MEMDEV_APILIST_1 &GUI_MEMDEV__APIList1
+ #define GUI_MEMDEV_APILIST_8 &GUI_MEMDEV__APIList8
+ #define GUI_MEMDEV_APILIST_16 &GUI_MEMDEV__APIList16
+#endif
+
+/* *************************************************************
+ * *
+ * Defines *
+ * *
+ * for device capabilities *
+ * *
+ *************************************************************
+
+The following is the list of device capabilities which can, but do
+not have to be implemented in the driver. This way the driver can be
+enhanced in the future without affecting the driver interface,
+keeping older drivers compatible.
+More DevCaps can always be added in the future, as older drivers
+are guaranteed to return 0 for all unimplemented features or queries.
+
+The values below define the legal parameters to the LCD_GetDeviceCaps
+and the LCD_GetpCapFunc routines.
+*/
+
+#define LCD_DEVCAP_NUMCOLORS 0x0 /* Quest number of colors
+ which LCD can display */
+#define LCD_DEVCAP_XSIZE 0x1 /* Quest horiz. res. of display */
+#define LCD_DEVCAP_YSIZE 0x2 /* Quest vert. res. of display */
+#define LCD_DEVCAP_VXSIZE 0x3 /* Quest vert. res. of virtual disp.*/
+#define LCD_DEVCAP_VYSIZE 0x4 /* Quest vert. res. of virtual disp.*/
+#define LCD_DEVCAP_XORG 0x5 /* X-origin ... usually 0 */
+#define LCD_DEVCAP_YORG 0x6 /* Y-origin ... usually 0 */
+#define LCD_DEVCAP_CONTROLLER 0x7 /* LCD Controller (Numerical) */
+#define LCD_DEVCAP_BITSPERPIXEL 0x8 /* Bits per pixel ... 1/2/4/8 */
+#define LCD_DEVCAP_NUMPAGES 0x10 /* Quest number of pages of display */
+
+#define LCD_DEVCAP_COLOR 0x1000 /* Quest Color[0]
+ 0x1001 Quest Color[1]
+ 0x1002 Quest Color[2]
+ ... */
+ /* The next 4095 entries are reserved so up to 4096 colors
+ can be queried ...*/
+
+int LCD_GetXSize(void);
+int LCD_GetXSize_1(void);
+int LCD_GetXSizeEx(int Index);
+
+int LCD_GetYSize(void);
+int LCD_GetYSize_1(void);
+int LCD_GetYSizeEx(int Index);
+
+int LCD_GetVXSize(void);
+int LCD_GetVXSize_1(void);
+int LCD_GetVXSizeEx(int Index);
+
+int LCD_GetVYSize(void);
+int LCD_GetVYSize_1(void);
+int LCD_GetVYSizeEx(int Index);
+
+U32 LCD_GetNumColors(void);
+U32 LCD_GetNumColors_1(void);
+U32 LCD_GetNumColorsEx(int Index);
+
+int LCD_GetBitsPerPixel(void);
+int LCD_GetBitsPerPixel_1(void);
+int LCD_GetBitsPerPixelEx(int Index);
+
+int LCD_GetFixedPalette(void);
+int LCD_GetFixedPalette_1(void);
+I32 LCD_GetFixedPaletteEx(int Index);
+
+int LCD_GetXMag(void);
+int LCD_GetXMag_1(void);
+int LCD_GetXMagEx(int Index);
+
+int LCD_GetYMag(void);
+int LCD_GetYMag_1(void);
+int LCD_GetYMagEx(int Index);
+
+int LCD_GetMirrorXEx(int LayerIndex);
+int LCD_GetMirrorYEx(int LayerIndex);
+int LCD_GetSwapXYEx(int LayerIndex);
+
+int LCD_GetSwapRBEx(int LayerIndex);
+int LCD_GetDeltaModeEx(int LayerIndex);
+int LCD_GetBitsPerPixel_L0Ex(int LayerIndex);
+
+int LCD_GetNumLayers(void);
+
+#define LCD_GetNumDisplays() LCD_GetNumLayers()
+
+#define LCD_GET_XSIZE() LCD_GetXSize()
+#define LCD_GET_YSIZE() LCD_GetYSize()
+#define LCD_GET_VXSIZE() LCD_GetVXSize()
+#define LCD_GET_VYSIZE() LCD_GetVYSize()
+#define LCD_GET_NUMCOLORS() LCD_GetNumColors()
+#define LCD_GET_BITSPERPIXEL() LCD_GetBitsPerPixel()
+
+
+/*********************************************************************
+*
+* LCD_CLIP function table
+*
+**********************************************************************
+*/
+typedef void tLCD_HL_DrawHLine (int x0, int y0, int x1);
+typedef void tLCD_HL_DrawPixel (int x0, int y0);
+
+typedef struct {
+ tLCD_HL_DrawHLine* pfDrawHLine;
+ tLCD_HL_DrawPixel* pfDrawPixel;
+} tLCD_HL_APIList;
+
+void LCD_DrawHLine(int x0, int y0, int x1);
+void LCD_DrawPixel(int x0, int y0);
+void LCD_DrawVLine (int x, int y0, int y1);
+
+
+
+/*********************************************************************
+*
+* Declarations for LCD_
+*
+**********************************************************************
+*/
+
+void LCD_SetClipRectEx(const LCD_RECT* pRect);
+void LCD_SetClipRectMax(void);
+
+/* Get device capabilities (0 if not supported) */
+I32 LCD_GetDevCap(int Index);
+
+/* Initialize LCD using config-paramters */
+int LCD_Init(void);
+
+void LCD_SetBkColor (LCD_COLOR Color); /* Set background color */
+void LCD_SetColor (LCD_COLOR Color); /* Set foreground color */
+void LCD_SetPixelIndex(int x, int y, int ColorIndex);
+
+/* Palette routines (Not available on all drivers) */
+void LCD_InitLUT(void);
+
+/* Decompressors */
+//typedef void tfDrawSpecialBitmap(int x0,int y0,int xsize, int ysize, const U8 GUI_UNI_PTR *pPixel, const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal, int xMag, int yMag);
+void LCD_DrawBitmap_RLE8(int x0,int y0,int xsize, int ysize, const U8 GUI_UNI_PTR *pPixel, const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal, int xMag, int yMag);
+void LCD_DrawBitmap_RLE4(int x0,int y0,int xsize, int ysize, const U8 GUI_UNI_PTR *pPixel, const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal, int xMag, int yMag);
+void LCD_DrawBitmap_565 (int x0,int y0,int xsize, int ysize, const U8 GUI_UNI_PTR *pPixel, const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal, int xMag, int yMag);
+void LCD_DrawBitmap_M565(int x0,int y0,int xsize, int ysize, const U8 GUI_UNI_PTR *pPixel, const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal, int xMag, int yMag);
+
+LCD_DRAWMODE LCD_SetDrawMode (LCD_DRAWMODE dm);
+void LCD_SetColorIndex(int Index);
+void LCD_SetBkColorIndex(int Index);
+void LCD_FillRect(int x0, int y0, int x1, int y1);
+typedef void tLCD_SetPixelAA(int x, int y, U8 Intens);
+
+void LCD_SetPixelAA(int x, int y, U8 Intens);
+void LCD_SetPixelAA_NoTrans(int x, int y, U8 Intens);
+
+LCD_COLOR LCD_AA_MixColors(LCD_COLOR Color, LCD_COLOR BkColor, U8 Intens);
+LCD_COLOR LCD_MixColors256(LCD_COLOR Color, LCD_COLOR BkColor, unsigned Intens);
+LCD_COLOR LCD_GetPixelColor(int x, int y); /* Get RGB color of pixel */
+unsigned int LCD_GetPixelIndex(int x, int y);
+int LCD_GetBkColorIndex (void);
+int LCD_GetColorIndex (void);
+
+/*********************************************************************
+*
+* Optional support for rotatation
+*
+**********************************************************************
+*/
+
+#if GUI_SUPPORT_ROTATION
+
+typedef void tLCD_DrawBitmap(int x0, int y0, int xsize, int ysize,
+ int xMul, int yMul, int BitsPerPixel, int BytesPerLine,
+ const U8 GUI_UNI_PTR * pPixel, const void * pTrans);
+typedef void tRect2TextRect (LCD_RECT * pRect);
+
+struct tLCD_APIList_struct {
+ tLCD_DrawBitmap * pfDrawBitmap;
+ tRect2TextRect * pfRect2TextRect;
+};
+
+typedef struct tLCD_APIList_struct tLCD_APIList;
+
+extern tLCD_APIList LCD_APIListCCW;
+extern tLCD_APIList LCD_APIListCW;
+extern tLCD_APIList LCD_APIList180;
+
+#define GUI_ROTATION tLCD_APIList
+#define GUI_ROTATE_CCW &LCD_APIListCCW
+#define GUI_ROTATE_CW &LCD_APIListCW
+#define GUI_ROTATE_180 &LCD_APIList180
+#define GUI_ROTATE_0 0
+#endif
+
+
+/* *************************************************************
+ * *
+ * LCD publics not used by GUI *
+ * *
+ *************************************************************
+
+
+The following functions can, but do not have to be defined in the LCD driver
+as they are not used by the GUI level.
+
+*/
+
+
+
+#define LCD_On LCD_L0_On
+#define LCD_Off LCD_L0_Off
+#define LCD_ReInit LCD_L0_ReInit
+#define LCD_SetLUTEntry LCD_L0_SetLUTEntry
+
+
+#define LCD_CC_UNLOCK (0) /* Default mode: Cache is transparent */
+#define LCD_CC_LOCK (1) /* Cache is locked, no write operations */
+#define LCD_CC_FLUSH (2) /* Flush cache, do not change mode */
+U8 LCD_L0_ControlCache(U8 mode);
+U8 LCD_L0_1_ControlCache(U8 mode);
+U8 LCD_L0_2_ControlCache(U8 mode);
+U8 LCD_L0_3_ControlCache(U8 mode);
+U8 LCD_L0_4_ControlCache(U8 mode);
+void LCD_L0_Refresh(void);
+void LCD_L0_1_Refresh(void);
+void LCD_L0_2_Refresh(void);
+void LCD_L0_3_Refresh(void);
+void LCD_L0_4_Refresh(void);
+/* Check if controller is still properly initialized */
+int LCD_L0_CheckInit(void); /* returns if init is still O.K.
+ by reading all available registers of
+ Display controller.
+ 0: Init O.K.
+ */
+
+#define LCD_ControlCache LCD_L0_ControlCache
+
+/*
+ ******************************************
+ * *
+ * Support for paging *
+ * *
+ ******************************************
+*/
+
+int LCD_SelPage (int NewPage); /* returns formerly sel. page */
+int LCD_ShowPage (int NewPage); /* sets / returns visible page */
+int LCD_GetSelPage (void); /* returns selected page */
+int LCD_GetVisPage (void); /* returns visible page */
+
+
+/* *************************************************************
+ * *
+ * LCD imports *
+ * (for routines in LCDColor) *
+ * *
+ *************************************************************
+*/
+
+
+int LCD_Color2Index (LCD_COLOR Color);
+LCD_COLOR LCD_Index2Color (int Index);
+LCD_COLOR LCD_Index2ColorEx (int i, unsigned int LayerIndex);
+
+/*********************************************************************
+*
+* LCD_X_...
+*
+**********************************************************************
+*/
+
+void LCD_X_Init(void);
+void LCD_X_On (void);
+void LCD_X_Off (void);
+
+char LCD_X_Read00(void);
+char LCD_X_Read01(void);
+void LCD_X_Write00(char c);
+void LCD_X_Write01(char c);
+void LCD_X_WriteM01(char * pData, int NumBytes);
+
+#if defined(__cplusplus)
+ }
+#endif
+
+#endif /* LCD_H */
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/LCDAA.c b/User/system/lib/lcd/gui/Core/LCDAA.c
new file mode 100644
index 0000000..ceee261
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/LCDAA.c
@@ -0,0 +1,117 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDAA.c
+Purpose : Low level antialiasing routines.
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#define LCD_C
+
+#include /* needed for definition of NULL */
+#include "LCD.h"
+#include "GUI_Private.h"
+#include "LCD_Private.h"
+
+/*********************************************************************
+*
+* Defines
+*
+**********************************************************************
+*/
+
+#define RETURN_IF_Y_OUT() \
+ if (y < GUI_Context.ClipRect.y0) \
+ return; \
+ if (y > GUI_Context.ClipRect.y1) \
+ return;
+
+#define RETURN_IF_X_OUT() \
+ if (x < GUI_Context.ClipRect.x0) return; \
+ if (x > GUI_Context.ClipRect.x1) return;
+
+#define CLIP_X() \
+ if (x0 < GUI_Context.ClipRect.x0) { x0 = GUI_Context.ClipRect.x0; } \
+ if (x1 > GUI_Context.ClipRect.x1) { x1 = GUI_Context.ClipRect.x1; }
+
+#define CLIP_Y() \
+ if (y0 < GUI_Context.ClipRect.y0) { y0 = GUI_Context.ClipRect.y0; } \
+ if (y1 > GUI_Context.ClipRect.y1) { y1 = GUI_Context.ClipRect.y1; }
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_AA_MixColors
+*/
+LCD_COLOR LCD_AA_MixColors(LCD_COLOR Color, LCD_COLOR BkColor, U8 Intens) {
+ /* Calc Color seperations for FgColor first */
+ I32 R = (Color&0xff)*Intens;
+ I32 G = (Color&0xff00)*Intens;
+ I32 B = (Color&0xff0000)*Intens;
+ /* Add Color seperations for BkColor */
+ Intens = 15-Intens;
+ R += (BkColor&0xff)*Intens;
+ G += (BkColor&0xff00)*Intens;
+ B += (BkColor&0xff0000)*Intens;
+ R = (R/15)&0xff;
+ G = (G/15)&0xff00;
+ B = (B/15)&0xff0000;
+ Color = R+G+B;
+ return Color;
+}
+
+/*********************************************************************
+*
+* LCD_SetPixelAA
+*/
+void LCD_SetPixelAA(int x, int y, U8 Intens) {
+ if (Intens == 0)
+ return;
+ RETURN_IF_Y_OUT();
+ RETURN_IF_X_OUT();
+ if (Intens >= 15) {
+ LCDDEV_L0_SetPixelIndex(x,y, LCD_COLORINDEX);
+ } else {
+ LCD_COLOR Color = LCD_Index2Color(LCD_COLORINDEX);
+ LCD_COLOR BkColor = LCD_GetPixelColor(x,y);
+ Color = LCD_AA_MixColors(Color, BkColor, Intens);
+ LCDDEV_L0_SetPixelIndex(x,y, LCD_Color2Index(Color));
+ }
+}
+
+/*********************************************************************
+*
+* LCD_SetPixelAA_NoTrans
+*/
+void LCD_SetPixelAA_NoTrans(int x, int y, U8 Intens) {
+ RETURN_IF_Y_OUT();
+ RETURN_IF_X_OUT();
+ if (Intens == 0) {
+ LCDDEV_L0_SetPixelIndex(x,y, LCD_BKCOLORINDEX);
+ } else if (Intens == 15) {
+ LCDDEV_L0_SetPixelIndex(x,y, LCD_COLORINDEX);
+ } else {
+ LCD_COLOR Color = LCD_AA_MixColors(LCD_Index2Color(LCD_COLORINDEX),
+ LCD_Index2Color(LCD_BKCOLORINDEX),
+ Intens);
+ LCDDEV_L0_SetPixelIndex(x,y,LCD_Color2Index(Color));
+ }
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/LCDColor.c b/User/system/lib/lcd/gui/Core/LCDColor.c
new file mode 100644
index 0000000..80c8f74
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/LCDColor.c
@@ -0,0 +1,181 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDColor.C
+Purpose : Color conversion routines for LCD-drivers
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#define LCDCOLOR_C
+
+#include /* needed for definition of NULL */
+#include "GUI_Private.h"
+#include "LCD_Private.h" /* inter modul definitions & Config */
+
+/*********************************************************************
+*
+* Defines, config defaults
+*
+**********************************************************************
+*/
+
+#ifndef LCD_SIZEOF_COLORCACHE
+ #define LCD_SIZEOF_COLORCACHE 0
+#endif
+
+#if LCD_SIZEOF_COLORCACHE
+ static const LCD_LOGPALETTE * pLogPalCache;
+#endif
+
+/*********************************************************************
+*
+* Public data
+*
+**********************************************************************
+*/
+
+LCD_PIXELINDEX LCD__aConvTable[LCD_MAX_LOG_COLORS];
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_GetpPalConvTableUncached
+*/
+LCD_PIXELINDEX* LCD_GetpPalConvTableUncached(const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal) {
+ if (pLogPal == NULL) {
+ return NULL;
+ }
+ if (!pLogPal->pPalEntries) {
+ return NULL;
+ }
+ /* Check if sufficient space is available */
+ if (pLogPal->NumEntries > LCD_MAX_LOG_COLORS) {
+ return NULL;
+ }
+ /* Build conversion table */
+ {
+ int i;
+ int NumEntries = pLogPal->NumEntries;
+ const LCD_COLOR GUI_UNI_PTR * pPalEntry = &pLogPal->pPalEntries[0];
+ for (i=0; i< NumEntries; i++) {
+ LCD__aConvTable[i] = LCD_Color2Index(*(pPalEntry+i));
+ }
+ }
+ return &LCD__aConvTable[0];
+}
+
+/*********************************************************************
+*
+* LCD_GetpPalConvTable
+*/
+LCD_PIXELINDEX* LCD_GetpPalConvTable(const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal) {
+/* Check cache */
+ #if LCD_SIZEOF_COLORCACHE
+ if (pLogPalCache == pLogPal) {
+ return &LCD__aConvTable[0];
+ }
+ pLogPalCache = pLogPal;
+ #endif
+ return LCD_GetpPalConvTableUncached(pLogPal);
+}
+
+/*********************************************************************
+*
+* LCD_InitLUT
+*/
+void LCD_InitLUT(void) {
+ #if (LCD_BITSPERPIXEL <= 8)
+ {
+ int i;
+ for (i=0; i < LCD_NUM_COLORS; i++) {
+ LCD_COLOR color = LCD_Index2Color((U8)i);
+ #if LCD_REVERSE_LUT
+ color ^= 0xffffff; /* Invert R,G,B components */
+ #endif
+ LCD_L0_SetLUTEntry((U8)i, color);
+ }
+ }
+ #endif
+ #if (GUI_NUM_LAYERS > 1)
+ #if (LCD_BITSPERPIXEL_1 <= 8)
+ {
+ int i;
+ int DisplayOld = GUI_SelectLayer(1);
+ for (i=0; i < LCD_NUM_COLORS_1; i++) {
+ LCD_COLOR color = LCD_Index2Color((U8)i);
+ #if LCD_REVERSE_LUT_1
+ color ^= 0xffffff; /* Invert R,G,B components */
+ #endif
+ LCD_L0_1_SetLUTEntry((U8)i, color);
+ }
+ GUI_SelectLayer(DisplayOld);
+ }
+ #endif
+ #endif
+ #if (GUI_NUM_LAYERS > 2)
+ #if (LCD_BITSPERPIXEL_2 <= 8)
+ {
+ int i;
+ int DisplayOld = GUI_SelectLayer(2);
+ for (i=0; i < LCD_NUM_COLORS_2; i++) {
+ LCD_COLOR color = LCD_Index2Color((U8)i);
+ #if LCD_REVERSE_LUT_2
+ color ^= 0xffffff; /* Invert R,G,B components */
+ #endif
+ LCD_L0_2_SetLUTEntry((U8)i, color);
+ }
+ GUI_SelectLayer(DisplayOld);
+ }
+ #endif
+ #endif
+ #if (GUI_NUM_LAYERS > 3)
+ #if (LCD_BITSPERPIXEL_3 <= 8)
+ {
+ int i;
+ int DisplayOld = GUI_SelectLayer(3);
+ for (i=0; i < LCD_NUM_COLORS_3; i++) {
+ LCD_COLOR color = LCD_Index2Color((U8)i);
+ #if LCD_REVERSE_LUT_3
+ color ^= 0xffffff; /* Invert R,G,B components */
+ #endif
+ LCD_L0_3_SetLUTEntry((U8)i, color);
+ }
+ GUI_SelectLayer(DisplayOld);
+ }
+ #endif
+ #endif
+ #if (GUI_NUM_LAYERS > 4)
+ #if (LCD_BITSPERPIXEL_4 <= 8)
+ {
+ int i;
+ int DisplayOld = GUI_SelectLayer(4);
+ for (i=0; i < LCD_NUM_COLORS_4; i++) {
+ LCD_COLOR color = LCD_Index2Color((U8)i);
+ #if LCD_REVERSE_LUT_4
+ color ^= 0xffffff; /* Invert R,G,B components */
+ #endif
+ LCD_L0_4_SetLUTEntry((U8)i, color);
+ }
+ GUI_SelectLayer(DisplayOld);
+ }
+ #endif
+ #endif
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/LCDGetP.c b/User/system/lib/lcd/gui/Core/LCDGetP.c
new file mode 100644
index 0000000..25f7aa9
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/LCDGetP.c
@@ -0,0 +1,61 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDGetP.c
+Purpose : Get Pixel routines
+ Note: These routines are in a module of their own
+ because they are mostly not required to link
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI_Private.h"
+#include "GUIDebug.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_GetPixelIndex
+*
+* NOTE:
+* We can not use the standard clipping which we use for drawing
+* operations as it is perfectly legal to read pixels outside of
+* the clipping area. We therefor get the bounding rectangle of the
+* device and use it for clipping.
+*/
+unsigned LCD_GetPixelIndex(int x, int y) {
+ LCD_RECT r;
+ GUI_ASSERT_LOCK();
+ LCDDEV_L0_GetRect(&r);
+ if (x < r.x0) {
+ return 0;
+ }
+ if (x > r.x1) {
+ return 0;
+ }
+ if (y < r.y0) {
+ return 0;
+ }
+ if (y > r.y1) {
+ return 0;
+ }
+ return LCDDEV_L0_GetPixelIndex(x,y);
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/LCDInfo.c b/User/system/lib/lcd/gui/Core/LCDInfo.c
new file mode 100644
index 0000000..ca3c78a
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/LCDInfo.c
@@ -0,0 +1,57 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDInfo.C
+Purpose : Routines returning info at runtime
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "LCD.h" /* interface definitions */
+#include "LCD_Private.h" /* private modul definitions & config */
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_GetDevCap
+*/
+I32 LCD_GetDevCap(int Index) {
+ switch (Index) {
+ case LCD_DEVCAP_NUMCOLORS:
+ return LCD_NUM_COLORS;
+ case LCD_DEVCAP_XSIZE:
+ return LCD_GetXSize();
+ case LCD_DEVCAP_YSIZE:
+ return LCD_GetYSize();
+ case LCD_DEVCAP_VXSIZE:
+ return LCD_VXSIZE;
+ case LCD_DEVCAP_VYSIZE:
+ return LCD_VYSIZE;
+ case LCD_DEVCAP_CONTROLLER:
+ return LCD_CONTROLLER;
+ case LCD_DEVCAP_BITSPERPIXEL:
+ return LCD_BITSPERPIXEL;
+ }
+ if ((Index >= LCD_DEVCAP_COLOR) && (Index < LCD_DEVCAP_COLOR+LCD_NUM_COLORS)) {
+ return LCD_Index2Color(Index-LCD_DEVCAP_COLOR);
+ }
+ return 0;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/LCDInfo0.c b/User/system/lib/lcd/gui/Core/LCDInfo0.c
new file mode 100644
index 0000000..19769ee
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/LCDInfo0.c
@@ -0,0 +1,41 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDInfo1.C
+Purpose : Routines returning info at runtime
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "LCD.h" /* interface definitions */
+#include "LCD_Private.h" /* private modul definitions & config */
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+
+int LCD_GetXSize(void) { return LCD_XSIZE; }
+int LCD_GetYSize(void) { return LCD_YSIZE; }
+int LCD_GetVXSize(void) { return LCD_VXSIZE; }
+int LCD_GetVYSize(void) { return LCD_VYSIZE; }
+int LCD_GetBitsPerPixel(void) { return LCD_BITSPERPIXEL; }
+U32 LCD_GetNumColors(void) { return LCD_NUM_COLORS; }
+int LCD_GetYMag(void) { return LCD_YMAG; }
+int LCD_GetXMag(void) { return LCD_XMAG; }
+int LCD_GetFixedPalette(void) { return LCD_FIXEDPALETTE; }
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/LCDInfo1.c b/User/system/lib/lcd/gui/Core/LCDInfo1.c
new file mode 100644
index 0000000..03bcfca
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/LCDInfo1.c
@@ -0,0 +1,53 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDInfo1.C
+Purpose : Routines returning info at runtime
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "LCD.h" /* interface definitions */
+#include "LCD_Private.h" /* private modul definitions & config */
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+
+#if GUI_NUM_LAYERS > 1
+ int LCD_GetXSize_1(void) { return LCD_XSIZE_1; }
+ int LCD_GetYSize_1(void) { return LCD_YSIZE_1; }
+ int LCD_GetVXSize_1(void) { return LCD_VXSIZE_1; }
+ int LCD_GetVYSize_1(void) { return LCD_VYSIZE_1; }
+ int LCD_GetBitsPerPixel_1(void) { return LCD_BITSPERPIXEL_1; }
+ U32 LCD_GetNumColors_1(void) { return LCD_NUM_COLORS_1; }
+ int LCD_GetYMag_1(void) { return LCD_YMAG_1; }
+ int LCD_GetXMag_1(void) { return LCD_XMAG_1; }
+ int LCD_GetFixedPalette_1(void) { return LCD_FIXEDPALETTE_1; }
+#else
+ int LCD_GetXSize_1(void) { return 0; }
+ int LCD_GetYSize_1(void) { return 0; }
+ int LCD_GetVXSize_1(void) { return 0; }
+ int LCD_GetVYSize_1(void) { return 0; }
+ int LCD_GetBitsPerPixel_1(void) { return 0; }
+ U32 LCD_GetNumColors_1(void) { return 0; }
+ int LCD_GetYMag_1(void) { return 0; }
+ int LCD_GetXMag_1(void) { return 0; }
+ int LCD_GetFixedPalette_1(void) { return 0; }
+#endif
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/LCDL0Delta.c b/User/system/lib/lcd/gui/Core/LCDL0Delta.c
new file mode 100644
index 0000000..a582fe5
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/LCDL0Delta.c
@@ -0,0 +1,516 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDL0Delta.c
+Purpose : Link between GUI and LCD_L0... if delta display needs to
+ be supported
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI_Private.h"
+#include "GUIDebug.h"
+#include "LCD_Private.h" /* private modul definitions & config */
+
+#if LCD_DELTA_MODE
+
+/*********************************************************************
+*
+* Static data
+*
+**********************************************************************
+*/
+static U8 _aPixelData_0[LCD_XSIZE];
+static U8 _aPixelData_1[LCD_XSIZE];
+static const GUI_LOGPALETTE _Pal;
+static GUI_BITMAP _Bm;
+static int _y;
+static U8 _aRGB[3];
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _SetRGB
+*/
+static void _SetRGB(LCD_PIXELINDEX ColorIndex) {
+ _aRGB[0] = ColorIndex & 0x00f;
+ _aRGB[1] = (ColorIndex & 0x0f0) >> 4;
+ _aRGB[2] = (ColorIndex & 0xf00) >> 8;
+}
+
+/*********************************************************************
+*
+* _SetPixel
+*/
+static void _SetPixelIndex(int x, LCD_PIXELINDEX ColorIndex) {
+ _SetRGB(ColorIndex);
+ _aPixelData_0[x] = _aRGB[(x + (_y & 1)) % 3];
+}
+
+/*********************************************************************
+*
+* _InitBM
+*/
+static void _InitBM(int xsize, int x0) {
+ _Bm.XSize = xsize;
+ _Bm.YSize = 1;
+ _Bm.BytesPerLine = xsize;
+ _Bm.BitsPerPixel = 8;
+ _Bm.pfDraw = 0;
+ _Bm.pData = &_aPixelData_0[x0];
+ _Bm.pPal = &_Pal;
+ _Bm.pfDraw = 0;
+}
+
+/*********************************************************************
+*
+* _DrawBitLine1BPP
+*/
+static void _DrawBitLine1BPP(int x, U8 const GUI_UNI_PTR * p, int Diff, int xsize, const LCD_PIXELINDEX * pTrans) {
+ int xx;
+ LCD_PIXELINDEX Index0 = *(pTrans+0);
+ LCD_PIXELINDEX Index1 = *(pTrans+1);
+ x += Diff;
+ xx = x;
+ switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) {
+ case 0:
+ do {
+ _SetPixelIndex(xx++, (*p & (0x80 >> Diff)) ? Index1 : Index0);
+ if (++Diff == 8) {
+ Diff = 0;
+ p++;
+ }
+ } while (--xsize);
+ break;
+ case LCD_DRAWMODE_TRANS:
+ do {
+ if (*p & (0x80 >> Diff)) {
+ _SetPixelIndex(xx, Index1);
+ } else {
+ _SetPixelIndex(xx, LCD_L0_GetPixelIndex(xx, _y));
+ }
+ xx++;
+ if (++Diff == 8) {
+ Diff = 0;
+ p++;
+ }
+ } while (--xsize);
+ break;
+ case LCD_DRAWMODE_XOR:;
+ do {
+ if (*p & (0x80 >> Diff)) {
+ int Pixel = LCD_L0_GetPixelIndex(xx, _y);
+ _SetPixelIndex(xx, LCD_NUM_COLORS - 1 - Pixel);
+ }
+ xx++;
+ if (++Diff == 8) {
+ Diff = 0;
+ p++;
+ }
+ } while (--xsize);
+ break;
+ }
+ LCD_L0_DrawBitmap(x, _y, _Bm.XSize, 1, _Bm.BitsPerPixel, _Bm.BytesPerLine, _Bm.pData, 0, 0);
+}
+
+/*********************************************************************
+*
+* _DrawBitLine2BPP
+*/
+static void _DrawBitLine2BPP(int x, U8 const GUI_UNI_PTR * p, int Diff, int xsize, const LCD_PIXELINDEX * pTrans) {
+ int xx;
+ LCD_PIXELINDEX Pixels = *p;
+ int CurrentPixel = Diff;
+ x += Diff;
+ xx = x;
+ switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) {
+ case 0:
+ if (pTrans) {
+ do {
+ int Shift = (3 - CurrentPixel) << 1;
+ int Index = (Pixels & (0xC0 >> (6 - Shift))) >> Shift;
+ LCD_PIXELINDEX PixelIndex = *(pTrans + Index);
+ _SetPixelIndex(xx++, PixelIndex);
+ if (++CurrentPixel == 4) {
+ CurrentPixel = 0;
+ Pixels = *(++p);
+ }
+ } while (--xsize);
+ } else {
+ do {
+ int Shift = (3 - CurrentPixel) << 1;
+ int Index = (Pixels & (0xC0 >> (6 - Shift))) >> Shift;
+ _SetPixelIndex(xx++, Index);
+ if (++CurrentPixel == 4) {
+ CurrentPixel = 0;
+ Pixels = *(++p);
+ }
+ } while (--xsize);
+ }
+ break;
+ case LCD_DRAWMODE_TRANS:
+ if (pTrans) {
+ do {
+ int Shift = (3 - CurrentPixel) << 1;
+ int Index = (Pixels & (0xC0 >> (6 - Shift))) >> Shift;
+ if (Index) {
+ LCD_PIXELINDEX PixelIndex = *(pTrans + Index);
+ _SetPixelIndex(xx, PixelIndex);
+ } else {
+ _SetPixelIndex(xx, LCD_L0_GetPixelIndex(xx, _y));
+ }
+ xx++;
+ if (++CurrentPixel == 4) {
+ CurrentPixel = 0;
+ Pixels = *(++p);
+ }
+ } while (--xsize);
+ } else {
+ do {
+ int Shift = (3 - CurrentPixel) << 1;
+ int Index = (Pixels & (0xC0 >> (6 - Shift))) >> Shift;
+ if (Index) {
+ _SetPixelIndex(xx, Index);
+ } else {
+ _SetPixelIndex(xx, LCD_L0_GetPixelIndex(xx, _y));
+ }
+ xx++;
+ if (++CurrentPixel == 4) {
+ CurrentPixel = 0;
+ Pixels = *(++p);
+ }
+ } while (--xsize);
+ }
+ break;
+ }
+ LCD_L0_DrawBitmap(x, _y, _Bm.XSize, 1, _Bm.BitsPerPixel, _Bm.BytesPerLine, _Bm.pData, 0, 0);
+}
+
+/*********************************************************************
+*
+* _DrawBitLine4BPP
+*/
+static void _DrawBitLine4BPP(int x, U8 const GUI_UNI_PTR * p, int Diff, int xsize, const LCD_PIXELINDEX * pTrans) {
+ int xx;
+ U8 Pixels = *p;
+ int CurrentPixel = Diff;
+ x += Diff;
+ xx = x;
+ switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) {
+ case 0:
+ if (pTrans) {
+ do {
+ int Shift = (1 - CurrentPixel) << 2;
+ int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift;
+ LCD_PIXELINDEX PixelIndex = *(pTrans + Index);
+ _SetPixelIndex(xx++, PixelIndex);
+ if (++CurrentPixel == 2) {
+ CurrentPixel = 0;
+ Pixels = *(++p);
+ }
+ } while (--xsize);
+ } else {
+ do {
+ int Shift = (1 - CurrentPixel) << 2;
+ int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift;
+ _SetPixelIndex(xx++, Index);
+ if (++CurrentPixel == 2) {
+ CurrentPixel = 0;
+ Pixels = *(++p);
+ }
+ } while (--xsize);
+ }
+ break;
+ case LCD_DRAWMODE_TRANS:
+ if (pTrans) {
+ do {
+ int Shift = (1 - CurrentPixel) << 2;
+ int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift;
+ if (Index) {
+ U8 PixelIndex = *(pTrans + Index);
+ _SetPixelIndex(xx, PixelIndex);
+ } else {
+ _SetPixelIndex(xx, LCD_L0_GetPixelIndex(xx, _y));
+ }
+ xx++;
+ if (++CurrentPixel == 2) {
+ CurrentPixel = 0;
+ Pixels = *(++p);
+ }
+ } while (--xsize);
+ } else {
+ do {
+ int Shift = (1 - CurrentPixel) << 2;
+ int Index = (Pixels & (0xF0 >> (4 - Shift))) >> Shift;
+ if (Index) {
+ _SetPixelIndex(xx, Index);
+ } else {
+ _SetPixelIndex(xx, LCD_L0_GetPixelIndex(xx, _y));
+ }
+ xx++;
+ if (++CurrentPixel == 2) {
+ CurrentPixel = 0;
+ Pixels = *(++p);
+ }
+ } while (--xsize);
+ }
+ break;
+ }
+ LCD_L0_DrawBitmap(x, _y, _Bm.XSize, 1, _Bm.BitsPerPixel, _Bm.BytesPerLine, _Bm.pData, 0, 0);
+}
+
+/*********************************************************************
+*
+* _DrawBitLine8BPP
+*/
+static void _DrawBitLine8BPP(int x, U8 const GUI_UNI_PTR * p, int xsize, const LCD_PIXELINDEX * pTrans) {
+ int xx = x;
+ LCD_PIXELINDEX Pixel;
+ switch (GUI_Context.DrawMode & (LCD_DRAWMODE_TRANS | LCD_DRAWMODE_XOR)) {
+ case 0:
+ if (pTrans) {
+ for (; xsize > 0; xsize--, xx++, p++) {
+ Pixel = *p;
+ _SetPixelIndex(xx, *(pTrans + Pixel));
+ }
+ } else {
+ for (; xsize > 0; xsize--, xx++, p++) {
+ _SetPixelIndex(xx, *p);
+ }
+ }
+ break;
+ case LCD_DRAWMODE_TRANS:
+ if (pTrans) {
+ for (; xsize > 0; xsize--, xx++, p++) {
+ Pixel = *p;
+ if (Pixel) {
+ _SetPixelIndex(xx, *(pTrans + Pixel));
+ } else {
+ _SetPixelIndex(xx, LCD_L0_GetPixelIndex(xx, _y));
+ }
+ }
+ } else {
+ for (; xsize > 0; xsize--, xx++, p++) {
+ Pixel = *p;
+ if (Pixel) {
+ _SetPixelIndex(xx, Pixel);
+ } else {
+ _SetPixelIndex(xx, LCD_L0_GetPixelIndex(xx, _y));
+ }
+ }
+ }
+ break;
+ }
+ LCD_L0_DrawBitmap(x, _y, _Bm.XSize, 1, _Bm.BitsPerPixel, _Bm.BytesPerLine, _Bm.pData, 0, 0);
+}
+
+/*********************************************************************
+*
+* _DrawBitLine16BPP
+*/
+static void _DrawBitLine16BPP(int x, U16 const GUI_UNI_PTR * p, int xsize, const LCD_PIXELINDEX * pTrans) {
+ int xx = x;
+ LCD_PIXELINDEX pixel;
+ if ((GUI_Context.DrawMode & LCD_DRAWMODE_TRANS) == 0) {
+ if (pTrans) {
+ for (; xsize > 0; xsize--, xx++, p++) {
+ pixel = *p;
+ _SetPixelIndex(xx, *(pTrans + pixel));
+ }
+ } else {
+ for (;xsize > 0; xsize--, xx++, p++) {
+ _SetPixelIndex(xx, *p);
+ }
+ }
+ } else {
+ if (pTrans) {
+ for (; xsize > 0; xsize--, xx++, p++) {
+ pixel = *p;
+ if (pixel) {
+ _SetPixelIndex(xx, *(pTrans + pixel));
+ } else {
+ _SetPixelIndex(xx, LCD_L0_GetPixelIndex(xx, _y));
+ }
+ }
+ } else {
+ for (; xsize > 0; xsize--, xx++, p++) {
+ pixel = *p;
+ if (pixel) {
+ _SetPixelIndex(xx, pixel);
+ } else {
+ _SetPixelIndex(xx, LCD_L0_GetPixelIndex(xx, _y));
+ }
+ }
+ }
+ }
+ LCD_L0_DrawBitmap(x, _y, _Bm.XSize, 1, _Bm.BitsPerPixel, _Bm.BytesPerLine, _Bm.pData, 0, 0);
+}
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_L0_DELTA_DrawBitmap
+*/
+void LCD_L0_DELTA_DrawBitmap(int x0, int y0,
+ int xsize, int ysize,
+ int BitsPerPixel,
+ int BytesPerLine,
+ const U8 GUI_UNI_PTR * pData, int Diff,
+ const LCD_PIXELINDEX* pTrans)
+{
+ int i;
+ _InitBM(xsize, x0 + Diff);
+ for (i = 0; i < ysize; i++) {
+ _y = i + y0;
+ switch (BitsPerPixel) {
+ case 1:
+ _DrawBitLine1BPP(x0, pData, Diff, xsize, pTrans);
+ break;
+ #if (LCD_MAX_LOG_COLORS > 2)
+ case 2:
+ _DrawBitLine2BPP(x0, pData, Diff, xsize, pTrans);
+ break;
+ #endif
+ #if (LCD_MAX_LOG_COLORS > 4)
+ case 4:
+ _DrawBitLine4BPP(x0, pData, Diff, xsize, pTrans);
+ break;
+ #endif
+ #if (LCD_MAX_LOG_COLORS > 16)
+ case 8:
+ _DrawBitLine8BPP(x0, pData, xsize, pTrans);
+ break;
+ #endif
+ #if (LCD_BITSPERPIXEL > 8)
+ case 16:
+ _DrawBitLine16BPP(x0, (const U16 *)pData, xsize, pTrans);
+ break;
+ #endif
+ }
+ pData += BytesPerLine;
+ }
+}
+
+/*********************************************************************
+*
+* LCD_L0_DELTA_DrawHLine
+*/
+void LCD_L0_DELTA_DrawHLine(int x0, int y, int x1) {
+ if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
+ for (; x0 <= x1; x0++) {
+ LCD_L0_XorPixel(x0, y);
+ }
+ } else {
+ LCD_L0_DELTA_FillRect(x0, y, x1, y);
+ }
+}
+
+/*********************************************************************
+*
+* LCD_L0_DELTA_DrawVLine
+*/
+void LCD_L0_DELTA_DrawVLine(int x , int y0, int y1) {
+ if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
+ for (; y0 <= y1; y0++) {
+ LCD_L0_XorPixel(x, y0);
+ }
+ } else {
+ int aIndex[2];
+ _SetRGB(LCD_COLORINDEX);
+ aIndex[0] = x % 3;
+ aIndex[1] = (x + 1) % 3;
+ for (; y0 <= y1; y0++) {
+ LCD_L0_SetPixelIndex(x, y0, _aRGB[aIndex[y0 & 1]]);
+ }
+ }
+}
+
+/*********************************************************************
+*
+* LCD_L0_DELTA_FillRect
+*/
+void LCD_L0_DELTA_FillRect(int x0, int y0, int x1, int y1) {
+ if (GUI_Context.DrawMode & LCD_DRAWMODE_XOR) {
+ for (; y0 <= y1; y0++) {
+ LCD_L0_DELTA_DrawHLine(x0, y0, x1);
+ }
+ } else {
+ int x, y, aInit_0 = 0, aInit_1 = 0;
+ _InitBM(x1 - x0 + 1, x0);/**/
+ _SetRGB(LCD_COLORINDEX);
+ for (y = y0; y <= y1; y++) {
+ int Index = y & 1;
+ if (Index) {
+ if (!aInit_1) {
+ for (x = x0; x <= x1; x++) {
+ _aPixelData_1[x] = _aRGB[(x + 1) % 3];
+ }
+ aInit_1 = 1;
+ }
+ LCD_L0_DrawBitmap(x0, y, _Bm.XSize, 1, _Bm.BitsPerPixel, _Bm.BytesPerLine, &_aPixelData_1[x0], 0, 0);
+ } else {
+ if (!aInit_0) {
+ for (x = x0; x <= x1; x++) {
+ _aPixelData_0[x] = _aRGB[x % 3];
+ }
+ aInit_0 = 1;
+ }
+ LCD_L0_DrawBitmap(x0, y, _Bm.XSize, 1, _Bm.BitsPerPixel, _Bm.BytesPerLine, _Bm.pData, 0, 0);
+ }
+ }
+ }
+}
+
+/*********************************************************************
+*
+* LCD_L0_DELTA_GetPixelIndex
+*/
+unsigned int LCD_L0_DELTA_GetPixelIndex(int x, int y) {
+ return LCD_L0_GetPixelIndex(x, y);
+}
+
+/*********************************************************************
+*
+* LCD_L0_DELTA_SetPixelIndex
+*/
+void LCD_L0_DELTA_SetPixelIndex(int x, int y, int ColorIndex) {
+ LCD_L0_SetPixelIndex(x, y, ColorIndex);
+}
+
+/*********************************************************************
+*
+* LCD_L0_DELTA_XorPixel
+*/
+void LCD_L0_DELTA_XorPixel(int x, int y) {
+ LCD_L0_XorPixel(x, y);
+}
+
+#else
+
+void LCDL0Delta_c(void);
+void LCDL0Delta_c(void) { } /* avoid empty object files */
+
+#endif
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/LCDL0Mag.c b/User/system/lib/lcd/gui/Core/LCDL0Mag.c
new file mode 100644
index 0000000..89f9c49
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/LCDL0Mag.c
@@ -0,0 +1,260 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCD.c
+Purpose : Link between GUI and LCD_L0
+ Performs most of the clipping.
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI_Private.h"
+#include "GUIDebug.h"
+#include "LCD_Private.h" /* private modul definitions & config */
+
+#if LCD_XMAG > 2
+ #error Not yet supported
+#endif
+
+#if LCD_XMAG == 2
+
+/*********************************************************************
+*
+* Static data
+*
+**********************************************************************
+*/
+
+static const U8 abData12[16] = {
+ 0x0, 0x3, 0xc, 0xf, 0x30, 0x33, 0x3c, 0x3f, 0xC0, 0xC3, 0xCc, 0xcf, 0xf0, 0xf3, 0xfc, 0xff
+};
+
+static const U8 abData22[16] = {
+ 0x0, 0x5, 0x5*2, 0x5*3,
+ 0x50*1+0x0, 0x50*1+0x5, 0x50*1+0x5*2, 0x50*1+0x5*3,
+ 0x50*2+0x0, 0x50*2+0x5, 0x50*2+0x5*2, 0x50*2+0x5*3,
+ 0x50*3+0x0, 0x50*3+0x5, 0x50*3+0x5*2, 0x50*3+0x5*3
+};
+
+static const U8 abData32[16] = {
+ 0x0, 0x11, 0x22, 0x33,
+ 0x44, 0x55, 0x66, 0x77,
+ 0x88, 0x99, 0xaa, 0xbb,
+ 0xcc, 0xdd, 0xee, 0xff
+};
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _DrawBitline
+*/
+static void _DrawBitline(int x0, int y0, int xsize, int BPP, const U8*pData, int Diff, const LCD_PIXELINDEX* pTrans) {
+ union {
+ U8 ab[100]; /* Byte Buffer */
+ U16 au16[50]; /* Word Buffer */
+ } Buffer;
+ int i;
+ int NumPixels;
+ int NumPixelsMax = sizeof(Buffer.ab)*8/BPP/LCD_XMAG;
+ while (xsize >0) {
+ int iOff =0;
+ NumPixels = (xsize < NumPixelsMax) ? xsize : NumPixelsMax;
+ switch (BPP) {
+ case 1:
+ for (i=0; i>= 8-Diff;
+ Data &= 0xff;
+ } else {
+ Data = *pData;
+ }
+ pData++;
+ Buffer.ab[iOff++] = abData12[Data>>4];
+ Buffer.ab[iOff++] = abData12[Data&15];
+ }
+ break;
+ case 2:
+ for (i=0; i>= 8-(Diff<<1);
+ Data &= 0xff;
+ } else {
+ Data = *pData;
+ }
+ pData++;
+ Buffer.ab[iOff++] = abData22[Data>>4];
+ Buffer.ab[iOff++] = abData22[Data&15];
+ }
+ break;
+ case 4:
+ for (i=0; i>= 8-(Diff<<2);
+ Data &= 0xff;
+ } else {
+ Data = *pData;
+ }
+ pData++;
+ Buffer.ab[iOff++] = abData32[Data>>4];
+ Buffer.ab[iOff++] = abData32[Data&15];
+ }
+ break;
+ case 8:
+ for (i=0; i 2
+ GUI_MEMSET (&Buffer.ab[i*LCD_XMAG], *(pData+i), LCD_XMAG);
+ #else
+ Buffer.ab[i*LCD_XMAG] = Buffer.ab[i*LCD_XMAG+1] = *pData++;
+ #endif
+ }
+ break;
+ case 16:
+ for (i=0; i 2
+ GUI_MEMSET (&Buffer.ab[i*LCD_XMAG], *(pData+i), LCD_XMAG);
+ #else
+ Buffer.au16[i*LCD_XMAG] = Buffer.au16[i*LCD_XMAG+1] = *(U16*)pData;
+ pData += 2; /* Move to next word */
+ #endif
+ }
+ break;
+ }
+ LCD_L0_DrawBitmap(x0 + Diff * LCD_XMAG, y0, NumPixels * LCD_XMAG, LCD_YMAG, BPP, 0, Buffer.ab, 0, pTrans);
+ x0 += NumPixels*LCD_XMAG;
+ xsize -= NumPixels;
+ }
+}
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_L0_MAG_DrawBitmap
+*/
+void LCD_L0_MAG_DrawBitmap(int x0, int y0, int xsize, int ysize,
+ int BPP, int BytesPerLine, const U8* pData, int Diff,
+ const LCD_PIXELINDEX* pTrans)
+{
+ int iLine;
+ y0 *= LCD_YMAG;
+ x0 *= LCD_XMAG;
+ for (iLine = 0; iLine < ysize; iLine++) {
+ #if LCD_XMAG == 1
+ LCD_L0_DrawBitmap(x0, y0, xsize, LCD_YMAG, BPP, 0, pData, Diff, pTrans);
+ #else
+ _DrawBitline(x0, y0, xsize, BPP, pData, Diff, pTrans);
+ #endif
+ y0+= LCD_YMAG;
+ pData += BytesPerLine;
+ }
+}
+
+/*********************************************************************
+*
+* LCD_L0_MAG_DrawHLine
+*/
+void LCD_L0_MAG_DrawHLine(int x0, int y0, int x1) {
+ x0 *= LCD_XMAG;
+ x1 = x1*(LCD_XMAG) + LCD_XMAG-1;
+ y0 *= LCD_YMAG;
+ LCD_L0_FillRect(x0, y0, x1, y0 + LCD_YMAG-1);
+}
+
+/*********************************************************************
+*
+* LCD_L0_MAG_DrawVLine
+*/
+void LCD_L0_MAG_DrawVLine(int x0 , int y0, int y1) {
+ y0 *= LCD_YMAG;
+ y1 = y1*(LCD_YMAG) + LCD_YMAG-1;
+ x0 *= LCD_XMAG;
+ LCD_L0_FillRect(x0, y0, x0 + LCD_XMAG-1, y1);
+}
+
+/*********************************************************************
+*
+* LCD_L0_MAG_FillRect
+*/
+void LCD_L0_MAG_FillRect(int x0, int y0, int x1, int y1) {
+ y0 *= LCD_YMAG;
+ y1 = y1*(LCD_YMAG) + LCD_YMAG-1;
+ x0 *= LCD_XMAG;
+ x1 = x1*(LCD_XMAG) + LCD_XMAG-1;
+ LCD_L0_FillRect(x0, y0, x1, y1);
+}
+
+/*********************************************************************
+*
+* LCD_L0_MAG_GetPixelIndex
+*/
+unsigned int LCD_L0_MAG_GetPixelIndex(int x, int y) {
+ return LCD_L0_GetPixelIndex(x* LCD_XMAG, y* LCD_YMAG);
+}
+
+/*********************************************************************
+*
+* LCD_L0_MAG_SetPixelIndex
+*/
+void LCD_L0_MAG_SetPixelIndex(int x, int y, int ColorIndex) {
+ int ix, iy;
+ y *= LCD_YMAG;
+ x *= LCD_XMAG;
+ for (iy=0; iy< LCD_YMAG; iy++) {
+ for (ix=0; ix< LCD_XMAG; ix++) {
+ LCD_L0_SetPixelIndex(x+ix, y+iy, ColorIndex);
+ }
+ }
+}
+
+/*********************************************************************
+*
+* LCD_L0_MAG_XorPixel
+*/
+void LCD_L0_MAG_XorPixel(int x, int y) {
+ int ix, iy;
+ y *= LCD_YMAG;
+ x *= LCD_XMAG;
+ for (iy=0; iy< LCD_YMAG; iy++) {
+ for (ix=0; ix< LCD_XMAG; ix++) {
+ LCD_L0_XorPixel(x+ix, y+iy);
+ }
+ }
+}
+
+#else
+
+void LCDL0Mag_c(void);
+void LCDL0Mag_c(void) { } /* avoid empty object files */
+
+#endif
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/LCDP1.c b/User/system/lib/lcd/gui/Core/LCDP1.c
new file mode 100644
index 0000000..ca1fe0e
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/LCDP1.c
@@ -0,0 +1,83 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCD1.C
+Purpose : Color conversion routines for 1 bpp (b/w) mode
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include
+#include "LCD_Protected.h" /* inter modul definitions */
+
+
+/*********************************************************************
+*
+* Public data
+*
+**********************************************************************
+*/
+
+#if GUI_SUPPORT_MEMDEV
+
+/*********************************************************************
+*
+* LCD_Color2Index_1
+*
+* Purpose
+* API table for this color conversion mode. Only used by memory
+* devices in this mode.
+*/
+const LCD_API_COLOR_CONV LCD_API_ColorConv_1 = {
+ LCD_Color2Index_1,
+ LCD_Index2Color_1,
+ LCD_GetIndexMask_1
+};
+
+#endif
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Color2Index_1
+*/
+unsigned LCD_Color2Index_1(LCD_COLOR Color) {
+ int r,g,b;
+ r = Color &255;
+ g = (Color>>8) &255;
+ b = Color>>16;
+ return (r+g+b+383) /(3*255);
+}
+
+/*********************************************************************
+*
+* LCD_Index2Color_1
+*/
+LCD_COLOR LCD_Index2Color_1(int Index) {
+ return Index ? 0xFFFFFF : 0;
+}
+
+/*********************************************************************
+*
+* LCD_GetIndexMask_1
+*/
+unsigned LCD_GetIndexMask_1(void) {
+ return 0x01;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/LCDP565_Index2Color.c b/User/system/lib/lcd/gui/Core/LCDP565_Index2Color.c
new file mode 100644
index 0000000..17c3f2e
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/LCDP565_Index2Color.c
@@ -0,0 +1,62 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDP565_Index2Color.c
+Purpose : Color conversion routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD_Protected.h" /* inter modul definitions */
+
+/*********************************************************************
+*
+* Defines
+*
+**********************************************************************
+*/
+
+#define B_BITS 5
+#define G_BITS 6
+#define R_BITS 5
+
+#define R_MASK ((1 << R_BITS) -1)
+#define G_MASK ((1 << G_BITS) -1)
+#define B_MASK ((1 << B_BITS) -1)
+
+/*********************************************************************
+*
+* Public code,
+*
+* LCD_FIXEDPALETTE == 565, 65536 colors, BBBBBGGGGGGRRRRR
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Index2Color_565
+*/
+LCD_COLOR LCD_Index2Color_565(int Index) {
+ unsigned int r,g,b;
+ /* Seperate the color masks */
+ r = Index & R_MASK;
+ g = (Index >> R_BITS) & G_MASK;
+ b = ((unsigned)Index >> (R_BITS + G_BITS)) & B_MASK;
+ /* Convert the color masks */
+ r = r * 255 / R_MASK;
+ g = g * 255 / G_MASK;
+ b = b * 255 / B_MASK;
+ return r + (g<<8) + (((U32)b)<<16);
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/LCDPM565_Index2Color.c b/User/system/lib/lcd/gui/Core/LCDPM565_Index2Color.c
new file mode 100644
index 0000000..cd562e9
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/LCDPM565_Index2Color.c
@@ -0,0 +1,62 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDPM565_Index2Color.c
+Purpose : Color conversion routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD_Protected.h" /* inter modul definitions */
+
+/*********************************************************************
+*
+* Defines
+*
+**********************************************************************
+*/
+
+#define B_BITS 5
+#define G_BITS 6
+#define R_BITS 5
+
+#define R_MASK ((1 << R_BITS) -1)
+#define G_MASK ((1 << G_BITS) -1)
+#define B_MASK ((1 << B_BITS) -1)
+
+/*********************************************************************
+*
+* Public code,
+*
+* LCD_FIXEDPALETTE == 565, 65536 colors, RRRRRGGGGGGBBBBB
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Index2Color_M565
+*/
+LCD_COLOR LCD_Index2Color_M565(int Index) {
+ unsigned int r,g,b;
+ /* Seperate the color masks */
+ b = Index & B_MASK;
+ g = (Index >> B_BITS) & G_MASK;
+ r = ((unsigned)Index >> (B_BITS + G_BITS)) & R_MASK;
+ /* Convert the color masks */
+ r = r * 255 / R_MASK;
+ g = g * 255 / G_MASK;
+ b = b * 255 / B_MASK;
+ return r + (g<<8) + (((U32)b)<<16);
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/LCDRLE4.c b/User/system/lib/lcd/gui/Core/LCDRLE4.c
new file mode 100644
index 0000000..aa1c12f
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/LCDRLE4.c
@@ -0,0 +1,138 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDRLE4.c
+Purpose : Drawing routines for run length encoded bitmaps
+ with 4bpp
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "LCD.h"
+#include "GUI_Private.h"
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _DrawBitmap_RLE4
+*/
+static void _DrawBitmap_RLE4(int x0,int y0,int xsize, int ysize, const U8 GUI_UNI_PTR * pPixel, const LCD_LOGPALETTE GUI_UNI_PTR* pLogPal, int xMag, int yMag) {
+ const LCD_PIXELINDEX* pTrans =NULL;
+ char NoTrans = !(GUI_Context.DrawMode & LCD_DRAWMODE_TRANS);
+ LCD_PIXELINDEX aColorIndex[2];
+ LCD_PIXELINDEX PixelIndex;
+ int xi,y;
+ int xL, yL;
+ char IsMagnified = ((yMag | xMag) != 1);
+ aColorIndex[0] = LCD_ACOLORINDEX[0];
+ aColorIndex[1] = LCD_ACOLORINDEX[1];
+ /* Handle color translation */
+ if ((pLogPal) && (pLogPal->pPalEntries)) {
+ if ((pTrans = LCD_GetpPalConvTable(pLogPal)) == NULL) {
+ return;
+ }
+ }
+ /* Check if we can limit the number of lines due to clipping) */
+ if (yMag == 1) {
+ if (ysize > GUI_Context.ClipRect.y1 - y0 + 1)
+ ysize = GUI_Context.ClipRect.y1 - y0 + 1;
+ }
+ /* Repeat until we have reached bottom */
+ for (xi=0, y = 0; y < ysize; ) {
+ U8 Cmd,Data;
+ Cmd= *pPixel++;
+ Data = *pPixel++;
+ if (Cmd) {
+ LCD_SetColorIndex(pTrans ? *(pTrans+Data) : Data);
+ while (Cmd) {
+ int xi1 = xi+Cmd;
+ if (xi1>=xsize)
+ xi1 = xsize;
+ Cmd -= (xi1-xi);
+ if (Data || NoTrans) { /* Skip transparent pixels */
+ if (IsMagnified) {
+ xL = xMag * xi + x0;
+ yL = yMag * y + y0;
+ LCD_FillRect(xL, yL, xL + xMag * (xi1 - xi) -1 , yL + yMag - 1);
+ } else {
+ LCD_DrawHLine(x0+xi, y + y0, xi1+x0-1);
+ }
+ }
+ xi =xi1;
+ if (xi1==xsize) {
+ y++;
+ xi=0;
+ }
+ }
+ } else {
+ while (Data--) {
+ U8 Index = *pPixel++;
+ if ((Index>>4) || NoTrans) { /* Skip transparent pixels */
+ PixelIndex = pTrans ? *(pTrans+(Index>>4)) : (Index>>4);
+ if (IsMagnified) {
+ LCD_SetColorIndex(PixelIndex);
+ xL = xMag * xi + x0;
+ yL = yMag * y + y0;
+ LCD_FillRect(xL, yL, xL + xMag -1 , yL + yMag - 1);
+ } else {
+ LCD_SetPixelIndex(x0+xi, y + y0, PixelIndex);
+ }
+ }
+ if (++xi >= xsize) {
+ xi=0; y++;
+ }
+ if (Data-- == 0)
+ break;
+ if ((Index&15) || NoTrans) { /* Skip transparent pixels */
+ PixelIndex = pTrans ? *(pTrans+(Index&15)) : (Index&15);
+ if (IsMagnified) {
+ LCD_SetColorIndex(PixelIndex);
+ xL = xMag * xi + x0;
+ yL = yMag * y + y0;
+ LCD_FillRect(xL, yL, xL + xMag -1 , yL + yMag - 1);
+ } else {
+ LCD_SetPixelIndex(x0+xi, y + y0, PixelIndex);
+ }
+ }
+ if (++xi >= xsize) {
+ xi=0; y++;
+ }
+ }
+ }
+ }
+ LCD_ACOLORINDEX[0] = aColorIndex[0];
+ LCD_ACOLORINDEX[1] = aColorIndex[1];
+}
+
+/*********************************************************************
+*
+* Public data
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_BitmapMethodsRLE4
+*/
+const GUI_BITMAP_METHODS GUI_BitmapMethodsRLE4 = {
+ _DrawBitmap_RLE4,
+ NULL
+};
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/LCDRLE8.c b/User/system/lib/lcd/gui/Core/LCDRLE8.c
new file mode 100644
index 0000000..4da2e58
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/LCDRLE8.c
@@ -0,0 +1,165 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDRLE8.c
+Purpose : Drawing routines for run length encoded bitmaps
+ with 8 bpp
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI_Private.h"
+#include "LCD_Private.h"
+
+/*********************************************************************
+*
+* Static data
+*
+**********************************************************************
+*/
+
+static struct {
+ int x,y;
+ const U8 GUI_UNI_PTR * pPixel;
+ const U8 GUI_UNI_PTR * pPixelStart;
+} Cache;
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _DrawBitmap_RLE8
+*/
+static void _DrawBitmap_RLE8(int x0,int y0,int xsize, int ysize, const U8 GUI_UNI_PTR * pPixel, const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal, int xMag, int yMag) {
+ LCD_PIXELINDEX aColorIndex[2];
+ LCD_PIXELINDEX PixelIndex;
+ int xi,y;
+ int xL, yL;
+ const U8 GUI_UNI_PTR * pPixelOrg = pPixel;
+ char NoTrans = !(GUI_Context.DrawMode & LCD_DRAWMODE_TRANS);
+ const LCD_PIXELINDEX* pTrans =NULL;
+ char IsMagnified = ((yMag | xMag) != 1);
+ aColorIndex[0] = LCD_ACOLORINDEX[0];
+ aColorIndex[1] = LCD_ACOLORINDEX[1];
+ /* Handle color translation */
+ if ((pLogPal) && (pLogPal->pPalEntries)) {
+ if ((pTrans = LCD_GetpPalConvTable(pLogPal)) == NULL) {
+ return;
+ }
+ }
+ /* Check if we can limit the number of lines due to clipping) */
+ if (yMag == 1) {
+ if (ysize > GUI_Context.ClipRect.y1 - y0 + 1)
+ ysize = GUI_Context.ClipRect.y1 - y0 + 1;
+ }
+ /* Init variables for looping */
+ xi=0;
+ y =0;
+ /* Check if we can use the cache to save some unnecessary iterations */
+ if (!IsMagnified) {
+ int yDiff = GUI_Context.ClipRect.y0 - y0;
+ if ((Cache.pPixelStart == pPixel) && (yDiff > Cache.y)) {
+ /* Accept cache values */
+ y = Cache.y;
+ xi = Cache.x;
+ pPixel = Cache.pPixel;
+ }
+ }
+ /* Init values for caching */
+ Cache.pPixel = Cache.pPixelStart = pPixelOrg;
+ Cache.x = Cache.y = 0;
+ /* Repeat until we have reached bottom */
+ for (; y < ysize; ) {
+ U8 Cmd = *pPixel++;
+ U8 Data = *pPixel++;
+ if (Cmd) {
+ /* Save cache info */
+ Cache.pPixel = pPixel-2;
+ Cache.x = xi;
+ Cache.y = y;
+ LCD_ACOLORINDEX[1] = pTrans ? *(pTrans+Data) : Data;
+ while (Cmd) {
+ int xi1 = xi+Cmd;
+ if (xi1>=xsize)
+ xi1 = xsize;
+ Cmd -= (xi1-xi);
+ if (Data || NoTrans) { /* Skip transparent pixels */
+ if (IsMagnified) {
+ xL = xMag * xi + x0;
+ yL = yMag * y + y0;
+ LCD_FillRect(xL, yL, xL + xMag * (xi1 - xi) -1 , yL + yMag - 1);
+ } else {
+ LCD_DrawHLine(x0+xi, y + y0, xi1+x0-1);
+ }
+ }
+ xi =xi1;
+ if (xi1==xsize) {
+ y++;
+ xi=0;
+ }
+ }
+ } else {
+ do {
+ U8 Index = *pPixel++;
+ if (Index || NoTrans) { /* Skip transparent pixels */
+ int x = x0+xi;
+ PixelIndex = pTrans ? *(pTrans+Index) : Index;
+ if (IsMagnified) {
+ LCD_SetColorIndex(PixelIndex);
+ xL = xMag * xi + x0;
+ yL = yMag * y + y0;
+ LCD_FillRect(xL, yL, xL + xMag -1 , yL + yMag - 1);
+ } else {
+ #if 1 /* High speed variant */
+ if (y + y0>= GUI_Context.ClipRect.y0)
+ if (x >= GUI_Context.ClipRect.x0)
+ if (x <= GUI_Context.ClipRect.x1)
+ LCDDEV_L0_SetPixelIndex(x, y + y0, PixelIndex);
+ #else
+ LCD_SetPixelIndex(x, y + y0, PixelIndex);
+ #endif
+ }
+ }
+ if (++xi >= xsize) {
+ xi=0; y++;
+ if (y >= ysize)
+ break;
+ }
+ } while (--Data);
+ }
+ }
+ LCD_ACOLORINDEX[0] = aColorIndex[0];
+ LCD_ACOLORINDEX[1] = aColorIndex[1];
+}
+
+/*********************************************************************
+*
+* Public data
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_BitmapMethodsRLE8
+*/
+const GUI_BITMAP_METHODS GUI_BitmapMethodsRLE8 = {
+ _DrawBitmap_RLE8,
+ NULL
+};
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/LCDSIM.h b/User/system/lib/lcd/gui/Core/LCDSIM.h
new file mode 100644
index 0000000..b45bbdb
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/LCDSIM.h
@@ -0,0 +1,90 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDSIM.h
+Purpose : Declares LCD interface functions
+----------------------------------------------------------------------
+*/
+
+#ifndef LCDSIM_H
+#define LCDSIM_H
+
+
+/************************************************************
+*
+* defines
+*
+*************************************************************
+*/
+#define LCDSIM_MAX_DISPLAYS 5
+
+/************************************************************
+*
+* LCDSIM_ General declarations
+*
+*************************************************************
+*/
+
+char* LCDSIM_Init(void);
+int LCDSIM_GetMouseState(LCD_tMouseState *pState);
+void LCDSIM_SetMouseState(int x, int y, int KeyStat);
+void LCDSIM_CheckMouseState(void);
+int LCDSIM_SaveBMP (const char * sFileName);
+int LCDSIM_SaveBMPEx (const char * sFileName, int x0, int y0, int xSize, int ySize);
+int LCDSIM_SaveSBMP (const char * sFileName);
+int LCDSIM_SaveSBMPEx(const char * sFileName, int x0, int y0, int xSize, int ySize);
+
+/************************************************************
+*
+* LCDSIM_ Functions for each display
+*
+*************************************************************
+*/
+
+void LCDSIM_FillRect(int x0, int y0, int x1, int y1, int Index, int LayerIndex);
+int LCDSIM_GetModifyCnt(int LayerIndex);
+int LCDSIM_GetModifyCntInfo(int LayerIndex);
+int LCDSIM_GetPixelColor(int x, int y, int LayerIndex);
+int LCDSIM_GetPixelIndex(int x, int y, int LayerIndex);
+int LCDSIM_Index2Color(int Index, int LayerIndex);
+int LCDSIM_RLUT_GetPixelIndex(int x, int y, int LayerIndex);
+void LCDSIM_RLUT_SetPixelIndex(int x, int y, int Index, int LayerIndex);
+void LCDSIM_SetLUTEntry(U8 Pos, LCD_COLOR color, int LayerIndex);
+void LCDSIM_SetPixelIndex(int x, int y, int Index, int LayerIndex);
+void LCDSIM_SetPixelColor(int x, int y, LCD_COLOR PixelColor, int LayerIndex);
+void LCDSIM_SetSubPixel(int x, int y, U8 Value, int LayerIndex);
+void LCDSIM_SetSubPixelPhys(int xPhys, int yPhys, int Index, int LayerIndex);
+void LCDSIM_SetPixelPhys(int x, int y, int Index, int LayerIndex);
+int LCDSIM_GetPixelPhys(int xPhys, int yPhys, int LayerIndex);
+void LCDSIM_FillRectPhys(int x0Phys, int y0Phys, int x1Phys, int y1Phys, int Index, int LayerIndex);
+
+/************************************************************
+*
+* LCDSIM_ Declarations for painting in windows program
+*
+*************************************************************
+*/
+
+#if defined(_WINDOWS_) | defined(_WINDOWS_H) /* if windows.h has already been included */
+ void LCDSIM_Paint (HWND hWnd);
+ void LCDSIM_PaintEx(HWND hWnd, LPRECT pRectDest, LPRECT pRectSrc);
+ void LCDSIM_PaintAt(HWND hWnd, int x, int y);
+#endif
+
+
+#endif /* LCD_H */
+
+
+
+
diff --git a/User/system/lib/lcd/gui/Core/LCD_API.c b/User/system/lib/lcd/gui/Core/LCD_API.c
new file mode 100644
index 0000000..c734b61
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/LCD_API.c
@@ -0,0 +1,302 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCD_API.C
+Purpose : Selection of LCD display
+---------------------------END-OF-HEADER------------------------------
+*/
+
+
+#include /* needed for definition of NULL */
+#include "GUI_Private.h"
+#include "GUIDebug.h"
+#include "LCD_Private.h" /* Required for configuration, APIList */
+
+#if GUI_COMPILER_SUPPORTS_FP
+
+/*********************************************************************
+*
+* LCD Device
+* (if memory devices are supported)
+*
+**********************************************************************
+*/
+
+const tLCDDEV_APIList LCD_L0_APIList = {
+#if LCD_YMAG==1
+ #if LCD_DELTA_MODE
+ LCD_L0_Color2Index,
+ LCD_L0_Index2Color,
+ LCD_L0_GetIndexMask,
+ LCD_L0_DELTA_DrawBitmap,
+ LCD_L0_DELTA_DrawHLine,
+ LCD_L0_DELTA_DrawVLine,
+ LCD_L0_DELTA_FillRect,
+ LCD_L0_DELTA_GetPixelIndex,
+ LCD_L0_GetRect, /* Original routine is o.k. here, since we use the logical
+ coordinates for clipping, which are not magnified */
+ LCD_L0_DELTA_SetPixelIndex,
+ LCD_L0_DELTA_XorPixel,
+ LCD_L0_SetLUTEntry,
+ #else
+ LCD_L0_Color2Index,
+ LCD_L0_Index2Color,
+ LCD_L0_GetIndexMask,
+ (tLCDDEV_DrawBitmap*)LCD_L0_DrawBitmap,
+ LCD_L0_DrawHLine,
+ LCD_L0_DrawVLine,
+ LCD_L0_FillRect,
+ LCD_L0_GetPixelIndex,
+ LCD_L0_GetRect,
+ LCD_L0_SetPixelIndex,
+ LCD_L0_XorPixel,
+ LCD_L0_SetLUTEntry,
+ #endif
+#else
+ LCD_L0_Color2Index,
+ LCD_L0_Index2Color,
+ LCD_L0_GetIndexMask,
+ LCD_L0_MAG_DrawBitmap,
+ LCD_L0_MAG_DrawHLine,
+ LCD_L0_MAG_DrawVLine,
+ LCD_L0_MAG_FillRect,
+ LCD_L0_MAG_GetPixelIndex,
+ LCD_L0_GetRect, /* Original routine is o.k. here, since we use the logical
+ coordinates for clipping, which are not magnified */
+ LCD_L0_MAG_SetPixelIndex,
+ LCD_L0_MAG_XorPixel,
+ LCD_L0_SetLUTEntry,
+#endif
+#if GUI_SUPPORT_MEMDEV
+ NULL, /* pfFillPolygon */
+ NULL, /* pfFillPolygonAA */
+ #if LCD_BITSPERPIXEL <= 8
+ &GUI_MEMDEV__APIList8
+ #else
+ &GUI_MEMDEV__APIList16
+ #endif
+#endif
+};
+
+/*
+ *************************************************
+ * *
+ * LCD Device *
+ * (if memory devices are supported) *
+ * *
+ *************************************************
+*/
+
+#if GUI_NUM_LAYERS > 1
+const tLCDDEV_APIList LCD_L0_1_APIList = {
+#if LCD_YMAG_1 == 1
+ LCD_L0_1_Color2Index,
+ LCD_L0_1_Index2Color,
+ LCD_L0_1_GetIndexMask,
+ LCD_L0_1_DrawBitmap,
+ LCD_L0_1_DrawHLine,
+ LCD_L0_1_DrawVLine,
+ LCD_L0_1_FillRect,
+ LCD_L0_1_GetPixelIndex,
+ LCD_L0_1_GetRect,
+ LCD_L0_1_SetPixelIndex,
+ LCD_L0_1_XorPixel,
+ LCD_L0_1_SetLUTEntry,
+#else
+ LCD_L0_1_Color2Index,
+ LCD_L0_1_Index2Color,
+ LCD_L0_1_GetIndexMask,
+ LCD_L0_1_MAG_DrawBitmap,
+ LCD_L0_1_MAG_DrawHLine,
+ LCD_L0_1_MAG_DrawVLine,
+ LCD_L0_1_MAG_FillRect,
+ LCD_L0_1_MAG_GetPixelIndex,
+ LCD_L0_1_GetRect, /* Original routine is o.k. here, since we use the logical
+ coordinates for clipping, which are not magnified */
+ LCD_L0_1_MAG_SetPixelIndex,
+ LCD_L0_1_MAG_XorPixel,
+ LCD_L0_1_SetLUTEntry,
+#endif
+#if GUI_SUPPORT_MEMDEV
+ NULL, /* pfFillPolygon */
+ NULL, /* pfFillPolygonAA */
+ #if LCD_BITSPERPIXEL_1 <= 8
+ &GUI_MEMDEV__APIList8
+ #else
+ &GUI_MEMDEV__APIList16
+ #endif
+#endif
+};
+#endif
+
+#if GUI_NUM_LAYERS > 2
+const tLCDDEV_APIList LCD_L0_2_APIList = {
+#if LCD_YMAG_2 == 1
+ LCD_L0_2_Color2Index,
+ LCD_L0_2_Index2Color,
+ LCD_L0_2_GetIndexMask,
+ LCD_L0_2_DrawBitmap,
+ LCD_L0_2_DrawHLine,
+ LCD_L0_2_DrawVLine,
+ LCD_L0_2_FillRect,
+ LCD_L0_2_GetPixelIndex,
+ LCD_L0_2_GetRect,
+ LCD_L0_2_SetPixelIndex,
+ LCD_L0_2_XorPixel,
+ LCD_L0_2_SetLUTEntry,
+#else
+ LCD_L0_2_Color2Index,
+ LCD_L0_2_Index2Color,
+ LCD_L0_2_GetIndexMask,
+ LCD_L0_2_MAG_DrawBitmap,
+ LCD_L0_2_MAG_DrawHLine,
+ LCD_L0_2_MAG_DrawVLine,
+ LCD_L0_2_MAG_FillRect,
+ LCD_L0_2_MAG_GetPixelIndex,
+ LCD_L0_2_GetRect, /* Original routine is o.k. here, since we use the logical
+ coordinates for clipping, which are not magnified */
+ LCD_L0_2_MAG_SetPixelIndex,
+ LCD_L0_2_MAG_XorPixel,
+ LCD_L0_2_SetLUTEntry,
+#endif
+#if GUI_SUPPORT_MEMDEV
+ NULL, /* pfFillPolygon */
+ NULL, /* pfFillPolygonAA */
+ #if LCD_BITSPERPIXEL_2 <= 8
+ &GUI_MEMDEV__APIList8
+ #else
+ &GUI_MEMDEV__APIList16
+ #endif
+#endif
+};
+#endif
+
+#if GUI_NUM_LAYERS > 3
+const tLCDDEV_APIList LCD_L0_3_APIList = {
+#if LCD_YMAG_3 == 1
+ LCD_L0_3_Color2Index,
+ LCD_L0_3_Index2Color,
+ LCD_L0_3_GetIndexMask,
+ LCD_L0_3_DrawBitmap,
+ LCD_L0_3_DrawHLine,
+ LCD_L0_3_DrawVLine,
+ LCD_L0_3_FillRect,
+ LCD_L0_3_GetPixelIndex,
+ LCD_L0_3_GetRect,
+ LCD_L0_3_SetPixelIndex,
+ LCD_L0_3_XorPixel,
+ LCD_L0_3_SetLUTEntry,
+#else
+ LCD_L0_3_Color2Index,
+ LCD_L0_3_Index2Color,
+ LCD_L0_3_GetIndexMask,
+ LCD_L0_3_MAG_DrawBitmap,
+ LCD_L0_3_MAG_DrawHLine,
+ LCD_L0_3_MAG_DrawVLine,
+ LCD_L0_3_MAG_FillRect,
+ LCD_L0_3_MAG_GetPixelIndex,
+ LCD_L0_3_GetRect, /* Original routine is o.k. here, since we use the logical
+ coordinates for clipping, which are not magnified */
+ LCD_L0_3_MAG_SetPixelIndex,
+ LCD_L0_3_MAG_XorPixel,
+ LCD_L0_3_SetLUTEntry,
+#endif
+#if GUI_SUPPORT_MEMDEV
+ NULL, /* pfFillPolygon */
+ NULL, /* pfFillPolygonAA */
+ #if LCD_BITSPERPIXEL_3 <= 8
+ &GUI_MEMDEV__APIList8
+ #else
+ &GUI_MEMDEV__APIList16
+ #endif
+#endif
+};
+#endif
+
+#if GUI_NUM_LAYERS > 4
+const tLCDDEV_APIList LCD_L0_4_APIList = {
+#if LCD_YMAG_4 == 1
+ LCD_L0_4_Color2Index,
+ LCD_L0_4_Index2Color,
+ LCD_L0_4_GetIndexMask,
+ LCD_L0_4_DrawBitmap,
+ LCD_L0_4_DrawHLine,
+ LCD_L0_4_DrawVLine,
+ LCD_L0_4_FillRect,
+ LCD_L0_4_GetPixelIndex,
+ LCD_L0_4_GetRect,
+ LCD_L0_4_SetPixelIndex,
+ LCD_L0_4_XorPixel,
+ LCD_L0_4_SetLUTEntry,
+#else
+ LCD_L0_4_Color2Index,
+ LCD_L0_4_Index2Color,
+ LCD_L0_4_GetIndexMask,
+ LCD_L0_4_MAG_DrawBitmap,
+ LCD_L0_4_MAG_DrawHLine,
+ LCD_L0_4_MAG_DrawVLine,
+ LCD_L0_4_MAG_FillRect,
+ LCD_L0_4_MAG_GetPixelIndex,
+ LCD_L0_4_GetRect, /* Original routine is o.k. here, since we use the logical
+ coordinates for clipping, which are not magnified */
+ LCD_L0_4_MAG_SetPixelIndex,
+ LCD_L0_4_MAG_XorPixel,
+ LCD_L0_4_SetLUTEntry,
+#endif
+#if GUI_SUPPORT_MEMDEV
+ NULL, /* pfFillPolygon */
+ NULL, /* pfFillPolygonAA */
+ #if LCD_BITSPERPIXEL_4 <= 8
+ &GUI_MEMDEV__APIList8
+ #else
+ &GUI_MEMDEV__APIList16
+ #endif
+#endif
+};
+#endif
+
+/***********************************************************
+*
+* LCD_aAPI
+*
+* Purpose:
+* This table lists the available displays/layers by a single pointer.
+* It is important that these are non-constants, because some high level
+* software (such as the VNC server, but maybe also the mouse "Cursor" mdoule)
+* may need to override these pointers in order to link itself into the chain
+* of drawing routines.
+* However, the API tables may of course be constants.
+*
+*/
+
+const tLCDDEV_APIList* /*const*/ LCD_aAPI[] = {
+ &LCD_L0_APIList
+#if GUI_NUM_LAYERS > 1
+ ,&LCD_L0_1_APIList
+#endif
+#if GUI_NUM_LAYERS > 2
+ ,&LCD_L0_2_APIList
+#endif
+#if GUI_NUM_LAYERS > 3
+ ,&LCD_L0_3_APIList
+#endif
+#if GUI_NUM_LAYERS > 4
+ ,&LCD_L0_4_APIList
+#endif
+};
+
+#endif
+
+/*************************** End of file ****************************/
+
diff --git a/User/system/lib/lcd/gui/Core/LCD_ConfDefaults.h b/User/system/lib/lcd/gui/Core/LCD_ConfDefaults.h
new file mode 100644
index 0000000..a683fbd
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/LCD_ConfDefaults.h
@@ -0,0 +1,740 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* �C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCD_ConfDefaults.h
+Purpose : Valid LCD configuration and defaults
+----------------------------------------------------------------------
+*/
+
+#ifndef LCD_CONFIG_DEFAULTS_H
+#define LCD_CONFIG_DEFAULTS_H
+
+#include "LCDConf.h" /* Configuration header file */
+#include "GUI_ConfDefaults.h" /* Needed for GUI_NUM_LAYERS */
+/*********************************************************************
+ *
+ * Map the defines for this controller
+ *
+ * #define LCD_ LCD__0
+ *
+ **********************************************************************
+ */
+
+#ifdef LCD_CONTROLLER_0
+#define LCD_CONTROLLER LCD_CONTROLLER_0
+#endif
+
+#ifdef LCD_XSIZE_0
+#define LCD_XSIZE LCD_XSIZE_0
+#endif
+
+#ifdef LCD_YSIZE_0
+#define LCD_YSIZE LCD_YSIZE_0
+#endif
+
+#ifdef LCD_BITSPERPIXEL_0
+#define LCD_BITSPERPIXEL LCD_BITSPERPIXEL_0
+#endif
+
+#ifdef LCD_VYSIZE_0
+#define LCD_VYSIZE LCD_VYSIZE_0
+#endif
+
+#ifdef LCD_MIRROR_X_0
+#define LCD_MIRROR_X LCD_MIRROR_X_0
+#endif
+
+#ifdef LCD_MIRROR_Y_0
+#define LCD_MIRROR_Y LCD_MIRROR_Y_0
+#endif
+
+#ifdef LCD_SWAP_XY_0
+#define LCD_SWAP_XY LCD_SWAP_XY_0
+#endif
+
+#ifdef LCD_CACHE_CONTROL_0
+#define LCD_CACHE_CONTROL LCD_CACHE_CONTROL_0
+#endif
+
+#ifdef LCD_FIRSTSEG0_0
+#define LCD_FIRSTSEG0 LCD_FIRSTSEG0_0
+#endif
+
+#ifdef LCD_LASTSEG0_0
+#define LCD_LASTSEG0 LCD_LASTSEG0_0
+#endif
+
+#ifdef LCD_FIRSTCOM0_0
+#define LCD_FIRSTCOM0 LCD_FIRSTCOM0_0
+#endif
+
+#ifdef LCD_LASTCOM0_0
+#define LCD_LASTCOM0 LCD_LASTCOM0_0
+#endif
+
+#ifdef LCD_BITSPERPIXEL_L0_0
+#define LCD_BITSPERPIXEL_L0 LCD_BITSPERPIXEL_0
+#endif
+
+#ifdef LCD_DELTA_MODE_0
+#define LCD_DELTA_MODE LCD_DELTA_MODE_0
+#endif
+
+#ifdef LCD_XORG0_0
+#define LCD_XORG0 LCD_XORG0_0
+#endif
+
+#ifdef LCD_YORG0_0
+#define LCD_YORG0 LCD_YORG0_0
+#endif
+
+#ifdef LCD_FIXEDPALETTE_0
+#define LCD_FIXEDPALETTE LCD_FIXEDPALETTE_0
+#endif
+
+#ifdef LCD_CACHE_0
+#ifdef LCD_CACHE
+#undef LCD_CACHE
+#endif
+#define LCD_CACHE LCD_CACHE_0
+#endif
+
+#ifdef LCD_CHECKBUSY_0
+#ifdef LCD_CHECKBUSY
+#undef LCD_CHECKBUSY
+#endif
+#define LCD_CHECKBUSY LCD_CHECKBUSY_0
+#endif
+
+#ifdef LCD_SWAP_BYTE_ORDER_0
+#define LCD_SWAP_BYTE_ORDER LCD_SWAP_BYTE_ORDER_0
+#endif
+
+#ifdef LCD_SWAP_RB_0
+#define LCD_SWAP_RB LCD_SWAP_RB_0
+#endif
+
+#ifdef LCD_PHYSCOLORS_0
+#define LCD_PHYSCOLORS LCD_PHYSCOLORS_0
+#endif
+
+#ifndef LCD_ALLOW_NON_OPTIMIZED_MODE
+#define LCD_ALLOW_NON_OPTIMIZED_MODE 0
+#endif
+
+/*********************************************************************
+ *
+ * Some error checking
+ *
+ **********************************************************************
+ */
+#ifndef LCD_CONTROLLER
+#error LCD_CONTROLLER not defined !
+#endif
+
+/*******************************************************************
+ *
+ * Defaults for config switches
+ *
+ ********************************************************************
+ */
+
+#ifndef LCD_NUM_CONTROLLERS
+#define LCD_NUM_CONTROLLERS (1)
+#endif
+
+#ifndef LCD_NUM_COLORS
+#define LCD_NUM_COLORS (1L << LCD_BITSPERPIXEL)
+#endif
+
+/*********************************************************************
+ *
+ * Map the defines for controller 0 to general defines
+ *
+ **********************************************************************
+ */
+
+/* Allow use of multiple physical lines for one logical line ...
+ Used for delta-type LCDs, where value should be 2 */
+
+#ifndef LCD_YMAG
+#define LCD_YMAG 1
+#endif
+#ifndef LCD_XMAG
+#define LCD_XMAG 1
+#endif
+
+#ifndef LCD_VXSIZE
+#define LCD_VXSIZE (LCD_XSIZE * LCD_XMAG) /* virtual x-size */
+#endif
+#ifndef LCD_VYSIZE
+#define LCD_VYSIZE (LCD_YSIZE * LCD_YMAG) /* virtual y-size */
+#endif
+
+#ifndef LCD_SWAP_BYTE_ORDER
+#define LCD_SWAP_BYTE_ORDER (0) /* only for 16 bit bus, default is not swapped */
+#endif
+
+#ifndef LCD_MAX_LOG_COLORS
+#define LCD_MAX_LOG_COLORS (256)
+#endif
+
+/* Optionally swap red and blue components */
+#ifndef LCD_SWAP_RB
+#define LCD_SWAP_RB 0
+#endif
+
+#if !defined(LCD_CONTROLLER) && defined(LCD_CONTROLLER_0)
+#define LCD_CONTROLLER LCD_CONTROLLER_0
+#endif
+
+#if !defined(LCD_XSIZE) && defined(LCD_XSIZE_0)
+#define LCD_XSIZE LCD_XSIZE_0
+#endif
+
+#if !defined(LCD_YSIZE) && defined(LCD_YSIZE_0)
+#define LCD_YSIZE LCD_YSIZE_0
+#endif
+
+#if !defined(LCD_BITSPERPIXEL) && defined(LCD_BITSPERPIXEL_0)
+#define LCD_BITSPERPIXEL LCD_BITSPERPIXEL_0
+#endif
+
+#if !defined(LCD_VYSIZE) && defined(LCD_VYSIZE_0)
+#define LCD_VYSIZE LCD_VYSIZE_0
+#endif
+
+/*********************************************************************
+ *
+ * Defaults for Display 0 (first display)
+ *
+ **********************************************************************
+ */
+
+#ifndef LCD_MIRROR_X
+#define LCD_MIRROR_X (0) /* If active: X -> -X */
+#endif
+#ifndef LCD_MIRROR_Y
+#define LCD_MIRROR_Y (0) /* If active: Y -> -Y */
+#endif
+#ifndef LCD_SWAP_XY
+#define LCD_SWAP_XY (0) /* If active: X <-> Y */
+#endif
+#ifndef LCD_BITSPERPIXEL_L0
+#define LCD_BITSPERPIXEL_L0 LCD_BITSPERPIXEL
+#endif
+#ifndef LCD_DELTA_MODE
+#define LCD_DELTA_MODE 0 /**/
+#endif
+
+/* Position data for controller 0 */
+#ifndef LCD_XORG0
+#define LCD_XORG0 (0) /* leftmost position covered by this controller */
+#endif
+#ifndef LCD_YORG0
+#define LCD_YORG0 (0) /* topmost position covered by this controller */
+#endif
+#ifndef LCD_XSIZE0
+#define LCD_XSIZE0 (LCD_XSIZE) /* horizontal size covered by this controller */
+#endif
+#ifndef LCD_YSIZE0
+#define LCD_YSIZE0 (LCD_YSIZE) /* vertical size covered by this controller */
+#endif
+#ifndef LCD_FIRSTSEG0
+#define LCD_FIRSTSEG0 (0) /* first segment used by this controller */
+#endif
+#ifndef LCD_LASTSEG0
+#define LCD_LASTSEG0 (LCD_XSIZE - 1) /* Contr.0: last segment line used */
+#endif
+#ifndef LCD_FIRSTCOM0
+#define LCD_FIRSTCOM0 (0) /* first com used by this controller */
+#endif
+#ifndef LCD_LASTCOM0
+#define LCD_LASTCOM0 (LCD_YSIZE - 1) /* Contr.0: last com line used */
+#endif
+
+#if (!LCD_SWAP_XY)
+#define LCD_XSIZE_PHYS LCD_XSIZE
+#define LCD_YSIZE_PHYS LCD_YSIZE
+#define LCD_VXSIZE_PHYS LCD_VXSIZE
+#define LCD_VYSIZE_PHYS LCD_VYSIZE
+#else
+#define LCD_XSIZE_PHYS LCD_YSIZE
+#define LCD_YSIZE_PHYS LCD_XSIZE
+#define LCD_VXSIZE_PHYS LCD_VYSIZE
+#define LCD_VYSIZE_PHYS LCD_VXSIZE
+#endif
+
+/**********************************************************
+ *
+ * Color settings
+ */
+#ifndef LCD_REVERSE
+#define LCD_REVERSE 0
+#endif
+
+#ifndef LCD_REVERSE_LUT
+#define LCD_REVERSE_LUT 0
+#endif
+
+#ifndef LCD_PHYSCOLORS_IN_RAM
+#define LCD_PHYSCOLORS_IN_RAM 0
+#endif
+
+#if !defined(LCD_PHYSCOLORS)
+#if (LCD_BITSPERPIXEL == 1) | (LCD_BITSPERPIXEL == 2) | (LCD_BITSPERPIXEL == 4)
+#ifndef LCD_FIXEDPALETTE
+#define LCD_FIXEDPALETTE LCD_BITSPERPIXEL
+#endif
+#endif
+#endif /* defined (LCD_PHYSCOLORS) */
+
+#if !defined(LCD_FIXEDPALETTE)
+#if !defined(LCD_PHYSCOLORS)
+#if LCD_BITSPERPIXEL == 8
+// #define LCD_FIXEDPALETTE 8666
+#define LCD_FIXEDPALETTE 233
+
+#elif LCD_BITSPERPIXEL == 12
+#define LCD_FIXEDPALETTE 44412
+#elif LCD_BITSPERPIXEL == 15
+#define LCD_FIXEDPALETTE 555
+#elif LCD_BITSPERPIXEL == 16
+#define LCD_FIXEDPALETTE 565
+#else
+#define LCD_FIXEDPALETTE 0
+#endif
+#else
+#define LCD_FIXEDPALETTE 0
+#endif
+#endif
+
+#if (LCD_BITSPERPIXEL > 8) && defined(LCD_PHYSCOLORS)
+#error List of physical colors not permitted if more than 8 bpp are used !
+#endif
+
+#if (LCD_FIXEDPALETTE == 0)
+#if !defined(LCD_PHYSCOLORS)
+#error You have to define a fixed palette (LCD_FIXEDPALETTE) or
+#error the list of physical colors (LCD_PHYSCOLORS) in LCDConf.h !
+#endif
+#endif
+
+/* In order to avoid warnings for undefined parameters */
+#ifndef LCD_USE_PARA
+#define LCD_USE_PARA(para) para = para;
+#endif
+
+/*********************************************************************
+ *
+ * Defaults for Display 1 (second display)
+ *
+ **********************************************************************
+ */
+#if GUI_NUM_LAYERS > 1
+
+#ifndef LCD_MIRROR_X_1
+#define LCD_MIRROR_X_1 (0) /* If active: X -> -X */
+#endif
+#ifndef LCD_MIRROR_Y_1
+#define LCD_MIRROR_Y_1 (0) /* If active: Y -> -Y */
+#endif
+#ifndef LCD_SWAP_XY_1
+#define LCD_SWAP_XY_1 (0) /* If active: X <-> Y */
+#endif
+#ifndef LCD_BITSPERPIXEL_L0_1
+#define LCD_BITSPERPIXEL_L0_1 LCD_BITSPERPIXEL_1
+#endif
+#ifndef LCD_DELTA_MODE_1
+#define LCD_DELTA_MODE_1 0 /**/
+#endif
+
+#ifndef LCD_YMAG_1
+#define LCD_YMAG_1 1
+#endif
+
+#ifndef LCD_XMAG_1
+#define LCD_XMAG_1 1
+#endif
+
+#ifndef LCD_VXSIZE_1
+#define LCD_VXSIZE_1 (LCD_XSIZE_1 * LCD_XMAG_1) /* virtual x-size */
+#endif
+
+#ifndef LCD_VYSIZE_1
+#define LCD_VYSIZE_1 (LCD_YSIZE_1 * LCD_YMAG_1) /* virtual y-size */
+#endif
+
+#ifndef LCD_NUM_COLORS_1
+#define LCD_NUM_COLORS_1 (1L << LCD_BITSPERPIXEL_1)
+#endif
+
+/* Optionally swap red and blue components */
+#ifndef LCD_SWAP_RB_1
+#define LCD_SWAP_RB_1 0
+#endif
+
+/**********************************************************
+ *
+ * Color settings
+ */
+#ifndef LCD_REVERSE_1
+#define LCD_REVERSE_1 0
+#endif
+
+#ifndef LCD_REVERSE_LUT_1
+#define LCD_REVERSE_LUT_1 0
+#endif
+
+#if !defined(LCD_PHYSCOLORS_1)
+#if (LCD_BITSPERPIXEL_1 == 1) | (LCD_BITSPERPIXEL_1 == 2) | (LCD_BITSPERPIXEL_1 == 4)
+#ifndef LCD_FIXEDPALETTE_1
+#define LCD_FIXEDPALETTE_1 LCD_BITSPERPIXEL_1
+#endif
+#endif
+#endif /* defined (LCD_PHYSCOLORS) */
+
+#if !defined(LCD_FIXEDPALETTE_1)
+#if !defined(LCD_PHYSCOLORS_1)
+#if LCD_BITSPERPIXEL_1 == 8
+#define LCD_FIXEDPALETTE_1 8666
+#elif LCD_BITSPERPIXEL_1 == 15
+#define LCD_FIXEDPALETTE_1 555
+#elif LCD_BITSPERPIXEL_1 == 16
+#define LCD_FIXEDPALETTE_1 565
+#else
+#define LCD_FIXEDPALETTE_1 0
+#endif
+#else
+#define LCD_FIXEDPALETTE_1 0
+#endif
+#endif
+
+#if (LCD_BITSPERPIXEL_1 > 8) && defined(LCD_PHYSCOLORS_1)
+#error List of physical colors not permitted if more than 8 bpp are used !
+#endif
+
+#if (LCD_FIXEDPALETTE_1 == 0)
+#if !defined(LCD_PHYSCOLORS_1)
+#error You have to define a fixed palette (LCD_FIXEDPALETTE_1) or
+#error the list of physical colors (LCD_PHYSCOLORS_1) in LCDConf.h !
+#endif
+#endif
+#endif /* GUI_NUM_LAYERS > 1 */
+
+/*********************************************************************
+ *
+ * Defaults for Display 2 (third display)
+ *
+ **********************************************************************
+ */
+#if GUI_NUM_LAYERS > 2
+
+#ifndef LCD_MIRROR_X_2
+#define LCD_MIRROR_X_2 (0) /* If active: X -> -X */
+#endif
+#ifndef LCD_MIRROR_Y_2
+#define LCD_MIRROR_Y_2 (0) /* If active: Y -> -Y */
+#endif
+#ifndef LCD_SWAP_XY_2
+#define LCD_SWAP_XY_2 (0) /* If active: X <-> Y */
+#endif
+#ifndef LCD_BITSPERPIXEL_L0_2
+#define LCD_BITSPERPIXEL_L0_2 LCD_BITSPERPIXEL_2
+#endif
+#ifndef LCD_DELTA_MODE_2
+#define LCD_DELTA_MODE_2 0 /**/
+#endif
+
+#ifndef LCD_YMAG_2
+#define LCD_YMAG_2 1
+#endif
+
+#ifndef LCD_XMAG_2
+#define LCD_XMAG_2 1
+#endif
+
+#ifndef LCD_VXSIZE_2
+#define LCD_VXSIZE_2 (LCD_XSIZE_2 * LCD_XMAG_2) /* virtual x-size */
+#endif
+
+#ifndef LCD_VYSIZE_2
+#define LCD_VYSIZE_2 (LCD_YSIZE_2 * LCD_YMAG_2) /* virtual y-size */
+#endif
+
+#ifndef LCD_NUM_COLORS_2
+#define LCD_NUM_COLORS_2 (1L << LCD_BITSPERPIXEL_2)
+#endif
+
+/* Optionally swap red and blue components */
+#ifndef LCD_SWAP_RB_2
+#define LCD_SWAP_RB_2 0
+#endif
+
+/**********************************************************
+ *
+ * Color settings
+ */
+#ifndef LCD_REVERSE_2
+#define LCD_REVERSE_2 0
+#endif
+
+#ifndef LCD_REVERSE_LUT_2
+#define LCD_REVERSE_LUT_2 0
+#endif
+
+#if !defined(LCD_PHYSCOLORS_2)
+#if (LCD_BITSPERPIXEL_2 == 1) | (LCD_BITSPERPIXEL_2 == 2) | (LCD_BITSPERPIXEL_2 == 4)
+#ifndef LCD_FIXEDPALETTE_2
+#define LCD_FIXEDPALETTE_2 LCD_BITSPERPIXEL_2
+#endif
+#endif
+#endif /* defined (LCD_PHYSCOLORS) */
+
+#if !defined(LCD_FIXEDPALETTE_2)
+#if !defined(LCD_PHYSCOLORS_2)
+#if LCD_BITSPERPIXEL_2 == 8
+#define LCD_FIXEDPALETTE_2 8666
+#elif LCD_BITSPERPIXEL_2 == 15
+#define LCD_FIXEDPALETTE_2 555
+#elif LCD_BITSPERPIXEL_2 == 16
+#define LCD_FIXEDPALETTE_2 565
+#else
+#define LCD_FIXEDPALETTE_2 0
+#endif
+#else
+#define LCD_FIXEDPALETTE_2 0
+#endif
+#endif
+
+#if (LCD_BITSPERPIXEL_2 > 8) && defined(LCD_PHYSCOLORS_2)
+#error List of physical colors not permitted if more than 8 bpp are used !
+#endif
+
+#if (LCD_FIXEDPALETTE_2 == 0)
+#if !defined(LCD_PHYSCOLORS_2)
+#error You have to define a fixed palette (LCD_FIXEDPALETTE_2) or
+#error the list of physical colors (LCD_PHYSCOLORS_2) in LCDConf.h !
+#endif
+#endif
+#endif /* GUI_NUM_LAYERS > 2 */
+
+/*********************************************************************
+ *
+ * Defaults for Display 3 (fourth display)
+ *
+ **********************************************************************
+ */
+#if GUI_NUM_LAYERS > 3
+
+#ifndef LCD_MIRROR_X_3
+#define LCD_MIRROR_X_3 (0) /* If active: X -> -X */
+#endif
+#ifndef LCD_MIRROR_Y_3
+#define LCD_MIRROR_Y_3 (0) /* If active: Y -> -Y */
+#endif
+#ifndef LCD_SWAP_XY_3
+#define LCD_SWAP_XY_3 (0) /* If active: X <-> Y */
+#endif
+#ifndef LCD_BITSPERPIXEL_L0_3
+#define LCD_BITSPERPIXEL_L0_3 LCD_BITSPERPIXEL_3
+#endif
+#ifndef LCD_DELTA_MODE_3
+#define LCD_DELTA_MODE_3 0 /**/
+#endif
+
+#ifndef LCD_YMAG_3
+#define LCD_YMAG_3 1
+#endif
+
+#ifndef LCD_XMAG_3
+#define LCD_XMAG_3 1
+#endif
+
+#ifndef LCD_VXSIZE_3
+#define LCD_VXSIZE_3 (LCD_XSIZE_3 * LCD_XMAG_3) /* virtual x-size */
+#endif
+
+#ifndef LCD_VYSIZE_3
+#define LCD_VYSIZE_3 (LCD_YSIZE_3 * LCD_YMAG_3) /* virtual y-size */
+#endif
+
+#ifndef LCD_NUM_COLORS_3
+#define LCD_NUM_COLORS_3 (1L << LCD_BITSPERPIXEL_3)
+#endif
+
+/* Optionally swap red and blue components */
+#ifndef LCD_SWAP_RB_3
+#define LCD_SWAP_RB_3 0
+#endif
+
+/**********************************************************
+ *
+ * Color settings
+ */
+#ifndef LCD_REVERSE_3
+#define LCD_REVERSE_3 0
+#endif
+
+#ifndef LCD_REVERSE_LUT_3
+#define LCD_REVERSE_LUT_3 0
+#endif
+
+#if !defined(LCD_PHYSCOLORS_3)
+#if (LCD_BITSPERPIXEL_3 == 1) | (LCD_BITSPERPIXEL_3 == 2) | (LCD_BITSPERPIXEL_3 == 4)
+#ifndef LCD_FIXEDPALETTE_3
+#define LCD_FIXEDPALETTE_3 LCD_BITSPERPIXEL_3
+#endif
+#endif
+#endif /* defined (LCD_PHYSCOLORS) */
+
+#if !defined(LCD_FIXEDPALETTE_3)
+#if !defined(LCD_PHYSCOLORS_3)
+#if LCD_BITSPERPIXEL_3 == 8
+#define LCD_FIXEDPALETTE_3 8666
+#elif LCD_BITSPERPIXEL_3 == 15
+#define LCD_FIXEDPALETTE_3 555
+#elif LCD_BITSPERPIXEL_3 == 16
+#define LCD_FIXEDPALETTE_3 565
+#else
+#define LCD_FIXEDPALETTE_3 0
+#endif
+#else
+#define LCD_FIXEDPALETTE_3 0
+#endif
+#endif
+
+#if (LCD_BITSPERPIXEL_3 > 8) && defined(LCD_PHYSCOLORS_3)
+#error List of physical colors not permitted if more than 8 bpp are used !
+#endif
+
+#if (LCD_FIXEDPALETTE_3 == 0)
+#if !defined(LCD_PHYSCOLORS_3)
+#error You have to define a fixed palette (LCD_FIXEDPALETTE_3) or
+#error the list of physical colors (LCD_PHYSCOLORS_3) in LCDConf.h !
+#endif
+#endif
+#endif /* GUI_NUM_LAYERS > 3 */
+
+/*********************************************************************
+ *
+ * Defaults for Display 4 (fiveth display)
+ *
+ **********************************************************************
+ */
+#if GUI_NUM_LAYERS > 4
+
+#ifndef LCD_MIRROR_X_4
+#define LCD_MIRROR_X_4 (0) /* If active: X -> -X */
+#endif
+#ifndef LCD_MIRROR_Y_4
+#define LCD_MIRROR_Y_4 (0) /* If active: Y -> -Y */
+#endif
+#ifndef LCD_SWAP_XY_4
+#define LCD_SWAP_XY_4 (0) /* If active: X <-> Y */
+#endif
+#ifndef LCD_BITSPERPIXEL_L0_4
+#define LCD_BITSPERPIXEL_L0_4 LCD_BITSPERPIXEL_4
+#endif
+#ifndef LCD_DELTA_MODE_4
+#define LCD_DELTA_MODE_4 0 /**/
+#endif
+
+#ifndef LCD_YMAG_4
+#define LCD_YMAG_4 1
+#endif
+
+#ifndef LCD_XMAG_4
+#define LCD_XMAG_4 1
+#endif
+
+#ifndef LCD_VXSIZE_4
+#define LCD_VXSIZE_4 (LCD_XSIZE_4 * LCD_XMAG_4) /* virtual x-size */
+#endif
+
+#ifndef LCD_VYSIZE_4
+#define LCD_VYSIZE_4 (LCD_YSIZE_4 * LCD_YMAG_4) /* virtual y-size */
+#endif
+
+#ifndef LCD_NUM_COLORS_4
+#define LCD_NUM_COLORS_4 (1L << LCD_BITSPERPIXEL_4)
+#endif
+
+/* Optionally swap red and blue components */
+#ifndef LCD_SWAP_RB_4
+#define LCD_SWAP_RB_4 0
+#endif
+
+/**********************************************************
+ *
+ * Color settings
+ */
+#ifndef LCD_REVERSE_4
+#define LCD_REVERSE_4 0
+#endif
+
+#ifndef LCD_REVERSE_LUT_4
+#define LCD_REVERSE_LUT_4 0
+#endif
+
+#if !defined(LCD_PHYSCOLORS_4)
+#if (LCD_BITSPERPIXEL_4 == 1) | (LCD_BITSPERPIXEL_4 == 2) | (LCD_BITSPERPIXEL_4 == 4)
+#ifndef LCD_FIXEDPALETTE_4
+#define LCD_FIXEDPALETTE_4 LCD_BITSPERPIXEL_4
+#endif
+#endif
+#endif /* defined (LCD_PHYSCOLORS) */
+
+#if !defined(LCD_FIXEDPALETTE_4)
+#if !defined(LCD_PHYSCOLORS_4)
+#if LCD_BITSPERPIXEL_4 == 8
+#define LCD_FIXEDPALETTE_4 8666
+#elif LCD_BITSPERPIXEL_4 == 15
+#define LCD_FIXEDPALETTE_4 555
+#elif LCD_BITSPERPIXEL_4 == 16
+#define LCD_FIXEDPALETTE_4 565
+#else
+#define LCD_FIXEDPALETTE_4 0
+#endif
+#else
+#define LCD_FIXEDPALETTE_4 0
+#endif
+#endif
+
+#if (LCD_BITSPERPIXEL_4 > 8) && defined(LCD_PHYSCOLORS_4)
+#error List of physical colors not permitted if more than 8 bpp are used !
+#endif
+
+#if (LCD_FIXEDPALETTE_4 == 0)
+#if !defined(LCD_PHYSCOLORS_4)
+#error You have to define a fixed palette (LCD_FIXEDPALETTE_4) or
+#error the list of physical colors (LCD_PHYSCOLORS_4) in LCDConf.h !
+#endif
+#endif
+#endif /* GUI_NUM_LAYERS > 4 */
+
+/*********************************************************************
+ *
+ * Global defaults for all displays
+ *
+ **********************************************************************
+ */
+
+#if (LCD_BITSPERPIXEL <= 8) && (GUI_NUM_LAYERS < 2)
+#define LCD_PIXELINDEX U8
+#else
+#define LCD_PIXELINDEX U16
+#endif
+
+#endif /* LCD_INTERN_H */
diff --git a/User/system/lib/lcd/gui/Core/LCD_DrawBitmap_565.c b/User/system/lib/lcd/gui/Core/LCD_DrawBitmap_565.c
new file mode 100644
index 0000000..aba207e
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/LCD_DrawBitmap_565.c
@@ -0,0 +1,157 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCD_DrawBitmap_565.c
+Purpose : Drawing routine for drawing a 16bpp bitmap
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI_Private.h"
+#include "LCD_Private.h"
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _DrawBitmap_565
+*/
+static void _DrawBitmap_565(int x0,int y0,int xsize, int ysize, const U8 GUI_UNI_PTR * pPixel, const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal, int xMag, int yMag) {
+ const U16 * pData;
+ int y, OldIndex, PrevIndex, Mode, SwapRB, Mag, BytesPerLine, UseDrawBitmap = 0;
+ GUI_USE_PARA(pLogPal);
+ OldIndex = LCD_GetColorIndex();
+ PrevIndex = OldIndex;
+ pData = (const U16 *)pPixel;
+ Mode = LCD_GetFixedPaletteEx(GUI_Context.SelLayer);
+ SwapRB = LCD_GetSwapRBEx(GUI_Context.SelLayer);
+ Mag = (xMag | yMag);
+ BytesPerLine = xsize * 2;
+ #if GUI_SUPPORT_MEMDEV == 0
+ if ((Mode == 565) && (SwapRB == 0) && (Mag == 1)) {
+ UseDrawBitmap = 1;
+ }
+ #else
+ if (GUI_Context.pDeviceAPI->pMemDevAPI) {
+ if (((GUI_Context.hDevData && (GUI_Context.pDeviceAPI->pMemDevAPI->pfIndex2Color == LCD_Index2Color_565)) ||
+ ((GUI_Context.hDevData == 0) && (Mode == 565) && (SwapRB == 0))) && (Mag == 1)) {
+ UseDrawBitmap = 1;
+ }
+ }
+ #endif
+ if (UseDrawBitmap) {
+ LCD_DrawBitmap(x0, y0, xsize, ysize, 1, 1, 16, BytesPerLine, pPixel, 0);
+ } else {
+ if (Mag == 1) {
+ /* Perform clipping */
+ int x1, y1, Diff;
+ y1 = y0 + ysize - 1;
+ x1 = x0 + xsize - 1;
+ /* Clip Y */
+ if (y0 < GUI_Context.ClipRect.y0) {
+ Diff = GUI_Context.ClipRect.y0 -y0;
+ y0 = GUI_Context.ClipRect.y0;
+ #if GUI_SUPPORT_LARGE_BITMAPS /* Required only for 16 bit CPUs if some bitmaps are >64kByte */
+ pData += (U32)Diff * (U32)BytesPerLine / 2;
+ #else
+ pData += (unsigned)Diff * (unsigned)BytesPerLine / 2;
+ #endif
+ ysize -= Diff;
+ }
+ Diff = y1 - GUI_Context.ClipRect.y1;
+ if (Diff > 0) {
+ ysize -= Diff;
+ }
+ if (ysize <=0) {
+ return;
+ }
+ /* Clip right side */
+ Diff = x1 - GUI_Context.ClipRect.x1;
+ if (Diff > 0) {
+ xsize -= Diff;
+ }
+ /* Clip left side */
+ Diff =0;
+ if (x0 < GUI_Context.ClipRect.x0) {
+ Diff = GUI_Context.ClipRect.x0-x0;
+ xsize -= Diff;
+ pData += Diff;
+ x0 += Diff;
+ }
+ if (xsize <=0) {
+ return;
+ }
+ /* Simple, unmagnified output using LCD_L0_SetPixel() */
+ for (y = 0; y < ysize; y++) {
+ int x;
+ const U16 * p = pData;
+ for (x = 0; x < xsize; x++) {
+ U16 Index;
+ Index = *p++;
+ if (Index != PrevIndex) {
+ LCD_SetColor(LCD_Index2Color_565(Index));
+ PrevIndex = Index;
+ }
+ LCDDEV_L0_SetPixelIndex(x + x0, y + y0, LCD_COLORINDEX);
+ }
+ pData += BytesPerLine / 2;
+ }
+ } else {
+ /* Magnified output using LCD_FillRect() */
+ int x,y;
+ int yi;
+ for (y = y0, yi = 0; yi < ysize; yi++, y += yMag, pPixel += BytesPerLine) {
+ int yMax;
+ yMax = y + yMag - 1;
+ /* Draw if within clip area */
+ if ((yMax >= GUI_Context.ClipRect.y0) && (y <= GUI_Context.ClipRect.y1)) {
+ int xi;
+ const U16 GUI_UNI_PTR * p = pData;
+ for (x = x0, xi = 0; xi < xsize; xi++, x += xMag) {
+ U16 Index;
+ Index = *p++;
+ if (Index != PrevIndex) {
+ LCD_SetColor(LCD_Index2Color_565(Index));
+ PrevIndex = Index;
+ }
+ LCD_FillRect(x, y, x + xMag - 1, yMax);
+ }
+ }
+ pData += BytesPerLine / 2;
+ }
+ }
+ GUI_SetColorIndex(OldIndex);
+ }
+}
+
+/*********************************************************************
+*
+* Public data
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_BitmapMethods565
+*/
+const GUI_BITMAP_METHODS GUI_BitmapMethods565 = {
+ _DrawBitmap_565,
+ LCD_Index2Color_565
+};
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/LCD_DrawBitmap_M565.c b/User/system/lib/lcd/gui/Core/LCD_DrawBitmap_M565.c
new file mode 100644
index 0000000..5b9c844
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/LCD_DrawBitmap_M565.c
@@ -0,0 +1,157 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCD_DrawBitmap_M565.c
+Purpose : Drawing routine for drawing a 16bpp bitmap
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "GUI_Private.h"
+#include "LCD_Private.h"
+
+/*********************************************************************
+*
+* Static code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* _DrawBitmap_M565
+*/
+static void _DrawBitmap_M565(int x0,int y0,int xsize, int ysize, const U8 GUI_UNI_PTR * pPixel, const LCD_LOGPALETTE GUI_UNI_PTR * pLogPal, int xMag, int yMag) {
+ const U16 * pData;
+ int y, OldIndex, PrevIndex, Mode, SwapRB, Mag, BytesPerLine, UseDrawBitmap = 0;
+ GUI_USE_PARA(pLogPal);
+ OldIndex = LCD_GetColorIndex();
+ PrevIndex = OldIndex;
+ pData = (const U16 *)pPixel;
+ Mode = LCD_GetFixedPaletteEx(GUI_Context.SelLayer);
+ SwapRB = LCD_GetSwapRBEx(GUI_Context.SelLayer);
+ Mag = (xMag | yMag);
+ BytesPerLine = xsize * 2;
+ #if GUI_SUPPORT_MEMDEV == 0
+ if ((Mode == 565) && (SwapRB == 1) && (Mag == 1)) {
+ UseDrawBitmap = 1;
+ }
+ #else
+ if (GUI_Context.pDeviceAPI->pMemDevAPI) {
+ if (((GUI_Context.hDevData && (GUI_Context.pDeviceAPI->pMemDevAPI->pfIndex2Color == LCD_Index2Color_565)) ||
+ ((GUI_Context.hDevData == 0) && (Mode == 565) && (SwapRB == 1))) && (Mag == 1)) {
+ UseDrawBitmap = 1;
+ }
+ }
+ #endif
+ if (UseDrawBitmap) {
+ LCD_DrawBitmap(x0, y0, xsize, ysize, 1, 1, 16, BytesPerLine, pPixel, 0);
+ } else {
+ if (Mag == 1) {
+ /* Perform clipping */
+ int x1, y1, Diff;
+ y1 = y0 + ysize - 1;
+ x1 = x0 + xsize - 1;
+ /* Clip Y */
+ if (y0 < GUI_Context.ClipRect.y0) {
+ Diff = GUI_Context.ClipRect.y0 -y0;
+ y0 = GUI_Context.ClipRect.y0;
+ #if GUI_SUPPORT_LARGE_BITMAPS /* Required only for 16 bit CPUs if some bitmaps are >64kByte */
+ pData += (U32)Diff * (U32)BytesPerLine / 2;
+ #else
+ pData += (unsigned)Diff * (unsigned)BytesPerLine / 2;
+ #endif
+ ysize -= Diff;
+ }
+ Diff = y1 - GUI_Context.ClipRect.y1;
+ if (Diff > 0) {
+ ysize -= Diff;
+ }
+ if (ysize <=0) {
+ return;
+ }
+ /* Clip right side */
+ Diff = x1 - GUI_Context.ClipRect.x1;
+ if (Diff > 0) {
+ xsize -= Diff;
+ }
+ /* Clip left side */
+ Diff =0;
+ if (x0 < GUI_Context.ClipRect.x0) {
+ Diff = GUI_Context.ClipRect.x0-x0;
+ xsize -= Diff;
+ pData += Diff;
+ x0 += Diff;
+ }
+ if (xsize <=0) {
+ return;
+ }
+ /* Simple, unmagnified output using LCD_L0_SetPixel() */
+ for (y = 0; y < ysize; y++) {
+ int x;
+ const U16 * p = pData;
+ for (x = 0; x < xsize; x++) {
+ U16 Index;
+ Index = *p++;
+ if (Index != PrevIndex) {
+ LCD_SetColor(LCD_Index2Color_M565(Index));
+ PrevIndex = Index;
+ }
+ LCDDEV_L0_SetPixelIndex(x + x0, y + y0, LCD_COLORINDEX);
+ }
+ pData += BytesPerLine / 2;
+ }
+ } else {
+ /* Magnified output using LCD_FillRect() */
+ int x,y;
+ int yi;
+ for (y = y0, yi = 0; yi < ysize; yi++, y += yMag, pPixel += BytesPerLine) {
+ int yMax;
+ yMax = y + yMag - 1;
+ /* Draw if within clip area */
+ if ((yMax >= GUI_Context.ClipRect.y0) && (y <= GUI_Context.ClipRect.y1)) {
+ int xi;
+ const U16 GUI_UNI_PTR * p = pData;
+ for (x = x0, xi = 0; xi < xsize; xi++, x += xMag) {
+ U16 Index;
+ Index = *p++;
+ if (Index != PrevIndex) {
+ LCD_SetColor(LCD_Index2Color_M565(Index));
+ PrevIndex = Index;
+ }
+ LCD_FillRect(x, y, x + xMag - 1, yMax);
+ }
+ }
+ pData += BytesPerLine / 2;
+ }
+ }
+ GUI_SetColorIndex(OldIndex);
+ }
+}
+
+/*********************************************************************
+*
+* Public data
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* GUI_BitmapMethodsM565
+*/
+const GUI_BITMAP_METHODS GUI_BitmapMethodsM565 = {
+ _DrawBitmap_M565,
+ LCD_Index2Color_M565
+};
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/LCD_DrawVLine.c b/User/system/lib/lcd/gui/Core/LCD_DrawVLine.c
new file mode 100644
index 0000000..23d2406
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/LCD_DrawVLine.c
@@ -0,0 +1,67 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCD_DrawVLine.c
+Purpose : Implementation of optional routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD_Private.h"
+#include "GUI_Private.h"
+
+/*********************************************************************
+*
+* Defines
+*
+**********************************************************************
+*/
+
+#define RETURN_IF_Y_OUT() \
+ if (y < GUI_Context.ClipRect.y0) return; \
+ if (y > GUI_Context.ClipRect.y1) return;
+
+#define RETURN_IF_X_OUT() \
+ if (x < GUI_Context.ClipRect.x0) return; \
+ if (x > GUI_Context.ClipRect.x1) return;
+
+#define CLIP_X() \
+ if (x0 < GUI_Context.ClipRect.x0) { x0 = GUI_Context.ClipRect.x0; } \
+ if (x1 > GUI_Context.ClipRect.x1) { x1 = GUI_Context.ClipRect.x1; }
+
+#define CLIP_Y() \
+ if (y0 < GUI_Context.ClipRect.y0) { y0 = GUI_Context.ClipRect.y0; } \
+ if (y1 > GUI_Context.ClipRect.y1) { y1 = GUI_Context.ClipRect.y1; }
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_DrawVLine
+*/
+void LCD_DrawVLine(int x, int y0, int y1) {
+ /* Perform clipping and check if there is something to do */
+ RETURN_IF_X_OUT();
+ CLIP_Y();
+ if (y1 < y0) {
+ return;
+ }
+ /* Call driver to draw */
+ LCDDEV_L0_DrawVLine(x, y0, y1);
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/LCD_GetColorIndex.c b/User/system/lib/lcd/gui/Core/LCD_GetColorIndex.c
new file mode 100644
index 0000000..493b955
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/LCD_GetColorIndex.c
@@ -0,0 +1,45 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCD_GetColorIndex.c
+Purpose : Implementation of different LCD_GetColorIndex routines
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD_Private.h"
+#include "GUI_Protected.h"
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_GetBkColorIndex
+*/
+int LCD_GetBkColorIndex(void) {
+ return LCD_BKCOLORINDEX;
+}
+
+/*********************************************************************
+*
+* LCD_GetColorIndex
+*/
+int LCD_GetColorIndex(void) {
+ return LCD_COLORINDEX;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/LCD_GetEx.c b/User/system/lib/lcd/gui/Core/LCD_GetEx.c
new file mode 100644
index 0000000..f50bd23
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/LCD_GetEx.c
@@ -0,0 +1,585 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCD_GetEx.C
+Purpose : Routines returning info at runtime
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "LCD.h" /* interface definitions */
+#include "LCD_Private.h" /* private modul definitions & config */
+
+/*********************************************************************
+ *
+ * Public code
+ *
+ **********************************************************************
+ */
+/*********************************************************************
+ *
+ * LCD_GetXSizeEx
+ */
+int LCD_GetXSizeEx(int LayerIndex)
+{
+ if (LayerIndex == 0)
+ {
+ return LCD_XSIZE;
+ }
+#if GUI_NUM_LAYERS > 1
+ if (LayerIndex == 1)
+ {
+ return LCD_XSIZE_1;
+ }
+#endif
+#if GUI_NUM_LAYERS > 2
+ if (LayerIndex == 2)
+ {
+ return LCD_XSIZE_2;
+ }
+#endif
+#if GUI_NUM_LAYERS > 3
+ if (LayerIndex == 3)
+ {
+ return LCD_XSIZE_3;
+ }
+#endif
+#if GUI_NUM_LAYERS > 4
+ if (LayerIndex == 4)
+ {
+ return LCD_XSIZE_4;
+ }
+#endif
+ return 0;
+}
+
+/*********************************************************************
+ *
+ * LCD_GetYSizeEx
+ */
+int LCD_GetYSizeEx(int LayerIndex)
+{
+ if (LayerIndex == 0)
+ {
+ return LCD_YSIZE;
+ }
+#if GUI_NUM_LAYERS > 1
+ if (LayerIndex == 1)
+ {
+ return LCD_YSIZE_1;
+ }
+#endif
+#if GUI_NUM_LAYERS > 2
+ if (LayerIndex == 2)
+ {
+ return LCD_YSIZE_2;
+ }
+#endif
+#if GUI_NUM_LAYERS > 3
+ if (LayerIndex == 3)
+ {
+ return LCD_YSIZE_3;
+ }
+#endif
+#if GUI_NUM_LAYERS > 4
+ if (LayerIndex == 4)
+ {
+ return LCD_YSIZE_4;
+ }
+#endif
+ return 0;
+}
+
+/*********************************************************************
+ *
+ * LCD_GetVXSizeEx
+ */
+int LCD_GetVXSizeEx(int LayerIndex)
+{
+ if (LayerIndex == 0)
+ {
+ return LCD_VXSIZE;
+ }
+#if GUI_NUM_LAYERS > 1
+ if (LayerIndex == 1)
+ {
+ return LCD_VXSIZE_1;
+ }
+#endif
+#if GUI_NUM_LAYERS > 2
+ if (LayerIndex == 2)
+ {
+ return LCD_VXSIZE_2;
+ }
+#endif
+#if GUI_NUM_LAYERS > 3
+ if (LayerIndex == 3)
+ {
+ return LCD_VXSIZE_3;
+ }
+#endif
+#if GUI_NUM_LAYERS > 4
+ if (LayerIndex == 4)
+ {
+ return LCD_VXSIZE_4;
+ }
+#endif
+ return 0;
+}
+
+/*********************************************************************
+ *
+ * LCD_GetVYSizeEx
+ */
+int LCD_GetVYSizeEx(int LayerIndex)
+{
+ if (LayerIndex == 0)
+ {
+ return LCD_VYSIZE;
+ }
+#if GUI_NUM_LAYERS > 1
+ if (LayerIndex == 1)
+ {
+ return LCD_VYSIZE_1;
+ }
+#endif
+#if GUI_NUM_LAYERS > 2
+ if (LayerIndex == 2)
+ {
+ return LCD_VYSIZE_2;
+ }
+#endif
+#if GUI_NUM_LAYERS > 3
+ if (LayerIndex == 3)
+ {
+ return LCD_VYSIZE_3;
+ }
+#endif
+#if GUI_NUM_LAYERS > 4
+ if (LayerIndex == 4)
+ {
+ return LCD_VYSIZE_4;
+ }
+#endif
+ return 0;
+}
+
+/*********************************************************************
+ *
+ * LCD_GetBitsPerPixelEx
+ */
+int LCD_GetBitsPerPixelEx(int LayerIndex)
+{
+ if (LayerIndex == 0)
+ {
+ return LCD_BITSPERPIXEL;
+ }
+#if GUI_NUM_LAYERS > 1
+ if (LayerIndex == 1)
+ {
+ return LCD_BITSPERPIXEL_1;
+ }
+#endif
+#if GUI_NUM_LAYERS > 2
+ if (LayerIndex == 2)
+ {
+ return LCD_BITSPERPIXEL_2;
+ }
+#endif
+#if GUI_NUM_LAYERS > 3
+ if (LayerIndex == 3)
+ {
+ return LCD_BITSPERPIXEL_3;
+ }
+#endif
+#if GUI_NUM_LAYERS > 4
+ if (LayerIndex == 4)
+ {
+ return LCD_BITSPERPIXEL_4;
+ }
+#endif
+ return 0;
+}
+
+/*********************************************************************
+ *
+ * LCD_GetBitsPerPixel_L0Ex
+ */
+int LCD_GetBitsPerPixel_L0Ex(int LayerIndex)
+{
+ if (LayerIndex == 0)
+ {
+ return LCD_BITSPERPIXEL_L0;
+ }
+#if GUI_NUM_LAYERS > 1
+ if (LayerIndex == 1)
+ {
+ return LCD_BITSPERPIXEL_L0_1;
+ }
+#endif
+#if GUI_NUM_LAYERS > 2
+ if (LayerIndex == 2)
+ {
+ return LCD_BITSPERPIXEL_L0_2;
+ }
+#endif
+#if GUI_NUM_LAYERS > 3
+ if (LayerIndex == 3)
+ {
+ return LCD_BITSPERPIXEL_L0_3;
+ }
+#endif
+#if GUI_NUM_LAYERS > 4
+ if (LayerIndex == 4)
+ {
+ return LCD_BITSPERPIXEL_L0_4;
+ }
+#endif
+ return 0;
+}
+
+/*********************************************************************
+ *
+ * LCD_GetNumColorsEx
+ */
+U32 LCD_GetNumColorsEx(int LayerIndex)
+{
+ if (LayerIndex == 0)
+ {
+ return LCD_NUM_COLORS;
+ }
+#if GUI_NUM_LAYERS > 1
+ if (LayerIndex == 1)
+ {
+ return LCD_NUM_COLORS_1;
+ }
+#endif
+#if GUI_NUM_LAYERS > 2
+ if (LayerIndex == 2)
+ {
+ return LCD_NUM_COLORS_2;
+ }
+#endif
+#if GUI_NUM_LAYERS > 3
+ if (LayerIndex == 3)
+ {
+ return LCD_NUM_COLORS_3;
+ }
+#endif
+#if GUI_NUM_LAYERS > 4
+ if (LayerIndex == 4)
+ {
+ return LCD_NUM_COLORS_4;
+ }
+#endif
+ return 0;
+}
+
+/*********************************************************************
+ *
+ * LCD_GetYMagEx
+ */
+int LCD_GetYMagEx(int LayerIndex)
+{
+ if (LayerIndex == 0)
+ {
+ return LCD_YMAG;
+ }
+#if GUI_NUM_LAYERS > 1
+ if (LayerIndex == 1)
+ {
+ return LCD_YMAG_1;
+ }
+#endif
+#if GUI_NUM_LAYERS > 2
+ if (LayerIndex == 2)
+ {
+ return LCD_YMAG_2;
+ }
+#endif
+#if GUI_NUM_LAYERS > 3
+ if (LayerIndex == 3)
+ {
+ return LCD_YMAG_3;
+ }
+#endif
+#if GUI_NUM_LAYERS > 4
+ if (LayerIndex == 4)
+ {
+ return LCD_YMAG_4;
+ }
+#endif
+ return 0;
+}
+
+/*********************************************************************
+ *
+ * LCD_GetXMagEx
+ */
+int LCD_GetXMagEx(int LayerIndex)
+{
+ if (LayerIndex == 0)
+ {
+ return LCD_XMAG;
+ }
+#if GUI_NUM_LAYERS > 1
+ if (LayerIndex == 1)
+ {
+ return LCD_XMAG_1;
+ }
+#endif
+#if GUI_NUM_LAYERS > 2
+ if (LayerIndex == 2)
+ {
+ return LCD_XMAG_2;
+ }
+#endif
+#if GUI_NUM_LAYERS > 3
+ if (LayerIndex == 3)
+ {
+ return LCD_XMAG_3;
+ }
+#endif
+#if GUI_NUM_LAYERS > 4
+ if (LayerIndex == 4)
+ {
+ return LCD_XMAG_4;
+ }
+#endif
+ return 0;
+}
+
+/*********************************************************************
+ *
+ * LCD_GetFixedPaletteEx
+ */
+I32 LCD_GetFixedPaletteEx(int LayerIndex)
+{
+ if (LayerIndex == 0)
+ {
+ return LCD_FIXEDPALETTE;
+ }
+#if GUI_NUM_LAYERS > 1
+ if (LayerIndex == 1)
+ {
+ return LCD_FIXEDPALETTE_1;
+ }
+#endif
+#if GUI_NUM_LAYERS > 2
+ if (LayerIndex == 2)
+ {
+ return LCD_FIXEDPALETTE_2;
+ }
+#endif
+#if GUI_NUM_LAYERS > 3
+ if (LayerIndex == 3)
+ {
+ return LCD_FIXEDPALETTE_3;
+ }
+#endif
+#if GUI_NUM_LAYERS > 4
+ if (LayerIndex == 4)
+ {
+ return LCD_FIXEDPALETTE_4;
+ }
+#endif
+ return 0;
+}
+
+/*********************************************************************
+ *
+ * LCD_GetMirrorXEx
+ */
+int LCD_GetMirrorXEx(int LayerIndex)
+{
+ if (LayerIndex == 0)
+ {
+ return LCD_MIRROR_X;
+ }
+#if GUI_NUM_LAYERS > 1
+ if (LayerIndex == 1)
+ {
+ return LCD_MIRROR_X_1;
+ }
+#endif
+#if GUI_NUM_LAYERS > 2
+ if (LayerIndex == 2)
+ {
+ return LCD_MIRROR_X_2;
+ }
+#endif
+#if GUI_NUM_LAYERS > 3
+ if (LayerIndex == 3)
+ {
+ return LCD_MIRROR_X_3;
+ }
+#endif
+#if GUI_NUM_LAYERS > 4
+ if (LayerIndex == 4)
+ {
+ return LCD_MIRROR_X_4;
+ }
+#endif
+ return 0;
+}
+
+/*********************************************************************
+ *
+ * LCD_GetMirrorYEx
+ */
+int LCD_GetMirrorYEx(int LayerIndex)
+{
+ if (LayerIndex == 0)
+ {
+ return LCD_MIRROR_Y;
+ }
+#if GUI_NUM_LAYERS > 1
+ if (LayerIndex == 1)
+ {
+ return LCD_MIRROR_Y_1;
+ }
+#endif
+#if GUI_NUM_LAYERS > 2
+ if (LayerIndex == 2)
+ {
+ return LCD_MIRROR_Y_2;
+ }
+#endif
+#if GUI_NUM_LAYERS > 3
+ if (LayerIndex == 3)
+ {
+ return LCD_MIRROR_Y_3;
+ }
+#endif
+#if GUI_NUM_LAYERS > 4
+ if (LayerIndex == 4)
+ {
+ return LCD_MIRROR_Y_4;
+ }
+#endif
+ return 0;
+}
+
+/*********************************************************************
+ *
+ * LCD_GetSwapXYEx
+ */
+int LCD_GetSwapXYEx(int LayerIndex)
+{
+ if (LayerIndex == 0)
+ {
+ return LCD_SWAP_XY;
+ }
+#if GUI_NUM_LAYERS > 1
+ if (LayerIndex == 1)
+ {
+ return LCD_SWAP_XY_1;
+ }
+#endif
+#if GUI_NUM_LAYERS > 2
+ if (LayerIndex == 2)
+ {
+ return LCD_SWAP_XY_2;
+ }
+#endif
+#if GUI_NUM_LAYERS > 3
+ if (LayerIndex == 3)
+ {
+ return LCD_SWAP_XY_3;
+ }
+#endif
+#if GUI_NUM_LAYERS > 4
+ if (LayerIndex == 4)
+ {
+ return LCD_SWAP_XY_4;
+ }
+#endif
+ return 0;
+}
+
+/*********************************************************************
+ *
+ * LCD_GetSwapRBEx
+ */
+int LCD_GetSwapRBEx(int LayerIndex)
+{
+ if (LayerIndex == 0)
+ {
+ return LCD_SWAP_RB;
+ }
+#if GUI_NUM_LAYERS > 1
+ if (LayerIndex == 1)
+ {
+ return LCD_SWAP_RB_1;
+ }
+#endif
+#if GUI_NUM_LAYERS > 2
+ if (LayerIndex == 2)
+ {
+ return LCD_SWAP_RB_2;
+ }
+#endif
+#if GUI_NUM_LAYERS > 3
+ if (LayerIndex == 3)
+ {
+ return LCD_SWAP_RB_3;
+ }
+#endif
+#if GUI_NUM_LAYERS > 4
+ if (LayerIndex == 4)
+ {
+ return LCD_SWAP_RB_4;
+ }
+#endif
+ return 0;
+}
+
+/*********************************************************************
+ *
+ * LCD_GetDeltaModeEx
+ */
+int LCD_GetDeltaModeEx(int LayerIndex)
+{
+ if (LayerIndex == 0)
+ {
+ return LCD_DELTA_MODE;
+ }
+#if GUI_NUM_LAYERS > 1
+ if (LayerIndex == 1)
+ {
+ return LCD_DELTA_MODE_1;
+ }
+#endif
+#if GUI_NUM_LAYERS > 2
+ if (LayerIndex == 2)
+ {
+ return LCD_DELTA_MODE_2;
+ }
+#endif
+#if GUI_NUM_LAYERS > 3
+ if (LayerIndex == 3)
+ {
+ return LCD_DELTA_MODE_3;
+ }
+#endif
+#if GUI_NUM_LAYERS > 4
+ if (LayerIndex == 4)
+ {
+ return LCD_DELTA_MODE_4;
+ }
+#endif
+ return 0;
+}
+
+/************************* End of file ******************************/
diff --git a/User/system/lib/lcd/gui/Core/LCD_GetNumDisplays.c b/User/system/lib/lcd/gui/Core/LCD_GetNumDisplays.c
new file mode 100644
index 0000000..816c75b
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/LCD_GetNumDisplays.c
@@ -0,0 +1,38 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCDInfo1.C
+Purpose : Routines returning info at runtime
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include /* needed for definition of NULL */
+#include "LCD.h" /* interface definitions */
+#include "LCD_Private.h" /* private modul definitions & config */
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_GetNumLayers
+*/
+int LCD_GetNumLayers(void) {
+ return GUI_NUM_LAYERS;
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/LCD_GetPixelColor.c b/User/system/lib/lcd/gui/Core/LCD_GetPixelColor.c
new file mode 100644
index 0000000..75a1478
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/LCD_GetPixelColor.c
@@ -0,0 +1,39 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCD_GetPixelColor.c
+Purpose : Get Pixel routines
+ Note: These routines are in a module of their own
+ because they are mostly not required to link
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "LCD.h" /* interface definitions */
+#include "LCD_Protected.h" /* inter modul definitions */
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_GetPixelColor
+*/
+LCD_COLOR LCD_GetPixelColor(int x, int y) {
+ return LCD_Index2Color(LCD_GetPixelIndex(x,y));
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/LCD_Index2ColorEx.c b/User/system/lib/lcd/gui/Core/LCD_Index2ColorEx.c
new file mode 100644
index 0000000..03452af
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/LCD_Index2ColorEx.c
@@ -0,0 +1,49 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCD_Index2ColorEx.c
+Purpose : Implementation of LCD_Index2ColorEx
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#include "GUI_Private.h"
+#include "LCD_Private.h" /* Required for configuration, APIList */
+
+/*********************************************************************
+*
+* Public code
+*
+**********************************************************************
+*/
+/*********************************************************************
+*
+* LCD_Index2ColorEx
+*
+* Purpose:
+* Convert Index to color for the given display
+*/
+LCD_COLOR LCD_Index2ColorEx(int i, unsigned int LayerIndex) {
+ #if GUI_SUPPORT_DEVICES
+ LCD_COLOR r = 0;
+ if (LayerIndex < GUI_NUM_LAYERS) {
+ r = LCD_aAPI[LayerIndex]->pfIndex2Color(i);
+ }
+ return r;
+ #else
+ GUI_USE_PARA(LayerIndex);
+ return LCD_Index2Color(i);
+ #endif
+}
+
+/*************************** End of file ****************************/
diff --git a/User/system/lib/lcd/gui/Core/LCD_L0_Generic.c b/User/system/lib/lcd/gui/Core/LCD_L0_Generic.c
new file mode 100644
index 0000000..1a6cb05
--- /dev/null
+++ b/User/system/lib/lcd/gui/Core/LCD_L0_Generic.c
@@ -0,0 +1,226 @@
+/*
+*********************************************************************************************************
+* uC/GUI
+* Universal graphic software for embedded applications
+*
+* (c) Copyright 2002, Micrium Inc., Weston, FL
+* (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
+*
+* C/GUI is protected by international copyright laws. Knowledge of the
+* source code may not be used to write a similar product. This file may
+* only be used in accordance with a license and should not be redistributed
+* in any way. We appreciate your understanding and fairness.
+*
+----------------------------------------------------------------------
+File : LCD_L0_Generic.c
+Purpose : Color conversion routines for LCD-drivers
+ This file may not be compiled by itself, but needs
+ to be included in every LCD driver
+---------------------------END-OF-HEADER------------------------------
+*/
+
+#ifndef LCD_INCLUDEDRIVER_H /* includes only for stand-alone compilation, not as included file */
+ #include