From 81ac365308a65077f6f922bb99a3aa2822d7ea4e Mon Sep 17 00:00:00 2001 From: morixinguan Date: Sat, 30 Jan 2021 21:40:08 +0800 Subject: [PATCH] add GuiLite demo --- .../tencent_os_guilite_demo/BSP/.mxproject | 14 + .../BSP/BearPi_STM32L31RC.ioc | 277 + .../BSP/Hardware/BH1750/BH1750.c | 53 + .../BSP/Hardware/BH1750/bh1750.h | 39 + .../BSP/Hardware/E53_IA1/E53_IA1.c | 292 + .../BSP/Hardware/E53_IA1/E53_IA1.h | 46 + .../BSP/Hardware/E53_SF1/E53_SF1.c | 302 ++ .../BSP/Hardware/E53_SF1/E53_SF1.h | 49 + .../BSP/Hardware/E53_ST1/E53_ST1.c | 377 ++ .../BSP/Hardware/E53_ST1/E53_ST1.h | 70 + .../BSP/Hardware/LCD_ST7789/font.h | 406 ++ .../BSP/Hardware/LCD_ST7789/lcd_spi2_drv.c | 730 +++ .../BSP/Hardware/LCD_ST7789/lcd_spi2_drv.h | 73 + .../BSP/Hardware/LCD_ST7789/logo.h | 1652 ++++++ .../tencent_os_guilite_demo/BSP/Inc/adc.h | 58 + .../tencent_os_guilite_demo/BSP/Inc/gpio.h | 57 + .../tencent_os_guilite_demo/BSP/Inc/i2c.h | 58 + .../tencent_os_guilite_demo/BSP/Inc/main.h | 86 + .../BSP/Inc/mcu_init.h | 24 + .../tencent_os_guilite_demo/BSP/Inc/spi.h | 62 + .../BSP/Inc/stm32l4xx_hal_conf.h | 440 ++ .../BSP/Inc/stm32l4xx_it.h | 73 + .../BSP/Inc/tickless/bsp_pm_device.h | 11 + .../BSP/Inc/tickless/bsp_tickless_alarm.h | 17 + .../tencent_os_guilite_demo/BSP/Inc/usart.h | 64 + .../tencent_os_guilite_demo/BSP/Src/adc.c | 123 + .../tencent_os_guilite_demo/BSP/Src/gpio.c | 87 + .../tencent_os_guilite_demo/BSP/Src/i2c.c | 118 + .../tencent_os_guilite_demo/BSP/Src/main.c | 26 + .../BSP/Src/mcu_init.c | 165 + .../tencent_os_guilite_demo/BSP/Src/spi.c | 271 + .../BSP/Src/stm32l4xx_hal_msp.c | 84 + .../BSP/Src/stm32l4xx_it.c | 297 + .../BSP/Src/stm32l4xx_it_module.c | 307 ++ .../BSP/Src/system_stm32l4xx.c | 337 ++ .../BSP/Src/tickless/bsp_pm_device.c | 31 + .../BSP/Src/tickless/bsp_pwr_mgr.c | 26 + .../BSP/Src/tickless/bsp_tickless_alarm.c | 440 ++ .../tencent_os_guilite_demo/BSP/Src/usart.c | 313 ++ .../BearPi_STM32L31RC.uvguix.Administrator | 1896 +++++++ .../BearPi_STM32L31RC.uvoptx | 1204 +++++ .../BearPi_STM32L31RC.uvprojx | 797 +++ .../RTE/_TencentOS_tiny/RTE_Components.h | 21 + .../startup_stm32l431xx.s | 404 ++ .../BearPi_STM32L31RC.uvoptx | 4 +- .../BearPi_STM32L31RC.uvprojx | 2 +- .../RTE/_TencentOS_tiny/RTE_Components.h | 3 +- components/gui/GuiLite/UIcode/CMakeLists.txt | 15 + components/gui/GuiLite/UIcode/GuiLite.h | 4798 +++++++++++++++++ components/gui/GuiLite/UIcode/UIcode.cpp | 97 + components/gui/GuiLite/UIcode/UIcode.sln | 22 + components/gui/GuiLite/UIcode/UIcode.vcxproj | 158 + .../gui/GuiLite/UIcode/UIcode.vcxproj.filters | 6 + components/gui/GuiLite/UIcode/curl.exe | Bin 0 -> 424448 bytes components/gui/GuiLite/UIcode/sync_build.bat | 28 + examples/guilite_demo/guilite_demo.c | 38 + 56 files changed, 17444 insertions(+), 4 deletions(-) create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/.mxproject create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/BearPi_STM32L31RC.ioc create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/BH1750/BH1750.c create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/BH1750/bh1750.h create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/E53_IA1/E53_IA1.c create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/E53_IA1/E53_IA1.h create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/E53_SF1/E53_SF1.c create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/E53_SF1/E53_SF1.h create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/E53_ST1/E53_ST1.c create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/E53_ST1/E53_ST1.h create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/LCD_ST7789/font.h create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/LCD_ST7789/lcd_spi2_drv.c create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/LCD_ST7789/lcd_spi2_drv.h create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/LCD_ST7789/logo.h create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/adc.h create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/gpio.h create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/i2c.h create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/main.h create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/mcu_init.h create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/spi.h create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/stm32l4xx_hal_conf.h create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/stm32l4xx_it.h create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/tickless/bsp_pm_device.h create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/tickless/bsp_tickless_alarm.h create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/usart.h create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/adc.c create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/gpio.c create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/i2c.c create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/main.c create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/mcu_init.c create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/spi.c create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/stm32l4xx_hal_msp.c create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/stm32l4xx_it.c create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/stm32l4xx_it_module.c create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/system_stm32l4xx.c create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/tickless/bsp_pm_device.c create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/tickless/bsp_pwr_mgr.c create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/tickless/bsp_tickless_alarm.c create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/usart.c create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BearPi_STM32L31RC.uvguix.Administrator create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BearPi_STM32L31RC.uvoptx create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BearPi_STM32L31RC.uvprojx create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/RTE/_TencentOS_tiny/RTE_Components.h create mode 100644 board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/startup_stm32l431xx.s create mode 100644 components/gui/GuiLite/UIcode/CMakeLists.txt create mode 100644 components/gui/GuiLite/UIcode/GuiLite.h create mode 100644 components/gui/GuiLite/UIcode/UIcode.cpp create mode 100644 components/gui/GuiLite/UIcode/UIcode.sln create mode 100644 components/gui/GuiLite/UIcode/UIcode.vcxproj create mode 100644 components/gui/GuiLite/UIcode/UIcode.vcxproj.filters create mode 100644 components/gui/GuiLite/UIcode/curl.exe create mode 100644 components/gui/GuiLite/UIcode/sync_build.bat create mode 100644 examples/guilite_demo/guilite_demo.c diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/.mxproject b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/.mxproject new file mode 100644 index 00000000..b297bdd2 --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/.mxproject @@ -0,0 +1,14 @@ +[PreviousGenFiles] +HeaderPath=F:/RTOS/TencentOS/TencentOS-tiny/board/BearPi_STM32L31RC/BSP/Inc +HeaderFiles=gpio.h;adc.h;dac.h;i2c.h;usart.h;spi.h;stm32l4xx_it.h;stm32l4xx_hal_conf.h;main.h; +SourcePath=F:/RTOS/TencentOS/TencentOS-tiny/board/BearPi_STM32L31RC/BSP/Src +SourceFiles=gpio.c;adc.c;dac.c;i2c.c;usart.c;spi.c;stm32l4xx_it.c;stm32l4xx_hal_msp.c;main.c; + +[PreviousLibFiles] +LibFiles=Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_adc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_adc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_adc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_def.h;Drivers/STM32L4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ramfunc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_cortex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_exti.h;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c;Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_adc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_ll_adc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_adc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_i2c_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_uart_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_spi_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_tim_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_def.h;Drivers/STM32L4xx_HAL_Driver/Inc/Legacy/stm32_hal_legacy.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_rcc_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_flash_ramfunc.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_gpio_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_dma_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_pwr_ex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_cortex.h;Drivers/STM32L4xx_HAL_Driver/Inc/stm32l4xx_hal_exti.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l431xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/stm32l4xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Include/system_stm32l4xx.h;Drivers/CMSIS/Device/ST/STM32L4xx/Source/Templates/system_stm32l4xx.c;Drivers/CMSIS/Include/cmsis_armcc.h;Drivers/CMSIS/Include/cmsis_armclang.h;Drivers/CMSIS/Include/cmsis_compiler.h;Drivers/CMSIS/Include/cmsis_gcc.h;Drivers/CMSIS/Include/cmsis_iccarm.h;Drivers/CMSIS/Include/cmsis_version.h;Drivers/CMSIS/Include/core_armv8mbl.h;Drivers/CMSIS/Include/core_armv8mml.h;Drivers/CMSIS/Include/core_cm0.h;Drivers/CMSIS/Include/core_cm0plus.h;Drivers/CMSIS/Include/core_cm1.h;Drivers/CMSIS/Include/core_cm23.h;Drivers/CMSIS/Include/core_cm3.h;Drivers/CMSIS/Include/core_cm33.h;Drivers/CMSIS/Include/core_cm4.h;Drivers/CMSIS/Include/core_cm7.h;Drivers/CMSIS/Include/core_sc000.h;Drivers/CMSIS/Include/core_sc300.h;Drivers/CMSIS/Include/mpu_armv7.h;Drivers/CMSIS/Include/mpu_armv8.h;Drivers/CMSIS/Include/tz_context.h; + +[PreviousUsedKeilFiles] +SourceFiles=..\Src\main.c;..\Src\gpio.c;..\Src\adc.c;..\Src\i2c.c;..\Src\usart.c;..\Src\spi.c;..\Src\stm32l4xx_it.c;..\Src\stm32l4xx_hal_msp.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c;../\Src/system_stm32l4xx.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_adc_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_i2c_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_uart_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_spi_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_tim_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_rcc_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_flash_ramfunc.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_gpio.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_dma_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_pwr_ex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_cortex.c;../Drivers/STM32L4xx_HAL_Driver/Src/stm32l4xx_hal_exti.c;../\Src/system_stm32l4xx.c;../Drivers/CMSIS/Device/ST/STM32L4xx/Source/Templates/system_stm32l4xx.c;null; +HeaderPath=..\Drivers\STM32L4xx_HAL_Driver\Inc;..\Drivers\STM32L4xx_HAL_Driver\Inc\Legacy;..\Drivers\CMSIS\Device\ST\STM32L4xx\Include;..\Drivers\CMSIS\Include;..\Inc; +CDefines=USE_HAL_DRIVER;STM32L431xx;USE_HAL_DRIVER;STM32L431xx; + diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/BearPi_STM32L31RC.ioc b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/BearPi_STM32L31RC.ioc new file mode 100644 index 00000000..77281737 --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/BearPi_STM32L31RC.ioc @@ -0,0 +1,277 @@ +#MicroXplorer Configuration settings - do not modify +ADC1.Channel-0\#ChannelRegularConversion=ADC_CHANNEL_3 +ADC1.IPParameters=Rank-0\#ChannelRegularConversion,master,Channel-0\#ChannelRegularConversion,SamplingTime-0\#ChannelRegularConversion,OffsetNumber-0\#ChannelRegularConversion,NbrOfConversionFlag +ADC1.NbrOfConversionFlag=1 +ADC1.OffsetNumber-0\#ChannelRegularConversion=ADC_OFFSET_NONE +ADC1.Rank-0\#ChannelRegularConversion=1 +ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_2CYCLES_5 +ADC1.master=1 +File.Version=6 +KeepUserPlacement=false +LPUART1.BaudRate=115200 +LPUART1.IPParameters=BaudRate,WordLength +LPUART1.WordLength=UART_WORDLENGTH_8B +Mcu.Family=STM32L4 +Mcu.IP0=ADC1 +Mcu.IP1=I2C1 +Mcu.IP10=USART2 +Mcu.IP11=USART3 +Mcu.IP2=LPUART1 +Mcu.IP3=NVIC +Mcu.IP4=RCC +Mcu.IP5=SPI1 +Mcu.IP6=SPI2 +Mcu.IP7=SPI3 +Mcu.IP8=SYS +Mcu.IP9=USART1 +Mcu.IPNb=12 +Mcu.Name=STM32L431R(B-C)Tx +Mcu.Package=LQFP64 +Mcu.Pin0=PC13 +Mcu.Pin1=PC14-OSC32_IN (PC14) +Mcu.Pin10=PA2 +Mcu.Pin11=PA3 +Mcu.Pin12=PA4 +Mcu.Pin13=PA6 +Mcu.Pin14=PC4 +Mcu.Pin15=PC5 +Mcu.Pin16=PB2 +Mcu.Pin17=PB13 +Mcu.Pin18=PB15 +Mcu.Pin19=PC6 +Mcu.Pin2=PC15-OSC32_OUT (PC15) +Mcu.Pin20=PC7 +Mcu.Pin21=PA9 +Mcu.Pin22=PA10 +Mcu.Pin23=PA12 +Mcu.Pin24=PA15 (JTDI) +Mcu.Pin25=PC10 +Mcu.Pin26=PC11 +Mcu.Pin27=PB3 (JTDO-TRACESWO) +Mcu.Pin28=PB5 +Mcu.Pin29=PB6 +Mcu.Pin3=PH0-OSC_IN (PH0) +Mcu.Pin30=PB7 +Mcu.Pin31=VP_SYS_VS_Systick +Mcu.Pin4=PH1-OSC_OUT (PH1) +Mcu.Pin5=PC0 +Mcu.Pin6=PC1 +Mcu.Pin7=PC2 +Mcu.Pin8=PC3 +Mcu.Pin9=PA1 +Mcu.PinsNb=32 +Mcu.ThirdPartyNb=0 +Mcu.UserConstants= +Mcu.UserName=STM32L431RCTx +MxCube.Version=5.3.0 +MxDb.Version=DB.5.0.30 +NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.EXTI2_IRQn=true\:0\:0\:false\:false\:true\:true\:true +NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.LPUART1_IRQn=true\:0\:0\:false\:false\:true\:true\:true +NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false +NVIC.SysTick_IRQn=true\:0\:0\:false\:false\:true\:false\:true +NVIC.USART2_IRQn=true\:0\:0\:false\:false\:true\:true\:true +NVIC.USART3_IRQn=true\:0\:0\:false\:false\:true\:true\:true +NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false +PA1.Mode=Full_Duplex_Master +PA1.Signal=SPI1_SCK +PA10.Mode=Asynchronous +PA10.Signal=USART1_RX +PA12.Locked=true +PA12.Mode=Full_Duplex_Master +PA12.Signal=SPI1_MOSI +PA15\ (JTDI).GPIOParameters=GPIO_Label +PA15\ (JTDI).GPIO_Label=M26_PWR +PA15\ (JTDI).Locked=true +PA15\ (JTDI).Signal=GPIO_Output +PA2.Mode=Asynchronous +PA2.Signal=USART2_TX +PA3.Mode=Asynchronous +PA3.Signal=USART2_RX +PA4.Locked=true +PA4.Mode=NSS_Signal_Hard_Output +PA4.Signal=SPI1_NSS +PA6.Mode=Full_Duplex_Master +PA6.Signal=SPI1_MISO +PA9.Mode=Asynchronous +PA9.Signal=USART1_TX +PB13.Locked=true +PB13.Mode=TX_Only_Simplex_Unidirect_Master +PB13.Signal=SPI2_SCK +PB15.GPIOParameters=GPIO_Label +PB15.GPIO_Label=LCD_PWR +PB15.Locked=true +PB15.Signal=GPIO_Output +PB2.GPIOParameters=GPIO_Label +PB2.GPIO_Label=KEY1 +PB2.Locked=true +PB2.Signal=GPXTI2 +PB3\ (JTDO-TRACESWO).GPIOParameters=GPIO_Label +PB3\ (JTDO-TRACESWO).GPIO_Label=KEY2 +PB3\ (JTDO-TRACESWO).Locked=true +PB3\ (JTDO-TRACESWO).Signal=GPIO_Output +PB5.Locked=true +PB5.Mode=Full_Duplex_Master +PB5.Signal=SPI3_MOSI +PB6.Locked=true +PB6.Mode=I2C +PB6.Signal=I2C1_SCL +PB7.Locked=true +PB7.Mode=I2C +PB7.Signal=I2C1_SDA +PC0.Mode=Asynchronous +PC0.Signal=LPUART1_RX +PC1.Mode=Asynchronous +PC1.Signal=LPUART1_TX +PC10.Mode=Full_Duplex_Master +PC10.Signal=SPI3_SCK +PC11.Mode=Full_Duplex_Master +PC11.Signal=SPI3_MISO +PC13.GPIOParameters=GPIO_Label +PC13.GPIO_Label=LED +PC13.Locked=true +PC13.Signal=GPIO_Output +PC14-OSC32_IN\ (PC14).Mode=LSE-External-Oscillator +PC14-OSC32_IN\ (PC14).Signal=RCC_OSC32_IN +PC15-OSC32_OUT\ (PC15).Mode=LSE-External-Oscillator +PC15-OSC32_OUT\ (PC15).Signal=RCC_OSC32_OUT +PC2.Locked=true +PC2.Signal=ADCx_IN3 +PC3.Locked=true +PC3.Mode=TX_Only_Simplex_Unidirect_Master +PC3.Signal=SPI2_MOSI +PC4.Mode=Asynchronous +PC4.Signal=USART3_TX +PC5.Mode=Asynchronous +PC5.Signal=USART3_RX +PC6.GPIOParameters=GPIO_Label +PC6.GPIO_Label=LCD_WR_RS +PC6.Locked=true +PC6.Signal=GPIO_Output +PC7.GPIOParameters=GPIO_Label +PC7.GPIO_Label=LCD_RST +PC7.Locked=true +PC7.Signal=GPIO_Output +PCC.Checker=true +PCC.Line=STM32L4x1 +PCC.MCU=STM32L431R(B-C)Tx +PCC.PartNumber=STM32L431RCTx +PCC.Seq0=0 +PCC.Series=STM32L4 +PCC.Temperature=25 +PCC.Vdd=3.0 +PH0-OSC_IN\ (PH0).Mode=HSE-External-Oscillator +PH0-OSC_IN\ (PH0).Signal=RCC_OSC_IN +PH1-OSC_OUT\ (PH1).Mode=HSE-External-Oscillator +PH1-OSC_OUT\ (PH1).Signal=RCC_OSC_OUT +PinOutPanel.RotationAngle=0 +ProjectManager.AskForMigrate=true +ProjectManager.BackupPrevious=false +ProjectManager.CompilerOptimize=6 +ProjectManager.ComputerToolchain=false +ProjectManager.CoupleFile=true +ProjectManager.CustomerFirmwarePackage= +ProjectManager.DefaultFWLocation=true +ProjectManager.DeletePrevious=true +ProjectManager.DeviceId=STM32L431RCTx +ProjectManager.FirmwarePackage=STM32Cube FW_L4 V1.14.0 +ProjectManager.FreePins=false +ProjectManager.HalAssertFull=false +ProjectManager.HeapSize=0x200 +ProjectManager.KeepUserCode=true +ProjectManager.LastFirmware=true +ProjectManager.LibraryCopy=0 +ProjectManager.MainLocation=Src +ProjectManager.NoMain=false +ProjectManager.PreviousToolchain= +ProjectManager.ProjectBuild=false +ProjectManager.ProjectFileName=BearPi_STM32L31RC.ioc +ProjectManager.ProjectName=BearPi_STM32L31RC +ProjectManager.StackSize=0x400 +ProjectManager.TargetToolchain=MDK-ARM V5 +ProjectManager.ToolChainLocation= +ProjectManager.UnderRoot=false +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_ADC1_Init-ADC1-false-HAL-true,4-MX_I2C1_Init-I2C1-false-HAL-true,5-MX_LPUART1_UART_Init-LPUART1-false-HAL-true,6-MX_USART2_UART_Init-USART2-false-HAL-true,7-MX_USART3_UART_Init-USART3-false-HAL-true,8-MX_SPI1_Init-SPI1-false-HAL-true,9-MX_SPI3_Init-SPI3-false-HAL-true,10-MX_SPI2_Init-SPI2-false-HAL-true +RCC.ADCFreq_Value=32000000 +RCC.AHBFreq_Value=80000000 +RCC.APB1Freq_Value=80000000 +RCC.APB1TimFreq_Value=80000000 +RCC.APB2Freq_Value=80000000 +RCC.APB2TimFreq_Value=80000000 +RCC.CortexFreq_Value=80000000 +RCC.FCLKCortexFreq_Value=80000000 +RCC.FamilyName=M +RCC.HCLKFreq_Value=80000000 +RCC.HSE_VALUE=8000000 +RCC.HSI48_VALUE=48000000 +RCC.HSI_VALUE=16000000 +RCC.I2C1Freq_Value=80000000 +RCC.I2C2Freq_Value=80000000 +RCC.I2C3Freq_Value=80000000 +RCC.IPParameters=ADCFreq_Value,AHBFreq_Value,APB1Freq_Value,APB1TimFreq_Value,APB2Freq_Value,APB2TimFreq_Value,CortexFreq_Value,FCLKCortexFreq_Value,FamilyName,HCLKFreq_Value,HSE_VALUE,HSI48_VALUE,HSI_VALUE,I2C1Freq_Value,I2C2Freq_Value,I2C3Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPUART1Freq_Value,LSCOPinFreq_Value,LSI_VALUE,MCO1PinFreq_Value,MSI_VALUE,PLLN,PLLPoutputFreq_Value,PLLQoutputFreq_Value,PLLRCLKFreq_Value,PLLSAI1N,PLLSAI1PoutputFreq_Value,PLLSAI1QoutputFreq_Value,PLLSAI1RoutputFreq_Value,PWRFreq_Value,RNGFreq_Value,SAI1Freq_Value,SDMMCFreq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,USART1Freq_Value,USART2Freq_Value,USART3Freq_Value,VCOInputFreq_Value,VCOOutputFreq_Value,VCOSAI1OutputFreq_Value +RCC.LPTIM1Freq_Value=80000000 +RCC.LPTIM2Freq_Value=80000000 +RCC.LPUART1Freq_Value=80000000 +RCC.LSCOPinFreq_Value=32000 +RCC.LSI_VALUE=32000 +RCC.MCO1PinFreq_Value=80000000 +RCC.MSI_VALUE=4000000 +RCC.PLLN=40 +RCC.PLLPoutputFreq_Value=22857142.85714286 +RCC.PLLQoutputFreq_Value=80000000 +RCC.PLLRCLKFreq_Value=80000000 +RCC.PLLSAI1N=16 +RCC.PLLSAI1PoutputFreq_Value=9142857.142857144 +RCC.PLLSAI1QoutputFreq_Value=32000000 +RCC.PLLSAI1RoutputFreq_Value=32000000 +RCC.PWRFreq_Value=80000000 +RCC.RNGFreq_Value=32000000 +RCC.SAI1Freq_Value=9142857.142857144 +RCC.SDMMCFreq_Value=32000000 +RCC.SWPMI1Freq_Value=80000000 +RCC.SYSCLKFreq_VALUE=80000000 +RCC.SYSCLKSource=RCC_SYSCLKSOURCE_PLLCLK +RCC.USART1Freq_Value=80000000 +RCC.USART2Freq_Value=80000000 +RCC.USART3Freq_Value=80000000 +RCC.VCOInputFreq_Value=4000000 +RCC.VCOOutputFreq_Value=160000000 +RCC.VCOSAI1OutputFreq_Value=64000000 +SH.ADCx_IN3.0=ADC1_IN3,IN3-Single-Ended +SH.ADCx_IN3.ConfNb=1 +SH.GPXTI2.0=GPIO_EXTI2 +SH.GPXTI2.ConfNb=1 +SPI1.CalculateBaudRate=40.0 MBits/s +SPI1.Direction=SPI_DIRECTION_2LINES +SPI1.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,VirtualNSS +SPI1.Mode=SPI_MODE_MASTER +SPI1.VirtualNSS=VM_NSSHARD +SPI1.VirtualType=VM_MASTER +SPI2.CLKPhase=SPI_PHASE_2EDGE +SPI2.CLKPolarity=SPI_POLARITY_HIGH +SPI2.CalculateBaudRate=40.0 MBits/s +SPI2.DataSize=SPI_DATASIZE_8BIT +SPI2.Direction=SPI_DIRECTION_2LINES +SPI2.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,DataSize,CLKPolarity,CLKPhase +SPI2.Mode=SPI_MODE_MASTER +SPI2.VirtualType=VM_MASTER +SPI3.CalculateBaudRate=40.0 MBits/s +SPI3.Direction=SPI_DIRECTION_2LINES +SPI3.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate +SPI3.Mode=SPI_MODE_MASTER +SPI3.VirtualType=VM_MASTER +USART1.IPParameters=VirtualMode-Asynchronous +USART1.VirtualMode-Asynchronous=VM_ASYNC +USART2.IPParameters=VirtualMode-Asynchronous +USART2.VirtualMode-Asynchronous=VM_ASYNC +USART3.IPParameters=VirtualMode-Asynchronous +USART3.VirtualMode-Asynchronous=VM_ASYNC +VP_SYS_VS_Systick.Mode=SysTick +VP_SYS_VS_Systick.Signal=SYS_VS_Systick +board=custom diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/BH1750/BH1750.c b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/BH1750/BH1750.c new file mode 100644 index 00000000..e711d6c5 --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/BH1750/BH1750.c @@ -0,0 +1,53 @@ +#include "bh1750.h" +#include "stm32l4xx.h" +#include "i2c.h" + + +float result_lx; +uint8_t BUF[2]; +int result; + + +/*************************************************************** +* 函数名称: Init_BH1750 +* 说 明: 写命令初始化BH1750 +* 参 数: 无 +* 返 回 值: 无 +***************************************************************/ +void BH1750_Init(void) +{ + uint8_t t_Data = 0x01; + HAL_I2C_Master_Transmit(&hi2c1,BH1750_Addr,&t_Data,1,0xff); +} + +/*************************************************************** +* 函数名称: Start_BH1750 +* 说 明: 启动BH1750 +* 参 数: 无 +* 返 回 值: 无 +***************************************************************/ +void BH1750_Start(void) +{ + uint8_t t_Data = 0x10; + HAL_I2C_Master_Transmit(&hi2c1,BH1750_Addr,&t_Data,1,0xff); +} + + + +/*************************************************************** +* 函数名称: Convert_BH1750 +* 说 明: 数值转换 +* 参 数: 无 +* 返 回 值: 光强值 +***************************************************************/ +float BH1750_Convert(void) +{ + BH1750_Start(); + HAL_Delay(180); + HAL_I2C_Master_Receive(&hi2c1, BH1750_Addr+1,BUF,2,0xff); + result=BUF[0]; + result=(result<<8)+BUF[1]; //合成数据,即光照数据 + result_lx=(float)(result/1.2); + return result_lx; +} + diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/BH1750/bh1750.h b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/BH1750/bh1750.h new file mode 100644 index 00000000..125a483d --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/BH1750/bh1750.h @@ -0,0 +1,39 @@ +#ifndef __BH1750_H__ +#define __BH1750_H__ +/* 包含头文件 ----------------------------------------------------------------*/ +#include "stm32l4xx_hal.h" + +/* 类型定义 ------------------------------------------------------------------*/ +/* 宏定义 --------------------------------------------------------------------*/ +#define I2C_OWN_ADDRESS 0x0A + +#define BH1750_Addr 0x46 +#define BH1750_ON 0x01 +#define BH1750_CON 0x10 +#define BH1750_ONE 0x20 +#define BH1750_RSET 0x07 + + +/*************************************************************** +* 函数名称: BH1750_Data_TypeDef +* 说 明: BH1750结构体 +* 参 数: 无 +* 返 回 值: 无 +***************************************************************/ +typedef struct +{ + char Lux[5]; //光强 +}BH1750_Data_TypeDef; + + + +void BH1750_Init(void); //IO初始化, +void BH1750_Start(void); //上电,设置清除数据寄存器 +//void BH1750_Read(void); //连续的读取内部寄存器数据 +float BH1750_Convert(void); +#endif + + + + + diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/E53_IA1/E53_IA1.c b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/E53_IA1/E53_IA1.c new file mode 100644 index 00000000..00415d6e --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/E53_IA1/E53_IA1.c @@ -0,0 +1,292 @@ +#include "E53_IA1.h" +#include "stm32l4xx.h" +#include "i2c.h" +#include "string.h" + +const int16_t POLYNOMIAL = 0x131; +E53_IA1_Data_TypeDef E53_IA1_Data; + + +/*************************************************************** +* 鍑芥暟鍚嶇О: Init_BH1750 +* 璇 鏄: 鍐欏懡浠ゅ垵濮嬪寲BH1750 +* 鍙 鏁: 鏃 +* 杩 鍥 鍊: 鏃 +***************************************************************/ +void Init_BH1750(void) +{ + uint8_t t_Data = 0x01; + HAL_I2C_Master_Transmit(&hi2c1,BH1750_Addr,&t_Data,1,0xff); +} + +/*************************************************************** +* 鍑芥暟鍚嶇О: Start_BH1750 +* 璇 鏄: 鍚姩BH1750 +* 鍙 鏁: 鏃 +* 杩 鍥 鍊: 鏃 +***************************************************************/ +void Start_BH1750(void) +{ + uint8_t t_Data = 0x10; + HAL_I2C_Master_Transmit(&hi2c1,BH1750_Addr,&t_Data,1,0xff); +} + +/*************************************************************** +* 鍑芥暟鍚嶇О: Convert_BH1750 +* 璇 鏄: 鏁板艰浆鎹 +* 鍙 鏁: 鏃 +* 杩 鍥 鍊: 鍏夊己鍊 +***************************************************************/ +float Convert_BH1750(void) +{ + float result_lx; + uint8_t BUF[2]; + int result; + Start_BH1750(); + HAL_Delay(180); + HAL_I2C_Master_Receive(&hi2c1, BH1750_Addr+1,BUF,2,0xff); + result=BUF[0]; + result=(result<<8)+BUF[1]; //Synthetic Digital Illumination Intensity Data + result_lx=(float)(result/1.2); + return result_lx; +} + +/*************************************************************** +* 鍑芥暟鍚嶇О: SHT30_reset +* 璇 鏄: SHT30澶嶄綅 +* 鍙 鏁: 鏃 +* 杩 鍥 鍊: 鏃 +***************************************************************/ +void SHT30_reset(void) +{ + uint8_t SHT3X_Resetcommand_Buffer[2]={0x30,0xA2}; //soft reset + HAL_I2C_Master_Transmit(&hi2c1,SHT30_Addr<<1,SHT3X_Resetcommand_Buffer,2,0x10); + HAL_Delay(15); + +} + +/*************************************************************** +* 鍑芥暟鍚嶇О: Init_SHT30 +* 璇 鏄: 鍒濆鍖朣HT30锛岃缃祴閲忓懆鏈 +* 鍙 鏁: 鏃 +* 杩 鍥 鍊: 鏃 +***************************************************************/ +void Init_SHT30(void) +{ + uint8_t SHT3X_Modecommand_Buffer[2]={0x22,0x36}; //periodic mode commands + HAL_I2C_Master_Transmit(&hi2c1,SHT30_Addr<<1,SHT3X_Modecommand_Buffer,2,0x10); //send periodic mode commands + +} + +/*************************************************************** +* 鍑芥暟鍚嶇О: SHT3x_CheckCrc +* 璇 鏄: 妫鏌ユ暟鎹纭 +* 鍙 鏁: data锛氳鍙栧埌鐨勬暟鎹 + nbrOfBytes锛氶渶瑕佹牎楠岀殑鏁伴噺 + checksum锛氳鍙栧埌鐨勬牎瀵规瘮楠屽 +* 杩 鍥 鍊: 鏍¢獙缁撴灉锛0-鎴愬姛 1-澶辫触 +***************************************************************/ +uint8_t SHT3x_CheckCrc(char data[], char nbrOfBytes, char checksum) +{ + + char crc = 0xFF; + char bit = 0; + char byteCtr ; + + //calculates 8-Bit checksum with given polynomial + for(byteCtr = 0; byteCtr < nbrOfBytes; ++byteCtr) + { + crc ^= (data[byteCtr]); + for ( bit = 8; bit > 0; --bit) + { + if (crc & 0x80) crc = (crc << 1) ^ POLYNOMIAL; + else crc = (crc << 1); + } + } + + if(crc != checksum) + return 1; + else + return 0; + +} + +/*************************************************************** +* 鍑芥暟鍚嶇О: SHT3x_CalcTemperatureC +* 璇 鏄: 娓╁害璁$畻 +* 鍙 鏁: u16sT锛氳鍙栧埌鐨勬俯搴﹀師濮嬫暟鎹 +* 杩 鍥 鍊: 璁$畻鍚庣殑娓╁害鏁版嵁 +***************************************************************/ +float SHT3x_CalcTemperatureC(unsigned short u16sT) +{ + + float temperatureC = 0; // variable for result + + u16sT &= ~0x0003; // clear bits [1..0] (status bits) + //-- calculate temperature [鈩僝 -- + temperatureC = (175 * (float)u16sT / 65535 - 45); //T = -45 + 175 * rawValue / (2^16-1) + + return temperatureC; + +} + +/*************************************************************** +* 鍑芥暟鍚嶇О: SHT3x_CalcRH +* 璇 鏄: 婀垮害璁$畻 +* 鍙 鏁: u16sRH锛氳鍙栧埌鐨勬箍搴﹀師濮嬫暟鎹 +* 杩 鍥 鍊: 璁$畻鍚庣殑婀垮害鏁版嵁 +***************************************************************/ +float SHT3x_CalcRH(unsigned short u16sRH) +{ + + float humidityRH = 0; // variable for result + + u16sRH &= ~0x0003; // clear bits [1..0] (status bits) + //-- calculate relative humidity [%RH] -- + humidityRH = (100 * (float)u16sRH / 65535); // RH = rawValue / (2^16-1) * 10 + + return humidityRH; + +} + +/*************************************************************** +* 鍑芥暟鍚嶇О: Init_Motor +* 璇 鏄: 鍒濆鍖朓nit_E53_IA1鐨勯┈杈 +* 鍙 鏁: 鏃 +* 杩 鍥 鍊: 鏃 +***************************************************************/ +void Init_Motor(void) +{ + GPIO_InitTypeDef GPIO_InitStruct; + + /* GPIO Ports Clock Enable */ + IA1_Motor_GPIO_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(IA1_Motor_GPIO_Port, IA1_Motor_Pin, GPIO_PIN_RESET); + E53_IA1_Data.MotorMode=0; + /*Configure GPIO pin : PtPin */ + GPIO_InitStruct.Pin = IA1_Motor_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(IA1_Motor_GPIO_Port, &GPIO_InitStruct); +} + +void motor_control(char mode){ + if(mode==1) + { + E53_IA1_Data.MotorMode=1; + HAL_GPIO_WritePin(IA1_Motor_GPIO_Port, IA1_Motor_Pin, GPIO_PIN_SET); + } + else if(mode==0) + { + E53_IA1_Data.MotorMode=0; + HAL_GPIO_WritePin(IA1_Motor_GPIO_Port, IA1_Motor_Pin, GPIO_PIN_RESET); + } + +} + + +void light_control(char mode){ + if(mode==1) + { + E53_IA1_Data.LightMode=1; + HAL_GPIO_WritePin(IA1_Light_GPIO_Port, IA1_Light_Pin, GPIO_PIN_SET); + } + else if(mode==0) + { + E53_IA1_Data.LightMode=0; + HAL_GPIO_WritePin(IA1_Light_GPIO_Port, IA1_Light_Pin, GPIO_PIN_RESET); + } + +} + +/*************************************************************** +* 鍑芥暟鍚嶇О: Init_Light +* 璇 鏄: 鍒濆鍖朓nit_E53_IA1鐨勮ˉ鍏夌伅 +* 鍙 鏁: 鏃 +* 杩 鍥 鍊: 鏃 +***************************************************************/ +void Init_Light(void) +{ + GPIO_InitTypeDef GPIO_InitStruct; + + /* GPIO Ports Clock Enable */ + IA1_Light_GPIO_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(IA1_Light_GPIO_Port, IA1_Light_Pin, GPIO_PIN_RESET); + E53_IA1_Data.LightMode=0; + /*Configure GPIO pin : PtPin */ + GPIO_InitStruct.Pin = IA1_Light_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(IA1_Light_GPIO_Port, &GPIO_InitStruct); +} +/*************************************************************** +* 鍑芥暟鍚嶇О: Init_E53_IA1 +* 璇 鏄: 鍒濆鍖朓nit_E53_IA1 +* 鍙 鏁: 鏃 +* 杩 鍥 鍊: 鏃 +***************************************************************/ +void Init_E53_IA1(void) +{ + //printf("E53_sensor_board init!\n"); + MX_I2C1_Init(); + Init_BH1750(); + Init_SHT30(); + Init_Motor(); + Init_Light(); + memset((char *)&E53_IA1_Data,0,sizeof(E53_IA1_Data)); +} + +/*************************************************************** +* 鍑芥暟鍚嶇О: E53_IA1_Read_Data +* 璇 鏄: 娴嬮噺鍏夌収寮哄害銆佹俯搴︺佹箍搴 +* 鍙 鏁: 鏃 +* 杩 鍥 鍊: 鏃 +***************************************************************/ +void E53_IA1_Read_Data(void) +{ + + char data[3]; //data array for checksum verification + unsigned short tmp = 0; + uint16_t dat; + uint8_t SHT3X_Fetchcommand_Bbuffer[2]={0xE0,0x00}; //read the measurement results + uint8_t SHT3X_Data_Buffer[6]; //byte 0,1 is temperature byte 4,5 is humidity + + E53_IA1_Data.Lux=Convert_BH1750(); //Read bh1750 sensor data + + HAL_I2C_Master_Transmit(&hi2c1,SHT30_Addr<<1,SHT3X_Fetchcommand_Bbuffer,2,0x10); //Read sht30 sensor data + HAL_I2C_Master_Receive(&hi2c1,(SHT30_Addr<<1)+1,SHT3X_Data_Buffer,6,0x10); + + // /* check tem */ + data[0] = SHT3X_Data_Buffer[0]; + data[1] = SHT3X_Data_Buffer[1]; + data[2] = SHT3X_Data_Buffer[2]; + + tmp=SHT3x_CheckCrc(data, 2, data[2]); + if( !tmp ) /* value is ture */ + { + dat = ((uint16_t)data[0] << 8) | data[1]; + E53_IA1_Data.Temperature = SHT3x_CalcTemperatureC( dat ); + } + + // /* check humidity */ + data[0] = SHT3X_Data_Buffer[3]; + data[1] = SHT3X_Data_Buffer[4]; + data[2] = SHT3X_Data_Buffer[5]; + + tmp=SHT3x_CheckCrc(data, 2, data[2]); + if( !tmp ) /* value is ture */ + { + dat = ((uint16_t)data[0] << 8) | data[1]; + E53_IA1_Data.Humidity = SHT3x_CalcRH( dat ); + } + +} + + + diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/E53_IA1/E53_IA1.h b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/E53_IA1/E53_IA1.h new file mode 100644 index 00000000..2ba91d97 --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/E53_IA1/E53_IA1.h @@ -0,0 +1,46 @@ +#ifndef __E53_IA1_H__ +#define __E53_IA1_H__ +/* 鍖呭惈澶存枃浠 ----------------------------------------------------------------*/ +#include "stm32l4xx_hal.h" + +/* 鎺у埗璁惧IO鍙e畾涔 ------------------------------------------------------------*/ + +#define IA1_Motor_Pin GPIO_PIN_8 +#define IA1_Motor_GPIO_Port GPIOB +#define IA1_Motor_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() +#define IA1_Light_Pin GPIO_PIN_0 +#define IA1_Light_GPIO_Port GPIOA +#define IA1_Light_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() + +/* E53_IA1浼犳劅鍣ㄦ暟鎹被鍨嬪畾涔 ------------------------------------------------------------*/ +typedef struct +{ + float Lux; //鍏夌収寮哄害 + float Humidity; //婀垮害 + float Temperature; //娓╁害 + char MotorMode; + char LightMode; +} E53_IA1_Data_TypeDef; + +extern E53_IA1_Data_TypeDef E53_IA1_Data; + +/* 瀵勫瓨鍣ㄥ畯瀹氫箟 --------------------------------------------------------------------*/ +#define I2C_OWN_ADDRESS 0x0A + +#define SHT30_Addr 0x44 + +#define BH1750_Addr 0x46 +#define BH1750_ON 0x01 +#define BH1750_CON 0x10 +#define BH1750_ONE 0x20 +#define BH1750_RSET 0x07 + +void Init_E53_IA1(void); +void E53_IA1_Read_Data(void); + +#endif + + + + + diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/E53_SF1/E53_SF1.c b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/E53_SF1/E53_SF1.c new file mode 100644 index 00000000..c8194c4a --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/E53_SF1/E53_SF1.c @@ -0,0 +1,302 @@ +#include "E53_SF1.h" +#include "stm32l4xx.h" +#include "stm32l4xx_it.h" +#include "main.h" + +ADC_HandleTypeDef hadc1; +TIM_HandleTypeDef htim16; + +/*************************************************************** +* 鍑芥暟鍚嶇О: MX_TIM16_Init +* 璇 鏄: 鍒濆鍖栧畾鏃跺櫒16 +* 鍙 鏁: 鏃 +* 杩 鍥 鍊: 鏃 +***************************************************************/ +/* TIM16 init function */ +void MX_TIM16_Init(void) +{ + TIM_OC_InitTypeDef sConfigOC; + TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig; + + htim16.Instance = TIM16; + htim16.Init.Prescaler = 79; + htim16.Init.CounterMode = TIM_COUNTERMODE_UP; + htim16.Init.Period = 999; + htim16.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim16.Init.RepetitionCounter = 0; + htim16.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim16) != HAL_OK) + { + Error_Handler(); + } + + if (HAL_TIM_PWM_Init(&htim16) != HAL_OK) + { + Error_Handler(); + } + + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 499; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; + sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; + if (HAL_TIM_PWM_ConfigChannel(&htim16, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) + { + Error_Handler(); + } + + sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; + sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; + sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; + sBreakDeadTimeConfig.DeadTime = 0; + sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; + sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; + sBreakDeadTimeConfig.BreakFilter = 0; + sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; + if (HAL_TIMEx_ConfigBreakDeadTime(&htim16, &sBreakDeadTimeConfig) != HAL_OK) + { + Error_Handler(); + } + + HAL_TIM_MspPostInit(&htim16); + +} +/*************************************************************** +* 鍑芥暟鍚嶇О: HAL_TIM_Base_MspInit +* 璇 鏄: 浣胯兘瀹氭椂鍣16鏃堕挓,璁剧疆鏃堕挓婧 +* 鍙 鏁: 鏃 +* 杩 鍥 鍊: 鏃 +***************************************************************/ +void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) +{ + + if(tim_baseHandle->Instance==TIM16) + { + /* USER CODE BEGIN TIM16_MspInit 0 */ + + /* USER CODE END TIM16_MspInit 0 */ + /* TIM16 clock enable */ + __HAL_RCC_TIM16_CLK_ENABLE(); + /* USER CODE BEGIN TIM16_MspInit 1 */ + + /* USER CODE END TIM16_MspInit 1 */ + } +} + +/*************************************************************** +* 鍑芥暟鍚嶇О: HAL_TIM_MspPostInit +* 璇 鏄: 浣胯兘瀹氭椂鍣16纭欢鍒濆鍖 +* 鍙 鏁: 鏃 +* 杩 鍥 鍊: 鏃 +***************************************************************/ +void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct; + if(timHandle->Instance==TIM16) + { + /* USER CODE BEGIN TIM16_MspPostInit 0 */ + + /* USER CODE END TIM16_MspPostInit 0 */ + + /**TIM16 GPIO Configuration + PB8 ------> TIM16_CH1 + */ + GPIO_InitStruct.Pin = SF1_Beep_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF14_TIM16; + HAL_GPIO_Init(SF1_Beep_GPIO_Port, &GPIO_InitStruct); + + /* USER CODE BEGIN TIM16_MspPostInit 1 */ + + /* USER CODE END TIM16_MspPostInit 1 */ + } + +} + +/*************************************************************** +* 鍑芥暟鍚嶇О: MX_ADC1_Init +* 璇 鏄: 鍒濆鍖朅DC1鐢靛帇閲囬泦閫氶亾 +* 鍙 鏁: 鏃 +* 杩 鍥 鍊: 鏃 +***************************************************************/ +void MX_ADC1_Init(void) +{ + ADC_ChannelConfTypeDef sConfig; + + /**Common config + */ + hadc1.Instance = ADC1; + hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1; + hadc1.Init.Resolution = ADC_RESOLUTION_12B; + hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; + hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; + hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; + hadc1.Init.LowPowerAutoWait = DISABLE; + hadc1.Init.ContinuousConvMode = DISABLE; + hadc1.Init.NbrOfConversion = 1; + hadc1.Init.DiscontinuousConvMode = DISABLE; + hadc1.Init.NbrOfDiscConversion = 1; + hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; + hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; + hadc1.Init.DMAContinuousRequests = DISABLE; + hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED; + hadc1.Init.OversamplingMode = DISABLE; + if (HAL_ADC_Init(&hadc1) != HAL_OK) + { + Error_Handler(); + } + + /**Configure Regular Channel + */ + sConfig.Channel = ADC_CHANNEL_3; + sConfig.Rank = ADC_REGULAR_RANK_1; + sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5; + sConfig.SingleDiff = ADC_SINGLE_ENDED; + sConfig.OffsetNumber = ADC_OFFSET_NONE; + sConfig.Offset = 0; + if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) + { + Error_Handler(); + } + +} + +/*************************************************************** +* 鍑芥暟鍚嶇О: HAL_ADC_MspInit +* 璇 鏄: 浣胯兘ADC鏃堕挓,璁剧疆鏃堕挓婧 +* 鍙 鏁: 鏃 +* 杩 鍥 鍊: 鏃 +***************************************************************/ +void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct; + if(adcHandle->Instance==ADC1) + { + /* USER CODE BEGIN ADC1_MspInit 0 */ + + /* USER CODE END ADC1_MspInit 0 */ + /* ADC1 clock enable */ + __HAL_RCC_ADC_CLK_ENABLE(); + + /**ADC1 GPIO Configuration + PC2 ------> ADC1_IN3 + */ + GPIO_InitStruct.Pin = GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG_ADC_CONTROL; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /* USER CODE BEGIN ADC1_MspInit 1 */ + + /* USER CODE END ADC1_MspInit 1 */ + } +} + +/*************************************************************** +* 鍑芥暟鍚嶇О: Init_Beep +* 璇 鏄: 鍒濆鍖朎53_SF1鐨勮渹楦e櫒 +* 鍙 鏁: 鏃 +* 杩 鍥 鍊: 鏃 +***************************************************************/ +void Init_Beep(void) +{ + GPIO_InitTypeDef GPIO_InitStruct; + + /* GPIO Ports Clock Enable */ + SF1_Beep_GPIO_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(SF1_Beep_GPIO_Port, SF1_Beep_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin : PtPin */ + GPIO_InitStruct.Pin = SF1_Beep_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(SF1_Beep_GPIO_Port, &GPIO_InitStruct); +} + +/*************************************************************** +* 鍑芥暟鍚嶇О: Init_LED +* 璇 鏄: 鍒濆鍖朎53_SF1鐨凩ED鐏 +* 鍙 鏁: 鏃 +* 杩 鍥 鍊: 鏃 +***************************************************************/ +void Init_LED(void) +{ + GPIO_InitTypeDef GPIO_InitStruct; + + /* GPIO Ports Clock Enable */ + SF1_LED_GPIO_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(SF1_LED_GPIO_Port, SF1_LED_Pin, GPIO_PIN_SET); + + /*Configure GPIO pin : PtPin */ + GPIO_InitStruct.Pin = SF1_LED_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(SF1_LED_GPIO_Port, &GPIO_InitStruct); +} +/*************************************************************** +* 鍑芥暟鍚嶇О: Init_E53_SF1 +* 璇 鏄: 鍒濆鍖朎53_SF1鎵╁睍鏉 +* 鍙 鏁: 鏃 +* 杩 鍥 鍊: 鏃 +***************************************************************/ +void Init_E53_SF1(void) +{ + MX_ADC1_Init(); + Init_Beep(); + Init_LED(); + MX_TIM16_Init(); +} +/*************************************************************** +* 鍑芥暟鍚嶇О: E53_SF1_Read_Data +* 璇 鏄: 鑾峰彇鐑熼浘浼犳劅鍣ㄧ殑鏁版嵁 +* 鍙 鏁: 鏃 +* 杩 鍥 鍊: 鏃 +***************************************************************/ +void E53_SF1_Read_Data(void) +{ + HAL_ADC_Start(&hadc1); + HAL_ADC_PollForConversion(&hadc1, 50); + E53_SF1_Data.Smoke_Value = HAL_ADC_GetValue(&hadc1); +} +/*************************************************************** +* 鍑芥暟鍚嶇О: E53SF1_LED_StatusSet +* 璇 鏄: E53SF1寮鍙戞澘涓婄殑LED鐏殑浜伃鎺у埗 +* 鍙 鏁: status,LED鐏殑鐘舵 +* 闈1,鍏崇伅 +* 1,寮鐏 +* 杩 鍥 鍊: 鏃 +***************************************************************/ +void E53SF1_LED_StatusSet(E53SF1_Status_ENUM status) +{ + HAL_GPIO_WritePin(SF1_LED_GPIO_Port, SF1_LED_Pin, status != ON ? GPIO_PIN_RESET : GPIO_PIN_SET ); +} + +/*************************************************************** +* 鍑芥暟鍚嶇О: E53SF1_BEEP +* 璇 鏄: E53SF1铚傞福鍣ㄦ姤璀︿笌鍚 +* 鍙 鏁: status,LED_ENUM鏋氫妇鐨勬暟鎹 +* LED_OFF,鍏崇伅 +* LED_ON,寮鐏 +* 杩 鍥 鍊: 鏃 +***************************************************************/ +void E53SF1_Beep(E53SF1_Status_ENUM status) +{ + if(status == ON) + HAL_TIM_PWM_Start(&htim16,TIM_CHANNEL_1); + if(status == OFF) + HAL_TIM_PWM_Stop(&htim16,TIM_CHANNEL_1); +} + + diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/E53_SF1/E53_SF1.h b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/E53_SF1/E53_SF1.h new file mode 100644 index 00000000..4291a9b5 --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/E53_SF1/E53_SF1.h @@ -0,0 +1,49 @@ +#ifndef __E53_SF1_H__ +#define __E53_SF1_H__ +/* 鍖呭惈澶存枃浠 ----------------------------------------------------------------*/ +#include "stm32l4xx_hal.h" + +extern ADC_HandleTypeDef hadc1; +extern TIM_HandleTypeDef htim16; + +/* 鎺у埗璁惧IO鍙e畾涔 ------------------------------------------------------------*/ + +#define SF1_Beep_Pin GPIO_PIN_8 +#define SF1_Beep_GPIO_Port GPIOB +#define SF1_Beep_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() +#define SF1_LED_Pin GPIO_PIN_0 +#define SF1_LED_GPIO_Port GPIOA +#define SF1_LED_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() + + + +/* E53_SF1浼犳劅鍣ㄦ暟鎹被鍨嬪畾涔 ------------------------------------------------------------*/ +typedef struct +{ + int Smoke_Value; +} E53_SF1_Data_TypeDef; + +extern E53_SF1_Data_TypeDef E53_SF1_Data; + +/*************************************************************** +* 鍚 绉: GasStatus_ENUM +* 璇 鏄庯細鏋氫妇鐘舵佺粨鏋勪綋 +***************************************************************/ +typedef enum +{ + OFF = 0, + ON +} E53SF1_Status_ENUM; + +void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); +void Init_E53_SF1(void); +void E53_SF1_Read_Data(void); +void E53SF1_LED_StatusSet(E53SF1_Status_ENUM status); +void E53SF1_Beep(E53SF1_Status_ENUM status); + +#endif + + + + + diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/E53_ST1/E53_ST1.c b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/E53_ST1/E53_ST1.c new file mode 100644 index 00000000..6b9dbbbc --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/E53_ST1/E53_ST1.c @@ -0,0 +1,377 @@ +#include "E53_ST1.h" +#include "stm32l4xx.h" +#include "stm32l4xx_it.h" +#include "usart.h" +#include "main.h" + +gps_msg gpsmsg; +static unsigned char gps_uart[1000]; + + +TIM_HandleTypeDef htim16; + +/*************************************************************** +* 鍑芥暟鍚嶇О: MX_TIM16_Init +* 璇 鏄: 鍒濆鍖栧畾鏃跺櫒16 +* 鍙 鏁: 鏃 +* 杩 鍥 鍊: 鏃 +***************************************************************/ +/* TIM16 init function */ +void MX_TIM16_Init(void) +{ + TIM_OC_InitTypeDef sConfigOC; + TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig; + + htim16.Instance = TIM16; + htim16.Init.Prescaler = 79; + htim16.Init.CounterMode = TIM_COUNTERMODE_UP; + htim16.Init.Period = 999; + htim16.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim16.Init.RepetitionCounter = 0; + htim16.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim16) != HAL_OK) + { + Error_Handler(); + } + + if (HAL_TIM_PWM_Init(&htim16) != HAL_OK) + { + Error_Handler(); + } + + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 499; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; + sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; + if (HAL_TIM_PWM_ConfigChannel(&htim16, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) + { + Error_Handler(); + } + + sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; + sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; + sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; + sBreakDeadTimeConfig.DeadTime = 0; + sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; + sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; + sBreakDeadTimeConfig.BreakFilter = 0; + sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; + if (HAL_TIMEx_ConfigBreakDeadTime(&htim16, &sBreakDeadTimeConfig) != HAL_OK) + { + Error_Handler(); + } + + HAL_TIM_MspPostInit(&htim16); + +} +/*************************************************************** +* 鍑芥暟鍚嶇О: HAL_TIM_Base_MspInit +* 璇 鏄: 浣胯兘瀹氭椂鍣16鏃堕挓,璁剧疆鏃堕挓婧 +* 鍙 鏁: 鏃 +* 杩 鍥 鍊: 鏃 +***************************************************************/ +void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* tim_baseHandle) +{ + + if(tim_baseHandle->Instance==TIM16) + { + /* USER CODE BEGIN TIM16_MspInit 0 */ + + /* USER CODE END TIM16_MspInit 0 */ + /* TIM16 clock enable */ + __HAL_RCC_TIM16_CLK_ENABLE(); + /* USER CODE BEGIN TIM16_MspInit 1 */ + + /* USER CODE END TIM16_MspInit 1 */ + } +} + +/*************************************************************** +* 鍑芥暟鍚嶇О: HAL_TIM_MspPostInit +* 璇 鏄: 浣胯兘瀹氭椂鍣16纭欢鍒濆鍖 +* 鍙 鏁: 鏃 +* 杩 鍥 鍊: 鏃 +***************************************************************/ +void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct; + if(timHandle->Instance==TIM16) + { + /* USER CODE BEGIN TIM16_MspPostInit 0 */ + + /* USER CODE END TIM16_MspPostInit 0 */ + + /**TIM16 GPIO Configuration + PB8 ------> TIM16_CH1 + */ + GPIO_InitStruct.Pin = ST1_Beep_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF14_TIM16; + HAL_GPIO_Init(ST1_Beep_GPIO_Port, &GPIO_InitStruct); + + /* USER CODE BEGIN TIM16_MspPostInit 1 */ + + /* USER CODE END TIM16_MspPostInit 1 */ + } + +} + +/*************************************************************** +* 鍑芥暟鍚嶇О: Init_Beep +* 璇 鏄: 鍒濆鍖朎53_ST1鐨勮渹楦e櫒 +* 鍙 鏁: 鏃 +* 杩 鍥 鍊: 鏃 +***************************************************************/ +void Init_Beep(void) +{ + GPIO_InitTypeDef GPIO_InitStruct; + + /* GPIO Ports Clock Enable */ + ST1_Beep_GPIO_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(ST1_Beep_GPIO_Port, ST1_Beep_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin : PtPin */ + GPIO_InitStruct.Pin = ST1_Beep_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(ST1_Beep_GPIO_Port, &GPIO_InitStruct); +} + +/*************************************************************** +* 鍑芥暟鍚嶇О: Init_LED +* 璇 鏄: 鍒濆鍖朎53_ST1鐨凩ED鐏 +* 鍙 鏁: 鏃 +* 杩 鍥 鍊: 鏃 +***************************************************************/ +void Init_LED(void) +{ + GPIO_InitTypeDef GPIO_InitStruct; + + /* GPIO Ports Clock Enable */ + ST1_LED_GPIO_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(ST1_LED_GPIO_Port, ST1_LED_Pin, GPIO_PIN_SET); + + /*Configure GPIO pin : PtPin */ + GPIO_InitStruct.Pin = ST1_LED_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(ST1_LED_GPIO_Port, &GPIO_InitStruct); +} +/*************************************************************** +* 鍑芥暟鍚嶇О: Init_GPS_POW +* 璇 鏄: 鍒濆鍖朎53_ST1鐨凣PS浣胯兘寮曡剼 +* 鍙 鏁: 鏃 +* 杩 鍥 鍊: 鏃 +***************************************************************/ +void Init_GPS_POW(void) +{ + GPIO_InitTypeDef GPIO_InitStruct; + + /* GPIO Ports Clock Enable */ + ST1_GPS_POW_GPIO_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(ST1_GPS_POW_GPIO_Port, ST1_GPS_POW_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin : PtPin */ + GPIO_InitStruct.Pin = ST1_GPS_POW_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(ST1_GPS_POW_GPIO_Port, &GPIO_InitStruct); +} +/*************************************************************** +* 鍑芥暟鍚嶇О: GPS_Init +* 璇 鏄: 鍒濆鍖朑PS妯″潡 +* 鍙 鏁: 鏃 +* 杩 鍥 鍊: 鏃 +***************************************************************/ +void GPS_Init(void) +{ + MX_USART3_UART_Init(); //鍒濆鍖栦覆鍙 + HAL_UART_Transmit(&huart3, "$CCMSG,GGA,1,0,*19\r\n", 20, 200); + HAL_UART_Transmit(&huart3, "$CCMSG,GSA,1,0,*0D\r\n", 20, 200); + HAL_UART_Transmit(&huart3, "$CCMSG,GSV,1,0,*1A\r\n", 20, 200); +} + +/*************************************************************** +* 鍑芥暟鍚嶇О: Init_E53_ST1 +* 璇 鏄: 鍒濆鍖朎53_ST1鎵╁睍鏉 +* 鍙 鏁: 鏃 +* 杩 鍥 鍊: 鏃 +***************************************************************/ +void Init_E53_ST1(void) +{ + GPS_Init(); + Init_Beep(); + Init_LED(); + Init_GPS_POW(); + MX_TIM16_Init(); +} + +/***************************************************\ +* 鍑芥暟鍚嶇О: NMEA_Comma_Pos +* 鍑芥暟鍔熻兘锛氫粠buf閲岄潰寰楀埌绗琧x涓楀彿鎵鍦ㄧ殑浣嶇疆 +* 杈撳叆鍊硷細 +* 杩斿洖鍊硷細0~0xFE锛屼唬琛ㄩ楀彿鎵鍦ㄤ綅缃殑鍋忕Щ +* 0xFF锛屼唬琛ㄤ笉瀛樺湪绗琧x涓楀彿 +\***************************************************/ + +uint8_t NMEA_Comma_Pos(uint8_t *buf,uint8_t cx) +{ + uint8_t *p = buf; + while(cx) + { + if(*buf=='*'||*buf<' '||*buf>'z')return 0xFF; + if(*buf==',')cx--; + buf++; + } + return buf-p; +} +/***************************************************\ +* 鍑芥暟鍚嶇О: NMEA_Pow +* 鍑芥暟鍔熻兘锛氳繑鍥瀖鐨刵娆℃柟鍊 +* 杈撳叆鍊硷細搴曟暟m鍜屾寚鏁皀 +* 杩斿洖鍊硷細m^n +\***************************************************/ +uint32_t NMEA_Pow(uint8_t m,uint8_t n) +{ + uint32_t result = 1; + while(n--)result *= m; + return result; +} +/***************************************************\ +* 鍑芥暟鍚嶇О: NMEA_Str2num +* 鍑芥暟鍔熻兘锛歴tr鏁板瓧杞崲涓猴紙int锛夋暟瀛楋紝浠','鎴栬'*'缁撴潫 +* 杈撳叆鍊硷細buf锛屾暟瀛楀瓨鍌ㄥ尯 +* dx锛屽皬鏁扮偣浣嶆暟锛岃繑鍥炵粰璋冪敤鍑芥暟 +* 杩斿洖鍊硷細杞崲鍚庣殑鏁板 +\***************************************************/ +int NMEA_Str2num(uint8_t *buf,uint8_t*dx) +{ + uint8_t *p = buf; + uint32_t ires = 0,fres = 0; + uint8_t ilen = 0,flen = 0,i; + uint8_t mask = 0; + int res; + while(1) + { + if(*p=='-'){mask |= 0x02;p++;}//璇存槑鏈夎礋鏁 + if(*p==','||*p=='*')break;//閬囧埌缁撴潫绗 + if(*p=='.'){mask |= 0x01;p++;}//閬囧埌灏忔暟鐐 + else if(*p>'9'||(*p<'0'))//鏁板瓧涓嶅湪0鍜9涔嬪唴锛岃鏄庢湁闈炴硶瀛楃 + { + ilen = 0; + flen = 0; + break; + } + if(mask&0x01)flen++;//灏忔暟鐐圭殑浣嶆暟 + else ilen++;//str闀垮害鍔犱竴 + p++;//涓嬩竴涓瓧绗 + } + if(mask&0x02)buf++;//绉诲埌涓嬩竴浣嶏紝闄ゅ幓璐熷彿 + for(i=0;i5)flen=5;//鏈澶氬彇浜斾綅灏忔暟 + *dx = flen; + for(i=0;ilatitude_bd=temp/NMEA_Pow(10,dx+2); //寰楀埌掳 + rs=temp%NMEA_Pow(10,dx+2); //寰楀埌' + gpsmsg->latitude_bd=gpsmsg->latitude_bd*NMEA_Pow(10,5)+(rs*NMEA_Pow(10,5-dx))/60;//杞崲涓郝 + } + posx=NMEA_Comma_Pos(p4,4); //鍗楃含杩樻槸鍖楃含 + if(posx!=0XFF)gpsmsg->nshemi_bd=*(p4+posx); + posx=NMEA_Comma_Pos(p4,5); //寰楀埌缁忓害 + if(posx!=0XFF) + { + temp=NMEA_Str2num(p4+posx,&dx); + gpsmsg->longitude_bd=temp/NMEA_Pow(10,dx+2); //寰楀埌掳 + rs=temp%NMEA_Pow(10,dx+2); //寰楀埌' + gpsmsg->longitude_bd=gpsmsg->longitude_bd*NMEA_Pow(10,5)+(rs*NMEA_Pow(10,5-dx))/60;//杞崲涓郝 + } + posx=NMEA_Comma_Pos(p4,6); //涓滅粡杩樻槸瑗跨粡 + if(posx!=0XFF)gpsmsg->ewhemi_bd=*(p4+posx); +} + +/*************************************************************** +* 鍑芥暟鍚嶇О: E53_ST1_Read_Data +* 璇 鏄: 鑾峰彇GPS缁忕含搴︿俊鎭 +* 鍙 鏁: 鏃 +* 杩 鍥 鍊: 鏃 +***************************************************************/ +void E53_ST1_Read_Data(void) +{ + HAL_UART_Receive_IT(&huart3,gps_uart,1000); + NMEA_BDS_GPRMC_Analysis(&gpsmsg,(uint8_t*)gps_uart); //鍒嗘瀽瀛楃涓 + E53_ST1_Data.Longitude=(float)((float)gpsmsg.longitude_bd/100000); + E53_ST1_Data.Latitude=(float)((float)gpsmsg.latitude_bd/100000); +} + +/*************************************************************** +* 鍑芥暟鍚嶇О: E53_ST1_LED_StatusSet +* 璇 鏄: E53 ST1寮鍙戞澘涓婄殑LED鐏殑浜伃鎺у埗 +* 鍙 鏁: status,LED鐏殑鐘舵 +* 闈1,鍏崇伅 +* 1,寮鐏 +* 杩 鍥 鍊: 鏃 +***************************************************************/ +void E53_ST1_LED_StatusSet(E53ST1_Status_ENUM status) +{ + HAL_GPIO_WritePin(ST1_LED_GPIO_Port, ST1_LED_Pin, status != ST1_ON ? GPIO_PIN_RESET : GPIO_PIN_SET ); +} + +/*************************************************************** +* 鍑芥暟鍚嶇О: E53_ST1_Beep +* 璇 鏄: E53 ST1铚傞福鍣ㄦ姤璀︿笌鍚 +* 鍙 鏁: status,LED_ENUM鏋氫妇鐨勬暟鎹 +* ST1_OFF,鍏宠渹楦e櫒 +* ST1_ON,寮铚傞福鍣 +* 杩 鍥 鍊: 鏃 +***************************************************************/ +void E53_ST1_Beep(E53ST1_Status_ENUM status) +{ + if(status == ST1_ON) + HAL_TIM_PWM_Start(&htim16,TIM_CHANNEL_1); + if(status == ST1_OFF) + HAL_TIM_PWM_Stop(&htim16,TIM_CHANNEL_1); +} + + diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/E53_ST1/E53_ST1.h b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/E53_ST1/E53_ST1.h new file mode 100644 index 00000000..7a7ef30d --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/E53_ST1/E53_ST1.h @@ -0,0 +1,70 @@ +#ifndef __E53_ST1_H__ +#define __E53_ST1_H__ +/* 鍖呭惈澶存枃浠 ----------------------------------------------------------------*/ +#include "stm32l4xx_hal.h" + +/* 鎺у埗璁惧IO鍙e畾涔 ------------------------------------------------------------*/ + +#define ST1_Beep_Pin GPIO_PIN_8 +#define ST1_Beep_GPIO_Port GPIOB +#define ST1_Beep_GPIO_CLK_ENABLE() __HAL_RCC_GPIOB_CLK_ENABLE() +#define ST1_LED_Pin GPIO_PIN_0 +#define ST1_LED_GPIO_Port GPIOA +#define ST1_LED_GPIO_CLK_ENABLE() __HAL_RCC_GPIOA_CLK_ENABLE() +#define ST1_GPS_POW_Pin GPIO_PIN_9 +#define ST1_GPS_POW_GPIO_Port GPIOC +#define ST1_GPS_POW_GPIO_CLK_ENABLE() __HAL_RCC_GPIOC_CLK_ENABLE() + +/*************************************************************** +* 鍚 绉: GasStatus_ENUM +* 璇 鏄庯細鏋氫妇鐘舵佺粨鏋勪綋 +***************************************************************/ +typedef enum +{ + ST1_OFF = 0, + ST1_ON +} E53ST1_Status_ENUM; + +/***************************************************\ +*GPS NMEA-0183鍗忚閲嶈鍙傛暟缁撴瀯浣撳畾涔 +*鍗槦淇℃伅 +\***************************************************/ +__packed typedef struct +{ + uint32_t latitude_bd; //绾害 鍒嗘墿澶100000鍊嶏紝瀹為檯瑕侀櫎浠100000 + uint8_t nshemi_bd; //鍖楃含/鍗楃含,N:鍖楃含;S:鍗楃含 + uint32_t longitude_bd; //缁忓害 鍒嗘墿澶100000鍊,瀹為檯瑕侀櫎浠100000 + uint8_t ewhemi_bd; //涓滅粡/瑗跨粡,E:涓滅粡;W:瑗跨粡 +}gps_msg; + +/* E53_ST1浼犳劅鍣ㄦ暟鎹被鍨嬪畾涔 ------------------------------------------------------------*/ +typedef struct +{ + float Longitude; //缁忓害 + float Latitude; //绾害 +} E53_ST1_Data_TypeDef; + +extern E53_ST1_Data_TypeDef E53_ST1_Data; + +typedef struct +{ + char Longitude[9]; //缁忓害 + char Latitude[8]; //绾害 +} E53_ST1_Send_TypeDef; + +extern E53_ST1_Send_TypeDef E53_ST1_Send; + +extern TIM_HandleTypeDef htim16; + +void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); +void Init_E53_ST1(void); +void E53_ST1_Read_Data(void); +void E53_ST1_LED_StatusSet(E53ST1_Status_ENUM status); +void E53_ST1_Beep(E53ST1_Status_ENUM status); + +#endif + + + + + diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/LCD_ST7789/font.h b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/LCD_ST7789/font.h new file mode 100644 index 00000000..8c29a859 --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/LCD_ST7789/font.h @@ -0,0 +1,406 @@ +#ifndef __FONT_H +#define __FONT_H +//常用ASCII表 +//偏移量32 +//ASCII字符集: !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ +//PC2LCD2002取模方式设置:阴码+逐行式+顺向+C51格式 +//总共:3个字符集(12*12、16*16、24*24和32*32),用户可以自行新增其他分辨率的字符集。 +//每个字符所占用的字节数为:(size/8+((size%8)?1:0))*(size/2),其中size:是字库生成时的点阵大小(12/16/24/32...) + +//12*12 ASCII字符集点阵 +const unsigned char asc2_1206[95][12]={ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/ +{0x00,0x00,0x20,0x20,0x20,0x20,0x20,0x00,0x00,0x20,0x00,0x00},/*"!",1*/ +{0x28,0x28,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/ +{0x00,0x00,0x50,0x50,0xF8,0x50,0x50,0xF8,0x50,0x50,0x00,0x00},/*"#",3*/ +{0x00,0x20,0x70,0xA8,0xA0,0x60,0x30,0x28,0xA8,0x70,0x20,0x00},/*"$",4*/ +{0x00,0x00,0x48,0xA8,0xB0,0xA8,0x74,0x34,0x54,0x48,0x00,0x00},/*"%",5*/ +{0x00,0x00,0x20,0x50,0x50,0x6C,0xA8,0xA8,0x94,0x68,0x00,0x00},/*"&",6*/ +{0x40,0x40,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/ +{0x08,0x10,0x10,0x20,0x20,0x20,0x20,0x20,0x10,0x10,0x08,0x00},/*"(",8*/ +{0x40,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x20,0x40,0x00},/*")",9*/ +{0x00,0x00,0x00,0x20,0xA8,0x70,0x70,0xA8,0x20,0x00,0x00,0x00},/*"*",10*/ +{0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x00,0x00,0x00,0x00},/*"+",11*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x40,0x80,0x00},/*",",12*/ +{0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x00,0x00,0x00},/*"-",13*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00},/*".",14*/ +{0x00,0x04,0x08,0x08,0x10,0x10,0x20,0x20,0x40,0x40,0x80,0x00},/*"/",15*/ +{0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00},/*"0",16*/ +{0x00,0x00,0x20,0x60,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00},/*"1",17*/ +{0x00,0x00,0x70,0x88,0x88,0x10,0x20,0x40,0x80,0xF8,0x00,0x00},/*"2",18*/ +{0x00,0x00,0x70,0x88,0x08,0x30,0x08,0x08,0x88,0x70,0x00,0x00},/*"3",19*/ +{0x00,0x00,0x10,0x30,0x30,0x50,0x90,0xF8,0x10,0x38,0x00,0x00},/*"4",20*/ +{0x00,0x00,0xF8,0x80,0x80,0xF0,0x88,0x08,0x88,0x70,0x00,0x00},/*"5",21*/ +{0x00,0x00,0x30,0x48,0x80,0xB0,0xC8,0x88,0x88,0x70,0x00,0x00},/*"6",22*/ +{0x00,0x00,0x78,0x08,0x10,0x10,0x20,0x20,0x20,0x20,0x00,0x00},/*"7",23*/ +{0x00,0x00,0x70,0x88,0x88,0x70,0x88,0x88,0x88,0x70,0x00,0x00},/*"8",24*/ +{0x00,0x00,0x70,0x88,0x88,0x98,0x68,0x08,0x90,0x60,0x00,0x00},/*"9",25*/ +{0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x20,0x00,0x00},/*":",26*/ +{0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x20,0x20,0x00},/*";",27*/ +{0x00,0x00,0x08,0x10,0x20,0x40,0x40,0x20,0x10,0x08,0x00,0x00},/*"<",28*/ +{0x00,0x00,0x00,0x00,0xFC,0x00,0xFC,0x00,0x00,0x00,0x00,0x00},/*"=",29*/ +{0x00,0x00,0x40,0x20,0x10,0x08,0x08,0x10,0x20,0x40,0x00,0x00},/*">",30*/ +{0x00,0x00,0x70,0x88,0x88,0x10,0x20,0x20,0x00,0x20,0x00,0x00},/*"?",31*/ +{0x00,0x00,0x38,0x44,0x94,0xB4,0xB4,0xB8,0x44,0x38,0x00,0x00},/*"@",32*/ +{0x00,0x00,0x20,0x20,0x30,0x50,0x50,0x78,0x48,0xCC,0x00,0x00},/*"A",33*/ +{0x00,0x00,0xF0,0x48,0x48,0x70,0x48,0x48,0x48,0xF0,0x00,0x00},/*"B",34*/ +{0x00,0x00,0x78,0x88,0x80,0x80,0x80,0x80,0x88,0x70,0x00,0x00},/*"C",35*/ +{0x00,0x00,0xF0,0x48,0x48,0x48,0x48,0x48,0x48,0xF0,0x00,0x00},/*"D",36*/ +{0x00,0x00,0xF8,0x48,0x50,0x70,0x50,0x40,0x48,0xF8,0x00,0x00},/*"E",37*/ +{0x00,0x00,0xF8,0x48,0x50,0x70,0x50,0x40,0x40,0xE0,0x00,0x00},/*"F",38*/ +{0x00,0x00,0x38,0x48,0x80,0x80,0x9C,0x88,0x48,0x30,0x00,0x00},/*"G",39*/ +{0x00,0x00,0xCC,0x48,0x48,0x78,0x48,0x48,0x48,0xCC,0x00,0x00},/*"H",40*/ +{0x00,0x00,0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0xF8,0x00,0x00},/*"I",41*/ +{0x00,0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x90,0xE0},/*"J",42*/ +{0x00,0x00,0xEC,0x48,0x50,0x60,0x50,0x48,0x48,0xEC,0x00,0x00},/*"K",43*/ +{0x00,0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0x44,0xFC,0x00,0x00},/*"L",44*/ +{0x00,0x00,0xDC,0xD8,0xD8,0xD8,0xA8,0xA8,0xA8,0xAC,0x00,0x00},/*"M",45*/ +{0x00,0x00,0xDC,0x48,0x68,0x68,0x58,0x58,0x48,0xE8,0x00,0x00},/*"N",46*/ +{0x00,0x00,0x70,0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00,0x00},/*"O",47*/ +{0x00,0x00,0xF0,0x48,0x48,0x70,0x40,0x40,0x40,0xE0,0x00,0x00},/*"P",48*/ +{0x00,0x00,0x70,0x88,0x88,0x88,0x88,0xE8,0x98,0x70,0x18,0x00},/*"Q",49*/ +{0x00,0x00,0xF0,0x48,0x48,0x70,0x50,0x48,0x48,0xEC,0x00,0x00},/*"R",50*/ +{0x00,0x00,0x78,0x88,0x80,0x60,0x10,0x08,0x88,0xF0,0x00,0x00},/*"S",51*/ +{0x00,0x00,0xF8,0xA8,0x20,0x20,0x20,0x20,0x20,0x70,0x00,0x00},/*"T",52*/ +{0x00,0x00,0xCC,0x48,0x48,0x48,0x48,0x48,0x48,0x30,0x00,0x00},/*"U",53*/ +{0x00,0x00,0xCC,0x48,0x48,0x50,0x50,0x30,0x20,0x20,0x00,0x00},/*"V",54*/ +{0x00,0x00,0xA8,0xA8,0xA8,0xA8,0x70,0x50,0x50,0x50,0x00,0x00},/*"W",55*/ +{0x00,0x00,0xD8,0x50,0x50,0x20,0x20,0x50,0x50,0xD8,0x00,0x00},/*"X",56*/ +{0x00,0x00,0xD8,0x50,0x50,0x50,0x20,0x20,0x20,0x70,0x00,0x00},/*"Y",57*/ +{0x00,0x00,0xF8,0x90,0x10,0x20,0x20,0x40,0x48,0xF8,0x00,0x00},/*"Z",58*/ +{0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x38,0x00},/*"[",59*/ +{0x00,0x40,0x40,0x20,0x20,0x20,0x10,0x10,0x10,0x08,0x08,0x00},/*"\",60*/ +{0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x70,0x00},/*"]",61*/ +{0x20,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC},/*"_",63*/ +{0x40,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/ +{0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x38,0x48,0x3C,0x00,0x00},/*"a",65*/ +{0x00,0xC0,0x40,0x40,0x40,0x70,0x48,0x48,0x48,0x70,0x00,0x00},/*"b",66*/ +{0x00,0x00,0x00,0x00,0x00,0x38,0x48,0x40,0x48,0x30,0x00,0x00},/*"c",67*/ +{0x00,0x18,0x08,0x08,0x08,0x38,0x48,0x48,0x48,0x3C,0x00,0x00},/*"d",68*/ +{0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x78,0x40,0x38,0x00,0x00},/*"e",69*/ +{0x00,0x18,0x24,0x20,0x20,0x78,0x20,0x20,0x20,0x78,0x00,0x00},/*"f",70*/ +{0x00,0x00,0x00,0x00,0x00,0x3C,0x48,0x30,0x40,0x38,0x44,0x38},/*"g",71*/ +{0x00,0xC0,0x40,0x40,0x40,0x70,0x48,0x48,0x48,0xEC,0x00,0x00},/*"h",72*/ +{0x00,0x20,0x20,0x00,0x00,0x60,0x20,0x20,0x20,0x70,0x00,0x00},/*"i",73*/ +{0x00,0x10,0x10,0x00,0x00,0x30,0x10,0x10,0x10,0x10,0x10,0xE0},/*"j",74*/ +{0x00,0xC0,0x40,0x40,0x40,0x58,0x50,0x60,0x50,0xC8,0x00,0x00},/*"k",75*/ +{0x00,0xE0,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0xF8,0x00,0x00},/*"l",76*/ +{0x00,0x00,0x00,0x00,0x00,0xF0,0xA8,0xA8,0xA8,0xA8,0x00,0x00},/*"m",77*/ +{0x00,0x00,0x00,0x00,0x00,0xF0,0x48,0x48,0x48,0xEC,0x00,0x00},/*"n",78*/ +{0x00,0x00,0x00,0x00,0x00,0x30,0x48,0x48,0x48,0x30,0x00,0x00},/*"o",79*/ +{0x00,0x00,0x00,0x00,0x00,0xF0,0x48,0x48,0x48,0x70,0x40,0xE0},/*"p",80*/ +{0x00,0x00,0x00,0x00,0x00,0x38,0x48,0x48,0x48,0x38,0x08,0x1C},/*"q",81*/ +{0x00,0x00,0x00,0x00,0x00,0xD8,0x60,0x40,0x40,0xE0,0x00,0x00},/*"r",82*/ +{0x00,0x00,0x00,0x00,0x00,0x78,0x40,0x30,0x08,0x78,0x00,0x00},/*"s",83*/ +{0x00,0x00,0x00,0x20,0x20,0x78,0x20,0x20,0x20,0x38,0x00,0x00},/*"t",84*/ +{0x00,0x00,0x00,0x00,0x00,0xD8,0x48,0x48,0x48,0x3C,0x00,0x00},/*"u",85*/ +{0x00,0x00,0x00,0x00,0x00,0xD8,0x50,0x50,0x20,0x20,0x00,0x00},/*"v",86*/ +{0x00,0x00,0x00,0x00,0x00,0xA8,0xA8,0x70,0x50,0x50,0x00,0x00},/*"w",87*/ +{0x00,0x00,0x00,0x00,0x00,0xD8,0x50,0x20,0x50,0xD8,0x00,0x00},/*"x",88*/ +{0x00,0x00,0x00,0x00,0x00,0xCC,0x48,0x48,0x30,0x10,0x20,0xC0},/*"y",89*/ +{0x00,0x00,0x00,0x00,0x00,0x78,0x10,0x20,0x20,0x78,0x00,0x00},/*"z",90*/ +{0x18,0x10,0x10,0x10,0x10,0x30,0x10,0x10,0x10,0x10,0x18,0x00},/*"{",91*/ +{0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10},/*"|",92*/ +{0x60,0x20,0x20,0x20,0x20,0x10,0x20,0x20,0x20,0x20,0x60,0x00},/*"}",93*/ +{0x68,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"~",94*/ +}; + + +//16*16 ASCII字符集点阵 +const unsigned char asc2_1608[95][16]={ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/ +{0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x10,0x10,0x00,0x00},/*"!",1*/ +{0x00,0x12,0x24,0x24,0x48,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/ +{0x00,0x00,0x00,0x12,0x12,0x12,0x7E,0x24,0x24,0x24,0x7E,0x24,0x24,0x24,0x00,0x00},/*"#",3*/ +{0x00,0x00,0x08,0x3C,0x4A,0x4A,0x48,0x38,0x0C,0x0A,0x0A,0x4A,0x4A,0x3C,0x08,0x08},/*"$",4*/ +{0x00,0x00,0x00,0x44,0xA4,0xA8,0xA8,0xB0,0x54,0x1A,0x2A,0x2A,0x4A,0x44,0x00,0x00},/*"%",5*/ +{0x00,0x00,0x00,0x30,0x48,0x48,0x48,0x50,0x6E,0xA4,0x94,0x98,0x89,0x76,0x00,0x00},/*"&",6*/ +{0x00,0x60,0x20,0x20,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/ +{0x00,0x02,0x04,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x08,0x08,0x04,0x02,0x00},/*"(",8*/ +{0x00,0x40,0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x40,0x00},/*")",9*/ +{0x00,0x00,0x00,0x00,0x10,0x10,0xD6,0x38,0x38,0xD6,0x10,0x10,0x00,0x00,0x00,0x00},/*"*",10*/ +{0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x7F,0x08,0x08,0x08,0x00,0x00,0x00,0x00},/*"+",11*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x20,0x20,0x40},/*",",12*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"-",13*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x00,0x00},/*".",14*/ +{0x00,0x00,0x02,0x04,0x04,0x04,0x08,0x08,0x10,0x10,0x10,0x20,0x20,0x40,0x40,0x00},/*"/",15*/ +{0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00},/*"0",16*/ +{0x00,0x00,0x00,0x08,0x38,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00},/*"1",17*/ +{0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x02,0x04,0x08,0x10,0x20,0x42,0x7E,0x00,0x00},/*"2",18*/ +{0x00,0x00,0x00,0x3C,0x42,0x42,0x02,0x04,0x18,0x04,0x02,0x42,0x42,0x3C,0x00,0x00},/*"3",19*/ +{0x00,0x00,0x00,0x04,0x0C,0x0C,0x14,0x24,0x24,0x44,0x7F,0x04,0x04,0x1F,0x00,0x00},/*"4",20*/ +{0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x78,0x44,0x02,0x02,0x42,0x44,0x38,0x00,0x00},/*"5",21*/ +{0x00,0x00,0x00,0x18,0x24,0x40,0x40,0x5C,0x62,0x42,0x42,0x42,0x22,0x1C,0x00,0x00},/*"6",22*/ +{0x00,0x00,0x00,0x7E,0x42,0x04,0x04,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x00,0x00},/*"7",23*/ +{0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x3C,0x00,0x00},/*"8",24*/ +{0x00,0x00,0x00,0x38,0x44,0x42,0x42,0x42,0x46,0x3A,0x02,0x02,0x24,0x18,0x00,0x00},/*"9",25*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00},/*":",26*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10},/*";",27*/ +{0x00,0x00,0x00,0x02,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x02,0x00,0x00},/*"<",28*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00},/*"=",29*/ +{0x00,0x00,0x00,0x40,0x20,0x10,0x08,0x04,0x02,0x04,0x08,0x10,0x20,0x40,0x00,0x00},/*">",30*/ +{0x00,0x00,0x00,0x3C,0x42,0x42,0x62,0x04,0x08,0x08,0x08,0x00,0x18,0x18,0x00,0x00},/*"?",31*/ +{0x00,0x00,0x00,0x38,0x44,0x5A,0xAA,0xAA,0xAA,0xAA,0xAA,0x5C,0x42,0x3C,0x00,0x00},/*"@",32*/ +{0x00,0x00,0x00,0x10,0x10,0x18,0x28,0x28,0x24,0x3C,0x44,0x42,0x42,0xE7,0x00,0x00},/*"A",33*/ +{0x00,0x00,0x00,0xF8,0x44,0x44,0x44,0x78,0x44,0x42,0x42,0x42,0x44,0xF8,0x00,0x00},/*"B",34*/ +{0x00,0x00,0x00,0x3E,0x42,0x42,0x80,0x80,0x80,0x80,0x80,0x42,0x44,0x38,0x00,0x00},/*"C",35*/ +{0x00,0x00,0x00,0xF8,0x44,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x44,0xF8,0x00,0x00},/*"D",36*/ +{0x00,0x00,0x00,0xFC,0x42,0x48,0x48,0x78,0x48,0x48,0x40,0x42,0x42,0xFC,0x00,0x00},/*"E",37*/ +{0x00,0x00,0x00,0xFC,0x42,0x48,0x48,0x78,0x48,0x48,0x40,0x40,0x40,0xE0,0x00,0x00},/*"F",38*/ +{0x00,0x00,0x00,0x3C,0x44,0x44,0x80,0x80,0x80,0x8E,0x84,0x44,0x44,0x38,0x00,0x00},/*"G",39*/ +{0x00,0x00,0x00,0xE7,0x42,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x42,0xE7,0x00,0x00},/*"H",40*/ +{0x00,0x00,0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00},/*"I",41*/ +{0x00,0x00,0x00,0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x88,0xF0},/*"J",42*/ +{0x00,0x00,0x00,0xEE,0x44,0x48,0x50,0x70,0x50,0x48,0x48,0x44,0x44,0xEE,0x00,0x00},/*"K",43*/ +{0x00,0x00,0x00,0xE0,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x42,0xFE,0x00,0x00},/*"L",44*/ +{0x00,0x00,0x00,0xEE,0x6C,0x6C,0x6C,0x6C,0x6C,0x54,0x54,0x54,0x54,0xD6,0x00,0x00},/*"M",45*/ +{0x00,0x00,0x00,0xC7,0x62,0x62,0x52,0x52,0x4A,0x4A,0x4A,0x46,0x46,0xE2,0x00,0x00},/*"N",46*/ +{0x00,0x00,0x00,0x38,0x44,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x44,0x38,0x00,0x00},/*"O",47*/ +{0x00,0x00,0x00,0xFC,0x42,0x42,0x42,0x42,0x7C,0x40,0x40,0x40,0x40,0xE0,0x00,0x00},/*"P",48*/ +{0x00,0x00,0x00,0x38,0x44,0x82,0x82,0x82,0x82,0x82,0x82,0xB2,0x4C,0x38,0x06,0x00},/*"Q",49*/ +{0x00,0x00,0x00,0xFC,0x42,0x42,0x42,0x7C,0x48,0x48,0x44,0x44,0x42,0xE3,0x00,0x00},/*"R",50*/ +{0x00,0x00,0x00,0x3E,0x42,0x42,0x40,0x20,0x18,0x04,0x02,0x42,0x42,0x7C,0x00,0x00},/*"S",51*/ +{0x00,0x00,0x00,0xFE,0x92,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00},/*"T",52*/ +{0x00,0x00,0x00,0xE7,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00},/*"U",53*/ +{0x00,0x00,0x00,0xE7,0x42,0x42,0x44,0x24,0x24,0x28,0x28,0x18,0x10,0x10,0x00,0x00},/*"V",54*/ +{0x00,0x00,0x00,0xD6,0x54,0x54,0x54,0x54,0x54,0x6C,0x28,0x28,0x28,0x28,0x00,0x00},/*"W",55*/ +{0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x18,0x18,0x18,0x24,0x24,0x42,0xE7,0x00,0x00},/*"X",56*/ +{0x00,0x00,0x00,0xEE,0x44,0x44,0x28,0x28,0x10,0x10,0x10,0x10,0x10,0x38,0x00,0x00},/*"Y",57*/ +{0x00,0x00,0x00,0x7E,0x84,0x04,0x08,0x08,0x10,0x20,0x20,0x42,0x42,0xFC,0x00,0x00},/*"Z",58*/ +{0x00,0x1E,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1E,0x00},/*"[",59*/ +{0x00,0x00,0x40,0x20,0x20,0x20,0x10,0x10,0x10,0x08,0x08,0x04,0x04,0x04,0x02,0x02},/*"\",60*/ +{0x00,0x78,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x78,0x00},/*"]",61*/ +{0x00,0x18,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF},/*"_",63*/ +{0x00,0x60,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x0C,0x34,0x44,0x4C,0x36,0x00,0x00},/*"a",65*/ +{0x00,0x00,0x00,0x00,0xC0,0x40,0x40,0x58,0x64,0x42,0x42,0x42,0x64,0x58,0x00,0x00},/*"b",66*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x22,0x40,0x40,0x40,0x22,0x1C,0x00,0x00},/*"c",67*/ +{0x00,0x00,0x00,0x00,0x06,0x02,0x02,0x3E,0x42,0x42,0x42,0x42,0x46,0x3B,0x00,0x00},/*"d",68*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x7E,0x40,0x42,0x3C,0x00,0x00},/*"e",69*/ +{0x00,0x00,0x00,0x00,0x0C,0x12,0x10,0x7C,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00},/*"f",70*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x44,0x44,0x38,0x40,0x3C,0x42,0x42,0x3C},/*"g",71*/ +{0x00,0x00,0x00,0x00,0xC0,0x40,0x40,0x5C,0x62,0x42,0x42,0x42,0x42,0xE7,0x00,0x00},/*"h",72*/ +{0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00},/*"i",73*/ +{0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x1C,0x04,0x04,0x04,0x04,0x04,0x04,0x44,0x78},/*"j",74*/ +{0x00,0x00,0x00,0x00,0xC0,0x40,0x40,0x4E,0x48,0x50,0x70,0x48,0x44,0xEE,0x00,0x00},/*"k",75*/ +{0x00,0x00,0x00,0x10,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00},/*"l",76*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x49,0x49,0x49,0x49,0x49,0xED,0x00,0x00},/*"m",77*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDC,0x62,0x42,0x42,0x42,0x42,0xE7,0x00,0x00},/*"n",78*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00},/*"o",79*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD8,0x64,0x42,0x42,0x42,0x64,0x58,0x40,0xE0},/*"p",80*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1A,0x26,0x42,0x42,0x42,0x26,0x1A,0x02,0x07},/*"q",81*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEE,0x32,0x20,0x20,0x20,0x20,0xF8,0x00,0x00},/*"r",82*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x42,0x40,0x3C,0x02,0x42,0x7C,0x00,0x00},/*"s",83*/ +{0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x7C,0x10,0x10,0x10,0x10,0x12,0x0C,0x00,0x00},/*"t",84*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC6,0x42,0x42,0x42,0x42,0x46,0x3B,0x00,0x00},/*"u",85*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEE,0x44,0x44,0x28,0x28,0x10,0x10,0x00,0x00},/*"v",86*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xDB,0x89,0x4A,0x5A,0x54,0x24,0x24,0x00,0x00},/*"w",87*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x24,0x18,0x18,0x18,0x24,0x6E,0x00,0x00},/*"x",88*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x18,0x18,0x10,0x10,0x60},/*"y",89*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x44,0x08,0x10,0x10,0x22,0x7E,0x00,0x00},/*"z",90*/ +{0x00,0x03,0x04,0x04,0x04,0x04,0x04,0x04,0x08,0x04,0x04,0x04,0x04,0x04,0x03,0x00},/*"{",91*/ +{0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08},/*"|",92*/ +{0x00,0xC0,0x20,0x20,0x20,0x20,0x20,0x20,0x10,0x20,0x20,0x20,0x20,0x20,0xC0,0x00},/*"}",93*/ +{0x20,0x5A,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"~",94*/ +}; + +//24*24 ASICII字符集点阵 +const unsigned char asc2_2412[95][48]={ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",1*/ +{0x00,0x00,0x00,0x00,0x06,0x60,0x06,0x60,0x0C,0xC0,0x19,0x80,0x11,0x00,0x22,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x40,0x08,0x40,0x08,0x40,0x08,0x40,0x7F,0xE0,0x7F,0xE0,0x10,0x40,0x10,0x80,0x10,0x80,0x10,0x80,0x10,0x80,0x7F,0xE0,0x7F,0xE0,0x20,0x80,0x20,0x80,0x20,0x80,0x20,0x80,0x00,0x00,0x00,0x00,0x00,0x00},/*"#",3*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x0F,0x80,0x1A,0xC0,0x32,0xC0,0x33,0xC0,0x32,0x00,0x1A,0x00,0x0E,0x00,0x07,0x00,0x03,0x80,0x03,0x80,0x02,0xC0,0x32,0xC0,0x3A,0xC0,0x32,0xC0,0x12,0x80,0x0F,0x00,0x02,0x00,0x02,0x00,0x00,0x00},/*"$",4*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x80,0x50,0x80,0x89,0x00,0x89,0x00,0x89,0x00,0x8A,0x00,0x8A,0x00,0x5C,0x00,0x75,0xC0,0x05,0x40,0x0A,0x20,0x0A,0x20,0x12,0x20,0x12,0x20,0x12,0x20,0x21,0x40,0x21,0xC0,0x00,0x00,0x00,0x00,0x00,0x00},/*"%",5*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x36,0x00,0x34,0x00,0x19,0xE0,0x38,0x80,0x58,0x80,0xCC,0x80,0xCC,0x80,0xC6,0x80,0xC7,0x00,0xC3,0x10,0x63,0x90,0x3C,0xE0,0x00,0x00,0x00,0x00,0x00,0x00},/*"&",6*/ +{0x00,0x00,0x00,0x00,0x30,0x00,0x38,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/ +{0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x00,0x80,0x00,0x40,0x00,0x20,0x00,0x00},/*"(",8*/ +{0x00,0x00,0x00,0x00,0x40,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x00,0x00},/*")",9*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x03,0x00,0x02,0x00,0x62,0x30,0x72,0xF0,0x0B,0x80,0x0F,0x80,0x7A,0xF0,0x62,0x30,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"*",10*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x7F,0xF0,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"+",11*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x38,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x20,0x00},/*",",12*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"-",13*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x38,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*".",14*/ +{0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x60,0x00,0x40,0x00,0xC0,0x00,0x80,0x00,0x80,0x01,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x06,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x10,0x00,0x30,0x00,0x20,0x00,0x60,0x00,0x40,0x00,0x00,0x00},/*"/",15*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,0x30,0xC0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x30,0xC0,0x30,0xC0,0x19,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"0",16*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00},/*"1",17*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x21,0x80,0x40,0xC0,0x60,0xC0,0x60,0xC0,0x00,0xC0,0x00,0x80,0x01,0x80,0x03,0x00,0x06,0x00,0x04,0x00,0x08,0x00,0x10,0x40,0x20,0x40,0x60,0x40,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00},/*"2",18*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x00,0x63,0x00,0x61,0x80,0x61,0x80,0x01,0x80,0x01,0x80,0x03,0x00,0x0E,0x00,0x01,0x80,0x00,0x80,0x00,0xC0,0x00,0xC0,0x60,0xC0,0x60,0xC0,0x61,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"3",19*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x01,0x80,0x03,0x80,0x05,0x80,0x05,0x80,0x09,0x80,0x11,0x80,0x11,0x80,0x21,0x80,0x41,0x80,0x7F,0xF0,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00},/*"4",20*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xC0,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x2F,0x00,0x31,0x80,0x20,0xC0,0x00,0xC0,0x00,0xC0,0x60,0xC0,0x60,0xC0,0x41,0x80,0x21,0x80,0x1F,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"5",21*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x18,0xC0,0x30,0xC0,0x30,0x00,0x20,0x00,0x60,0x00,0x67,0x80,0x68,0xC0,0x70,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x20,0x60,0x30,0x40,0x18,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"6",22*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xE0,0x30,0x60,0x20,0x40,0x20,0x80,0x00,0x80,0x00,0x80,0x01,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"7",23*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x30,0xC0,0x60,0x60,0x60,0x60,0x60,0x60,0x30,0x40,0x38,0xC0,0x0F,0x00,0x13,0x80,0x30,0xC0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x30,0xC0,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00},/*"8",24*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x30,0x80,0x30,0xC0,0x60,0x40,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0xE0,0x31,0x60,0x1E,0x60,0x00,0x60,0x00,0xC0,0x00,0xC0,0x30,0x80,0x31,0x80,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"9",25*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*":",26*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x02,0x00,0x04,0x00,0x04,0x00},/*";",27*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x01,0x00,0x00,0x80,0x00,0x40,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00},/*"<",28*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"=",29*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x01,0x00,0x00,0x80,0x00,0x40,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*">",30*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xC0,0x18,0x60,0x20,0x30,0x20,0x30,0x30,0x30,0x30,0x30,0x00,0xE0,0x01,0x80,0x02,0x00,0x02,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x07,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"?",31*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x18,0xC0,0x30,0x40,0x33,0xA0,0x26,0xA0,0x66,0xA0,0x65,0xA0,0x6D,0x20,0x6D,0x20,0x6D,0x20,0x6D,0x20,0x6D,0x40,0x27,0x80,0x30,0x20,0x30,0x40,0x18,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"@",32*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x0A,0x00,0x0B,0x00,0x09,0x00,0x09,0x00,0x11,0x00,0x11,0x80,0x10,0x80,0x1F,0x80,0x20,0xC0,0x20,0xC0,0x20,0x40,0x40,0x40,0x40,0x60,0xF0,0xF0,0x00,0x00,0x00,0x00,0x00,0x00},/*"A",33*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x31,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x31,0x80,0x3F,0x00,0x30,0xC0,0x30,0x40,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0xC0,0x7F,0x80,0x00,0x00,0x00,0x00,0x00,0x00},/*"B",34*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xC0,0x18,0xC0,0x30,0x60,0x30,0x20,0x20,0x20,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x20,0x30,0x20,0x30,0x40,0x18,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"C",35*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x31,0x80,0x30,0xC0,0x30,0xC0,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0xC0,0x30,0xC0,0x31,0x80,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"D",36*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xC0,0x60,0xC0,0x60,0x20,0x60,0x20,0x60,0x00,0x61,0x00,0x61,0x00,0x7F,0x00,0x61,0x00,0x61,0x00,0x61,0x00,0x60,0x00,0x60,0x20,0x60,0x20,0x60,0x40,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00},/*"E",37*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xC0,0x60,0xC0,0x60,0x20,0x60,0x20,0x60,0x00,0x61,0x00,0x61,0x00,0x7F,0x00,0x61,0x00,0x61,0x00,0x61,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"F",38*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x18,0x80,0x30,0x40,0x30,0x40,0x20,0x40,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x63,0xF0,0x60,0xC0,0x60,0xC0,0x30,0xC0,0x30,0xC0,0x18,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"G",39*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x7F,0xE0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0xF0,0xF0,0x00,0x00,0x00,0x00,0x00,0x00},/*"H",40*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xC0,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00},/*"I",41*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xE0,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x63,0x00,0x66,0x00,0x3C,0x00},/*"J",42*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF3,0xC0,0x61,0x80,0x63,0x00,0x62,0x00,0x64,0x00,0x68,0x00,0x6C,0x00,0x74,0x00,0x76,0x00,0x62,0x00,0x63,0x00,0x61,0x00,0x61,0x80,0x60,0x80,0x60,0xC0,0xF1,0xE0,0x00,0x00,0x00,0x00,0x00,0x00},/*"K",43*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF8,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x20,0x60,0x20,0x60,0x40,0xFF,0xC0,0x00,0x00,0x00,0x00,0x00,0x00},/*"L",44*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xE0,0x61,0xC0,0x61,0xC0,0x71,0xC0,0x71,0xC0,0x72,0xC0,0x72,0xC0,0x52,0xC0,0x5A,0xC0,0x5A,0xC0,0x5C,0xC0,0x4C,0xC0,0x4C,0xC0,0x4C,0xC0,0x48,0xC0,0xE1,0xE0,0x00,0x00,0x00,0x00,0x00,0x00},/*"M",45*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x71,0xF0,0x30,0x40,0x38,0x40,0x38,0x40,0x2C,0x40,0x2C,0x40,0x26,0x40,0x26,0x40,0x22,0x40,0x23,0x40,0x21,0x40,0x21,0xC0,0x21,0xC0,0x20,0xC0,0x20,0xC0,0xF8,0x40,0x00,0x00,0x00,0x00,0x00,0x00},/*"N",46*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,0x30,0x40,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x30,0x40,0x30,0xC0,0x19,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"O",47*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x60,0xC0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x61,0xC0,0x7F,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"P",48*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,0x30,0x40,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x6E,0x60,0x32,0x40,0x33,0xC0,0x19,0x80,0x0F,0x00,0x01,0xE0,0x00,0xC0,0x00,0x00},/*"Q",49*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x80,0x60,0xC0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0xC0,0x7F,0x00,0x62,0x00,0x63,0x00,0x61,0x00,0x61,0x80,0x60,0xC0,0x60,0xC0,0x60,0x60,0xF0,0x70,0x00,0x00,0x00,0x00,0x00,0x00},/*"R",50*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x40,0x30,0xC0,0x60,0x40,0x60,0x40,0x60,0x00,0x70,0x00,0x3C,0x00,0x1F,0x00,0x07,0xC0,0x01,0xC0,0x00,0xE0,0x40,0x60,0x40,0x60,0x60,0x60,0x30,0xC0,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00},/*"S",51*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xE0,0x46,0x20,0x86,0x10,0x86,0x10,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,0x00,0x00},/*"T",52*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0xE0,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x30,0x40,0x18,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"U",53*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xE0,0x60,0x40,0x20,0x80,0x20,0x80,0x30,0x80,0x30,0x80,0x11,0x00,0x11,0x00,0x19,0x00,0x19,0x00,0x0A,0x00,0x0A,0x00,0x0E,0x00,0x0C,0x00,0x04,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"V",54*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEF,0x70,0x46,0x20,0x42,0x20,0x62,0x20,0x62,0x20,0x26,0x40,0x26,0x40,0x27,0x40,0x27,0x40,0x39,0x40,0x39,0x80,0x19,0x80,0x19,0x80,0x11,0x80,0x11,0x00,0x11,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"W",55*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0xE0,0x30,0x80,0x10,0x80,0x18,0x80,0x09,0x00,0x0D,0x00,0x06,0x00,0x04,0x00,0x06,0x00,0x06,0x00,0x0B,0x00,0x09,0x00,0x11,0x80,0x10,0x80,0x20,0xC0,0x71,0xE0,0x00,0x00,0x00,0x00,0x00,0x00},/*"X",56*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0x60,0x20,0x20,0x40,0x30,0x40,0x10,0x80,0x18,0x80,0x1D,0x00,0x0D,0x00,0x0E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x1F,0x80,0x00,0x00,0x00,0x00,0x00,0x00},/*"Y",57*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xE0,0x30,0x40,0x60,0xC0,0x40,0x80,0x01,0x80,0x01,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0x08,0x00,0x18,0x00,0x10,0x20,0x30,0x20,0x20,0x40,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00},/*"Z",58*/ +{0x00,0x00,0x00,0x00,0x07,0xC0,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x07,0xC0,0x00,0x00},/*"[",59*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x20,0x00,0x10,0x00,0x10,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x04,0x00,0x04,0x00,0x02,0x00,0x02,0x00,0x03,0x00,0x01,0x00,0x01,0x00,0x00,0x80,0x00,0x80,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x20},/*"\",60*/ +{0x00,0x00,0x00,0x00,0x3E,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x3E,0x00,0x00,0x00},/*"]",61*/ +{0x00,0x00,0x06,0x00,0x09,0x00,0x10,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xF0},/*"_",63*/ +{0x00,0x00,0x00,0x00,0x18,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x80,0x30,0xC0,0x30,0xC0,0x00,0xC0,0x07,0xC0,0x38,0xC0,0x70,0xC0,0x60,0xC0,0x60,0xC0,0x71,0xD0,0x3E,0x70,0x00,0x00,0x00,0x00,0x00,0x00},/*"a",65*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x70,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x33,0x80,0x3C,0xC0,0x38,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x40,0x38,0xC0,0x27,0x80,0x00,0x00,0x00,0x00,0x00,0x00},/*"b",66*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x31,0x80,0x31,0x80,0x61,0x80,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x40,0x30,0x40,0x30,0x80,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"c",67*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x03,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x1E,0xC0,0x31,0xC0,0x30,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x20,0xC0,0x31,0xE0,0x1E,0x80,0x00,0x00,0x00,0x00,0x00,0x00},/*"d",68*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x18,0xC0,0x10,0x40,0x30,0x60,0x30,0x60,0x3F,0xE0,0x30,0x00,0x30,0x00,0x18,0x20,0x18,0x40,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00},/*"e",69*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x06,0x60,0x0C,0x60,0x0C,0x00,0x0C,0x00,0x7F,0x80,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x00},/*"f",70*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xE0,0x1B,0x60,0x31,0x80,0x31,0x80,0x31,0x80,0x19,0x80,0x1F,0x00,0x30,0x00,0x3F,0x00,0x33,0xC0,0x60,0xC0,0x60,0xC0,0x71,0xC0,0x1F,0x00},/*"g",71*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x70,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x37,0x80,0x38,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x79,0xE0,0x00,0x00,0x00,0x00,0x00,0x00},/*"h",72*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00},/*"i",73*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x80,0x0F,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x33,0x00,0x3E,0x00},/*"j",74*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x70,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x31,0xC0,0x31,0x00,0x31,0x00,0x32,0x00,0x36,0x00,0x3A,0x00,0x31,0x00,0x31,0x80,0x30,0x80,0x30,0xC0,0x79,0xE0,0x00,0x00,0x00,0x00,0x00,0x00},/*"k",75*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x3E,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x3F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00},/*"l",76*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEC,0xE0,0x77,0x60,0x66,0x60,0x66,0x60,0x66,0x60,0x66,0x60,0x66,0x60,0x66,0x60,0x66,0x60,0x66,0x60,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x00},/*"m",77*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x80,0x38,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x79,0xE0,0x00,0x00,0x00,0x00,0x00,0x00},/*"n",78*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x19,0x80,0x30,0xC0,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x60,0x30,0xC0,0x30,0xC0,0x0F,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"o",79*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x80,0x38,0xC0,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0x60,0x30,0xC0,0x38,0xC0,0x37,0x80,0x30,0x00,0x30,0x00,0x7C,0x00},/*"p",80*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1E,0x40,0x31,0xC0,0x30,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x20,0xC0,0x31,0xC0,0x1E,0xC0,0x00,0xC0,0x00,0xC0,0x03,0xE0},/*"q",81*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF9,0xC0,0x1A,0x60,0x1C,0x60,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"r",82*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xC0,0x38,0xC0,0x30,0x40,0x30,0x40,0x1C,0x00,0x0F,0x00,0x03,0xC0,0x20,0xC0,0x20,0xC0,0x31,0xC0,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x00},/*"s",83*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x04,0x00,0x0C,0x00,0x0C,0x00,0x7F,0x80,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x40,0x0C,0x40,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x00},/*"t",84*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x40,0x71,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x30,0xC0,0x39,0xE0,0x1E,0x80,0x00,0x00,0x00,0x00,0x00,0x00},/*"u",85*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0xE0,0x30,0x40,0x10,0x80,0x10,0x80,0x18,0x80,0x09,0x00,0x0D,0x00,0x0D,0x00,0x06,0x00,0x06,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"v",86*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEF,0x70,0x46,0x20,0x62,0x20,0x26,0x40,0x26,0x40,0x37,0x40,0x39,0x80,0x19,0x80,0x19,0x80,0x19,0x80,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"w",87*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3D,0xE0,0x18,0x80,0x08,0x80,0x0D,0x00,0x06,0x00,0x06,0x00,0x07,0x00,0x09,0x00,0x10,0x80,0x10,0xC0,0x79,0xE0,0x00,0x00,0x00,0x00,0x00,0x00},/*"x",88*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x79,0xE0,0x10,0x80,0x10,0x80,0x10,0x80,0x09,0x00,0x09,0x00,0x0D,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x04,0x00,0x04,0x00,0x24,0x00,0x38,0x00},/*"y",89*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x80,0x21,0x80,0x23,0x00,0x22,0x00,0x06,0x00,0x04,0x00,0x0C,0x00,0x18,0x40,0x10,0x40,0x30,0xC0,0x3F,0x80,0x00,0x00,0x00,0x00,0x00,0x00},/*"z",90*/ +{0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x02,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0xC0,0x00,0x00},/*"{",91*/ +{0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00},/*"|",92*/ +{0x00,0x00,0x00,0x00,0x30,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x30,0x00,0x00,0x00},/*"}",93*/ +{0x00,0x00,0x38,0x00,0x44,0x20,0x43,0x20,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"~",94*/ +}; + +//32*32 ASCII字符集点阵 +const unsigned char asc2_3216[95][128]={ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*" ",0*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x03,0xC0,0x01,0xC0,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x03,0xC0,0x03,0xC0,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"!",1*/ +{0x00,0x00,0x00,0x00,0x03,0x18,0x07,0x38,0x07,0x38,0x0E,0x70,0x0C,0x60,0x18,0xC0,0x31,0x80,0x21,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*""",2*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x04,0x08,0x7F,0xFE,0x7F,0xFE,0x7F,0xFE,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,0x7F,0xFE,0x7F,0xFE,0x7F,0xFE,0x18,0x30,0x10,0x20,0x10,0x20,0x10,0x20,0x10,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"#",3*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x03,0xC0,0x0D,0x30,0x09,0x18,0x19,0x18,0x19,0x38,0x19,0x38,0x1D,0x00,0x0D,0x00,0x0F,0x00,0x07,0x00,0x03,0xC0,0x01,0xE0,0x01,0xF0,0x01,0x30,0x01,0x38,0x01,0x18,0x39,0x18,0x39,0x18,0x31,0x18,0x31,0x30,0x19,0x60,0x07,0xC0,0x01,0x00,0x01,0x00,0x01,0x00,0x00,0x00},/*"$",4*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x10,0x6C,0x10,0x44,0x20,0xC6,0x20,0xC6,0x40,0xC6,0x40,0xC6,0x40,0xC6,0x80,0xC6,0x80,0x44,0x80,0x6D,0x38,0x39,0x6C,0x02,0x44,0x02,0xC6,0x02,0xC6,0x04,0xC6,0x04,0xC6,0x08,0xC6,0x08,0xC6,0x08,0x44,0x10,0x6C,0x10,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"%",5*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x00,0x19,0x00,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x80,0x31,0x00,0x33,0x00,0x3A,0x00,0x1C,0x00,0x38,0x7C,0x3C,0x10,0x4C,0x10,0xCE,0x10,0xC6,0x20,0xC7,0x20,0xC3,0x20,0xC1,0xC0,0xC1,0xC2,0x60,0xE6,0x31,0x7C,0x1E,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"&",6*/ +{0x00,0x00,0x00,0x00,0x38,0x00,0x3C,0x00,0x3C,0x00,0x0C,0x00,0x0C,0x00,0x08,0x00,0x30,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"'",7*/ +{0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x18,0x00,0x30,0x00,0x20,0x00,0x60,0x00,0x40,0x00,0xC0,0x00,0xC0,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x00,0xC0,0x00,0xC0,0x00,0x40,0x00,0x60,0x00,0x20,0x00,0x30,0x00,0x18,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x00},/*"(",8*/ +{0x00,0x00,0x00,0x00,0x40,0x00,0x20,0x00,0x10,0x00,0x18,0x00,0x0C,0x00,0x04,0x00,0x06,0x00,0x02,0x00,0x03,0x00,0x03,0x00,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x03,0x00,0x03,0x00,0x03,0x00,0x06,0x00,0x04,0x00,0x0C,0x00,0x18,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x00,0x00},/*")",9*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0xC0,0x01,0xC0,0x30,0xC6,0x38,0x8E,0x1C,0x9C,0x06,0xB0,0x01,0xC0,0x01,0xC0,0x06,0xB0,0x1C,0x9C,0x38,0x8E,0x31,0x86,0x01,0xC0,0x01,0xC0,0x01,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"*",10*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x3F,0xFE,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"+",11*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x3C,0x00,0x3C,0x00,0x0C,0x00,0x0C,0x00,0x08,0x00,0x30,0x00,0x60,0x00},/*",",12*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"-",13*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x3C,0x00,0x3C,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*".",14*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x06,0x00,0x04,0x00,0x0C,0x00,0x08,0x00,0x18,0x00,0x10,0x00,0x30,0x00,0x20,0x00,0x60,0x00,0x40,0x00,0xC0,0x00,0x80,0x01,0x80,0x01,0x00,0x03,0x00,0x02,0x00,0x06,0x00,0x04,0x00,0x0C,0x00,0x08,0x00,0x18,0x00,0x10,0x00,0x30,0x00,0x20,0x00,0x60,0x00,0x40,0x00,0x00,0x00,0x00,0x00},/*"/",15*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x06,0x20,0x0C,0x30,0x18,0x18,0x18,0x18,0x18,0x08,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x18,0x08,0x18,0x18,0x18,0x18,0x0C,0x30,0x06,0x20,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"0",16*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x80,0x1F,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x03,0xC0,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"1",17*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,0x08,0x38,0x10,0x18,0x20,0x0C,0x20,0x0C,0x30,0x0C,0x30,0x0C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x60,0x00,0xC0,0x01,0x80,0x03,0x00,0x02,0x00,0x04,0x04,0x08,0x04,0x10,0x04,0x20,0x0C,0x3F,0xF8,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"2",18*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xC0,0x18,0x60,0x30,0x30,0x30,0x18,0x30,0x18,0x30,0x18,0x00,0x18,0x00,0x18,0x00,0x30,0x00,0x60,0x03,0xC0,0x00,0x70,0x00,0x18,0x00,0x08,0x00,0x0C,0x00,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x08,0x30,0x18,0x18,0x30,0x07,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"3",19*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x60,0x00,0xE0,0x00,0xE0,0x01,0x60,0x01,0x60,0x02,0x60,0x04,0x60,0x04,0x60,0x08,0x60,0x08,0x60,0x10,0x60,0x30,0x60,0x20,0x60,0x40,0x60,0x7F,0xFC,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x03,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"4",20*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xFC,0x0F,0xFC,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x10,0x00,0x13,0xE0,0x14,0x30,0x18,0x18,0x10,0x08,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x30,0x0C,0x30,0x0C,0x20,0x18,0x20,0x18,0x18,0x30,0x07,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"5",21*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xE0,0x06,0x18,0x0C,0x18,0x08,0x18,0x18,0x00,0x10,0x00,0x10,0x00,0x30,0x00,0x33,0xE0,0x36,0x30,0x38,0x18,0x38,0x08,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x18,0x0C,0x18,0x08,0x0C,0x18,0x0E,0x30,0x03,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"6",22*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFC,0x1F,0xFC,0x10,0x08,0x30,0x10,0x20,0x10,0x20,0x20,0x00,0x20,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x80,0x00,0x80,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"7",23*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,0x0C,0x30,0x18,0x18,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x38,0x0C,0x38,0x08,0x1E,0x18,0x0F,0x20,0x07,0xC0,0x18,0xF0,0x30,0x78,0x30,0x38,0x60,0x1C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x30,0x18,0x18,0x30,0x07,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"8",24*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xC0,0x18,0x20,0x30,0x10,0x30,0x18,0x60,0x08,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x60,0x0C,0x70,0x1C,0x30,0x2C,0x18,0x6C,0x0F,0x8C,0x00,0x0C,0x00,0x18,0x00,0x18,0x00,0x10,0x30,0x30,0x30,0x60,0x30,0xC0,0x0F,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"9",25*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x03,0xC0,0x03,0xC0,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x03,0xC0,0x03,0xC0,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*":",26*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x03,0x80,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x03,0x80,0x03,0x80,0x01,0x80,0x03,0x00,0x03,0x00,0x00,0x00},/*";",27*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x01,0x00,0x00,0x80,0x00,0x40,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"<",28*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"=",29*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x04,0x00,0x02,0x00,0x01,0x00,0x00,0x80,0x00,0x40,0x00,0x20,0x00,0x10,0x00,0x08,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*">",30*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xE0,0x0C,0x18,0x18,0x0C,0x10,0x06,0x30,0x06,0x38,0x06,0x38,0x06,0x38,0x06,0x00,0x0C,0x00,0x18,0x00,0x70,0x00,0xC0,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x00,0x00,0x00,0x01,0x80,0x03,0xC0,0x03,0xC0,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"?",31*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xE0,0x06,0x10,0x0C,0x08,0x18,0x04,0x30,0xD4,0x31,0xB2,0x21,0x32,0x63,0x32,0x63,0x22,0x66,0x22,0x66,0x22,0x66,0x22,0x66,0x62,0x66,0x64,0x66,0x64,0x26,0xE8,0x33,0x30,0x30,0x02,0x10,0x04,0x18,0x0C,0x0C,0x18,0x03,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"@",32*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x03,0x80,0x03,0x80,0x03,0x80,0x04,0xC0,0x04,0xC0,0x04,0xC0,0x04,0xC0,0x0C,0x40,0x08,0x60,0x08,0x60,0x08,0x60,0x08,0x20,0x1F,0xF0,0x10,0x30,0x10,0x30,0x10,0x30,0x20,0x18,0x20,0x18,0x20,0x18,0x60,0x1C,0xF8,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"A",33*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xE0,0x18,0x38,0x18,0x18,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x18,0x18,0x30,0x1F,0xE0,0x18,0x18,0x18,0x0C,0x18,0x04,0x18,0x06,0x18,0x06,0x18,0x06,0x18,0x06,0x18,0x06,0x18,0x0C,0x18,0x18,0x7F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"B",34*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xE0,0x06,0x1C,0x08,0x0C,0x18,0x06,0x30,0x02,0x30,0x02,0x30,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x30,0x02,0x30,0x02,0x10,0x04,0x18,0x08,0x0C,0x10,0x03,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"C",35*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xC0,0x18,0x70,0x18,0x18,0x18,0x08,0x18,0x0C,0x18,0x0C,0x18,0x06,0x18,0x06,0x18,0x06,0x18,0x06,0x18,0x06,0x18,0x06,0x18,0x06,0x18,0x06,0x18,0x06,0x18,0x04,0x18,0x0C,0x18,0x0C,0x18,0x18,0x18,0x18,0x18,0x60,0x7F,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"D",36*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFC,0x18,0x0C,0x18,0x04,0x18,0x02,0x18,0x02,0x18,0x00,0x18,0x00,0x18,0x10,0x18,0x10,0x18,0x30,0x1F,0xF0,0x18,0x30,0x18,0x10,0x18,0x10,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x02,0x18,0x02,0x18,0x04,0x18,0x0C,0x7F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"E",37*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xFC,0x18,0x1C,0x18,0x04,0x18,0x02,0x18,0x02,0x18,0x00,0x18,0x00,0x18,0x10,0x18,0x10,0x18,0x30,0x1F,0xF0,0x18,0x30,0x18,0x10,0x18,0x10,0x18,0x10,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"F",38*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x0C,0x30,0x08,0x10,0x18,0x18,0x30,0x08,0x30,0x08,0x20,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x7E,0x60,0x18,0x60,0x18,0x20,0x18,0x30,0x18,0x30,0x18,0x10,0x18,0x18,0x18,0x0C,0x20,0x07,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"G",39*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x3F,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x3F,0xFC,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0xFC,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"H",40*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xF8,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"I",41*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xFE,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x00,0x60,0x70,0x60,0x70,0xC0,0x71,0x80,0x3F,0x00},/*"J",42*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x7C,0x18,0x30,0x18,0x20,0x18,0x60,0x18,0x40,0x18,0x80,0x18,0x80,0x19,0x00,0x19,0x00,0x1B,0x00,0x1D,0x80,0x1D,0x80,0x18,0xC0,0x18,0xC0,0x18,0x60,0x18,0x60,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x18,0x18,0x18,0x7E,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"K",43*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x02,0x18,0x02,0x18,0x04,0x18,0x0C,0x7F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"L",44*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x0F,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x1C,0x38,0x2C,0x2C,0x2C,0x2C,0x2C,0x2C,0x2C,0x2C,0x4C,0x2C,0x4C,0x26,0x4C,0x26,0x4C,0x26,0x4C,0x26,0x8C,0x22,0x8C,0x23,0x8C,0x23,0x8C,0x23,0x0C,0x23,0x0C,0x21,0x0C,0xF1,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"M",45*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x1F,0x38,0x04,0x38,0x04,0x2C,0x04,0x2C,0x04,0x26,0x04,0x26,0x04,0x23,0x04,0x23,0x04,0x21,0x84,0x21,0x84,0x20,0xC4,0x20,0xC4,0x20,0x64,0x20,0x64,0x20,0x34,0x20,0x34,0x20,0x1C,0x20,0x1C,0x20,0x0C,0x20,0x0C,0xF8,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"N",46*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x0C,0x30,0x18,0x18,0x10,0x08,0x30,0x0C,0x30,0x0C,0x60,0x04,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x20,0x06,0x30,0x0C,0x30,0x0C,0x10,0x08,0x18,0x18,0x0C,0x30,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"O",47*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xF0,0x18,0x18,0x18,0x0C,0x18,0x06,0x18,0x06,0x18,0x06,0x18,0x06,0x18,0x06,0x18,0x06,0x18,0x0C,0x18,0x18,0x1F,0xE0,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"P",48*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x0C,0x30,0x18,0x18,0x10,0x08,0x30,0x0C,0x30,0x0C,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x60,0x06,0x27,0x84,0x38,0xCC,0x38,0x6C,0x18,0x78,0x0C,0x70,0x03,0xE0,0x00,0x32,0x00,0x3C,0x00,0x1C,0x00,0x00},/*"Q",49*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xE0,0x18,0x38,0x18,0x18,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x18,0x18,0x30,0x1F,0xE0,0x18,0xC0,0x18,0xC0,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x18,0x18,0x18,0x7E,0x1E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"R",50*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xC8,0x18,0x78,0x30,0x18,0x60,0x18,0x60,0x08,0x60,0x08,0x60,0x00,0x70,0x00,0x3C,0x00,0x1F,0x00,0x07,0xC0,0x01,0xF0,0x00,0x78,0x00,0x18,0x00,0x1C,0x40,0x0C,0x40,0x0C,0x60,0x0C,0x20,0x0C,0x30,0x18,0x38,0x30,0x27,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"S",51*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xFC,0x31,0x84,0x21,0x86,0x41,0x82,0x41,0x82,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"T",52*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x3E,0x30,0x08,0x30,0x08,0x30,0x08,0x30,0x08,0x30,0x08,0x30,0x08,0x30,0x08,0x30,0x08,0x30,0x08,0x30,0x08,0x30,0x08,0x30,0x08,0x30,0x08,0x30,0x08,0x30,0x08,0x30,0x08,0x30,0x08,0x30,0x08,0x18,0x10,0x1C,0x20,0x07,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"U",53*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x1E,0x18,0x0C,0x18,0x08,0x18,0x08,0x18,0x08,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x20,0x06,0x20,0x06,0x20,0x06,0x20,0x06,0x40,0x03,0x40,0x03,0x40,0x03,0x40,0x03,0x80,0x01,0x80,0x01,0x80,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"V",54*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF3,0xCF,0x61,0x86,0x61,0x84,0x21,0x84,0x20,0x84,0x30,0xC4,0x31,0xC4,0x31,0xC4,0x31,0xC8,0x31,0xC8,0x11,0xC8,0x12,0x48,0x1A,0x68,0x1A,0x68,0x1A,0x70,0x1C,0x70,0x0C,0x70,0x0C,0x70,0x0C,0x30,0x0C,0x20,0x08,0x20,0x08,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"W",55*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x3E,0x18,0x08,0x18,0x10,0x0C,0x10,0x0C,0x20,0x06,0x20,0x06,0x40,0x03,0x40,0x03,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0xC0,0x02,0xC0,0x02,0x60,0x04,0x60,0x04,0x70,0x08,0x30,0x08,0x30,0x18,0x18,0x10,0x1C,0x7C,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"X",56*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x3E,0x38,0x08,0x18,0x08,0x18,0x10,0x0C,0x10,0x0C,0x10,0x0C,0x20,0x06,0x20,0x06,0x20,0x03,0x40,0x03,0x40,0x03,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x07,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"Y",57*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0xFE,0x1C,0x0C,0x18,0x0C,0x30,0x18,0x20,0x18,0x00,0x30,0x00,0x60,0x00,0x60,0x00,0xC0,0x00,0xC0,0x01,0x80,0x01,0x80,0x03,0x00,0x03,0x00,0x06,0x00,0x06,0x00,0x0C,0x00,0x18,0x02,0x18,0x06,0x30,0x04,0x30,0x1C,0x7F,0xFC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"Z",58*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xFC,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0xFC,0x00,0x00,0x00,0x00},/*"[",59*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x18,0x00,0x08,0x00,0x0C,0x00,0x04,0x00,0x06,0x00,0x06,0x00,0x02,0x00,0x03,0x00,0x01,0x00,0x01,0x80,0x01,0x80,0x00,0x80,0x00,0xC0,0x00,0x40,0x00,0x60,0x00,0x60,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x18,0x00,0x18,0x00,0x0C,0x00,0x0C,0x00,0x0C,0x00,0x06,0x00,0x00},/*"\",60*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x00,0xC0,0x3F,0xC0,0x00,0x00,0x00,0x00},/*"]",61*/ +{0x00,0x00,0x00,0x00,0x03,0xC0,0x03,0xE0,0x06,0x20,0x08,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"^",62*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF},/*"_",63*/ +{0x00,0x00,0x00,0x00,0x1E,0x00,0x03,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"`",64*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xE0,0x18,0x30,0x30,0x18,0x30,0x18,0x30,0x18,0x00,0x38,0x07,0xD8,0x1C,0x18,0x30,0x18,0x60,0x18,0x60,0x18,0x60,0x18,0x60,0x19,0x30,0x79,0x1F,0x8E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"a",65*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x78,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x19,0xE0,0x1A,0x38,0x1C,0x18,0x1C,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x08,0x1C,0x18,0x1C,0x30,0x13,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"b",66*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xE0,0x0E,0x10,0x0C,0x18,0x18,0x18,0x30,0x18,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x04,0x18,0x04,0x18,0x08,0x0C,0x10,0x03,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"c",67*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x78,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x07,0xD8,0x0C,0x38,0x18,0x18,0x18,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x10,0x18,0x18,0x38,0x0C,0x5E,0x07,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"d",68*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x0C,0x30,0x08,0x18,0x18,0x08,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x3F,0xFC,0x30,0x00,0x30,0x00,0x30,0x00,0x18,0x04,0x18,0x08,0x0E,0x18,0x03,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"e",69*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x01,0x86,0x01,0x06,0x03,0x06,0x03,0x00,0x03,0x00,0x03,0x00,0x3F,0xF8,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x1F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"f",70*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xEE,0x0C,0x36,0x08,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x08,0x18,0x0C,0x30,0x0F,0xE0,0x18,0x00,0x18,0x00,0x1F,0xC0,0x0F,0xF8,0x18,0x1C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x18,0x18,0x07,0xE0},/*"g",71*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x78,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x19,0xE0,0x1A,0x30,0x1C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"h",72*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x80,0x03,0xC0,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"i",73*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x78,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x03,0xF0,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x00,0x30,0x18,0x60,0x18,0x40,0x0F,0x80},/*"j",74*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x78,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x18,0x7C,0x18,0x30,0x18,0x20,0x18,0x40,0x18,0x80,0x19,0x80,0x1B,0x80,0x1E,0xC0,0x1C,0xC0,0x18,0x60,0x18,0x30,0x18,0x30,0x18,0x18,0x18,0x1C,0x7E,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"k",75*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x1F,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"l",76*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0xEF,0x3C,0x71,0xC6,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0x61,0x86,0xF3,0xCF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"m",77*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0xE0,0x7A,0x30,0x1C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"n",78*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x0C,0x30,0x08,0x18,0x18,0x18,0x10,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x30,0x0C,0x18,0x18,0x18,0x18,0x0C,0x30,0x03,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"o",79*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x09,0xE0,0x7A,0x30,0x1C,0x18,0x18,0x08,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x0C,0x18,0x18,0x1C,0x18,0x1E,0x30,0x19,0xE0,0x18,0x00,0x18,0x00,0x18,0x00,0x7E,0x00},/*"p",80*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC8,0x0C,0x78,0x18,0x38,0x18,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x30,0x18,0x10,0x18,0x18,0x38,0x0C,0x78,0x07,0x98,0x00,0x18,0x00,0x18,0x00,0x18,0x00,0x7E},/*"q",81*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x1C,0x7E,0x66,0x06,0x86,0x07,0x80,0x07,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x06,0x00,0x7F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"r",82*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xE4,0x06,0x1C,0x0C,0x0C,0x0C,0x04,0x0C,0x04,0x0E,0x00,0x07,0xC0,0x01,0xF0,0x00,0x78,0x00,0x1C,0x10,0x0C,0x10,0x0C,0x18,0x0C,0x1C,0x18,0x13,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"s",83*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x03,0x00,0x07,0x00,0x3F,0xF8,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x00,0x03,0x04,0x03,0x04,0x01,0x88,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"t",84*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x78,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x38,0x0C,0x5E,0x07,0x90,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"u",85*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x3E,0x18,0x0C,0x18,0x08,0x18,0x18,0x0C,0x10,0x0C,0x10,0x04,0x20,0x06,0x20,0x06,0x20,0x03,0x40,0x03,0x40,0x03,0xC0,0x01,0x80,0x01,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"v",86*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFB,0xCF,0x61,0x86,0x21,0x84,0x31,0x84,0x31,0x84,0x31,0xC8,0x11,0xC8,0x1A,0xC8,0x1A,0x48,0x1A,0x70,0x0E,0x70,0x0C,0x70,0x0C,0x30,0x0C,0x20,0x04,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"w",87*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3E,0x7C,0x0C,0x10,0x0E,0x10,0x06,0x20,0x03,0x40,0x03,0x40,0x01,0x80,0x01,0x80,0x01,0xC0,0x02,0x60,0x04,0x60,0x04,0x30,0x08,0x18,0x18,0x18,0x7C,0x7E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"x",88*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x3E,0x18,0x18,0x18,0x10,0x08,0x10,0x0C,0x10,0x04,0x20,0x06,0x20,0x06,0x20,0x02,0x40,0x03,0x40,0x01,0x40,0x01,0x80,0x01,0x80,0x01,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x3E,0x00,0x3C,0x00},/*"y",89*/ +{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0xF8,0x30,0x38,0x30,0x30,0x20,0x60,0x20,0xE0,0x00,0xC0,0x01,0x80,0x03,0x80,0x03,0x00,0x06,0x00,0x0E,0x04,0x0C,0x04,0x18,0x0C,0x30,0x18,0x3F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"z",90*/ +{0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x10,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0xC0,0x01,0x80,0x00,0x40,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x10,0x00,0x0C,0x00,0x00},/*"{",91*/ +{0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,0x80},/*"|",92*/ +{0x00,0x00,0x00,0x00,0x18,0x00,0x04,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x01,0x80,0x00,0xC0,0x01,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x02,0x00,0x04,0x00,0x18,0x00,0x00,0x00},/*"}",93*/ +{0x00,0x00,0x1E,0x00,0x23,0x00,0x41,0x82,0x40,0x82,0x00,0xE4,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"~",94*/ +}; +#endif diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/LCD_ST7789/lcd_spi2_drv.c b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/LCD_ST7789/lcd_spi2_drv.c new file mode 100644 index 00000000..b65e874b --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/LCD_ST7789/lcd_spi2_drv.c @@ -0,0 +1,730 @@ +/** + * @Copyright (c) 2019,mculover666 All rights reserved + * @filename lcd_spi2_drv.c + * @breif Drive LCD based on spi2 commucation interface + * @version + * v1.0 完成基本驱动程序,可以刷屏 mculover666 2019/7/10 + * v1.1 添加打点、画线、画矩形、画圆算法实现 mculover666 2019/7/12 + * v1.2 添加显示英文ASCII字符和字符串 mculover666 2019/7/12 + * v1.3 添加绘制六芒星函数(基于画线函数) mculover666 2019/7/12 + * v1.4 添加显示图片函数 mculover666 2019/7/13 + * v2.0 使用宏开关控制字符显示和图片显示 mculover666 2019/7/13 + * @note 移植说明(非常重要): + * 1. LCD_SPI_Send是LCD的底层发送函数,如果是不同的芯片或者SPI接口,使用CubeMX生成初始化代码, + * 先修改此"lcd_spi2_drv.h"的LCD控制引脚宏定义, + * 然后修改LCD_SPI_Send中的内容即可; + * 2. 如果使用的是ST7789V2液晶控制器,但是不同分辨率的屏幕,修改"lcd_spi2_drv.h"中的LCD_Width和LCD_Height宏定义即可; + * 3. LCD_Buf_Size请勿轻易修改,会影响几乎所有的函数,除非你明确的了解后果; + * 4. 此驱动程序需要spi.h和spi.c的支持; + * 5. 其余情况不适配此驱动代码; + * 6. 使用ASCII字符显示功能和图片显示功能请先在"lcd_spi2_drv.c"打开对应的宏开关; + * 7. 由于整数和浮点数情况较多,本驱动程序不包含,请使用sprintf控制格式,然后调用字符串显示函数,敬请谅解。 + */ + +#include "lcd_spi2_drv.h" +#include "spi.h" +#if USE_ASCII_FONT_LIB +#include "font.h" +#endif /* USE_ASCII_FONT_LIB */ + +#define LCD_TOTAL_BUF_SIZE (240*240*2) +#define LCD_Buf_Size 1152 + +static uint8_t lcd_buf[LCD_Buf_Size]; + +/** + * @brief SPI 发送字节函数 + * @param TxData 要发送的数据 + * @param size 发送数据的字节大小 + * @return 0:写入成功,其他:写入失败 + */ +static uint8_t SPI_WriteByte(uint8_t *TxData,uint16_t size) +{ + return HAL_SPI_Transmit(&hspi2,TxData,size,1000); +} + + +/** + *@brief LCD控制引脚初始化 + *@param none + *@retval none +*/ + +static void LCD_GPIO_Init(void) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(LCD_PWR_GPIO_Port, LCD_PWR_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOC, LCD_WR_RS_Pin|LCD_RST_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin : PtPin */ + GPIO_InitStruct.Pin = LCD_PWR_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(LCD_PWR_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pins : PCPin PCPin */ + GPIO_InitStruct.Pin = LCD_WR_RS_Pin|LCD_RST_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /* 复位LCD */ + LCD_PWR(0); + LCD_RST(0); + HAL_Delay(100); + LCD_RST(1); + + /* 初始化SPI2接口 */ + MX_SPI2_Init(); +} + +/** + * @brief LCD底层SPI发送数据函数 + * @param data —— 数据的起始地址 + * @param size —— 发送数据字节数 + * @return none + */ +static void LCD_SPI_Send(uint8_t *data, uint16_t size) +{ + SPI_WriteByte(data, size); +} + +/** + * @brief 写命令到LCD + * @param cmd —— 需要发送的命令 + * @return none + */ +static void LCD_Write_Cmd(uint8_t cmd) +{ + LCD_WR_RS(0); + LCD_SPI_Send(&cmd, 1); +} + +/** + * @brief 写数据到LCD + * @param dat —— 需要发送的数据 + * @return none + */ +static void LCD_Write_Data(uint8_t dat) +{ + LCD_WR_RS(1); + LCD_SPI_Send(&dat, 1); +} +/** + * @brief 写16位的数据(两个字节)到LCD + * @param dat —— 需要发送的16bit数据 + * @return none + */ +static void LCD_Write_2Byte(const uint16_t dat) +{ + uint8_t data[2] = {0}; + + data[0] = dat >> 8; + data[1] = dat; + + LCD_WR_RS(1); + LCD_SPI_Send(data, 2); +} +/** + * @brief 设置数据写入LCD缓存区域 + * @param x1,y1 —— 起点坐标 + * @param x2,y2 —— 终点坐标 + * @return none + */ +void LCD_Address_Set(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) +{ + LCD_Write_Cmd(0x2a); + LCD_Write_Data(x1 >> 8); + LCD_Write_Data(x1); + LCD_Write_Data(x2 >> 8); + LCD_Write_Data(x2); + + LCD_Write_Cmd(0x2b); + LCD_Write_Data(y1 >> 8); + LCD_Write_Data(y1); + LCD_Write_Data(y2 >> 8); + LCD_Write_Data(y2); + + LCD_Write_Cmd(0x2C); +} +/** + * @breif 打开LCD显示背光 + * @param none + * @return none + */ +void LCD_DisplayOn(void) +{ + LCD_PWR(1); +} +/** + * @brief 关闭LCD显示背光 + * @param none + * @return none + */ +void LCD_DisplayOff(void) +{ + LCD_PWR(0); +} +/** + * @brief 以一种颜色清空LCD屏 + * @param color —— 清屏颜色(16bit) + * @return none + */ +void LCD_Clear(uint16_t color) +{ + uint16_t i, j; + uint8_t data[2] = {0}; //LCD屏幕色彩深度16bit,data[0]是颜色数据的高位,data[1]是颜色数据的低位 + + data[0] = color >> 8; + data[1] = color; + + LCD_Address_Set(0, 0, LCD_Width - 1, LCD_Height - 1); + + for(j = 0; j < LCD_Buf_Size / 2; j++) + { + lcd_buf[j * 2] = data[0]; + lcd_buf[j * 2 + 1] = data[1]; + } + + LCD_WR_RS(1); + + for(i = 0; i < (LCD_TOTAL_BUF_SIZE / LCD_Buf_Size); i++) + { + LCD_SPI_Send(lcd_buf, LCD_Buf_Size); + } +} +/** + * @brief LCD初始化 + * @param none + * @return none + */ +void LCD_Init(void) +{ + LCD_GPIO_Init(); + + HAL_Delay(120); + + /* Sleep Out */ + LCD_Write_Cmd(0x11); + /* wait for power stability */ + HAL_Delay(120); + + /* Memory Data Access Control */ + LCD_Write_Cmd(0x36); + LCD_Write_Data(0x00); + + /* RGB 5-6-5-bit */ + LCD_Write_Cmd(0x3A); + LCD_Write_Data(0x65); + + /* Porch Setting */ + LCD_Write_Cmd(0xB2); + LCD_Write_Data(0x0C); + LCD_Write_Data(0x0C); + LCD_Write_Data(0x00); + LCD_Write_Data(0x33); + LCD_Write_Data(0x33); + + /* Gate Control */ + LCD_Write_Cmd(0xB7); + LCD_Write_Data(0x72); + + /* VCOM Setting */ + LCD_Write_Cmd(0xBB); + LCD_Write_Data(0x3D); //Vcom=1.625V + + /* LCM Control */ + LCD_Write_Cmd(0xC0); + LCD_Write_Data(0x2C); + + /* VDV and VRH Command Enable */ + LCD_Write_Cmd(0xC2); + LCD_Write_Data(0x01); + + /* VRH Set */ + LCD_Write_Cmd(0xC3); + LCD_Write_Data(0x19); + + /* VDV Set */ + LCD_Write_Cmd(0xC4); + LCD_Write_Data(0x20); + + /* Frame Rate Control in Normal Mode */ + LCD_Write_Cmd(0xC6); + LCD_Write_Data(0x0F); //60MHZ + + /* Power Control 1 */ + LCD_Write_Cmd(0xD0); + LCD_Write_Data(0xA4); + LCD_Write_Data(0xA1); + + /* Positive Voltage Gamma Control */ + LCD_Write_Cmd(0xE0); + LCD_Write_Data(0xD0); + LCD_Write_Data(0x04); + LCD_Write_Data(0x0D); + LCD_Write_Data(0x11); + LCD_Write_Data(0x13); + LCD_Write_Data(0x2B); + LCD_Write_Data(0x3F); + LCD_Write_Data(0x54); + LCD_Write_Data(0x4C); + LCD_Write_Data(0x18); + LCD_Write_Data(0x0D); + LCD_Write_Data(0x0B); + LCD_Write_Data(0x1F); + LCD_Write_Data(0x23); + + /* Negative Voltage Gamma Control */ + LCD_Write_Cmd(0xE1); + LCD_Write_Data(0xD0); + LCD_Write_Data(0x04); + LCD_Write_Data(0x0C); + LCD_Write_Data(0x11); + LCD_Write_Data(0x13); + LCD_Write_Data(0x2C); + LCD_Write_Data(0x3F); + LCD_Write_Data(0x44); + LCD_Write_Data(0x51); + LCD_Write_Data(0x2F); + LCD_Write_Data(0x1F); + LCD_Write_Data(0x1F); + LCD_Write_Data(0x20); + LCD_Write_Data(0x23); + + /* Display Inversion On */ + LCD_Write_Cmd(0x21); + + LCD_Write_Cmd(0x29); + + LCD_Address_Set(0, 0, LCD_Width - 1, LCD_Height - 1); + + LCD_Clear(WHITE); + + /*打开显示*/ + LCD_PWR(1); +} +/** + * @brief 带颜色画点函数 + * @param x,y —— 画点坐标 + * @return none + */ +void LCD_Draw_ColorPoint(uint16_t x, uint16_t y,uint16_t color) +{ + LCD_Address_Set(x, y, x, y); + LCD_Write_2Byte(color); +} +/** + * @brief 带颜色画线函数(直线、斜线) + * @param x1,y1 起点坐标 + * @param x2,y2 终点坐标 + * @return none + */ +void LCD_Draw_ColorLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color) +{ + uint16_t i = 0; + int16_t delta_x = 0, delta_y = 0; + int8_t incx = 0, incy = 0; + uint16_t distance = 0; + uint16_t t = 0; + uint16_t x = 0, y = 0; + uint16_t x_temp = 0, y_temp = 0; + + + if(y1 == y2) + { + /* 快速画水平线 */ + LCD_Address_Set(x1, y1, x2, y2); + + for(i = 0; i < x2 - x1; i++) + { + lcd_buf[2 * i] = color >> 8; + lcd_buf[2 * i + 1] = color; + } + + LCD_WR_RS(1); + LCD_SPI_Send(lcd_buf, (x2 - x1) * 2); + return; + } + else + { + /* 画斜线(Bresenham算法) */ + /* 计算两点之间在x和y方向的间距,得到画笔在x和y方向的步进值 */ + delta_x = x2 - x1; + delta_y = y2 - y1; + if(delta_x > 0) + { + //斜线(从左到右) + incx = 1; + } + else if(delta_x == 0) + { + //垂直斜线(竖线) + incx = 0; + } + else + { + //斜线(从右到左) + incx = -1; + delta_x = -delta_x; + } + if(delta_y > 0) + { + //斜线(从左到右) + incy = 1; + } + else if(delta_y == 0) + { + //水平斜线(水平线) + incy = 0; + } + else + { + //斜线(从右到左) + incy = -1; + delta_y = -delta_y; + } + + /* 计算画笔打点距离(取两个间距中的最大值) */ + if(delta_x > delta_y) + { + distance = delta_x; + } + else + { + distance = delta_y; + } + + /* 开始打点 */ + x = x1; + y = y1; + //第一个点无效,所以t的次数加一 + for(t = 0; t <= distance + 1;t++) + { + LCD_Draw_ColorPoint(x, y, color); + + /* 判断离实际值最近的像素点 */ + x_temp += delta_x; + if(x_temp > distance) + { + //x方向越界,减去距离值,为下一次检测做准备 + x_temp -= distance; + //在x方向递增打点 + x += incx; + + } + y_temp += delta_y; + if(y_temp > distance) + { + //y方向越界,减去距离值,为下一次检测做准备 + y_temp -= distance; + //在y方向递增打点 + y += incy; + } + } + } +} +/** + * @breif 带颜色画矩形函数 + * @param x1,y1 —— 矩形起始点 + * @param x2,y2 —— 矩形终点 + * @param color —— 颜色 + * @retval none + */ +void LCD_Draw_ColorRect(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color) +{ + LCD_Draw_ColorLine(x1,y1,x2,y1,color); + LCD_Draw_ColorLine(x1,y1,x1,y2,color); + LCD_Draw_ColorLine(x1,y2,x2,y2,color); + LCD_Draw_ColorLine(x2,y1,x2,y2,color); +} +/** + * @breif 带颜色画圆函数 + * @param x1,x2 —— 圆心坐标 + * @param r —— 半径 + * @param color —— 颜色 + * @retval none + */ +void LCD_Draw_ColorCircle(uint16_t x, uint16_t y, uint16_t r, uint16_t color) +{ + /* Bresenham画圆算法 */ + int16_t a = 0, b = r; + int16_t d = 3 - (r << 1); //算法决策参数 + + /* 如果圆在屏幕可见区域外,直接退出 */ + if (x - r < 0 || x + r > LCD_Width || y - r < 0 || y + r > LCD_Height) + { + return; + } + + /* 开始画圆 */ + while(a <= b) + { + LCD_Draw_ColorPoint(x - b, y - a, color); + LCD_Draw_ColorPoint(x + b, y - a, color); + LCD_Draw_ColorPoint(x - a, y + b, color); + LCD_Draw_ColorPoint(x - b, y - a, color); + LCD_Draw_ColorPoint(x - a, y - b, color); + LCD_Draw_ColorPoint(x + b, y + a, color); + LCD_Draw_ColorPoint(x + a, y - b, color); + LCD_Draw_ColorPoint(x + a, y + b, color); + LCD_Draw_ColorPoint(x - b, y + a, color); + a++; + + if(d < 0) + { + d += 4 * a + 6; + } + else + { + d += 10 + 4 * (a - b); + b--; + } + + LCD_Draw_ColorPoint(x + a, y + b, color); + } +} +/** + * @brief 以一种颜色填充/清空某个矩形区域 + * @param color —— 清屏颜色(16bit) + * @return none + */ +void LCD_Fill(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color) +{ + uint16_t i = 0; + uint32_t size = 0, size_remain = 0; + + size = (x2 - x1 + 1) * (y2 - y1 + 1) * 2; + + if(size > LCD_Buf_Size) + { + size_remain = size - LCD_Buf_Size; + size = LCD_Buf_Size; + } + + LCD_Address_Set(x1, y1, x2, y2); + + while(1) + { + for(i = 0; i < size / 2; i++) + { + lcd_buf[2 * i] = color >> 8; + lcd_buf[2 * i + 1] = color; + } + + LCD_WR_RS(1); + LCD_SPI_Send(lcd_buf, size); + + if(size_remain == 0) + break; + + if(size_remain > LCD_Buf_Size) + { + size_remain = size_remain - LCD_Buf_Size; + } + + else + { + size = size_remain; + size_remain = 0; + } + } +} +#if USE_ASCII_FONT_LIB +/** + * @brief 显示一个ASCII码字符 + * @param x,y 显示起始坐标 + * @param ch 需要显示的字符 + * @param size 字体大小(支持16/24/32号字体) + * @return none + * @note 需要font.h字库文件的支持 + */ +void LCD_ShowChar(uint16_t x, uint16_t y, char ch, uint16_t back_color, uint16_t font_color, uint8_t font_size) +{ + int i = 0, j = 0; + uint8_t temp = 0; + uint8_t size = 0; + uint8_t t = 0; + + /* 检测显示是否会越界 */ + if((x > (LCD_Width - font_size / 2)) || (y > (LCD_Height - font_size))) + return; + + /* 根据字符大小设置显存操作区域 */ + LCD_Address_Set(x, y, x + font_size/2 - 1, y + font_size - 1); + + /* 计算字符在字库中的偏移值*/ + ch = ch - ' '; + + /* 显示16号/32号字体 */ + if((font_size == 16) || (font_size == 32) ) + { + /* 计算字体一个字符对应点阵集所占的字节数 */ + size = (font_size / 8 + ((font_size % 8) ? 1 : 0)) * (font_size / 2); + + for(i = 0; i < size; i++) + { + if(font_size == 16) + temp = asc2_1608[ch][i]; //调用1608字体 + else if(font_size == 32) + temp = asc2_3216[ch][i]; //调用3216字体 + else + return; //没有的字库 + + for(j = 0; j < 8; j++) + { + if(temp & 0x80) + LCD_Write_2Byte(font_color); + else + LCD_Write_2Byte(back_color); + + temp <<= 1; + } + } + } + /* 显示12号字体 */ + else if(font_size == 12) + { + /* 计算字体一个字符对应点阵集所占的字节数 */ + size = (font_size / 8 + ((font_size % 8) ? 1 : 0)) * (font_size / 2); + + for(i = 0; i < size; i++) + { + temp = asc2_1206[ch][i]; + + for(j = 0; j < 6; j++) + { + if(temp & 0x80) + LCD_Write_2Byte(font_color); + else + LCD_Write_2Byte(back_color); + + temp <<= 1; + } + } + } + /* 显示24号字体 */ + else if(font_size == 24) + { + /* 计算字体一个字符对应点阵集所占的字节数 */ + size = (font_size * 16) / 8; + + for(i = 0; i < size; i++) + { + temp = asc2_2412[ch][i]; + if(i % 2 == 0) + t = 8; + else + t = 4; + for(j = 0; j < t; j++) + { + if(temp & 0x80) + LCD_Write_2Byte(font_color); + else + LCD_Write_2Byte(back_color); + + temp <<= 1; + } + } + } + /* 其余字体 */ + else + return; +} +/** + * @brief 显示一个ASCII码字符串 + * @param x,y 显示起始坐标 + * @param str 需要显示的字符串 + * @param size 字体大小(支持16/24/32号字体) + * @return none + * @note 1. 需要font.h字库文件的支持 + * 2. 超过指定width不显示超过的字符 + */ +void LCD_ShowCharStr(uint16_t x, uint16_t y, char* str, uint16_t back_color, uint16_t font_color, uint8_t font_size) +{ + while((*str <= '~') && (*str >= ' ')) //判断是否非法字符 + { + LCD_ShowChar(x,y,*str,back_color, font_color,font_size); + x += font_size / 2; + str++; + } +} +#endif /* USE_ASCII_FONT_LIB */ +/** + * @breif 带颜色画六芒星函数 + * @param x,y —— 六芒星中心点 + * @param r —— 六芒星半径 + * @param color —— 颜色 + * @retval none + */ +void LCD_Draw_ColorSixPointStar(uint16_t x, uint16_t y, uint8_t r, uint16_t color) +{ + uint16_t a = r / 2; + uint16_t b = 1.432*r; + + /* 绘制倒三角 */ + LCD_Draw_ColorLine(x-b,y-a,x+b,y-a,color); + LCD_Draw_ColorLine(x+b,y-a,x,y+r,color); + LCD_Draw_ColorLine(x,y+r,x-b,y-a,color); + + /* 绘制正三角 */ + LCD_Draw_ColorLine(x-b,y+a,x+b,y+a,color); + LCD_Draw_ColorLine(x+b,y+a,x,y-r,color); + LCD_Draw_ColorLine(x,y-r,x-b,y+a,color); + +} + +#if USE_PICTURE_DISPLAY +/** + * @brief 显示图片函数 + * @param x,y —— 起点坐标 + * @param width —— 图片宽度 + * @param height —— 图片高度 + * @param p —— 图片缓存数据起始地址 + * @return none + * @note Image2Lcd取模方式:C语言数据/水平扫描/16位真彩色(RGB565)/高位在前,其他的不选 + */ +void LCD_Show_Image(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint8_t *p) +{ + uint32_t img_size = width * height * 2; //图片所占字节数 + uint32_t remain_size = img_size; //图片每次发送后剩余的字节数 + uint8_t i = 0; + + /* 错误检测 */ + if(x + width > LCD_Width || y + height > LCD_Height) + { + return; + } + + LCD_Address_Set(x, y, x + width - 1, y + height - 1); + + LCD_WR_RS(1); + + /* SPI每次最大发送2^16 = 65536个数据,图片最大大小为240*240*2 = 115200,会超过此大小,所以设计循环发送算法 */ + for(i = 0;i <= img_size / 65536; i++) + { + if(remain_size / 65536 >= 1) + { + LCD_SPI_Send((uint8_t *)p, 65535); + p += 65535; + remain_size -= 65535; + } + else + { + LCD_SPI_Send((uint8_t *)p, remain_size % 65535); + } + + } +} +#endif /* USE_PICTURE_DISPLAY */ diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/LCD_ST7789/lcd_spi2_drv.h b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/LCD_ST7789/lcd_spi2_drv.h new file mode 100644 index 00000000..5ea63071 --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/LCD_ST7789/lcd_spi2_drv.h @@ -0,0 +1,73 @@ +/** + * @Copyright (c) 2019,mculover666 All rights reserved + * @filename lcd_spi2_drv.h + * @breif Drive LCD based on spi2 commucation interface + * @version + * v1.0 完成基本驱动程序,可以刷屏 mculover666 2019/7/10 + * v1.1 添加打点、画线、画矩形、画圆算法实现 mculover666 2019/7/12 + * v1.2 添加显示英文ASCII字符和字符串 mculover666 2019/7/12 + * v1.3 添加绘制六芒星函数(基于画线函数) mculover666 2019/7/12 + * v1.4 添加显示图片函数 mculover666 2019/7/13 + * v2.0 使用宏开关控制字符显示和图片显示 mculover666 2019/7/13 + * @note 移植说明(非常重要): + * 1. LCD_SPI_Send是LCD的底层发送函数,如果是不同的芯片或者SPI接口,使用CubeMX生成初始化代码, + * 先修改此"lcd_spi2_drv.h"的LCD控制引脚宏定义, + * 然后修改LCD_SPI_Send中的内容即可; + * 2. 如果使用的是ST7789V2液晶控制器,但是不同分辨率的屏幕,修改"lcd_spi2_drv.h"中的LCD_Width和LCD_Height宏定义即可; + * 3. LCD_Buf_Size请勿轻易修改,会影响几乎所有的函数,除非你明确的了解后果; + * 4. 此驱动程序需要spi.h和spi.c的支持; + * 5. 其余情况不适配此驱动代码; + * 6. 使用ASCII字符显示功能和图片显示功能请先在"lcd_spi2_drv.c"打开对应的宏开关; + * 7. 由于整数和浮点数情况较多,本驱动程序不包含,请使用sprintf控制格式,然后调用字符串显示函数,敬请谅解。 + */ + +#ifndef _LCD_SPI2_DRV_H_ +#define _LCD_SPI2_DRV_H_ + +#include "stm32l4xx_hal.h" + +/* 宏定义开关 */ +#define USE_ASCII_FONT_LIB 1 //使用ASCII字符显示请打开该宏(值设为1) +#define USE_PICTURE_DISPLAY 1 //使用图片显示请打开该宏(值设为1) + +#define LCD_PWR(n) (n?HAL_GPIO_WritePin(LCD_PWR_GPIO_Port,LCD_PWR_Pin,GPIO_PIN_SET):HAL_GPIO_WritePin(LCD_PWR_GPIO_Port,LCD_PWR_Pin,GPIO_PIN_RESET)) +#define LCD_WR_RS(n) (n?HAL_GPIO_WritePin(LCD_WR_RS_GPIO_Port,LCD_WR_RS_Pin,GPIO_PIN_SET):HAL_GPIO_WritePin(LCD_WR_RS_GPIO_Port,LCD_WR_RS_Pin,GPIO_PIN_RESET)) +#define LCD_RST(n) (n?HAL_GPIO_WritePin(LCD_RST_GPIO_Port,LCD_RST_Pin,GPIO_PIN_SET):HAL_GPIO_WritePin(LCD_RST_GPIO_Port,LCD_RST_Pin,GPIO_PIN_RESET)) +#define LCD_Width 240 +#define LCD_Height 240 + +//画笔颜色 +#define WHITE 0xFFFF //白色 +#define YELLOW 0xFFE0 //黄色 +#define BRRED 0XFC07 //棕红色 +#define PINK 0XF81F //粉色 +#define RED 0xF800 //红色 +#define BROWN 0XBC40 //棕色 +#define GRAY 0X8430 //灰色 +#define GBLUE 0X07FF //兰色 +#define GREEN 0x07E0 //绿色 +#define BLUE 0x001F //蓝色 +#define BLACK 0x0000 //黑色 + + + +void LCD_Address_Set(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2); +void LCD_DisplayOn(void); +void LCD_DisplayOff(void); +void LCD_Clear(uint16_t color); +void LCD_Init(void); //LCD初始化函数 +void LCD_Draw_ColorPoint(uint16_t x, uint16_t y,uint16_t color); +void LCD_Draw_ColorLine(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color); +void LCD_Draw_ColorRect(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color); +void LCD_Draw_ColorCircle(uint16_t x, uint16_t y, uint16_t r, uint16_t color); +void LCD_Fill(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color); +#if USE_ASCII_FONT_LIB +void LCD_ShowChar(uint16_t x, uint16_t y, char ch, uint16_t back_color, uint16_t font_color, uint8_t font_size); +void LCD_ShowCharStr(uint16_t x, uint16_t y, char* str, uint16_t back_color, uint16_t font_color, uint8_t font_size); +#endif /* USE_ASCII_FONT_LIB */ +void LCD_Draw_ColorSixPointStar(uint16_t x, uint16_t y, uint8_t r, uint16_t color); +#if USE_PICTURE_DISPLAY +void LCD_Show_Image(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint8_t *p); +#endif /*USE_PICTURE_DISPLAY */ + +#endif /* _LCD_SPI2_DRV_H_ */ diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/LCD_ST7789/logo.h b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/LCD_ST7789/logo.h new file mode 100644 index 00000000..8c3ad4af --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Hardware/LCD_ST7789/logo.h @@ -0,0 +1,1652 @@ +const unsigned char gImage_logo[26400] = { /* 0X10,0X10,0X00,0XF0,0X00,0X37,0X01,0X1B, */ +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC6,0XBE,0X2B,0X9B, +0X02,0XBB,0X43,0XFC,0XE7,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XEF,0X9F,0X2B,0X7B,0X02,0X1A,0X02,0X9B, +0X02,0XBB,0X02,0X7B,0X01,0XFA,0X4C,0X1C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X5C,0X7C,0X01,0XFA,0X02,0X7B,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X7B,0X02,0X1A,0X7D,0X3D,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X8D,0X9D,0X02,0X1A,0X02,0X5B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X5A,0X02,0X7B,0XB6,0X5E, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC6,0X9E, +0X02,0X9B,0X02,0X3A,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B,0X02,0X1A, +0X1B,0X3B,0XE7,0X5F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XEF,0X9F,0X2B,0X7B,0X02,0X1A, +0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0X9B,0X01,0XFA,0X4C,0X3C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X5C,0X7C,0X01,0XFA,0X02,0X7B,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0X7B,0X02,0X1A,0X85,0X3D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X95,0X9D,0X02,0X1A,0X02,0X5B,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X5A,0X02,0X7B,0XB6,0X5E,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XC6,0X9E,0X02,0XBB,0X02,0X3A,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B, +0X02,0X5A,0X02,0X7B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B,0X02,0X1A,0X23,0X3B, +0XE7,0X5F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XEF,0X9F,0X2B,0X7B, +0X02,0X1A,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B,0X02,0X9B, +0X95,0X9D,0X4C,0X1C,0X01,0XFA,0X02,0X7B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B, +0X01,0XFA,0X54,0X3C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X5C,0X7C,0X01,0XFA,0X02,0X7B, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X3A,0XF7,0XBF, +0X85,0X5D,0XCE,0XDE,0XEF,0X7F,0X2B,0X7B,0X02,0X1A,0X02,0X9B,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0X7B,0X02,0X1A,0X85,0X5D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X95,0X9D,0X02,0X1A,0X02,0X5A,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X1A,0XFF,0XFF, +0X01,0XDA,0X01,0X9A,0XFF,0XFF,0XFF,0XFF,0XD6,0XFE,0X23,0X3B,0X02,0X1A,0X02,0X9B, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X5A,0X02,0X7B,0XB6,0X7E,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XC6,0XBE,0X02,0XBB,0X02,0X3A,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X7B,0X33,0X9B, +0XFF,0XFF,0XD7,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC6,0XBE,0X12,0XFB, +0X02,0X1A,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B,0X02,0X1A,0X23,0X5B,0XEF,0X7F, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XAE,0X3E,0X01,0XDA,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X7B, +0X02,0X5A,0X8D,0X7D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XB6,0X7E,0X0A,0XBB,0X02,0X3A,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X7B,0X01,0XDA, +0XDF,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X1B,0X1B,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0X9B,0X02,0X5A,0X02,0X3A,0X85,0X5D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XAE,0X1E,0X02,0X9B,0X02,0X3A,0X02,0X9B,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X7B, +0X33,0XBC,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0X9B,0X02,0X5A,0X02,0X5A,0X8D,0X9D,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X9D,0XDD,0X02,0X7B,0X02,0X3A,0X02,0X9B, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B, +0X23,0X5B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B,0X02,0X3A,0X02,0X5A,0X95,0XBD, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8D,0X9D,0X02,0X3A, +0X02,0X5A,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B, +0X23,0X5B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X7B, +0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B,0X02,0X3A, +0X02,0X5A,0X9D,0XDD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X85,0X3D,0X02,0X1A,0X02,0X7B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B, +0X23,0X5B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XAE,0X3E,0X74,0XFD,0X6C,0XDD,0XCE,0XDE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X7B,0X85,0X5D, +0X02,0X9B,0X02,0X3A,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0X9B,0X02,0X3A,0X02,0X7B,0XA5,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X4C,0X1C,0X02,0X7B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B, +0X23,0X5B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0X5F,0X02,0X9B,0X13,0X1B,0X13,0X1B, +0X13,0X1B,0X13,0X1B,0X13,0X1B,0X13,0X1B,0X13,0X1B,0X13,0X1B,0X13,0X1B,0X0A,0XDB, +0X7D,0X3D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBE,0X9E,0XBE,0X7E,0XB6,0X5E,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X95,0X9D,0X1B,0X1B, +0X02,0X7A,0X02,0X5A,0X02,0X5A,0X02,0X5A,0X02,0X5A,0X02,0X5A,0X02,0X7B,0X23,0X3B, +0X95,0X9D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X9D,0XFE,0X3B,0XBC, +0X1B,0X1B,0X13,0X1B,0X13,0X1B,0X13,0X1B,0X13,0X1B,0X13,0X1B,0X12,0XFB,0X12,0XDB, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XB6,0X5E,0XBE,0X7E,0XBE,0X7E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X23,0X5B,0X02,0X3A,0X01,0XDA,0XC6,0XBE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X1A,0XEF,0XBF, +0XFF,0XFF,0X95,0XBD,0X02,0X5A,0X02,0X3A,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0X9B,0X02,0X3A,0X02,0X9B,0XA6,0X1E,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X8D,0X7D,0X02,0X5A,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B, +0X23,0X5B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X9D,0XFE,0X02,0X1A,0X02,0X7B,0X02,0X7B, +0X02,0X7B,0X02,0X9B,0X02,0X9B,0X02,0X9B,0X02,0X7B,0X02,0X7B,0X02,0X7B,0X01,0XFA, +0XA6,0X1E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X01,0X9A,0X02,0X3A,0X02,0X3A,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X5C,0X7C,0X02,0X1A,0X02,0X9B, +0X02,0X9B,0X02,0X7B,0X02,0X7B,0X02,0X7B,0X02,0X7B,0X02,0X7B,0X02,0X9B,0X02,0X9B, +0X01,0XFA,0X6C,0XDD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8D,0X7D,0X01,0XFA,0X02,0X7B, +0X02,0X7B,0X02,0X7B,0X02,0X7B,0X02,0X7B,0X02,0X7B,0X02,0X7B,0X02,0X1A,0X7D,0X1D, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XEF,0X7F, +0X01,0XBA,0X02,0X1A,0X1B,0X3B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X02,0X1A,0X02,0X5A,0X01,0X9A,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X1A,0XE7,0X5F, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X95,0X9D,0X02,0X5A,0X02,0X5A,0X02,0X9B,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B,0X02,0X3A,0X01,0XBA,0X85,0X5D,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X85,0X5D,0X02,0X5A,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B, +0X23,0X5B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X85,0X5D,0X1B,0X3B,0X2B,0X7B,0X2B,0X7B, +0X23,0X5B,0X02,0X9B,0X02,0XBB,0X02,0X9B,0X2B,0X9C,0X2B,0X7B,0X2B,0X7B,0X13,0X1B, +0XEF,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDF,0X3F,0X02,0X3A,0X02,0X7B,0X3B,0XDC,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XBF,0X01,0XFA,0X02,0XBB,0X02,0X7B, +0X0A,0XBB,0X5C,0X7C,0X5C,0X7C,0X5C,0X7C,0X5C,0X7C,0X4C,0X1C,0X02,0X5A,0X02,0XBB, +0X02,0X9B,0X02,0X5A,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0X7A,0X02,0X9B,0X02,0X9B, +0X0A,0XDB,0X3B,0XBC,0X33,0XBC,0X33,0XBC,0X33,0XBC,0X33,0XBC,0X23,0X3B,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XAE,0X3E, +0X02,0X3A,0X02,0X5B,0X6C,0XDD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X85,0X5D,0X95,0XBD,0X8D,0X9D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X1A,0XE7,0X5F, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8D,0X7D,0X02,0X5A,0X02,0X5A, +0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0X9B,0X02,0X5A,0X02,0X3A,0X7D,0X3D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X8D,0X9D,0X02,0X5A,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B, +0X23,0X5B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XA5,0XFE,0X02,0X5A,0X02,0X7B,0X3B,0XDC,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XAE,0X1E,0X02,0X5A,0X02,0X5A,0X85,0X3D,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8D,0X7D,0X02,0X5A,0X02,0X9B,0X0A,0XBB, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDF,0X3F,0X02,0X3A, +0X02,0XBB,0X02,0X3A,0XFF,0XFF,0XFF,0XFF,0XF7,0XBF,0X01,0XFA,0X02,0XBB,0X02,0X1A, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7D,0X1D, +0X02,0X5A,0X02,0X5A,0XB6,0X5E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X1A,0XEF,0X9F, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X85,0X5D, +0X02,0X3A,0X02,0X5A,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B, +0X02,0X5A,0X02,0X3A,0X85,0X3D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XB6,0X7E,0X12,0XFB,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B, +0X23,0X5B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X5C,0X7C,0X02,0X7B,0X02,0X5A,0X74,0XFD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XC6,0XBE,0X7D,0X3D,0X64,0X9C,0X64,0X9C,0X64,0X9C,0X64,0X9C, +0X7D,0X1D,0XE7,0X5F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X85,0X5D,0X95,0X9D, +0X95,0X9D,0X95,0X9D,0X95,0X9D,0X95,0X9D,0X95,0X9D,0X9D,0XBD,0XCE,0XDE,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XB6,0X5E,0X95,0XBD, +0X95,0X9D,0X95,0X9D,0X95,0X9D,0X8D,0X9D,0X9D,0XBD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X9D,0XFE,0X6C,0XDD,0X64,0X9C,0X64,0X9C,0X64,0X9C,0X64,0XBC,0X95,0XBD, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XD6,0XFE,0X8D,0X7D,0X95,0X9D,0X95,0X9D, +0X95,0X9D,0X95,0X9D,0X95,0X9D,0X95,0X9D,0XA6,0X1E,0XEF,0XBF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XDF,0X5F,0X95,0X9D,0X43,0XFC,0X02,0X7B,0X02,0X7B,0X64,0X9C,0X9D,0XBD, +0X95,0X9D,0X85,0X5D,0XFF,0XFF,0XFF,0XFF,0X4C,0X1C,0X02,0X7B,0X02,0X5A,0X85,0X5D, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XEF,0X9F,0X02,0X1A, +0X02,0X9B,0X02,0X5A,0XFF,0XFF,0XFF,0XFF,0XB6,0X7E,0X02,0X3A,0X02,0X9B,0X2B,0X7B, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XCE,0XDE,0X95,0XBD,0X2B,0X7B, +0X02,0X9B,0X02,0X7B,0X7D,0X1D,0X95,0XBD,0X8D,0X9D,0X95,0X9D,0XFF,0XFF,0XFF,0XFF, +0XCE,0XFE,0X8D,0X7D,0X8D,0X7D,0XCE,0XDE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X85,0X5D, +0X95,0X9D,0X95,0X9D,0X95,0X9D,0X95,0X9D,0X95,0X9D,0X95,0X9D,0X9D,0XBD,0XCE,0XDE, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X85,0X5D,0X8D,0X9D,0X9D,0XDD, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8D,0X7D,0X95,0X9D,0X95,0XBD, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X1A,0XEF,0X9F, +0XFF,0XFF,0XAE,0X3E,0XC6,0XBE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X85,0X3D,0X02,0X3A,0X02,0X5A,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B,0X02,0X5A,0X02,0X3A, +0X85,0X5D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XB6,0X7E, +0X0A,0XDB,0X02,0X1A,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B, +0X23,0X5B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X23,0X3B,0X02,0X9B,0X02,0X3A,0XAE,0X1E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X33,0X9B,0X01,0XFA,0X02,0X5A,0X02,0X3A,0X02,0X3A,0X02,0X3A,0X02,0X5A, +0X02,0X5A,0X01,0XDA,0XB6,0X5E,0XFF,0XFF,0XFF,0XFF,0XE7,0X5F,0X01,0XBA,0X02,0X5A, +0X02,0X5A,0X02,0X5A,0X02,0X5A,0X02,0X5A,0X02,0X5A,0X02,0X5A,0X02,0X1A,0X0A,0XDB, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X9D,0XDD,0X01,0XFA,0X02,0X3A,0X02,0X5A, +0X02,0X3A,0X02,0X3A,0X02,0X3A,0X01,0XFA,0X75,0X1D,0XFF,0XFF,0XFF,0XFF,0XE7,0X7F, +0X02,0X1A,0X02,0X3A,0X02,0X5A,0X02,0X3A,0X02,0X3A,0X02,0X3A,0X02,0X5A,0X02,0X3A, +0X02,0X5A,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X5C,0X9C,0X02,0X1A,0X02,0X5A,0X02,0X5A, +0X02,0X5A,0X02,0X5A,0X02,0X5A,0X02,0X5A,0X02,0X3A,0X01,0XDA,0X8D,0X9D,0XFF,0XFF, +0XFF,0XFF,0X7D,0X3D,0X01,0XFA,0X02,0X7B,0X02,0XBB,0X02,0XBB,0X02,0X7B,0X02,0X3A, +0X02,0X3A,0X02,0X7B,0XFF,0XFF,0XFF,0XFF,0X12,0XFB,0X02,0X9B,0X02,0X3A,0XC6,0XBE, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBE,0X9E,0X02,0X3A, +0X02,0X9B,0X1B,0X1B,0XFF,0XFF,0XFF,0XFF,0X7D,0X3D,0X02,0X5A,0X02,0X7B,0X64,0XBD, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X4C,0X3C,0X02,0X1A,0X02,0X9B, +0X02,0XBB,0X02,0XBB,0X02,0X5A,0X02,0X3A,0X02,0X1A,0X2B,0X7B,0XFF,0XFF,0XFF,0XFF, +0X5C,0X7C,0X02,0X1A,0X01,0XDA,0XAE,0X3E,0XFF,0XFF,0XFF,0XFF,0XE7,0X5F,0X01,0XBA, +0X02,0X5A,0X02,0X5A,0X02,0X5A,0X02,0X5A,0X02,0X5A,0X02,0X5A,0X02,0X5A,0X02,0X1A, +0X0A,0XDB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XCE,0XFE,0X01,0XDA,0X02,0X1A,0X3B,0XDC, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X01,0XBA,0X02,0X3A,0X2B,0X7B, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X1A,0XEF,0X9F, +0XFF,0XFF,0X95,0XBD,0X01,0X9A,0X2B,0X5B,0XDF,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7D,0X3D,0X02,0X3A,0X02,0X5A,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B,0X02,0X5A,0X02,0X5A,0X8D,0X7D,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBE,0X7E,0X0A,0XDB,0X02,0X1A, +0X02,0X5A,0X02,0X3A,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B, +0X23,0X5B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X02,0X1A,0X02,0XBB,0X02,0X1A,0XE7,0X5F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X95,0XBD,0X02,0X1A,0X02,0X9B,0X02,0X7B,0X3B,0XDC,0X3B,0XDC,0X43,0XFC,0X0A,0XFB, +0X02,0X9B,0X02,0X7B,0X33,0XBC,0XFF,0XFF,0XFF,0XFF,0XAE,0X1E,0X02,0X3A,0X02,0XBB, +0X02,0X5A,0X02,0X3A,0X02,0X3A,0X02,0X3A,0X02,0X1A,0X02,0X9B,0X02,0XBB,0X02,0X1A, +0XC6,0XBE,0XFF,0XFF,0XFF,0XFF,0XEF,0X7F,0X01,0XBA,0X02,0XBB,0X02,0X7B,0X02,0X3A, +0X02,0X9B,0X02,0X9B,0X02,0X9B,0X02,0X1A,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X0A,0XDB, +0X02,0X7B,0X02,0X7B,0X1B,0X1B,0X43,0XFC,0X3B,0XDC,0X3B,0XDC,0X02,0X7B,0X02,0XBB, +0X02,0X3A,0XB6,0X5E,0XFF,0XFF,0XFF,0XFF,0X2B,0X9B,0X02,0X9B,0X02,0X9B,0X02,0X3A, +0X02,0X3A,0X02,0X3A,0X02,0X3A,0X02,0X3A,0X02,0XBB,0X02,0X9B,0X02,0X9B,0XFF,0XFF, +0XFF,0XFF,0X4C,0X1C,0X02,0X7B,0X02,0X9B,0X02,0XBB,0X02,0X9B,0X02,0X9B,0X02,0X9B, +0X02,0X7A,0X4C,0X3C,0XFF,0XFF,0XFF,0XFF,0X01,0XFA,0X02,0XBB,0X01,0XFA,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8D,0X7D,0X02,0X5A, +0X02,0X7B,0X4C,0X3C,0XFF,0XFF,0XFF,0XFF,0X44,0X1C,0X02,0X7B,0X02,0X5A,0XAE,0X3E, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1B,0X1B,0X02,0X9B,0X02,0X9B, +0X02,0XBB,0X02,0X9B,0X02,0X9B,0X02,0X9B,0X02,0X5A,0X7D,0X3D,0XFF,0XFF,0XFF,0XFF, +0X2B,0X7B,0X02,0X9B,0X02,0X1A,0XF7,0XBF,0XFF,0XFF,0XFF,0XFF,0XAE,0X3E,0X02,0X3A, +0X02,0XBB,0X02,0X5A,0X02,0X3A,0X02,0X3A,0X02,0X3A,0X02,0X1A,0X02,0X9B,0X02,0XBB, +0X02,0X1A,0XC6,0X9E,0XFF,0XFF,0XFF,0XFF,0X95,0XBD,0X02,0X5A,0X02,0X5A,0X85,0X5D, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC6,0XBE,0X02,0X3A,0X02,0X7B,0X6C,0XDD, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X1A,0XEF,0X9F, +0XFF,0XFF,0X9D,0XBD,0X02,0X5A,0X02,0X9B,0X01,0XFA,0X2B,0X9B,0XDF,0X3F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7D,0X1D,0X02,0X1A,0X02,0X5A, +0X02,0XBB,0X02,0X9B,0X02,0X3A,0X02,0X5A,0X8D,0X9D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBE,0X9E,0X12,0XFB,0X02,0X1A,0X02,0X9B,0X02,0X7B, +0X7D,0X1D,0XEF,0X7F,0X0A,0XBB,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B, +0X23,0X5B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XEF,0X9F, +0X02,0X1A,0X02,0XBB,0X02,0X1A,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X2B,0X7B,0X02,0X9B,0X02,0X1A,0XF7,0XBF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XBF, +0X02,0X3A,0X02,0X7B,0X3B,0XBC,0XFF,0XFF,0XFF,0XFF,0X74,0XFD,0X02,0X5A,0X02,0X3A, +0XB6,0X7E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1B,0X1B,0X02,0X9B,0X02,0X3A, +0XC6,0XDE,0XFF,0XFF,0XFF,0XFF,0X6C,0XDD,0X02,0X5A,0X02,0X7B,0X5C,0X7C,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XEF,0X9F,0X01,0XFA, +0X02,0X9B,0X23,0X5B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X6C,0XDD,0X02,0X7B, +0X02,0X3A,0XB6,0X5E,0XFF,0XFF,0XFF,0XFF,0X02,0X5A,0X02,0X9B,0X02,0X3A,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XD6,0XFE,0X02,0X3A,0X02,0X9B,0X0A,0XBB,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0X1A,0X02,0X9B,0X1B,0X3B,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDF,0X3F,0X02,0X3A,0X02,0X9B,0X02,0X7B,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X4C,0X3C,0X02,0X7B, +0X02,0X5A,0X8D,0X7D,0XFF,0XFF,0XFF,0XFF,0X1B,0X3B,0X02,0X9B,0X02,0X9B,0X13,0X1B, +0X43,0XFC,0X3B,0XFC,0X3B,0XFC,0X3B,0XFC,0X54,0X3C,0X9D,0XDD,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XEF,0X9F,0X02,0X3A, +0X02,0X7B,0X54,0X3C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X02,0X3A,0X02,0X9B,0X02,0X3A,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X75,0X1D,0X02,0X5A, +0X02,0X5A,0XB6,0X5E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1B,0X3B,0X02,0X9B, +0X02,0X3A,0XC6,0XBE,0XFF,0XFF,0XFF,0XFF,0X5C,0X9C,0X02,0X7B,0X02,0X3A,0XBE,0X7E, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8D,0X9D,0X02,0X5A,0X02,0X5A,0X9D,0XFE, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X1A,0XEF,0X7F, +0XFF,0XFF,0X95,0X9D,0X02,0X1A,0X02,0XBB,0X02,0XBB,0X02,0X7B,0X01,0XFA,0X33,0X9C, +0XE7,0X5F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X74,0XFD, +0X01,0XFA,0X02,0X5A,0X95,0X9D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XBE,0X9E,0X12,0XFB,0X02,0X1A,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0X3A, +0XBE,0X9E,0X02,0X1A,0X9D,0XDE,0X02,0X5A,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B, +0X23,0X5B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XB6,0X5E, +0X02,0X3A,0X02,0X9B,0X12,0XFB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X02,0X1A,0X02,0X9B,0X02,0X9B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XB6,0X5E, +0X02,0X3A,0X02,0X7B,0X6C,0XDD,0XFF,0XFF,0XFF,0XFF,0X3B,0XBC,0X02,0X7B,0X02,0X1A, +0XE7,0X5F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X2B,0X7B,0X02,0X9B,0X02,0X1A, +0XF7,0XDF,0XFF,0XFF,0XFF,0XFF,0X23,0X5B,0X02,0X9B,0X02,0X1A,0XF7,0XBF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XAE,0X3E,0X02,0X3A, +0X02,0X5A,0X85,0X3D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3B,0XBC,0X02,0X7B, +0X02,0X1A,0XE7,0X7F,0XFF,0XFF,0XFF,0XFF,0X01,0XFA,0X02,0X9B,0X23,0X3B,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0X9F,0X02,0X1A,0X02,0X7B,0X33,0XBC,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XC6,0XBE,0X02,0X3A,0X02,0X7B,0X54,0X5C,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XA6,0X1E,0X02,0X5A,0X02,0X7B,0X33,0X9C,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X12,0XFB,0X02,0X9B, +0X02,0X3A,0XC6,0X9E,0XFF,0XFF,0XFF,0XFF,0X2B,0X7B,0X02,0X7B,0X02,0XBB,0X02,0X9B, +0X02,0X7B,0X02,0X7B,0X02,0X7B,0X02,0X7B,0X02,0X7B,0X01,0XDA,0X95,0XBD,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X95,0XBD,0X02,0X5A, +0X02,0X5A,0X85,0X5D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDF, +0X02,0X1A,0X02,0X9B,0X23,0X5B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3B,0XDC,0X02,0X7B, +0X02,0X1A,0XDF,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X33,0X9C,0X02,0X9B, +0X02,0X1A,0XF7,0XBF,0XFF,0XFF,0XFF,0XFF,0X2B,0X7B,0X02,0X9B,0X01,0XFA,0XF7,0XDF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X54,0X5C,0X02,0X7B,0X02,0X3A,0XD6,0XFE, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X1A,0XEF,0X9F, +0XFF,0XFF,0XF7,0XBF,0X54,0X5C,0X01,0XFA,0X02,0X7B,0X02,0XBB,0X02,0XBB,0X02,0X7B, +0X01,0XFA,0X3B,0XBC,0XE7,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC6,0XBE, +0X12,0XFB,0X02,0X1A,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X01,0XFA, +0XFF,0XFF,0XAE,0X3E,0X85,0X5D,0X02,0X5A,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B, +0X23,0X5B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7D,0X3D, +0X02,0X5A,0X02,0X7B,0X4C,0X3C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XBF, +0X02,0X1A,0X02,0X7B,0X43,0XFC,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7D,0X3D, +0X02,0X5A,0X02,0X5A,0XA5,0XFE,0XFF,0XFF,0XFF,0XFF,0X02,0X9B,0X02,0X9B,0X01,0XFA, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0X7B,0X02,0X9B,0X02,0X1A, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0X3A,0X02,0X9B,0X02,0X5A,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X74,0XFD,0X02,0X5A, +0X02,0X3A,0XC6,0XBE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0X9B,0X02,0X9B, +0X02,0X1A,0XFF,0XFF,0XFF,0XFF,0XC6,0XBE,0X02,0X3A,0X02,0X7B,0X5C,0X7C,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XB6,0X5E,0X02,0X3A,0X02,0X7B,0X6C,0XDD,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X8D,0X9D,0X02,0X5A,0X02,0X5A,0X8D,0X7D,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X6C,0XFD,0X02,0X5A,0X02,0X5B,0X6C,0XDD,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0X1A,0X02,0XBB, +0X02,0X1A,0XFF,0XDF,0XFF,0XFF,0XFF,0XFF,0XDF,0X3F,0X0A,0XBB,0X02,0X1A,0X02,0X1A, +0X02,0X1A,0X02,0X1A,0X02,0X1A,0X02,0X7B,0X02,0XBB,0X02,0X5A,0X64,0XDD,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X64,0X9C,0X02,0X7B, +0X02,0X3A,0XBE,0X7E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBE,0X9E, +0X02,0X3A,0X02,0X7B,0X5C,0X7C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0XBB,0X02,0X9B, +0X02,0X1A,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0X7B,0X02,0X9B, +0X02,0X3A,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0X3A,0X02,0X9B,0X02,0X5A,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1B,0X1B,0X02,0X9B,0X01,0XFA,0XFF,0XFF, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X1A,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDF,0X4C,0X3C,0X01,0XFA,0X02,0X7B,0X02,0XBB, +0X02,0XBB,0X02,0X7B,0X01,0XFA,0X3B,0XDC,0XEF,0X9F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC6,0XBE,0X12,0XFB,0X02,0X1A, +0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0X5A,0X02,0X1A,0X02,0X1A,0X02,0X9B,0X01,0XFA, +0XFF,0XFF,0XFF,0XFF,0X74,0XFD,0X02,0X5A,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B, +0X23,0X5B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X43,0XFC, +0X02,0X7B,0X02,0X5A,0X85,0X5D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XB6,0X7E, +0X02,0X3A,0X02,0X9B,0X23,0X3B,0X4C,0X3C,0X44,0X1C,0X44,0X1C,0X4C,0X3C,0X02,0X7B, +0X02,0XBB,0X01,0XFA,0XEF,0X7F,0XFF,0XFF,0XFF,0XFF,0X01,0XFA,0X02,0X9B,0X12,0XFB, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X01,0XFA,0X02,0X9B,0X23,0X5B, +0XFF,0XFF,0XFF,0XFF,0XEF,0X9F,0X02,0X1A,0X02,0X9B,0X2B,0X7B,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3B,0XDC,0X02,0X7B, +0X02,0X7B,0X43,0XFC,0X4C,0X1C,0X44,0X1C,0X4C,0X1C,0X33,0X9B,0X02,0X7B,0X02,0X9B, +0X23,0X3B,0XFF,0XFF,0XFF,0XFF,0X8D,0X7D,0X02,0X5A,0X02,0X5A,0X8D,0X9D,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7D,0X3D,0X02,0X5A,0X02,0X5A,0XA5,0XFE,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X54,0X5C,0X02,0X7B,0X02,0X3A,0XC6,0XBE,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3B,0XBC,0X02,0X7B,0X02,0X5A,0XA6,0X1E,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0X5F,0X02,0X1A,0X02,0X9B, +0X02,0X5A,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X43,0XFC,0X02,0X7B,0X02,0X5A,0X8D,0X7D,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X23,0X7B,0X02,0X9B, +0X02,0X1A,0XF7,0XBF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X85,0X7D, +0X02,0X5A,0X02,0X5A,0X95,0XBD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0X1A,0X02,0X9B, +0X12,0XDB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0X1A,0X02,0X9B, +0X23,0X5B,0XFF,0XFF,0XFF,0XFF,0XF7,0XBF,0X02,0X1A,0X02,0X9B,0X23,0X7B,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X01,0XFA,0X02,0X9B,0X02,0X7B,0XFF,0XFF, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X3A,0XBE,0X9E, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XBF,0X4C,0X1C,0X01,0XFA, +0X02,0X7B,0X02,0XBB,0X02,0XBB,0X02,0X7B,0X01,0XFA,0X43,0XFC,0XEF,0X9F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC6,0XBE,0X1B,0X1B,0X02,0X1A,0X02,0X9B,0X02,0XBB, +0X02,0XBB,0X02,0X5A,0X02,0X1A,0X7D,0X3D,0XFF,0XFF,0XFF,0XFF,0X12,0XFB,0X01,0XDA, +0XFF,0XFF,0XFF,0XFF,0X6C,0XDC,0X02,0X7B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B, +0X23,0X5B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X0A,0XBB, +0X02,0X9B,0X02,0X3A,0XBE,0X9E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X85,0X5D, +0X02,0X5A,0X02,0XBB,0X02,0X5A,0X02,0X3A,0X02,0X3A,0X02,0X3A,0X02,0X3A,0X02,0X5A, +0X02,0X1A,0X2B,0X5B,0XFF,0XFF,0XFF,0XFF,0XCE,0XFE,0X02,0X3A,0X02,0X7B,0X4C,0X3C, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC6,0X9E,0X02,0X3A,0X02,0X7B,0X5C,0X9C, +0XFF,0XFF,0XFF,0XFF,0XB6,0X7E,0X02,0X3A,0X02,0X7B,0X64,0XBC,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0XBB,0X02,0X9B, +0X02,0X9B,0X02,0X3A,0X02,0X3A,0X02,0X3A,0X02,0X3A,0X02,0X3A,0X02,0X5B,0X01,0XBA, +0XAE,0X3E,0XFF,0XFF,0XFF,0XFF,0X54,0X5C,0X02,0X7B,0X02,0X3A,0XCE,0XDE,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X44,0X1C,0X02,0X7B,0X02,0X1A,0XDF,0X1F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X1B,0X3B,0X02,0X9B,0X02,0X1A,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0X9B,0X02,0X9B,0X02,0X1A,0XDF,0X3F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XA6,0X1E,0X02,0X3A,0X02,0X9B, +0X33,0X9B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X2B,0X7B,0X02,0X9B,0X02,0X3A,0XBE,0X7E,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0X5A,0X02,0X9B, +0X02,0X3A,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X54,0X3C, +0X02,0X7B,0X02,0X3A,0XCE,0XDE,0XFF,0XFF,0XFF,0XFF,0XD6,0XFE,0X02,0X3A,0X02,0X7B, +0X4C,0X1C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC6,0XBE,0X02,0X3A,0X02,0X7B, +0X5C,0X7C,0XFF,0XFF,0XFF,0XFF,0XBE,0X9E,0X02,0X3A,0X02,0X7B,0X64,0X9C,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0X7F,0X02,0X1A,0X02,0X7B,0X33,0X9C,0XFF,0XFF, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X1A, +0X23,0X3B,0XD6,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XBF, +0X43,0XFC,0X01,0XFA,0X02,0X7B,0X02,0XBB,0X02,0XBB,0X02,0X7B,0X01,0XFA,0X44,0X1C, +0XFF,0XFF,0XCE,0XDE,0X1B,0X1B,0X02,0X1A,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0X5A, +0X02,0X1A,0X74,0XFD,0XFF,0XFF,0XDF,0X3F,0X01,0X7A,0X74,0XFD,0XAE,0X3E,0X01,0X9A, +0XFF,0XFF,0XFF,0XFF,0X6C,0XDD,0X02,0X7B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B, +0X23,0X5B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0X1A, +0X02,0XBB,0X02,0X1A,0XFF,0XDF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X4C,0X1C, +0X02,0X7B,0X02,0X5B,0X64,0X9C,0X64,0XBD,0X64,0XBC,0X64,0XBC,0X64,0XBC,0X64,0X9C, +0X8D,0X9D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X95,0XBD,0X02,0X5A,0X02,0X5A,0X85,0X5D, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8D,0X7D,0X02,0X5A,0X02,0X5A,0X95,0XBD, +0XFF,0XFF,0XFF,0XFF,0X7D,0X3D,0X02,0X5A,0X02,0X5A,0X9D,0XDE,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0X1A,0X02,0X9B, +0X12,0XFB,0X6C,0XDD,0X64,0XBC,0X64,0XBC,0X64,0XBC,0X64,0XBC,0X6C,0XBD,0XC6,0XBE, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1B,0X1B,0X02,0X9B,0X02,0X1A,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X0A,0XDB,0X02,0X9B,0X02,0X1A,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X02,0X3A,0X02,0X9B,0X02,0X7B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0X1A,0X02,0XBB,0X02,0X1A,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X6C,0XFD,0X02,0X5B,0X02,0X7B, +0X6C,0XBD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0X3A,0X02,0XBB,0X02,0X1A,0XF7,0XBF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XBF,0X02,0X1A,0X02,0X9B, +0X2B,0X5B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1B,0X1B, +0X02,0X9B,0X02,0X1A,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X9D,0XDD,0X02,0X5A,0X02,0X5A, +0X85,0X3D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8D,0X7D,0X02,0X5A,0X02,0X5A, +0X95,0X9D,0XFF,0XFF,0XFF,0XFF,0X8D,0X9D,0X02,0X5A,0X02,0X5A,0X95,0X9D,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XAE,0X3E,0X02,0X3A,0X02,0X5B,0X6C,0XDD,0XFF,0XFF, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0X9B,0X02,0X1A,0X23,0X5B,0XD7,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XEF,0X9F,0X3B,0XDC,0X01,0XFA,0X02,0X7B,0X02,0XBB,0X02,0XBB,0X02,0X7B, +0X02,0X1A,0X02,0X3A,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0X5A,0X02,0X1A,0X6C,0XDD, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XB6,0X5E,0X02,0X1A,0XDF,0X5F,0X54,0X3C,0X01,0XBA, +0XFF,0XFF,0XFF,0XFF,0X6C,0XDD,0X02,0X7B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B, +0X23,0X5B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XD7,0X1F,0X02,0X3A, +0X02,0X9B,0X02,0X5A,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X12,0XFB, +0X02,0X9B,0X02,0X3A,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X5C,0X9C,0X02,0X7B,0X02,0X3A,0XBE,0X9E, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X54,0X3C,0X02,0X7B,0X02,0X3A,0XCE,0XDE, +0XFF,0XFF,0XFF,0XFF,0X4C,0X3C,0X02,0X7B,0X02,0X3A,0XD7,0X1F,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XD6,0XFE,0X02,0X3A,0X02,0X7B, +0X64,0X9C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0X1A,0X02,0X9B,0X02,0X7B,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0X1A,0X02,0X9B,0X0A,0XDB,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XEF,0X9F,0X02,0X1A,0X02,0X9B,0X33,0XBC,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XDF,0X1F,0X02,0X1A,0X02,0X9B,0X02,0X7B,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X23,0X5B,0X02,0X9B,0X02,0X5A, +0X9D,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XEF,0X9F,0X02,0X1A,0X02,0X9B,0X02,0X5A,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBE,0X9E,0X02,0X3A,0X02,0X7B, +0X64,0X9C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0X1A, +0X02,0X9B,0X02,0X9B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X64,0X9C,0X02,0X7B,0X02,0X3A, +0XB6,0X7E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X54,0X5C,0X02,0X7B,0X02,0X3A, +0XCE,0XDE,0XFF,0XFF,0XFF,0XFF,0X7D,0X3D,0X02,0X5A,0X02,0X7B,0X4C,0X1C,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7D,0X1D,0X02,0X5B,0X02,0X5A,0XA5,0XFE,0XFF,0XFF, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X7B,0X02,0X7B, +0X02,0XBB,0X02,0XBB,0X02,0X9B,0X01,0XFA,0X2B,0X7B,0XD7,0X1F,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0X7F,0X3B,0XBC,0X01,0XFA,0X02,0X7B,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X5B,0X02,0X1A,0X64,0XBC,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X5C,0X9C,0X02,0X3A,0X01,0XFA, +0XFF,0XFF,0XFF,0XFF,0X6C,0XDD,0X02,0X7B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B, +0X23,0X5B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X9D,0XDE,0X02,0X5A, +0X02,0X9B,0X2B,0X7B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0X3A, +0X02,0X9B,0X02,0X5A,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X2B,0X5B,0X02,0X9B,0X02,0X1A,0XF7,0XBF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X13,0X1B,0X02,0X9B,0X01,0XFA,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X2B,0X9B,0X02,0X7B,0X02,0X3A,0XDF,0X3F,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XA6,0X1E,0X02,0X3A,0X02,0X7B, +0X74,0XFD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XEF,0X7F,0X02,0X1A,0X02,0X7B,0X33,0X9C,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XDF,0X3F,0X02,0X1A,0X02,0X7B,0X43,0XFC,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XC6,0XBE,0X02,0X3A,0X02,0X7B,0X4C,0X1C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XCE,0XDE,0X02,0X3A,0X02,0XBB,0X02,0X3A,0XFF,0XDF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XD6,0XFE,0X02,0X1A,0X02,0XBB,0X01,0XFA, +0XEF,0X7F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X7D,0X1D,0X02,0X5A,0X02,0X9B,0X2B,0X7B,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X95,0XBD,0X02,0X5A,0X02,0X5B, +0X7D,0X3D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0X7F,0X02,0X1A, +0X02,0X7B,0X33,0XBC,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X2B,0X7B,0X02,0X9B,0X02,0X1A, +0XF7,0XBF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1B,0X1B,0X02,0X9B,0X01,0XFA, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XB6,0X7E,0X01,0XFA,0X02,0XBB,0X02,0X7B,0X01,0XFA, +0X02,0X1A,0X02,0X1A,0X02,0X1A,0X02,0X5A,0X02,0XBB,0X02,0X1A,0XDF,0X3F,0XFF,0XFF, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X3A,0X6C,0XDD,0X74,0XFD, +0X02,0X1A,0X02,0X7B,0X02,0XBB,0X02,0XBB,0X02,0X7B,0X02,0X1A,0X2B,0X7B,0XDF,0X3F, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0X5F,0X33,0XBC,0X01,0XFA, +0X02,0X7B,0X02,0X7B,0X01,0XFA,0X64,0X9C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XE7,0X7F,0X43,0XFC,0X01,0XFA,0X02,0X7B,0X02,0XBB,0X01,0XDA, +0XFF,0XFF,0XFF,0XFF,0X6C,0XDD,0X02,0X7B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B, +0X23,0X5B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X64,0XBC,0X02,0X7B, +0X02,0X7B,0X64,0XBC,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0X1A, +0X02,0XBB,0X02,0X9B,0X12,0XFB,0X3B,0XDC,0X3B,0XDC,0X3B,0XDC,0X3B,0XDC,0X23,0X5B, +0XD7,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0X3A,0X02,0X9B,0X02,0X5A,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X01,0XFA,0X02,0X9B,0X02,0X9B,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X4C,0X1C,0X02,0X7B,0X02,0X9B,0X02,0X7B,0X33,0XBC,0X3B,0XDC, +0X3B,0XDC,0X3B,0XDC,0X23,0X3B,0XE7,0X7F,0XFF,0XFF,0XAE,0X3E,0X02,0X3A,0X02,0XBB, +0X02,0X5A,0X2B,0X9B,0X3B,0XDC,0X3B,0XDC,0X3B,0XDC,0X33,0XBC,0X43,0XFC,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XAE,0X3E,0X02,0X3A,0X02,0X7B,0X6C,0XDD,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XA5,0XFE,0X02,0X5A,0X02,0X5A,0X7D,0X3D,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XCE,0XDE,0X02,0X1A,0X02,0XBB,0X02,0X7B,0X2B,0X7B,0X3B,0XDC,0X23,0X3B, +0XDF,0X5F,0XFF,0XFF,0XF7,0XBF,0X01,0XDA,0X02,0XBB,0X02,0XBB,0X02,0X3A,0X1B,0X1B, +0X2B,0X5B,0X2B,0X5B,0X2B,0X5B,0X1B,0X1B,0X02,0X3A,0X02,0XBB,0X02,0X9B,0X0A,0XDB, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X01,0XBA,0X02,0X5A,0X02,0X5A,0X02,0X5A,0X02,0X5A, +0X02,0X5A,0X02,0X3A,0X02,0X5A,0X02,0XBB,0X02,0X3A,0X8D,0X7D,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X9D,0XDD,0X02,0X3A,0X02,0XBB, +0X02,0X7B,0X33,0X9C,0X3B,0XDC,0X1B,0X3B,0XFF,0XFF,0XFF,0XFF,0XAE,0X3E,0X02,0X3A, +0X02,0X5A,0X6C,0XDD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0X5A,0X02,0X9B,0X02,0X1A, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0X1A,0X02,0X9B,0X02,0X7B, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X54,0X5C,0X01,0XDA,0X02,0X3A,0X02,0X3A, +0X02,0X3A,0X02,0X3A,0X02,0X5A,0X02,0XBB,0X02,0XBB,0X02,0X1A,0XFF,0XFF,0XFF,0XFF, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X5B,0X85,0X5D,0XD7,0X1F,0X85,0X5D, +0XFF,0XFF,0X5C,0X7C,0X01,0XFA,0X02,0X7B,0X02,0XBB,0X02,0XBB,0X02,0X7B,0X01,0XFA, +0X33,0X9C,0XE7,0X5F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0X5F, +0X23,0X5B,0X54,0X5C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XDF,0X5F,0X33,0XBC,0X01,0XFA,0X02,0X7B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X01,0X9A, +0XFF,0XFF,0XFF,0XFF,0X64,0XBC,0X02,0X7B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B, +0X23,0X5B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X23,0X3B,0X02,0X5A, +0X02,0X1A,0X9D,0XDE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X64,0XBC, +0X01,0XFA,0X02,0X5A,0X02,0X5A,0X02,0X3A,0X02,0X3A,0X02,0X3A,0X02,0X3A,0X02,0X7A, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XBF,0X01,0XDA,0X02,0X5A,0X23,0X3B,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDF,0X3F,0X01,0XDA,0X02,0X3A,0X33,0X9C,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XDF,0X5F,0X01,0XDA,0X02,0X5A,0X02,0X5B,0X02,0X5A,0X02,0X3A, +0X02,0X3A,0X02,0X1A,0X12,0XFB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0X5A,0X02,0X3A, +0X02,0X7B,0X02,0X5A,0X02,0X3A,0X02,0X3A,0X02,0X3A,0X01,0XFA,0X7D,0X3D,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X74,0XFD,0X02,0X1A,0X02,0X1A,0XA5,0XFE,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X5C,0X9C,0X02,0X3A,0X01,0XFA,0XB6,0X5E,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X0A,0XDB,0X02,0X3A,0X02,0X7B,0X02,0X5A,0X02,0X3A,0X02,0XBB, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X43,0XFC,0X02,0X1A,0X02,0X7B,0X02,0X7B,0X02,0X7B, +0X02,0X7B,0X02,0X7B,0X02,0X7B,0X02,0X7B,0X02,0X7B,0X02,0X5A,0X01,0XDA,0XD7,0X1F, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0XBB,0X02,0X5A,0X02,0X7B,0X02,0X7B,0X02,0X7B, +0X02,0X7B,0X02,0X7B,0X02,0X7B,0X02,0X3A,0X0A,0XDB,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0X3A,0X02,0X3A, +0X02,0X7B,0X02,0X5A,0X02,0X1A,0X3B,0XDC,0XFF,0XFF,0XFF,0XFF,0X6C,0XDD,0X02,0X1A, +0X02,0X1A,0XA5,0XFE,0XFF,0XFF,0XFF,0XFF,0XF7,0XDF,0X01,0XBA,0X02,0X5A,0X1B,0X3B, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0X5F,0X01,0XDA,0X02,0X5A,0X2B,0X9C, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XCE,0XDE,0XB6,0X5E, +0XB6,0X7E,0XB6,0X7E,0XB6,0X7E,0X02,0X5A,0X02,0X9B,0X0A,0XDB,0XFF,0XFF,0XFF,0XFF, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X5A,0X9D,0XDD,0X54,0X5C,0X01,0X39, +0XC6,0XBE,0XFF,0XFF,0XFF,0XDF,0X54,0X3C,0X01,0XFA,0X02,0X7B,0X02,0XBB,0X02,0XBB, +0X02,0X7B,0X01,0XFA,0X3B,0XBC,0XE7,0X5F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XD7,0X1F,0X33,0X9C, +0X01,0XFA,0X02,0X7B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X5A,0X02,0X1A,0X4C,0X3C, +0XFF,0XFF,0XFF,0XFF,0X5C,0X9C,0X02,0X7B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B, +0X23,0X5B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X54,0X3C,0X54,0X5C, +0X4C,0X1C,0XDF,0X5F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XC6,0X9E,0X74,0XFD,0X5C,0X7C,0X5C,0X5C,0X5C,0X5C,0X5C,0X5C,0X54,0X3C,0XAE,0X3E, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XD7,0X1F,0X4C,0X1C,0X54,0X3C,0X95,0X9D,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XCE,0XDE,0X4C,0X1C,0X54,0X3C,0X9D,0XDE,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8D,0X7D,0X5C,0X7C,0X5C,0X5C,0X5C,0X5C, +0X5C,0X5C,0X4C,0X3C,0XC6,0X9E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X9D,0XBD, +0X64,0X9C,0X5C,0X5C,0X5C,0X5C,0X5C,0X5C,0X5C,0X5C,0X4C,0X1C,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X85,0X5D,0X54,0X3C,0X4C,0X1C,0XE7,0X5F,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X7D,0X1D,0X54,0X5C,0X4C,0X1C,0XEF,0X9F,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XA5,0XFE,0X64,0X9C,0X5C,0X5C,0X4C,0X3C,0XBE,0X9E, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XA6,0X1E,0X4C,0X1C,0X2B,0X7B,0X2B,0X5B, +0X2B,0X5B,0X2B,0X5B,0X2B,0X5B,0X2B,0X5B,0X2B,0X9B,0X64,0X9C,0XF7,0X9F,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X85,0X5D,0X54,0X3C,0X5C,0X5C,0X5C,0X5C,0X5C,0X5C, +0X5C,0X5C,0X5C,0X7C,0X64,0XBC,0XA5,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X95,0XBD, +0X5C,0X9C,0X5C,0X5C,0X4C,0X1C,0XDF,0X3F,0XFF,0XFF,0XFF,0XFF,0X85,0X3D,0X54,0X3C, +0X4C,0X1C,0XE7,0X7F,0XFF,0XFF,0XFF,0XFF,0XD7,0X1F,0X4C,0X1C,0X54,0X3C,0X95,0X9D, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XCE,0XDE,0X4C,0X1C,0X54,0X3C,0X9D,0XDD, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XDF,0X3F,0X02,0X3A,0X02,0X7B,0X44,0X1C,0XFF,0XFF,0XFF,0XFF, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B,0X02,0X7B,0XFF,0XFF,0XBE,0X7E, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XBF,0X43,0XFC,0X01,0XFA,0X02,0X7B, +0X02,0XBB,0X02,0XBB,0X02,0X7B,0X01,0XFA,0X3B,0XDC,0XE7,0X7F,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XD6,0XFE,0X2B,0X7B,0X02,0X1A,0X02,0X7B, +0X02,0XBB,0X02,0XBB,0X02,0X9B,0X02,0X5A,0X02,0X1A,0X6C,0XBD,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X64,0X9C,0X02,0X7B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B, +0X23,0X5B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X74,0XFD,0X02,0X5B,0X02,0X5A,0X85,0X5D,0XFF,0XFF,0XFF,0XFF, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B,0X02,0X1A,0X5C,0X7C, +0XFF,0XDF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0X7F,0X33,0XBC, +0X01,0XFA,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0X7B,0X01,0XFA,0X43,0XFC,0XEF,0X9F, +0XFF,0XFF,0XFF,0XFF,0XCE,0XDE,0X23,0X3B,0X02,0X1A,0X02,0X7B,0X02,0XBB,0X02,0XBB, +0X02,0X9B,0X02,0X5A,0X02,0X3A,0X7D,0X1D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X5C,0X9C,0X02,0X7B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B, +0X23,0X5B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBE,0X9E,0X44,0X1C,0X54,0X5C,0X54,0X5C,0X54,0X5C, +0X54,0X5C,0X3B,0XDC,0X02,0X5A,0X02,0XBB,0X01,0XFA,0XE7,0X7F,0XFF,0XFF,0XFF,0XFF, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X7B, +0X01,0XFA,0X54,0X5C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XDF,0X3F,0X2B,0X5B,0X02,0X1A,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0X7B,0X01,0XFA, +0X54,0X5C,0X23,0X5B,0X02,0X1A,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0X9B,0X02,0X3A, +0X02,0X7B,0X8D,0X9D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XC6,0XBE,0X23,0X3B,0X02,0X5A,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B, +0X23,0X5B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XD6,0XFE,0X01,0XBA,0X02,0X5A,0X02,0X5A,0X02,0X5A, +0X02,0X5A,0X02,0X5A,0X02,0X7B,0X01,0XFA,0X54,0X5C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0X7B,0X01,0XFA,0X5C,0X7C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XCE,0XFE,0X1B,0X3B,0X02,0X1A,0X02,0X9B,0X02,0XBB,0X02,0XBB, +0X02,0X7B,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0X9B,0X02,0X3A,0X02,0XBB,0XA5,0XFE, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XB6,0X5E,0X12,0XFB, +0X02,0X1A,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B, +0X23,0X5B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1B,0X3B,0X33,0XBC,0X33,0XBC,0X33,0XBC, +0X33,0XBC,0X33,0XBC,0X54,0X3C,0XAE,0X3E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X13,0X1B,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X7B,0X02,0X1A,0X64,0XBC,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC6,0X9E,0X12,0XFB,0X02,0X1A,0X02,0X9B, +0X02,0XBB,0X02,0XBB,0X02,0X9B,0X02,0X1A,0X12,0XFB,0XB6,0X5E,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XA5,0XFE,0X0A,0XBB,0X02,0X1A,0X02,0X9B, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X7B, +0X33,0X9C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XAE,0X1E,0X01,0XDA,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X5A,0X02,0X1A,0X6C,0XDD, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XB6,0X5E,0X0A,0XBB, +0X02,0X3A,0X02,0X1A,0X23,0X5B,0XC6,0XBE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X95,0XBD,0X02,0X7B,0X02,0X3A,0X02,0X9B,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B,0X01,0XDA, +0XD7,0X1F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XC6,0X9E,0X02,0X9B,0X02,0X3A,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X5A, +0X02,0X1A,0X74,0XFD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X9D,0XBD,0XCE,0XFE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X85,0X5D,0X02,0X5A,0X02,0X3A,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B,0X02,0X1A,0X1B,0X3B,0XE7,0X5F, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X8D,0X7D,0X02,0X1A,0X02,0X7B,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0X5A,0X02,0X3A,0X7D,0X1D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X75,0X1D,0X02,0X3A, +0X02,0X5A,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X5A,0X02,0X7B,0XB6,0X5E,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X54,0X7C,0X01,0XFA,0X02,0X7B, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0X9B,0X02,0X5A,0X02,0X3A,0X85,0X5D,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X6C,0XBC,0X02,0X1A,0X02,0X5A,0X02,0X9B, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0X7B,0X02,0X1A,0X7D,0X3D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XEF,0X9F,0X2B,0X5B, +0X02,0X1A,0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B,0X02,0X5A,0X02,0X3A,0X8D,0X7D, +0XFF,0XFF,0XF7,0XDF,0X54,0X5C,0X01,0XFA,0X02,0X5B,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B, +0X01,0XFA,0X4C,0X1C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XBE,0X9E,0X02,0X9B,0X02,0X3A,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B,0X02,0X5A, +0X02,0X7B,0X02,0X3A,0X02,0X7B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B,0X02,0X1A,0X1B,0X1B, +0XDF,0X5F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X8D,0X7D,0X02,0X1A,0X02,0X7B,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X5A,0X02,0X5B,0XB6,0X5E,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X54,0X5C,0X01,0XFA,0X02,0X7B,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0X7B,0X02,0X1A,0X7D,0X3D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XEF,0X7F,0X23,0X5B,0X02,0X1A, +0X02,0X9B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0X9B,0X01,0XFA,0X4C,0X1C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBE,0X7E, +0X02,0X9B,0X02,0X3A,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X9B,0X02,0X1A, +0X1B,0X1B,0XDF,0X3F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X85,0X5D,0X02,0X1A,0X02,0X7B,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X5A,0X02,0X5B,0XAE,0X3E, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X54,0X5C,0X01,0XFA,0X02,0X7B,0X02,0XBB,0X02,0XBB, +0X02,0XBB,0X02,0XBB,0X02,0XBB,0X02,0X7B,0X02,0X1A,0X7D,0X1D,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XE7,0X7F,0X23,0X5B,0X02,0X1A,0X02,0X9B, +0X02,0XBB,0X02,0X7B,0X01,0XFA,0X44,0X1C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XC6,0XBE,0X2B,0X7B, +0X02,0X9B,0X3B,0XDC,0XE7,0X5F,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +}; diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/adc.h b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/adc.h new file mode 100644 index 00000000..520f6c9d --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/adc.h @@ -0,0 +1,58 @@ +/** + ****************************************************************************** + * File Name : ADC.h + * Description : This file provides code for the configuration + * of the ADC instances. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2019 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __adc_H +#define __adc_H +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern ADC_HandleTypeDef hadc1; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_ADC1_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif +#endif /*__ adc_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/gpio.h b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/gpio.h new file mode 100644 index 00000000..40490539 --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/gpio.h @@ -0,0 +1,57 @@ +/** + ****************************************************************************** + * File Name : gpio.h + * Description : This file contains all the functions prototypes for + * the gpio + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2019 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __gpio_H +#define __gpio_H +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_GPIO_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif +#endif /*__ pinoutConfig_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/i2c.h b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/i2c.h new file mode 100644 index 00000000..5b953f46 --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/i2c.h @@ -0,0 +1,58 @@ +/** + ****************************************************************************** + * File Name : I2C.h + * Description : This file provides code for the configuration + * of the I2C instances. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2019 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __i2c_H +#define __i2c_H +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern I2C_HandleTypeDef hi2c1; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_I2C1_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif +#endif /*__ i2c_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/main.h b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/main.h new file mode 100644 index 00000000..01ced96f --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/main.h @@ -0,0 +1,86 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.h + * @brief : Header for main.c file. + * This file contains the common defines of the application. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2019 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __MAIN_H +#define __MAIN_H + +#ifdef __cplusplus +extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "stm32l4xx_hal.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void Error_Handler(void); + +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +/* Private defines -----------------------------------------------------------*/ +#define LED_Pin GPIO_PIN_13 +#define LED_GPIO_Port GPIOC +#define KEY1_Pin GPIO_PIN_2 +#define KEY1_GPIO_Port GPIOB +#define KEY1_EXTI_IRQn EXTI2_IRQn +#define LCD_PWR_Pin GPIO_PIN_15 +#define LCD_PWR_GPIO_Port GPIOB +#define LCD_WR_RS_Pin GPIO_PIN_6 +#define LCD_WR_RS_GPIO_Port GPIOC +#define LCD_RST_Pin GPIO_PIN_7 +#define LCD_RST_GPIO_Port GPIOC +#define KEY2_Pin GPIO_PIN_3 +#define KEY2_GPIO_Port GPIOB +#define M26_PWR_Pin GPIO_PIN_15 +#define M26_PWR_GPIO_Port GPIOA +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +#ifdef __cplusplus +} +#endif + +#endif /* __MAIN_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/mcu_init.h b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/mcu_init.h new file mode 100644 index 00000000..962bb289 --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/mcu_init.h @@ -0,0 +1,24 @@ +#ifndef __MCU_INIT_H +#define __MCU_INIT_H +#ifdef __cplusplus + extern "C" { +#endif + +#include "main.h" +#include "adc.h" +#include "i2c.h" +#include "usart.h" +#include "spi.h" +#include "gpio.h" +#include "lcd_spi2_drv.h" +#include "bh1750.h" +#include "tos_k.h" + +void m26_power_on(void); +void board_init(void); +void SystemClock_Config(void); + +#ifdef __cplusplus +} +#endif +#endif /*__ __MCU_INIT_H */ diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/spi.h b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/spi.h new file mode 100644 index 00000000..408fc259 --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/spi.h @@ -0,0 +1,62 @@ +/** + ****************************************************************************** + * File Name : SPI.h + * Description : This file provides code for the configuration + * of the SPI instances. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2019 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __spi_H +#define __spi_H +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern SPI_HandleTypeDef hspi1; +extern SPI_HandleTypeDef hspi2; +extern SPI_HandleTypeDef hspi3; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_SPI1_Init(void); +void MX_SPI2_Init(void); +void MX_SPI3_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif +#endif /*__ spi_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/stm32l4xx_hal_conf.h b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/stm32l4xx_hal_conf.h new file mode 100644 index 00000000..e75091c5 --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/stm32l4xx_hal_conf.h @@ -0,0 +1,440 @@ +/** + ****************************************************************************** + * @file stm32l4xx_hal_conf.h + * @brief HAL configuration file. + ****************************************************************************** + * @attention + * + *

© COPYRIGHT(c) 2019 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32L4xx_HAL_CONF_H +#define __STM32L4xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ + +#define HAL_MODULE_ENABLED +#define HAL_ADC_MODULE_ENABLED +/*#define HAL_CRYP_MODULE_ENABLED */ +/*#define HAL_CAN_MODULE_ENABLED */ +/*#define HAL_COMP_MODULE_ENABLED */ +/*#define HAL_CRC_MODULE_ENABLED */ +/*#define HAL_CRYP_MODULE_ENABLED */ +/*#define HAL_DAC_MODULE_ENABLED */ +/*#define HAL_DCMI_MODULE_ENABLED */ +/*#define HAL_DMA2D_MODULE_ENABLED */ +/*#define HAL_DFSDM_MODULE_ENABLED */ +/*#define HAL_DSI_MODULE_ENABLED */ +/*#define HAL_FIREWALL_MODULE_ENABLED */ +/*#define HAL_GFXMMU_MODULE_ENABLED */ +/*#define HAL_HCD_MODULE_ENABLED */ +/*#define HAL_HASH_MODULE_ENABLED */ +/*#define HAL_I2S_MODULE_ENABLED */ +/*#define HAL_IRDA_MODULE_ENABLED */ +/*#define HAL_IWDG_MODULE_ENABLED */ +/*#define HAL_LTDC_MODULE_ENABLED */ +/*#define HAL_LCD_MODULE_ENABLED */ +/*#define HAL_LPTIM_MODULE_ENABLED */ +/*#define HAL_MMC_MODULE_ENABLED */ +/*#define HAL_NAND_MODULE_ENABLED */ +/*#define HAL_NOR_MODULE_ENABLED */ +/*#define HAL_OPAMP_MODULE_ENABLED */ +/*#define HAL_OSPI_MODULE_ENABLED */ +/*#define HAL_OSPI_MODULE_ENABLED */ +/*#define HAL_PCD_MODULE_ENABLED */ +/*#define HAL_QSPI_MODULE_ENABLED */ +/*#define HAL_QSPI_MODULE_ENABLED */ +/*#define HAL_RNG_MODULE_ENABLED */ +/*#define HAL_RTC_MODULE_ENABLED */ +/*#define HAL_SAI_MODULE_ENABLED */ +/*#define HAL_SD_MODULE_ENABLED */ +/*#define HAL_SMBUS_MODULE_ENABLED */ +/*#define HAL_SMARTCARD_MODULE_ENABLED */ +#define HAL_SPI_MODULE_ENABLED +/*#define HAL_SRAM_MODULE_ENABLED */ +/*#define HAL_SWPMI_MODULE_ENABLED */ +/*#define HAL_TIM_MODULE_ENABLED */ +/*#define HAL_TSC_MODULE_ENABLED */ +#define HAL_UART_MODULE_ENABLED +/*#define HAL_USART_MODULE_ENABLED */ +/*#define HAL_WWDG_MODULE_ENABLED */ +/*#define HAL_EXTI_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED +#define HAL_I2C_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED + +/* ########################## Oscillator Values adaptation ####################*/ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal Multiple Speed oscillator (MSI) default value. + * This value is the default MSI range value after Reset. + */ +#if !defined (MSI_VALUE) + #define MSI_VALUE ((uint32_t)4000000U) /*!< Value of the Internal oscillator in Hz*/ +#endif /* MSI_VALUE */ +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief Internal High Speed oscillator (HSI48) value for USB FS, SDMMC and RNG. + * This internal oscillator is mainly dedicated to provide a high precision clock to + * the USB peripheral by means of a special Clock Recovery System (CRS) circuitry. + * When the CRS is not used, the HSI48 RC oscillator runs on it default frequency + * which is subject to manufacturing process variations. + */ +#if !defined (HSI48_VALUE) + #define HSI48_VALUE ((uint32_t)48000000U) /*!< Value of the Internal High Speed oscillator for USB FS/SDMMC/RNG in Hz. + The real value my vary depending on manufacturing process variations.*/ +#endif /* HSI48_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) + #define LSI_VALUE ((uint32_t)32000U) /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature.*/ + +/** + * @brief External Low Speed oscillator (LSE) value. + * This value is used by the UART, RTC HAL module to compute the system frequency + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE ((uint32_t)32768U) /*!< Value of the External oscillator in Hz*/ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for SAI1 peripheral + * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source + * frequency. + */ +#if !defined (EXTERNAL_SAI1_CLOCK_VALUE) + #define EXTERNAL_SAI1_CLOCK_VALUE ((uint32_t)2097000U) /*!< Value of the SAI1 External clock source in Hz*/ +#endif /* EXTERNAL_SAI1_CLOCK_VALUE */ + +/** + * @brief External clock source for SAI2 peripheral + * This value is used by the RCC HAL module to compute the SAI1 & SAI2 clock source + * frequency. + */ +#if !defined (EXTERNAL_SAI2_CLOCK_VALUE) + #define EXTERNAL_SAI2_CLOCK_VALUE ((uint32_t)48000U) /*!< Value of the SAI2 External clock source in Hz*/ +#endif /* EXTERNAL_SAI2_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ + +#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */ +#define USE_RTOS 0U +#define PREFETCH_ENABLE 0U +#define INSTRUCTION_CACHE_ENABLE 1U +#define DATA_CACHE_ENABLE 1U + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* ################## SPI peripheral configuration ########################## */ + +/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver + * Activated: CRC code is present inside driver + * Deactivated: CRC code cleaned from driver + */ + +#define USE_SPI_CRC 0U + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED + #include "stm32l4xx_hal_rcc.h" + #include "stm32l4xx_hal_rcc_ex.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED + #include "stm32l4xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32l4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32l4xx_hal_dma.h" + #include "stm32l4xx_hal_dma_ex.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_DFSDM_MODULE_ENABLED + #include "stm32l4xx_hal_dfsdm.h" +#endif /* HAL_DFSDM_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32l4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32l4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED + #include "stm32l4xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_COMP_MODULE_ENABLED + #include "stm32l4xx_hal_comp.h" +#endif /* HAL_COMP_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32l4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED + #include "stm32l4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32l4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED + #include "stm32l4xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED + #include "stm32l4xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED + #include "stm32l4xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_FIREWALL_MODULE_ENABLED + #include "stm32l4xx_hal_firewall.h" +#endif /* HAL_FIREWALL_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32l4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED + #include "stm32l4xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED + #include "stm32l4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED + #include "stm32l4xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED + #include "stm32l4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED + #include "stm32l4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32l4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32l4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LCD_MODULE_ENABLED + #include "stm32l4xx_hal_lcd.h" +#endif /* HAL_LCD_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED + #include "stm32l4xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED + #include "stm32l4xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_OPAMP_MODULE_ENABLED + #include "stm32l4xx_hal_opamp.h" +#endif /* HAL_OPAMP_MODULE_ENABLED */ + +#ifdef HAL_OSPI_MODULE_ENABLED + #include "stm32l4xx_hal_ospi.h" +#endif /* HAL_OSPI_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32l4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED + #include "stm32l4xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED + #include "stm32l4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32l4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED + #include "stm32l4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED + #include "stm32l4xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED + #include "stm32l4xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32l4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_SWPMI_MODULE_ENABLED + #include "stm32l4xx_hal_swpmi.h" +#endif /* HAL_SWPMI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32l4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_TSC_MODULE_ENABLED + #include "stm32l4xx_hal_tsc.h" +#endif /* HAL_TSC_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32l4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32l4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32l4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32l4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32l4xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32l4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED + #include "stm32l4xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_GFXMMU_MODULE_ENABLED + #include "stm32l4xx_hal_gfxmmu.h" +#endif /* HAL_GFXMMU_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0U : assert_failed((char *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(char *file, uint32_t line); +#else + #define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32L4xx_HAL_CONF_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/stm32l4xx_it.h b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/stm32l4xx_it.h new file mode 100644 index 00000000..a817df7a --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/stm32l4xx_it.h @@ -0,0 +1,73 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32l4xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2019 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32L4xx_IT_H +#define __STM32L4xx_IT_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void NMI_Handler(void); +void HardFault_Handler(void); +void MemManage_Handler(void); +void BusFault_Handler(void); +void UsageFault_Handler(void); +void SVC_Handler(void); +void DebugMon_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); +void EXTI2_IRQHandler(void); +void USART2_IRQHandler(void); +void USART3_IRQHandler(void); +void LPUART1_IRQHandler(void); +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32L4xx_IT_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/tickless/bsp_pm_device.h b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/tickless/bsp_pm_device.h new file mode 100644 index 00000000..40efb2e1 --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/tickless/bsp_pm_device.h @@ -0,0 +1,11 @@ +#ifndef _PM_DEVICE_H_ +#define _PM_DEVICE_H_ + +#if TOS_CFG_PWR_MGR_EN > 0u + +extern k_pm_device_t pm_device_uart; + +#endif + +#endif + diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/tickless/bsp_tickless_alarm.h b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/tickless/bsp_tickless_alarm.h new file mode 100644 index 00000000..02cb3e8a --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/tickless/bsp_tickless_alarm.h @@ -0,0 +1,17 @@ +#ifndef _TICKLESS_ALARM_H_ +#define _TICKLESS_ALARM_H_ + +#if TOS_CFG_TICKLESS_EN > 0u + +extern k_tickless_wkup_alarm_t tickless_wkup_alarm_systick; + +extern k_tickless_wkup_alarm_t tickless_wkup_alarm_tim; + +extern k_tickless_wkup_alarm_t tickless_wkup_alarm_rtc_wkupirq; + +extern k_tickless_wkup_alarm_t tickless_wkup_alarm_rtc_alarmirq; + +#endif + +#endif + diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/usart.h b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/usart.h new file mode 100644 index 00000000..0537a48e --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Inc/usart.h @@ -0,0 +1,64 @@ +/** + ****************************************************************************** + * File Name : USART.h + * Description : This file provides code for the configuration + * of the USART instances. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2019 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __usart_H +#define __usart_H +#ifdef __cplusplus + extern "C" { +#endif + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +extern UART_HandleTypeDef hlpuart1; +extern UART_HandleTypeDef huart1; +extern UART_HandleTypeDef huart2; +extern UART_HandleTypeDef huart3; + +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +void MX_LPUART1_UART_Init(void); +void MX_USART1_UART_Init(void); +void MX_USART2_UART_Init(void); +void MX_USART3_UART_Init(void); + +/* USER CODE BEGIN Prototypes */ + +/* USER CODE END Prototypes */ + +#ifdef __cplusplus +} +#endif +#endif /*__ usart_H */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/adc.c b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/adc.c new file mode 100644 index 00000000..1fca8d20 --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/adc.c @@ -0,0 +1,123 @@ +/** + ****************************************************************************** + * File Name : ADC.c + * Description : This file provides code for the configuration + * of the ADC instances. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2019 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "adc.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +ADC_HandleTypeDef hadc1; + +/* ADC1 init function */ +void MX_ADC1_Init(void) +{ + ADC_ChannelConfTypeDef sConfig = {0}; + + /** Common config + */ + hadc1.Instance = ADC1; + hadc1.Init.ClockPrescaler = ADC_CLOCK_ASYNC_DIV1; + hadc1.Init.Resolution = ADC_RESOLUTION_12B; + hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT; + hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE; + hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV; + hadc1.Init.LowPowerAutoWait = DISABLE; + hadc1.Init.ContinuousConvMode = DISABLE; + hadc1.Init.NbrOfConversion = 1; + hadc1.Init.DiscontinuousConvMode = DISABLE; + hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START; + hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE; + hadc1.Init.DMAContinuousRequests = DISABLE; + hadc1.Init.Overrun = ADC_OVR_DATA_PRESERVED; + hadc1.Init.OversamplingMode = DISABLE; + if (HAL_ADC_Init(&hadc1) != HAL_OK) + { + Error_Handler(); + } + /** Configure Regular Channel + */ + sConfig.Channel = ADC_CHANNEL_3; + sConfig.Rank = ADC_REGULAR_RANK_1; + sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5; + sConfig.SingleDiff = ADC_SINGLE_ENDED; + sConfig.OffsetNumber = ADC_OFFSET_NONE; + sConfig.Offset = 0; + if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) + { + Error_Handler(); + } + +} + +void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(adcHandle->Instance==ADC1) + { + /* USER CODE BEGIN ADC1_MspInit 0 */ + + /* USER CODE END ADC1_MspInit 0 */ + /* ADC1 clock enable */ + __HAL_RCC_ADC_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + /**ADC1 GPIO Configuration + PC2 ------> ADC1_IN3 + */ + GPIO_InitStruct.Pin = GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_ANALOG_ADC_CONTROL; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /* USER CODE BEGIN ADC1_MspInit 1 */ + + /* USER CODE END ADC1_MspInit 1 */ + } +} + +void HAL_ADC_MspDeInit(ADC_HandleTypeDef* adcHandle) +{ + + if(adcHandle->Instance==ADC1) + { + /* USER CODE BEGIN ADC1_MspDeInit 0 */ + + /* USER CODE END ADC1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_ADC_CLK_DISABLE(); + + /**ADC1 GPIO Configuration + PC2 ------> ADC1_IN3 + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_2); + + /* USER CODE BEGIN ADC1_MspDeInit 1 */ + + /* USER CODE END ADC1_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/gpio.c b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/gpio.c new file mode 100644 index 00000000..53c791ea --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/gpio.c @@ -0,0 +1,87 @@ +/** + ****************************************************************************** + * File Name : gpio.c + * Description : This file provides code for the configuration + * of all used GPIO pins. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2019 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "gpio.h" +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/*----------------------------------------------------------------------------*/ +/* Configure GPIO */ +/*----------------------------------------------------------------------------*/ +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/** Configure pins as + * Analog + * Input + * Output + * EVENT_OUT + * EXTI +*/ +void MX_GPIO_Init(void) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOC, LED_Pin|LCD_WR_RS_Pin|LCD_RST_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOB, LCD_PWR_Pin|KEY2_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pins : PCPin PCPin PCPin */ + GPIO_InitStruct.Pin = LED_Pin|LCD_WR_RS_Pin|LCD_RST_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /*Configure GPIO pin : PtPin */ + GPIO_InitStruct.Pin = KEY1_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING; + GPIO_InitStruct.Pull = GPIO_NOPULL; + HAL_GPIO_Init(KEY1_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pins : PBPin PBPin */ + GPIO_InitStruct.Pin = LCD_PWR_Pin|KEY2_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* EXTI interrupt init*/ + HAL_NVIC_SetPriority(EXTI2_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(EXTI2_IRQn); + +} + +/* USER CODE BEGIN 2 */ + +/* USER CODE END 2 */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/i2c.c b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/i2c.c new file mode 100644 index 00000000..f71e46fd --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/i2c.c @@ -0,0 +1,118 @@ +/** + ****************************************************************************** + * File Name : I2C.c + * Description : This file provides code for the configuration + * of the I2C instances. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2019 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "i2c.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +I2C_HandleTypeDef hi2c1; + +/* I2C1 init function */ +void MX_I2C1_Init(void) +{ + + hi2c1.Instance = I2C1; + hi2c1.Init.Timing = 0x10909CEC; + hi2c1.Init.OwnAddress1 = 0; + hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + hi2c1.Init.OwnAddress2 = 0; + hi2c1.Init.OwnAddress2Masks = I2C_OA2_NOMASK; + hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + if (HAL_I2C_Init(&hi2c1) != HAL_OK) + { + Error_Handler(); + } + /** Configure Analogue filter + */ + if (HAL_I2CEx_ConfigAnalogFilter(&hi2c1, I2C_ANALOGFILTER_ENABLE) != HAL_OK) + { + Error_Handler(); + } + /** Configure Digital filter + */ + if (HAL_I2CEx_ConfigDigitalFilter(&hi2c1, 0) != HAL_OK) + { + Error_Handler(); + } + +} + +void HAL_I2C_MspInit(I2C_HandleTypeDef* i2cHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(i2cHandle->Instance==I2C1) + { + /* USER CODE BEGIN I2C1_MspInit 0 */ + + /* USER CODE END I2C1_MspInit 0 */ + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**I2C1 GPIO Configuration + PB6 ------> I2C1_SCL + PB7 ------> I2C1_SDA + */ + GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* I2C1 clock enable */ + __HAL_RCC_I2C1_CLK_ENABLE(); + /* USER CODE BEGIN I2C1_MspInit 1 */ + + /* USER CODE END I2C1_MspInit 1 */ + } +} + +void HAL_I2C_MspDeInit(I2C_HandleTypeDef* i2cHandle) +{ + + if(i2cHandle->Instance==I2C1) + { + /* USER CODE BEGIN I2C1_MspDeInit 0 */ + + /* USER CODE END I2C1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_I2C1_CLK_DISABLE(); + + /**I2C1 GPIO Configuration + PB6 ------> I2C1_SCL + PB7 ------> I2C1_SDA + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6|GPIO_PIN_7); + + /* USER CODE BEGIN I2C1_MspDeInit 1 */ + + /* USER CODE END I2C1_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/main.c b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/main.c new file mode 100644 index 00000000..feb98e5a --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/main.c @@ -0,0 +1,26 @@ +#include "mcu_init.h" +#include "cmsis_os.h" + +#define APPLICATION_TASK_STK_SIZE 4096 + +extern void application_entry(void *arg); +osThreadDef(application_entry, osPriorityNormal, 1, APPLICATION_TASK_STK_SIZE); + + +__weak void application_entry(void *arg) +{ + while (1) { + printf("This is a demo task,please use your task entry!\r\n"); + tos_task_delay(1000); + } +} + +int main(void) +{ + board_init(); + printf("Welcome to TencentOS tiny\r\n"); + osKernelInitialize(); // TOS Tiny kernel initialize + osThreadCreate(osThread(application_entry), NULL); // Create TOS Tiny task + osKernelStart(); // Start TOS Tiny +} + diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/mcu_init.c b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/mcu_init.c new file mode 100644 index 00000000..4e1f95a9 --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/mcu_init.c @@ -0,0 +1,165 @@ +#include "mcu_init.h" +#include "logo.h" + +int fputc(int ch, FILE *f) +{ + if (ch == '\n') { + HAL_UART_Transmit(&huart1, (void *)"\r", 1,30000); + } + HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFFFF); + return ch; +} + +int _write(int fd, char *ptr, int len) +{ + (void)HAL_UART_Transmit(&huart1, (uint8_t *)ptr, len, 0xFFFF); + return len; +} + +int fgetc(FILE *f) +{ + /* Place your implementation of fgetc here */ + /* e.g. readwrite a character to the USART2 and Loop until the end of transmission */ + uint8_t ch = 0; + HAL_UART_Receive(&huart1, &ch, 1,30000); + return ch; +} + +/* +* mqtt connect to tencent cloud with m26 demo +*/ +void m26_power_on(void) +{ + HAL_GPIO_WritePin(M26_PWR_GPIO_Port, M26_PWR_Pin, GPIO_PIN_RESET); + HAL_Delay(1000); + HAL_GPIO_WritePin(M26_PWR_GPIO_Port, M26_PWR_Pin, GPIO_PIN_SET); + HAL_Delay(5000); +} + +void board_init(void) +{ + HAL_Init(); + SystemClock_Config(); + MX_GPIO_Init(); + MX_ADC1_Init(); + MX_I2C1_Init(); + MX_LPUART1_UART_Init(); + MX_USART1_UART_Init(); + MX_USART2_UART_Init(); + MX_USART3_UART_Init(); + MX_SPI1_Init(); + MX_SPI3_Init(); + BH1750_Init(); + LCD_Init(); + LCD_Clear(BLACK); +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInit = {0}; + + /** Configure LSE Drive Capability + */ + HAL_PWR_EnableBkUpAccess(); + __HAL_RCC_LSEDRIVE_CONFIG(RCC_LSEDRIVE_LOW); + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSE|RCC_OSCILLATORTYPE_MSI; + RCC_OscInitStruct.LSEState = RCC_LSE_ON; + RCC_OscInitStruct.MSIState = RCC_MSI_ON; + RCC_OscInitStruct.MSICalibrationValue = 0; + RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI; + RCC_OscInitStruct.PLL.PLLM = 1; + RCC_OscInitStruct.PLL.PLLN = 40; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7; + RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2; + RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK) + { + Error_Handler(); + } + PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2|RCC_PERIPHCLK_USART3 + |RCC_PERIPHCLK_LPUART1|RCC_PERIPHCLK_I2C1 + |RCC_PERIPHCLK_ADC; + PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1; + PeriphClkInit.Usart3ClockSelection = RCC_USART3CLKSOURCE_PCLK1; + PeriphClkInit.Lpuart1ClockSelection = RCC_LPUART1CLKSOURCE_PCLK1; + PeriphClkInit.I2c1ClockSelection = RCC_I2C1CLKSOURCE_PCLK1; + PeriphClkInit.AdcClockSelection = RCC_ADCCLKSOURCE_PLLSAI1; + PeriphClkInit.PLLSAI1.PLLSAI1Source = RCC_PLLSOURCE_MSI; + PeriphClkInit.PLLSAI1.PLLSAI1M = 1; + PeriphClkInit.PLLSAI1.PLLSAI1N = 16; + PeriphClkInit.PLLSAI1.PLLSAI1P = RCC_PLLP_DIV7; + PeriphClkInit.PLLSAI1.PLLSAI1Q = RCC_PLLQ_DIV2; + PeriphClkInit.PLLSAI1.PLLSAI1R = RCC_PLLR_DIV2; + PeriphClkInit.PLLSAI1.PLLSAI1ClockOut = RCC_PLLSAI1_ADC1CLK; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK) + { + Error_Handler(); + } + /** Configure the main internal regulator output voltage + */ + if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK) + { + Error_Handler(); + } + /** Enable MSI Auto calibration + */ + HAL_RCCEx_EnableMSIPLLMode(); +} + +/* USER CODE BEGIN 4 */ + +/* USER CODE END 4 */ + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(char *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/spi.c b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/spi.c new file mode 100644 index 00000000..cf669d48 --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/spi.c @@ -0,0 +1,271 @@ +/** + ****************************************************************************** + * File Name : SPI.c + * Description : This file provides code for the configuration + * of the SPI instances. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2019 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "spi.h" + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +SPI_HandleTypeDef hspi1; +SPI_HandleTypeDef hspi2; +SPI_HandleTypeDef hspi3; + +/* SPI1 init function */ +void MX_SPI1_Init(void) +{ + + hspi1.Instance = SPI1; + hspi1.Init.Mode = SPI_MODE_MASTER; + hspi1.Init.Direction = SPI_DIRECTION_2LINES; + hspi1.Init.DataSize = SPI_DATASIZE_4BIT; + hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi1.Init.NSS = SPI_NSS_HARD_OUTPUT; + hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; + hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi1.Init.TIMode = SPI_TIMODE_DISABLE; + hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi1.Init.CRCPolynomial = 7; + hspi1.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; + hspi1.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; + if (HAL_SPI_Init(&hspi1) != HAL_OK) + { + Error_Handler(); + } + +} +/* SPI2 init function */ +void MX_SPI2_Init(void) +{ + + hspi2.Instance = SPI2; + hspi2.Init.Mode = SPI_MODE_MASTER; + hspi2.Init.Direction = SPI_DIRECTION_2LINES; + hspi2.Init.DataSize = SPI_DATASIZE_8BIT; + hspi2.Init.CLKPolarity = SPI_POLARITY_HIGH; + hspi2.Init.CLKPhase = SPI_PHASE_2EDGE; + hspi2.Init.NSS = SPI_NSS_SOFT; + hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; + hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi2.Init.TIMode = SPI_TIMODE_DISABLE; + hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi2.Init.CRCPolynomial = 7; + hspi2.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; + hspi2.Init.NSSPMode = SPI_NSS_PULSE_DISABLE; + if (HAL_SPI_Init(&hspi2) != HAL_OK) + { + Error_Handler(); + } + +} +/* SPI3 init function */ +void MX_SPI3_Init(void) +{ + + hspi3.Instance = SPI3; + hspi3.Init.Mode = SPI_MODE_MASTER; + hspi3.Init.Direction = SPI_DIRECTION_2LINES; + hspi3.Init.DataSize = SPI_DATASIZE_4BIT; + hspi3.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi3.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi3.Init.NSS = SPI_NSS_SOFT; + hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; + hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi3.Init.TIMode = SPI_TIMODE_DISABLE; + hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi3.Init.CRCPolynomial = 7; + hspi3.Init.CRCLength = SPI_CRC_LENGTH_DATASIZE; + hspi3.Init.NSSPMode = SPI_NSS_PULSE_ENABLE; + if (HAL_SPI_Init(&hspi3) != HAL_OK) + { + Error_Handler(); + } + +} + +void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(spiHandle->Instance==SPI1) + { + /* USER CODE BEGIN SPI1_MspInit 0 */ + + /* USER CODE END SPI1_MspInit 0 */ + /* SPI1 clock enable */ + __HAL_RCC_SPI1_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**SPI1 GPIO Configuration + PA1 ------> SPI1_SCK + PA4 ------> SPI1_NSS + PA6 ------> SPI1_MISO + PA12 ------> SPI1_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_6|GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI1_MspInit 1 */ + + /* USER CODE END SPI1_MspInit 1 */ + } + else if(spiHandle->Instance==SPI2) + { + /* USER CODE BEGIN SPI2_MspInit 0 */ + + /* USER CODE END SPI2_MspInit 0 */ + /* SPI2 clock enable */ + __HAL_RCC_SPI2_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**SPI2 GPIO Configuration + PC3 ------> SPI2_MOSI + PB13 ------> SPI2_SCK + */ + GPIO_InitStruct.Pin = GPIO_PIN_3; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_13; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI2_MspInit 1 */ + + /* USER CODE END SPI2_MspInit 1 */ + } + else if(spiHandle->Instance==SPI3) + { + /* USER CODE BEGIN SPI3_MspInit 0 */ + + /* USER CODE END SPI3_MspInit 0 */ + /* SPI3 clock enable */ + __HAL_RCC_SPI3_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**SPI3 GPIO Configuration + PC10 ------> SPI3_SCK + PC11 ------> SPI3_MISO + PB5 ------> SPI3_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF6_SPI3; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_5; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF6_SPI3; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI3_MspInit 1 */ + + /* USER CODE END SPI3_MspInit 1 */ + } +} + +void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle) +{ + + if(spiHandle->Instance==SPI1) + { + /* USER CODE BEGIN SPI1_MspDeInit 0 */ + + /* USER CODE END SPI1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI1_CLK_DISABLE(); + + /**SPI1 GPIO Configuration + PA1 ------> SPI1_SCK + PA4 ------> SPI1_NSS + PA6 ------> SPI1_MISO + PA12 ------> SPI1_MOSI + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_6|GPIO_PIN_12); + + /* USER CODE BEGIN SPI1_MspDeInit 1 */ + + /* USER CODE END SPI1_MspDeInit 1 */ + } + else if(spiHandle->Instance==SPI2) + { + /* USER CODE BEGIN SPI2_MspDeInit 0 */ + + /* USER CODE END SPI2_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI2_CLK_DISABLE(); + + /**SPI2 GPIO Configuration + PC3 ------> SPI2_MOSI + PB13 ------> SPI2_SCK + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_3); + + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13); + + /* USER CODE BEGIN SPI2_MspDeInit 1 */ + + /* USER CODE END SPI2_MspDeInit 1 */ + } + else if(spiHandle->Instance==SPI3) + { + /* USER CODE BEGIN SPI3_MspDeInit 0 */ + + /* USER CODE END SPI3_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI3_CLK_DISABLE(); + + /**SPI3 GPIO Configuration + PC10 ------> SPI3_SCK + PC11 ------> SPI3_MISO + PB5 ------> SPI3_MOSI + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_10|GPIO_PIN_11); + + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_5); + + /* USER CODE BEGIN SPI3_MspDeInit 1 */ + + /* USER CODE END SPI3_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/stm32l4xx_hal_msp.c b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/stm32l4xx_hal_msp.c new file mode 100644 index 00000000..568eaf02 --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/stm32l4xx_hal_msp.c @@ -0,0 +1,84 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * File Name : stm32l4xx_hal_msp.c + * Description : This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2019 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN Define */ + +/* USER CODE END Define */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN Macro */ + +/* USER CODE END Macro */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* External functions --------------------------------------------------------*/ +/* USER CODE BEGIN ExternalFunctions */ + +/* USER CODE END ExternalFunctions */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ +/** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) +{ + /* USER CODE BEGIN MspInit 0 */ + + /* USER CODE END MspInit 0 */ + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); + + /* System interrupt init*/ + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/stm32l4xx_it.c b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/stm32l4xx_it.c new file mode 100644 index 00000000..8c8c5f5a --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/stm32l4xx_it.c @@ -0,0 +1,297 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32l4xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2019 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "stm32l4xx_it.h" +#include "tos_k.h" +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* External variables --------------------------------------------------------*/ +extern UART_HandleTypeDef hlpuart1; +extern UART_HandleTypeDef huart2; +extern UART_HandleTypeDef huart3; +/* USER CODE BEGIN EV */ + +/* USER CODE END EV */ + +/******************************************************************************/ +/* Cortex-M4 Processor Interruption and Exception Handlers */ +/******************************************************************************/ +/** + * @brief This function handles Non maskable interrupt. + */ +void NMI_Handler(void) +{ + /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ + + /* USER CODE END NonMaskableInt_IRQn 0 */ + /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ + + /* USER CODE END NonMaskableInt_IRQn 1 */ +} + +/** + * @brief This function handles Hard fault interrupt. + */ +void HardFault_Handler(void) +{ + /* USER CODE BEGIN HardFault_IRQn 0 */ + + /* USER CODE END HardFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_HardFault_IRQn 0 */ + /* USER CODE END W1_HardFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Memory management fault. + */ +void MemManage_Handler(void) +{ + /* USER CODE BEGIN MemoryManagement_IRQn 0 */ + + /* USER CODE END MemoryManagement_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ + /* USER CODE END W1_MemoryManagement_IRQn 0 */ + } +} + +/** + * @brief This function handles Prefetch fault, memory access fault. + */ +void BusFault_Handler(void) +{ + /* USER CODE BEGIN BusFault_IRQn 0 */ + + /* USER CODE END BusFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_BusFault_IRQn 0 */ + /* USER CODE END W1_BusFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Undefined instruction or illegal state. + */ +void UsageFault_Handler(void) +{ + /* USER CODE BEGIN UsageFault_IRQn 0 */ + + /* USER CODE END UsageFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ + /* USER CODE END W1_UsageFault_IRQn 0 */ + } +} + +/** + * @brief This function handles System service call via SWI instruction. + */ +void SVC_Handler(void) +{ + /* USER CODE BEGIN SVCall_IRQn 0 */ + + /* USER CODE END SVCall_IRQn 0 */ + /* USER CODE BEGIN SVCall_IRQn 1 */ + + /* USER CODE END SVCall_IRQn 1 */ +} + +/** + * @brief This function handles Debug monitor. + */ +void DebugMon_Handler(void) +{ + /* USER CODE BEGIN DebugMonitor_IRQn 0 */ + + /* USER CODE END DebugMonitor_IRQn 0 */ + /* USER CODE BEGIN DebugMonitor_IRQn 1 */ + + /* USER CODE END DebugMonitor_IRQn 1 */ +} + +/** + * @brief This function handles Pendable request for system service. + */ +__weak void PendSV_Handler(void) +{ + /* USER CODE BEGIN PendSV_IRQn 0 */ + + /* USER CODE END PendSV_IRQn 0 */ + /* USER CODE BEGIN PendSV_IRQn 1 */ + + /* USER CODE END PendSV_IRQn 1 */ +} + +/** + * @brief This function handles System tick timer. + */ +void SysTick_Handler(void) +{ + /* USER CODE BEGIN SysTick_IRQn 0 */ + + /* USER CODE END SysTick_IRQn 0 */ + HAL_IncTick(); + if (tos_knl_is_running()) + { + tos_knl_irq_enter(); + tos_tick_handler(); + tos_knl_irq_leave(); + } + //HAL_SYSTICK_IRQHandler(); + /* USER CODE BEGIN SysTick_IRQn 1 */ + + /* USER CODE END SysTick_IRQn 1 */ +} + +/******************************************************************************/ +/* STM32L4xx Peripheral Interrupt Handlers */ +/* Add here the Interrupt Handlers for the used peripherals. */ +/* For the available peripheral interrupt handler names, */ +/* please refer to the startup file (startup_stm32l4xx.s). */ +/******************************************************************************/ + +/** + * @brief This function handles EXTI line1 interrupt. + */ +void EXTI1_IRQHandler(void) +{ + /* USER CODE BEGIN EXTI1_IRQn 0 */ + + /* USER CODE END EXTI1_IRQn 0 */ + HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1); + /* USER CODE BEGIN EXTI1_IRQn 1 */ + + /* USER CODE END EXTI1_IRQn 1 */ +} + +/** + * @brief This function handles EXTI line2 interrupt. + */ +void EXTI2_IRQHandler(void) +{ + /* USER CODE BEGIN EXTI2_IRQn 0 */ + + /* USER CODE END EXTI2_IRQn 0 */ + HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2); + /* USER CODE BEGIN EXTI2_IRQn 1 */ + + /* USER CODE END EXTI2_IRQn 1 */ +} + +/** + * @brief This function handles EXTI line3 interrupt. + */ +void EXTI3_IRQHandler(void) +{ + /* USER CODE BEGIN EXTI3_IRQn 0 */ + + /* USER CODE END EXTI3_IRQn 0 */ + HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3); + /* USER CODE BEGIN EXTI3_IRQn 1 */ + + /* USER CODE END EXTI3_IRQn 1 */ +} + +/** + * @brief This function handles USART2 global interrupt. + */ +void USART2_IRQHandler(void) +{ + /* USER CODE BEGIN USART2_IRQn 0 */ + + /* USER CODE END USART2_IRQn 0 */ + HAL_UART_IRQHandler(&huart2); + /* USER CODE BEGIN USART2_IRQn 1 */ + + /* USER CODE END USART2_IRQn 1 */ +} + +/** + * @brief This function handles USART3 global interrupt. + */ +void USART3_IRQHandler(void) +{ + /* USER CODE BEGIN USART3_IRQn 0 */ + + /* USER CODE END USART3_IRQn 0 */ + HAL_UART_IRQHandler(&huart3); + /* USER CODE BEGIN USART3_IRQn 1 */ + + /* USER CODE END USART3_IRQn 1 */ +} + +/** + * @brief This function handles LPUART1 global interrupt. + */ +void LPUART1_IRQHandler(void) +{ + /* USER CODE BEGIN LPUART1_IRQn 0 */ + + /* USER CODE END LPUART1_IRQn 0 */ + HAL_UART_IRQHandler(&hlpuart1); + /* USER CODE BEGIN LPUART1_IRQn 1 */ + + /* USER CODE END LPUART1_IRQn 1 */ +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/stm32l4xx_it_module.c b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/stm32l4xx_it_module.c new file mode 100644 index 00000000..2473e742 --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/stm32l4xx_it_module.c @@ -0,0 +1,307 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32l4xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2019 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "stm32l4xx_it.h" +#include "tos_k.h" +#include "tos_at.h" +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* External variables --------------------------------------------------------*/ +extern UART_HandleTypeDef hlpuart1; +extern UART_HandleTypeDef huart2; +extern UART_HandleTypeDef huart3; +/* USER CODE BEGIN EV */ + +/* USER CODE END EV */ + +/******************************************************************************/ +/* Cortex-M4 Processor Interruption and Exception Handlers */ +/******************************************************************************/ +/** + * @brief This function handles Non maskable interrupt. + */ +void NMI_Handler(void) +{ + /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ + + /* USER CODE END NonMaskableInt_IRQn 0 */ + /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ + + /* USER CODE END NonMaskableInt_IRQn 1 */ +} + +/** + * @brief This function handles Hard fault interrupt. + */ +void HardFault_Handler(void) +{ + /* USER CODE BEGIN HardFault_IRQn 0 */ + + /* USER CODE END HardFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_HardFault_IRQn 0 */ + /* USER CODE END W1_HardFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Memory management fault. + */ +void MemManage_Handler(void) +{ + /* USER CODE BEGIN MemoryManagement_IRQn 0 */ + + /* USER CODE END MemoryManagement_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ + /* USER CODE END W1_MemoryManagement_IRQn 0 */ + } +} + +/** + * @brief This function handles Prefetch fault, memory access fault. + */ +void BusFault_Handler(void) +{ + /* USER CODE BEGIN BusFault_IRQn 0 */ + + /* USER CODE END BusFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_BusFault_IRQn 0 */ + /* USER CODE END W1_BusFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Undefined instruction or illegal state. + */ +void UsageFault_Handler(void) +{ + /* USER CODE BEGIN UsageFault_IRQn 0 */ + + /* USER CODE END UsageFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ + /* USER CODE END W1_UsageFault_IRQn 0 */ + } +} + +/** + * @brief This function handles System service call via SWI instruction. + */ +void SVC_Handler(void) +{ + /* USER CODE BEGIN SVCall_IRQn 0 */ + + /* USER CODE END SVCall_IRQn 0 */ + /* USER CODE BEGIN SVCall_IRQn 1 */ + + /* USER CODE END SVCall_IRQn 1 */ +} + +/** + * @brief This function handles Debug monitor. + */ +void DebugMon_Handler(void) +{ + /* USER CODE BEGIN DebugMonitor_IRQn 0 */ + + /* USER CODE END DebugMonitor_IRQn 0 */ + /* USER CODE BEGIN DebugMonitor_IRQn 1 */ + + /* USER CODE END DebugMonitor_IRQn 1 */ +} + +/** + * @brief This function handles Pendable request for system service. + */ +__weak void PendSV_Handler(void) +{ + /* USER CODE BEGIN PendSV_IRQn 0 */ + + /* USER CODE END PendSV_IRQn 0 */ + /* USER CODE BEGIN PendSV_IRQn 1 */ + + /* USER CODE END PendSV_IRQn 1 */ +} + +/** + * @brief This function handles System tick timer. + */ +void SysTick_Handler(void) +{ + /* USER CODE BEGIN SysTick_IRQn 0 */ + + /* USER CODE END SysTick_IRQn 0 */ + HAL_IncTick(); + if (tos_knl_is_running()) + { + tos_knl_irq_enter(); + tos_tick_handler(); + tos_knl_irq_leave(); + } + //HAL_SYSTICK_IRQHandler(); + /* USER CODE BEGIN SysTick_IRQn 1 */ + + /* USER CODE END SysTick_IRQn 1 */ +} + +/******************************************************************************/ +/* STM32L4xx Peripheral Interrupt Handlers */ +/* Add here the Interrupt Handlers for the used peripherals. */ +/* For the available peripheral interrupt handler names, */ +/* please refer to the startup file (startup_stm32l4xx.s). */ +/******************************************************************************/ + +/** + * @brief This function handles EXTI line1 interrupt. + */ +void EXTI1_IRQHandler(void) +{ + /* USER CODE BEGIN EXTI1_IRQn 0 */ + + /* USER CODE END EXTI1_IRQn 0 */ + HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_1); + /* USER CODE BEGIN EXTI1_IRQn 1 */ + + /* USER CODE END EXTI1_IRQn 1 */ +} + +/** + * @brief This function handles EXTI line2 interrupt. + */ +void EXTI2_IRQHandler(void) +{ + /* USER CODE BEGIN EXTI2_IRQn 0 */ + + /* USER CODE END EXTI2_IRQn 0 */ + HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_2); + /* USER CODE BEGIN EXTI2_IRQn 1 */ + + /* USER CODE END EXTI2_IRQn 1 */ +} + +/** + * @brief This function handles EXTI line3 interrupt. + */ +void EXTI3_IRQHandler(void) +{ + /* USER CODE BEGIN EXTI3_IRQn 0 */ + + /* USER CODE END EXTI3_IRQn 0 */ + HAL_GPIO_EXTI_IRQHandler(GPIO_PIN_3); + /* USER CODE BEGIN EXTI3_IRQn 1 */ + + /* USER CODE END EXTI3_IRQn 1 */ +} + +/** + * @brief This function handles USART2 global interrupt. + */ +void USART2_IRQHandler(void) +{ + /* USER CODE BEGIN USART2_IRQn 0 */ + + /* USER CODE END USART2_IRQn 0 */ + HAL_UART_IRQHandler(&huart2); + /* USER CODE BEGIN USART2_IRQn 1 */ + + /* USER CODE END USART2_IRQn 1 */ +} + +/** + * @brief This function handles USART3 global interrupt. + */ +void USART3_IRQHandler(void) +{ + /* USER CODE BEGIN USART3_IRQn 0 */ + + /* USER CODE END USART3_IRQn 0 */ + HAL_UART_IRQHandler(&huart3); + /* USER CODE BEGIN USART3_IRQn 1 */ + + /* USER CODE END USART3_IRQn 1 */ +} + +/** + * @brief This function handles LPUART1 global interrupt. + */ +void LPUART1_IRQHandler(void) +{ + /* USER CODE BEGIN LPUART1_IRQn 0 */ + + /* USER CODE END LPUART1_IRQn 0 */ + tos_knl_irq_enter(); + HAL_UART_IRQHandler(&hlpuart1); + tos_knl_irq_leave(); + /* USER CODE BEGIN LPUART1_IRQn 1 */ + + /* USER CODE END LPUART1_IRQn 1 */ +} + +/* USER CODE BEGIN 1 */ +void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) +{ + extern uint8_t data; + if (huart->Instance == LPUART1) { + HAL_UART_Receive_IT(&hlpuart1, &data, 1); + tos_at_uart_input_byte(data); + } +} +/* USER CODE END 1 */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/system_stm32l4xx.c b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/system_stm32l4xx.c new file mode 100644 index 00000000..26bd5179 --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/system_stm32l4xx.c @@ -0,0 +1,337 @@ +/** + ****************************************************************************** + * @file system_stm32l4xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32l4xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * After each device reset the MSI (4 MHz) is used as system clock source. + * Then SystemInit() function is called, in "startup_stm32l4xx.s" file, to + * configure the system clock before to branch to main program. + * + * This file configures the system clock as follows: + *============================================================================= + *----------------------------------------------------------------------------- + * System Clock source | MSI + *----------------------------------------------------------------------------- + * SYSCLK(Hz) | 4000000 + *----------------------------------------------------------------------------- + * HCLK(Hz) | 4000000 + *----------------------------------------------------------------------------- + * AHB Prescaler | 1 + *----------------------------------------------------------------------------- + * APB1 Prescaler | 1 + *----------------------------------------------------------------------------- + * APB2 Prescaler | 1 + *----------------------------------------------------------------------------- + * PLL_M | 1 + *----------------------------------------------------------------------------- + * PLL_N | 8 + *----------------------------------------------------------------------------- + * PLL_P | 7 + *----------------------------------------------------------------------------- + * PLL_Q | 2 + *----------------------------------------------------------------------------- + * PLL_R | 2 + *----------------------------------------------------------------------------- + * PLLSAI1_P | NA + *----------------------------------------------------------------------------- + * PLLSAI1_Q | NA + *----------------------------------------------------------------------------- + * PLLSAI1_R | NA + *----------------------------------------------------------------------------- + * PLLSAI2_P | NA + *----------------------------------------------------------------------------- + * PLLSAI2_Q | NA + *----------------------------------------------------------------------------- + * PLLSAI2_R | NA + *----------------------------------------------------------------------------- + * Require 48MHz for USB OTG FS, | Disabled + * SDIO and RNG clock | + *----------------------------------------------------------------------------- + *============================================================================= + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2017 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32l4xx_system + * @{ + */ + +/** @addtogroup STM32L4xx_System_Private_Includes + * @{ + */ + +#include "stm32l4xx.h" + +#if !defined (HSE_VALUE) + #define HSE_VALUE 8000000U /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (MSI_VALUE) + #define MSI_VALUE 4000000U /*!< Value of the Internal oscillator in Hz*/ +#endif /* MSI_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE 16000000U /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +/******************************************************************************/ +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_Variables + * @{ + */ + /* The SystemCoreClock variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ + uint32_t SystemCoreClock = 4000000U; + + const uint8_t AHBPrescTable[16] = {0U, 0U, 0U, 0U, 0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U, 6U, 7U, 8U, 9U}; + const uint8_t APBPrescTable[8] = {0U, 0U, 0U, 0U, 1U, 2U, 3U, 4U}; + const uint32_t MSIRangeTable[12] = {100000U, 200000U, 400000U, 800000U, 1000000U, 2000000U, \ + 4000000U, 8000000U, 16000000U, 24000000U, 32000000U, 48000000U}; +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_FunctionPrototypes + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32L4xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system. + * @param None + * @retval None + */ + +void SystemInit(void) +{ + /* FPU settings ------------------------------------------------------------*/ + #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ + #endif + + /* Reset the RCC clock configuration to the default reset state ------------*/ + /* Set MSION bit */ + RCC->CR |= RCC_CR_MSION; + + /* Reset CFGR register */ + RCC->CFGR = 0x00000000U; + + /* Reset HSEON, CSSON , HSION, and PLLON bits */ + RCC->CR &= 0xEAF6FFFFU; + + /* Reset PLLCFGR register */ + RCC->PLLCFGR = 0x00001000U; + + /* Reset HSEBYP bit */ + RCC->CR &= 0xFFFBFFFFU; + + /* Disable all interrupts */ + RCC->CIER = 0x00000000U; + + /* Configure the Vector Table location add offset address ------------------*/ +#ifdef VECT_TAB_SRAM + SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#else + SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ +#endif +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is MSI, SystemCoreClock will contain the MSI_VALUE(*) + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(**) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(***) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(***) + * or HSI_VALUE(*) or MSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) MSI_VALUE is a constant defined in stm32l4xx_hal.h file (default value + * 4 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSI_VALUE is a constant defined in stm32l4xx_hal.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (***) HSE_VALUE is a constant defined in stm32l4xx_hal.h file (default value + * 8 MHz), user has to ensure that HSE_VALUE is same as the real + * frequency of the crystal used. Otherwise, this function may + * have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate(void) +{ + uint32_t tmp = 0U, msirange = 0U, pllvco = 0U, pllr = 2U, pllsource = 0U, pllm = 2U; + + /* Get MSI Range frequency--------------------------------------------------*/ + if((RCC->CR & RCC_CR_MSIRGSEL) == RESET) + { /* MSISRANGE from RCC_CSR applies */ + msirange = (RCC->CSR & RCC_CSR_MSISRANGE) >> 8U; + } + else + { /* MSIRANGE from RCC_CR applies */ + msirange = (RCC->CR & RCC_CR_MSIRANGE) >> 4U; + } + /*MSI frequency range in HZ*/ + msirange = MSIRangeTable[msirange]; + + /* Get SYSCLK source -------------------------------------------------------*/ + switch (RCC->CFGR & RCC_CFGR_SWS) + { + case 0x00: /* MSI used as system clock source */ + SystemCoreClock = msirange; + break; + + case 0x04: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + + case 0x08: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + + case 0x0C: /* PLL used as system clock source */ + /* PLL_VCO = (HSE_VALUE or HSI_VALUE or MSI_VALUE/ PLLM) * PLLN + SYSCLK = PLL_VCO / PLLR + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC); + pllm = ((RCC->PLLCFGR & RCC_PLLCFGR_PLLM) >> 4U) + 1U ; + + switch (pllsource) + { + case 0x02: /* HSI used as PLL clock source */ + pllvco = (HSI_VALUE / pllm); + break; + + case 0x03: /* HSE used as PLL clock source */ + pllvco = (HSE_VALUE / pllm); + break; + + default: /* MSI used as PLL clock source */ + pllvco = (msirange / pllm); + break; + } + pllvco = pllvco * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 8U); + pllr = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLR) >> 25U) + 1U) * 2U; + SystemCoreClock = pllvco/pllr; + break; + + default: + SystemCoreClock = msirange; + break; + } + /* Compute HCLK clock frequency --------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4U)]; + /* HCLK clock frequency */ + SystemCoreClock >>= tmp; +} + + +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/tickless/bsp_pm_device.c b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/tickless/bsp_pm_device.c new file mode 100644 index 00000000..bc95c813 --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/tickless/bsp_pm_device.c @@ -0,0 +1,31 @@ +#include "tos_k.h" +#include "mcu_init.h" + +#if TOS_CFG_PWR_MGR_EN > 0u + +static int pm_device_uart_init(void) +{ + return 0; +} + +static int pm_device_uart_suspend(void) +{ + return 0; +} + +static int pm_device_uart_resume(void) +{ + SystemClock_Config(); + + return 0; +} + +k_pm_device_t pm_device_uart = { + .name = "uart", + .init = pm_device_uart_init, + .suspend = pm_device_uart_suspend, + .resume = pm_device_uart_resume, +}; + +#endif + diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/tickless/bsp_pwr_mgr.c b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/tickless/bsp_pwr_mgr.c new file mode 100644 index 00000000..a8df35a8 --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/tickless/bsp_pwr_mgr.c @@ -0,0 +1,26 @@ +#include "tos_k.h" +#include "tickless/bsp_pm_device.h" +#include "tickless/bsp_tickless_alarm.h" + +int tos_bsp_tickless_setup(void) +{ +#if TOS_CFG_TICKLESS_EN > 0u + tos_pm_device_register(&pm_device_uart); + + /* we set a default one shot timer here(systick) */ + // tos_tickless_wkup_alarm_install(TOS_LOW_POWER_MODE_SLEEP, &tickless_wkup_alarm_systick); + tos_tickless_wkup_alarm_install(TOS_LOW_POWER_MODE_SLEEP, &tickless_wkup_alarm_tim); + tos_tickless_wkup_alarm_init(TOS_LOW_POWER_MODE_SLEEP); + + tos_tickless_wkup_alarm_install(TOS_LOW_POWER_MODE_STOP, &tickless_wkup_alarm_rtc_wkupirq); + tos_tickless_wkup_alarm_init(TOS_LOW_POWER_MODE_STOP); + + tos_tickless_wkup_alarm_install(TOS_LOW_POWER_MODE_STANDBY, &tickless_wkup_alarm_rtc_alarmirq); + tos_tickless_wkup_alarm_init(TOS_LOW_POWER_MODE_STANDBY); + + tos_pm_cpu_lpwr_mode_set(TOS_LOW_POWER_MODE_SLEEP); +#endif + + return 0; +} + diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/tickless/bsp_tickless_alarm.c b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/tickless/bsp_tickless_alarm.c new file mode 100644 index 00000000..99c31edb --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/tickless/bsp_tickless_alarm.c @@ -0,0 +1,440 @@ +#include "tos_k.h" + +#include "stm32l4xx_hal.h" +#include "stm32l4xx_hal_tim.h" +#include "stm32l4xx_hal_rtc.h" + +#if TOS_CFG_TICKLESS_EN > 0u + +/* + systick本身也被实现为tickless的唤醒闹钟,实现原理是,当系统要进入tickless模式时, + 把systick的触发时间拉长 + 比如说,下一个任务或者软件定时器是6000ms后执行,那么这6000ms内systick没有必要一直来, + 可以把systick的中断间隔设置为6000ms后再来(实际上systick内部的计时寄存器只有24位,systick + 最大的中断间隔其实很小,可以参考tickless_systick_wkup_alarm_max_delay实现),但即使是这样, + 功耗依然会比在进入idle时仅仅使得cpu进入sleep模式要低(因为systick步长拉长了,cpu可以在sleep + 模式中停留更久) + + 实际上,tickless_systick_wkup_alarm_dismiss(tickless_wkup_alarm_dismiss)接口设计是有缺陷的, + 因为CPU从tickless中醒来,可能并不是因为闹钟时间到了,有可能是外部中断引起的CPU唤醒,因此一个较 + 为完备的实现应该是,让tickless_wkup_alarm_dismiss接口返回实际睡眠的时间(可以通过闹钟的计时寄存 + 器的值换算出来)。此缺陷后期会完善修复,现阶段对硬件尚不熟悉。 + + 注意,systick只能作为sleep模式下的唤醒闹钟。(参考tos_pm.h) + + 目前这一块实现尚不完备,有很懂这方面的朋友欢迎赐教~ + */ +static void tickless_systick_suspend(void) +{ + cpu_systick_suspend(); + cpu_systick_pending_reset(); +} + +static void tickless_systick_resume(void) +{ + cpu_systick_resume(); +} + +static void tickless_systick_wkup_alarm_expires_set(k_time_t millisecond) +{ + cpu_systick_expires_set(millisecond); +} + +static int tickless_systick_wkup_alarm_setup(k_time_t millisecond) +{ + tickless_systick_suspend(); + tickless_systick_wkup_alarm_expires_set(millisecond); + tickless_systick_resume(); + return 0; +} + +static int tickless_systick_wkup_alarm_dismiss(void) +{ + // TODO: + // if not wakeup by systick(that's say another interrupt), need to identify this and fix + return 0; +} + +static k_time_t tickless_systick_wkup_alarm_max_delay(void) +{ + return cpu_systick_max_delay_millisecond(); +} + +k_tickless_wkup_alarm_t tickless_wkup_alarm_systick = { + .init = K_NULL, + .setup = tickless_systick_wkup_alarm_setup, + .dismiss = tickless_systick_wkup_alarm_dismiss, + .max_delay = tickless_systick_wkup_alarm_max_delay, +}; + + +///////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////// +/* + 利用timer6实现的tickless唤醒闹钟,可以作为SLEEP模式下的唤醒源。(参考tos_pm.h) + 目前这一块实现尚不完备,有很懂这方面的朋友欢迎赐教~ + */ +static TIM_HandleTypeDef tim6; + +void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *tim_handler) +{ + if (tim_handler->Instance == TIM6) { + __HAL_RCC_TIM6_CLK_ENABLE(); + + /* TIM6 interrupt Init */ + HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn); + } +} + +void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef *tim_handler) +{ + if (tim_handler->Instance == TIM6) { + /* Peripheral clock disable */ + __HAL_RCC_TIM6_CLK_DISABLE(); + + /* TIM6 interrupt Deinit */ + HAL_NVIC_DisableIRQ(TIM6_DAC_IRQn); + } +} + +static int tickless_tim6_wkup_alarm_init(void) +{ + tim6.Instance = TIM6; + tim6.Init.Prescaler = 0; + tim6.Init.CounterMode = TIM_COUNTERMODE_UP; + tim6.Init.Period = 0; + tim6.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + tim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + HAL_TIM_Base_Init(&tim6); + return 0; +} + +static int tickless_tim6_wkup_alarm_setup(k_time_t millisecond) +{ + tim6.Init.Prescaler = 8000 - 1; + tim6.Init.Period = (millisecond * 10) - 1; + + HAL_TIM_Base_Stop(&tim6); + __HAL_TIM_CLEAR_IT(&tim6, TIM_IT_UPDATE); + + HAL_TIM_Base_Init(&tim6); + HAL_TIM_Base_Start_IT(&tim6); + return 0; +} + +static int tickless_tim6_wkup_alarm_dismiss(void) +{ + TOS_CPU_CPSR_ALLOC(); + + TOS_CPU_INT_DISABLE(); + + HAL_TIM_Base_Stop(&tim6); + HAL_TIM_Base_Stop_IT(&tim6); + + TOS_CPU_INT_ENABLE(); + return 0; +} + +static k_time_t tickless_tim6_wkup_alarm_max_delay(void) +{ + k_time_t millisecond; + uint32_t max_period; + + max_period = ~((uint32_t)0u); + millisecond = (max_period - 1) / 10; + return millisecond; +} + +void TIM6_DAC_IRQHandler(void) +{ + HAL_TIM_IRQHandler(&tim6); +} + +k_tickless_wkup_alarm_t tickless_wkup_alarm_tim = { + .init = tickless_tim6_wkup_alarm_init, + .setup = tickless_tim6_wkup_alarm_setup, + .dismiss = tickless_tim6_wkup_alarm_dismiss, + .max_delay = tickless_tim6_wkup_alarm_max_delay, +}; + + +///////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////// +/* + 利用rtc wakeup中断实现的tickless唤醒闹钟,可以作为SLEEP、STOP模式下的唤醒源。(参考tos_pm.h) + 目前这一块实现尚不完备,有很懂这方面的朋友欢迎赐教~ + */ +static RTC_HandleTypeDef rtc_handler; + +static HAL_StatusTypeDef tickless_rtc_time_set(uint8_t hour, uint8_t minu, uint8_t sec, uint8_t format) +{ + RTC_TimeTypeDef rtc_time; + + rtc_time.Hours = hour; + rtc_time.Minutes = minu; + rtc_time.Seconds = sec; + rtc_time.TimeFormat = format; + rtc_time.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; + rtc_time.StoreOperation = RTC_STOREOPERATION_RESET; + return HAL_RTC_SetTime(&rtc_handler, &rtc_time, RTC_FORMAT_BIN); +} + +static HAL_StatusTypeDef tickless_rtc_date_set(uint8_t year, uint8_t month, uint8_t date, uint8_t week) +{ + RTC_DateTypeDef rtc_date; + + rtc_date.Date = date; + rtc_date.Month = month; + rtc_date.WeekDay = week; + rtc_date.Year = year; + return HAL_RTC_SetDate(&rtc_handler, &rtc_date, RTC_FORMAT_BIN); +} + +static int tickless_rtc_wkup_alarm_init(void) +{ + rtc_handler.Instance = RTC; + rtc_handler.Init.HourFormat = RTC_HOURFORMAT_24; + rtc_handler.Init.AsynchPrediv = 0X7F; + rtc_handler.Init.SynchPrediv = 0XFF; + rtc_handler.Init.OutPut = RTC_OUTPUT_DISABLE; + rtc_handler.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; + rtc_handler.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; + + if (HAL_RTC_Init(&rtc_handler) != HAL_OK) { + return -1; + } + + if (HAL_RTCEx_BKUPRead(&rtc_handler, RTC_BKP_DR0) != 0X5050) { + tickless_rtc_time_set(23, 59, 56, RTC_HOURFORMAT12_PM); + tickless_rtc_date_set(15, 12, 27, 7); + HAL_RTCEx_BKUPWrite(&rtc_handler, RTC_BKP_DR0,0X5050); + } + + return 0; +} + +static int tickless_rtc_wkupirq_wkup_alarm_setup(k_time_t millisecond) +{ + uint32_t wkup_clock = RTC_WAKEUPCLOCK_CK_SPRE_16BITS; + if (millisecond < 1000) { + millisecond = 1000; + } + uint32_t wkup_count = (millisecond / 1000) - 1; + + __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&rtc_handler, RTC_FLAG_WUTF); + + HAL_RTCEx_SetWakeUpTimer_IT(&rtc_handler, wkup_count, wkup_clock); + + HAL_NVIC_SetPriority(RTC_WKUP_IRQn, 0x02, 0x02); + HAL_NVIC_EnableIRQ(RTC_WKUP_IRQn); + return 0; +} + +static int tickless_rtc_wkupirq_wkup_alarm_dismiss(void) +{ +#if defined(STM32F4) || defined(STM32L4) + __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); +#endif + + __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&rtc_handler, RTC_FLAG_WUTF); + + if (HAL_RTCEx_DeactivateWakeUpTimer(&rtc_handler) != HAL_OK) { + return -1; + } + + HAL_NVIC_DisableIRQ(RTC_WKUP_IRQn); + return 0; +} + +static k_time_t tickless_rtc_wkupirq_wkup_alarm_max_delay(void) +{ + return 0xFFFF * K_TIME_MILLISEC_PER_SEC; +} + +void HAL_RTC_MspInit(RTC_HandleTypeDef *rtc_handler) +{ + RCC_OscInitTypeDef rcc_osc; + RCC_PeriphCLKInitTypeDef periph_clock; + + __HAL_RCC_PWR_CLK_ENABLE(); + HAL_PWR_EnableBkUpAccess(); + + rcc_osc.OscillatorType = RCC_OSCILLATORTYPE_LSE; + rcc_osc.PLL.PLLState = RCC_PLL_NONE; + rcc_osc.LSEState = RCC_LSE_ON; + HAL_RCC_OscConfig(&rcc_osc); + + periph_clock.PeriphClockSelection = RCC_PERIPHCLK_RTC; + periph_clock.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; + HAL_RCCEx_PeriphCLKConfig(&periph_clock); + + __HAL_RCC_RTC_ENABLE(); +} + +void RTC_WKUP_IRQHandler(void) +{ + HAL_RTCEx_WakeUpTimerIRQHandler(&rtc_handler); +} + +void HAL_RTCEx_WakeUpTimerEventCallback(RTC_HandleTypeDef *rtc_handler) +{ +} + +k_tickless_wkup_alarm_t tickless_wkup_alarm_rtc_wkupirq = { + .init = tickless_rtc_wkup_alarm_init, + .setup = tickless_rtc_wkupirq_wkup_alarm_setup, + .dismiss = tickless_rtc_wkupirq_wkup_alarm_dismiss, + .max_delay = tickless_rtc_wkupirq_wkup_alarm_max_delay, +}; + + + +///////////////////////////////////////////////////////////////////////////////////////////// +///////////////////////////////////////////////////////////////////////////////////////////// +/* + 利用rtc alarm中断实现的tickless唤醒闹钟,可以作为SLEEP、STOP、STANDBY模式下的唤醒源。(参考tos_pm.h) + 目前这一块实现尚不完备,有很懂这方面的朋友欢迎赐教~ + */ +static int tickless_rtc_alarmirq_wkup_alarm_setup(k_time_t millisecond) +{ + uint8_t hour, minute, second, subsecond, date; + + RTC_AlarmTypeDef rtc_alarm; + RTC_TimeTypeDef rtc_time; + RTC_DateTypeDef rtc_date; + + HAL_RTC_GetTime(&rtc_handler, &rtc_time, RTC_FORMAT_BIN); + HAL_RTC_GetDate(&rtc_handler, &rtc_date, RTC_FORMAT_BIN); + + hour = rtc_time.Hours; + minute = rtc_time.Minutes; + second = rtc_time.Seconds; +#if 0 + date = rtc_date.Date; +#else + date = rtc_date.WeekDay; +#endif + + printf("before >>> %d %d %d %d\n", date, hour, minute, second); + + /* I know it's ugly, I will find a elegant way. Welcome to tell me, 3ks~ */ + second += millisecond / K_TIME_MILLISEC_PER_SEC; + if (second >= 60) { + minute += 1; + second -= 60; + } + if (minute >= 60) { + hour += 1; + minute -= 60; + } + if (hour >= 24) { + date += 1; + hour -= 24; + } + + printf("after >>> %d %d %d %d\n", date, hour, minute, second); + + rtc_alarm.AlarmTime.Hours = hour; + rtc_alarm.AlarmTime.Minutes = minute; + rtc_alarm.AlarmTime.Seconds = second; + rtc_alarm.AlarmTime.SubSeconds = 0; + rtc_alarm.AlarmTime.TimeFormat = RTC_HOURFORMAT12_AM; + + rtc_alarm.AlarmMask = RTC_ALARMMASK_NONE; + rtc_alarm.AlarmSubSecondMask = RTC_ALARMSUBSECONDMASK_NONE; + rtc_alarm.AlarmDateWeekDaySel = RTC_ALARMDATEWEEKDAYSEL_WEEKDAY; // RTC_ALARMDATEWEEKDAYSEL_DATE; // RTC_ALARMDATEWEEKDAYSEL_WEEKDAY; + rtc_alarm.AlarmDateWeekDay = date; + rtc_alarm.Alarm = RTC_ALARM_A; + HAL_RTC_SetAlarm_IT(&rtc_handler, &rtc_alarm, RTC_FORMAT_BIN); + + HAL_NVIC_SetPriority(RTC_Alarm_IRQn, 0x01, 0x02); + HAL_NVIC_EnableIRQ(RTC_Alarm_IRQn); + + + // __HAL_PWR_GET_FLAG(PWR_FLAG_WU) + + + __HAL_RCC_AHB1_FORCE_RESET(); //复位所有IO口 + __HAL_RCC_PWR_CLK_ENABLE(); //使能PWR时钟 + + // __HAL_RCC_BACKUPRESET_FORCE(); //复位备份区域 + HAL_PWR_EnableBkUpAccess(); //后备区域访问使能 + + __HAL_PWR_CLEAR_FLAG(PWR_FLAG_SB); + __HAL_RTC_WRITEPROTECTION_DISABLE(&rtc_handler);//关闭RTC写保护 + + //关闭RTC相关中断 + __HAL_RTC_WAKEUPTIMER_DISABLE_IT(&rtc_handler,RTC_IT_WUT); +#if 0 + __HAL_RTC_TIMESTAMP_DISABLE_IT(&rtc_handler,RTC_IT_TS); + __HAL_RTC_ALARM_DISABLE_IT(&rtc_handler,RTC_IT_ALRA|RTC_IT_ALRB); +#endif + + //清除RTC相关中断标志位 + __HAL_RTC_ALARM_CLEAR_FLAG(&rtc_handler,RTC_FLAG_ALRAF|RTC_FLAG_ALRBF); + __HAL_RTC_TIMESTAMP_CLEAR_FLAG(&rtc_handler,RTC_FLAG_TSF); + __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&rtc_handler,RTC_FLAG_WUTF); + + // __HAL_RCC_BACKUPRESET_RELEASE(); //备份区域复位结束 + __HAL_RTC_WRITEPROTECTION_ENABLE(&rtc_handler); //使能RTC写保护 + + +#ifdef STM32F4 + __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); //清除Wake_UP标志 +#endif + +#ifdef STM32F7 + // __HAL_PWR_CLEAR_WAKEUP_FLAG(PWR_WAKEUP_PIN_FLAG1); //清除Wake_UP标志 +#endif + + // HAL_PWR_EnableWakeUpPin(PWR_WAKEUP_PIN1); //设置WKUP用于唤醒 + + return 0; +} + +static int tickless_rtc_alarmirq_wkup_alarm_dismiss(void) +{ +#if 1 + // __HAL_PWR_GET_FLAG(PWR_FLAG_WU); + + __HAL_PWR_CLEAR_FLAG(PWR_FLAG_WU); + + // __HAL_RTC_WAKEUPTIMER_CLEAR_FLAG(&rtc_handler, RTC_FLAG_ALRAF); + + __HAL_RTC_ALARM_CLEAR_FLAG(&rtc_handler, RTC_FLAG_ALRAF); + +#if 0 + if (HAL_RTCEx_DeactivateWakeUpTimer(&rtc_handler) != HAL_OK) { + return -1; + } +#endif + + HAL_NVIC_DisableIRQ(RTC_Alarm_IRQn); + return 0; +#endif +} + +static k_time_t tickless_rtc_alarmirq_wkup_alarm_max_delay(void) +{ + return 0xFFFF; // just kidding, I will fix it out. Welcome to tell me, 3ks~ */ +} + +void RTC_Alarm_IRQHandler(void) +{ + HAL_RTC_AlarmIRQHandler(&rtc_handler); +} + +void HAL_RTC_AlarmAEventCallback(RTC_HandleTypeDef *rtc_handler) +{ +} + +k_tickless_wkup_alarm_t tickless_wkup_alarm_rtc_alarmirq = { + .init = tickless_rtc_wkup_alarm_init, + .setup = tickless_rtc_alarmirq_wkup_alarm_setup, + .dismiss = tickless_rtc_alarmirq_wkup_alarm_dismiss, + .max_delay = tickless_rtc_alarmirq_wkup_alarm_max_delay, +}; + +#endif + diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/usart.c b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/usart.c new file mode 100644 index 00000000..0a9b45ea --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BSP/Src/usart.c @@ -0,0 +1,313 @@ +/** + ****************************************************************************** + * File Name : USART.c + * Description : This file provides code for the configuration + * of the USART instances. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2019 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Includes ------------------------------------------------------------------*/ +#include "usart.h" + +/* USER CODE BEGIN 0 */ +uint8_t data; +/* USER CODE END 0 */ + +UART_HandleTypeDef hlpuart1; +UART_HandleTypeDef huart1; +UART_HandleTypeDef huart2; +UART_HandleTypeDef huart3; + +/* LPUART1 init function */ + +void MX_LPUART1_UART_Init(void) +{ + + hlpuart1.Instance = LPUART1; + hlpuart1.Init.BaudRate = 115200; + hlpuart1.Init.WordLength = UART_WORDLENGTH_8B; + hlpuart1.Init.StopBits = UART_STOPBITS_1; + hlpuart1.Init.Parity = UART_PARITY_NONE; + hlpuart1.Init.Mode = UART_MODE_TX_RX; + hlpuart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; + hlpuart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; + hlpuart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; + if (HAL_UART_Init(&hlpuart1) != HAL_OK) + { + Error_Handler(); + } + HAL_UART_Receive_IT(&hlpuart1, &data, 1); +} +/* USART1 init function */ + +void MX_USART1_UART_Init(void) +{ + + huart1.Instance = USART1; + huart1.Init.BaudRate = 115200; + huart1.Init.WordLength = UART_WORDLENGTH_8B; + huart1.Init.StopBits = UART_STOPBITS_1; + huart1.Init.Parity = UART_PARITY_NONE; + huart1.Init.Mode = UART_MODE_TX_RX; + huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart1.Init.OverSampling = UART_OVERSAMPLING_16; + huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; + huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; + if (HAL_UART_Init(&huart1) != HAL_OK) + { + Error_Handler(); + } + +} +/* USART2 init function */ + +void MX_USART2_UART_Init(void) +{ + + huart2.Instance = USART2; + huart2.Init.BaudRate = 115200; + huart2.Init.WordLength = UART_WORDLENGTH_8B; + huart2.Init.StopBits = UART_STOPBITS_1; + huart2.Init.Parity = UART_PARITY_NONE; + huart2.Init.Mode = UART_MODE_TX_RX; + huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart2.Init.OverSampling = UART_OVERSAMPLING_16; + huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; + huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; + if (HAL_UART_Init(&huart2) != HAL_OK) + { + Error_Handler(); + } + +} +/* USART3 init function */ + +void MX_USART3_UART_Init(void) +{ + + huart3.Instance = USART3; + huart3.Init.BaudRate = 115200; + huart3.Init.WordLength = UART_WORDLENGTH_8B; + huart3.Init.StopBits = UART_STOPBITS_1; + huart3.Init.Parity = UART_PARITY_NONE; + huart3.Init.Mode = UART_MODE_TX_RX; + huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart3.Init.OverSampling = UART_OVERSAMPLING_16; + huart3.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE; + huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT; + if (HAL_UART_Init(&huart3) != HAL_OK) + { + Error_Handler(); + } + +} + +void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) +{ + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(uartHandle->Instance==LPUART1) + { + /* USER CODE BEGIN LPUART1_MspInit 0 */ + + /* USER CODE END LPUART1_MspInit 0 */ + /* LPUART1 clock enable */ + __HAL_RCC_LPUART1_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + /**LPUART1 GPIO Configuration + PC0 ------> LPUART1_RX + PC1 ------> LPUART1_TX + */ + GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF8_LPUART1; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /* LPUART1 interrupt Init */ + HAL_NVIC_SetPriority(LPUART1_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(LPUART1_IRQn); + /* USER CODE BEGIN LPUART1_MspInit 1 */ + + /* USER CODE END LPUART1_MspInit 1 */ + } + else if(uartHandle->Instance==USART1) + { + /* USER CODE BEGIN USART1_MspInit 0 */ + + /* USER CODE END USART1_MspInit 0 */ + /* USART1 clock enable */ + __HAL_RCC_USART1_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**USART1 GPIO Configuration + PA9 ------> USART1_TX + PA10 ------> USART1_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF7_USART1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN USART1_MspInit 1 */ + + /* USER CODE END USART1_MspInit 1 */ + } + else if(uartHandle->Instance==USART2) + { + /* USER CODE BEGIN USART2_MspInit 0 */ + + /* USER CODE END USART2_MspInit 0 */ + /* USART2 clock enable */ + __HAL_RCC_USART2_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**USART2 GPIO Configuration + PA2 ------> USART2_TX + PA3 ------> USART2_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF7_USART2; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USART2 interrupt Init */ + HAL_NVIC_SetPriority(USART2_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(USART2_IRQn); + /* USER CODE BEGIN USART2_MspInit 1 */ + + /* USER CODE END USART2_MspInit 1 */ + } + else if(uartHandle->Instance==USART3) + { + /* USER CODE BEGIN USART3_MspInit 0 */ + + /* USER CODE END USART3_MspInit 0 */ + /* USART3 clock enable */ + __HAL_RCC_USART3_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + /**USART3 GPIO Configuration + PC4 ------> USART3_TX + PC5 ------> USART3_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF7_USART3; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /* USART3 interrupt Init */ + HAL_NVIC_SetPriority(USART3_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(USART3_IRQn); + /* USER CODE BEGIN USART3_MspInit 1 */ + + /* USER CODE END USART3_MspInit 1 */ + } +} + +void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle) +{ + + if(uartHandle->Instance==LPUART1) + { + /* USER CODE BEGIN LPUART1_MspDeInit 0 */ + + /* USER CODE END LPUART1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_LPUART1_CLK_DISABLE(); + + /**LPUART1 GPIO Configuration + PC0 ------> LPUART1_RX + PC1 ------> LPUART1_TX + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_0|GPIO_PIN_1); + + /* LPUART1 interrupt Deinit */ + HAL_NVIC_DisableIRQ(LPUART1_IRQn); + /* USER CODE BEGIN LPUART1_MspDeInit 1 */ + + /* USER CODE END LPUART1_MspDeInit 1 */ + } + else if(uartHandle->Instance==USART1) + { + /* USER CODE BEGIN USART1_MspDeInit 0 */ + + /* USER CODE END USART1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USART1_CLK_DISABLE(); + + /**USART1 GPIO Configuration + PA9 ------> USART1_TX + PA10 ------> USART1_RX + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10); + + /* USER CODE BEGIN USART1_MspDeInit 1 */ + + /* USER CODE END USART1_MspDeInit 1 */ + } + else if(uartHandle->Instance==USART2) + { + /* USER CODE BEGIN USART2_MspDeInit 0 */ + + /* USER CODE END USART2_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USART2_CLK_DISABLE(); + + /**USART2 GPIO Configuration + PA2 ------> USART2_TX + PA3 ------> USART2_RX + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3); + + /* USART2 interrupt Deinit */ + HAL_NVIC_DisableIRQ(USART2_IRQn); + /* USER CODE BEGIN USART2_MspDeInit 1 */ + + /* USER CODE END USART2_MspDeInit 1 */ + } + else if(uartHandle->Instance==USART3) + { + /* USER CODE BEGIN USART3_MspDeInit 0 */ + + /* USER CODE END USART3_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USART3_CLK_DISABLE(); + + /**USART3 GPIO Configuration + PC4 ------> USART3_TX + PC5 ------> USART3_RX + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_4|GPIO_PIN_5); + + /* USART3 interrupt Deinit */ + HAL_NVIC_DisableIRQ(USART3_IRQn); + /* USER CODE BEGIN USART3_MspDeInit 1 */ + + /* USER CODE END USART3_MspDeInit 1 */ + } +} + +/* USER CODE BEGIN 1 */ +/* USER CODE END 1 */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BearPi_STM32L31RC.uvguix.Administrator b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BearPi_STM32L31RC.uvguix.Administrator new file mode 100644 index 00000000..bbbc485f --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BearPi_STM32L31RC.uvguix.Administrator @@ -0,0 +1,1896 @@ + + + + -6.1 + +
### uVision Project, (C) Keil Software
+ + + + + + + + + + 38003 + Registers + 140 90 + + + 346 + Code Coverage + 1010 160 + + + 204 + Performance Analyzer + 1170 + + + + + + 35141 + Event Statistics + + 200 50 700 + + + 1506 + Symbols + + 80 80 80 + + + 1936 + Watch 1 + + 200 133 133 + + + 1937 + Watch 2 + + 200 133 133 + + + 1935 + Call Stack + Locals + + 200 133 133 + + + 2506 + Trace Data + + 75 135 130 95 70 230 200 150 + + + 466 + Source Browser - *** Not Enabled *** + 500 + 300 + + + + + + + + 1 + 1 + 0 + 0 + -1 + + + + + + + 44 + 2 + 3 + + -32000 + -32000 + + + -1 + -1 + + + 46 + 64 + 2003 + 973 + + + + 0 + + 528 + 01000000040000000100000001000000010000000100000000000000020000000000000001000000010000000000000028000000280000000100000003000000000000000100000044473A5C4769746875625C4769746875625C54656E63656E744F532D74696E795C6578616D706C65735C6775696C6974655F64656D6F5C6775696C6974655F64656D6F2E63000000000E6775696C6974655F64656D6F2E6300000000C5D4F200FFFFFFFF64473A5C4769746875625C4769746875625C54656E63656E744F532D74696E795C626F6172645C4265617250695F53544D33324C34333152435C4B45494C5C74656E63656E745F6F735F6775696C6974655F64656D6F5C4253505C5372635C6D61696E2E6300000000066D61696E2E6300000000FFDC7800FFFFFFFF68473A5C4769746875625C4769746875625C54656E63656E744F532D74696E795C626F6172645C4265617250695F53544D33324C34333152435C4B45494C5C74656E63656E745F6F735F6775696C6974655F64656D6F5C4253505C5372635C6D63755F696E69742E63000000000A6D63755F696E69742E6300000000BECEA100FFFFFFFF0100000010000000C5D4F200FFDC7800BECEA100F0A0A100BCA8E1009CC1B600F7B88600D9ADC200A5C2D700B3A6BE00EAD6A300F6FA7D00B5E99D005FC3CF00C1838300CACAD500010000000000000002000000F4000000660000008007000069030000 + + + + 0 + Build + + -1 + -1 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F40000004F00000090050000DF000000 + + + 16 + F200000009010000BA03000099010000 + + + + 1005 + 1005 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000ED00000039030000 + + + 16 + F200000009010000E2010000D4010000 + + + + 109 + 109 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000ED00000039030000 + + + 16 + F2000000090100000E02000049030000 + + + + 1465 + 1465 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 000000002D02000090050000BD020000 + + + 16 + F200000009010000BA03000099010000 + + + + 1466 + 1466 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000300200008D05000090020000 + + + 16 + F200000009010000BA03000099010000 + + + + 1467 + 1467 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000300200008D05000090020000 + + + 16 + F200000009010000BA03000099010000 + + + + 1468 + 1468 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000300200008D05000090020000 + + + 16 + F200000009010000BA03000099010000 + + + + 1506 + 1506 + 0 + 0 + 0 + 0 + 32767 + 0 + 16384 + 0 + + 16 + A3040000660000008D05000001010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 1913 + 1913 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F7000000660000008D050000C6000000 + + + 16 + F200000009010000BA03000099010000 + + + + 1935 + 1935 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 03000000300200008D050000A4020000 + + + 16 + F200000009010000E2010000D4010000 + + + + 1936 + 1936 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000300200008D05000090020000 + + + 16 + F200000009010000E2010000D4010000 + + + + 1937 + 1937 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000300200008D05000090020000 + + + 16 + F200000009010000E2010000D4010000 + + + + 1939 + 1939 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000300200008D05000090020000 + + + 16 + F200000009010000BA03000099010000 + + + + 1940 + 1940 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000300200008D05000090020000 + + + 16 + F200000009010000BA03000099010000 + + + + 1941 + 1941 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000300200008D05000090020000 + + + 16 + F200000009010000BA03000099010000 + + + + 1942 + 1942 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000300200008D05000090020000 + + + 16 + F200000009010000BA03000099010000 + + + + 195 + 195 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000ED00000039030000 + + + 16 + F2000000090100000E02000049030000 + + + + 196 + 196 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000ED00000039030000 + + + 16 + F2000000090100000E02000049030000 + + + + 197 + 197 + 1 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 030000006D0300007D070000CD030000 + + + 16 + F200000009010000BA03000099010000 + + + + 198 + 198 + 0 + 0 + 0 + 0 + 32767 + 0 + 32768 + 0 + + 16 + 000000001902000090050000BD020000 + + + 16 + F200000009010000BA03000099010000 + + + + 199 + 199 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000006D0300007D070000CD030000 + + + 16 + F200000009010000BA03000099010000 + + + + 203 + 203 + 0 + 0 + 0 + 0 + 32767 + 0 + 8192 + 0 + + 16 + F40000006300000090050000DF000000 + + + 16 + F200000009010000BA03000099010000 + + + + 204 + 204 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F7000000660000008D050000C6000000 + + + 16 + F200000009010000BA03000099010000 + + + + 221 + 221 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000000000000000000000000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 2506 + 2506 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A0040000630000009005000029020000 + + + 16 + F200000009010000E2010000D4010000 + + + + 2507 + 2507 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 000000002D02000090050000A9020000 + + + 16 + F200000009010000BA03000099010000 + + + + 343 + 343 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F7000000660000008D050000C6000000 + + + 16 + F200000009010000BA03000099010000 + + + + 346 + 346 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F7000000660000008D050000C6000000 + + + 16 + F200000009010000BA03000099010000 + + + + 35141 + 35141 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F40000006300000090050000DF000000 + + + 16 + F200000009010000E2010000D4010000 + + + + 35824 + 35824 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F7000000660000008D050000C6000000 + + + 16 + F200000009010000BA03000099010000 + + + + 35885 + 35885 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 35886 + 35886 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 35887 + 35887 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 35888 + 35888 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 35889 + 35889 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 35890 + 35890 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 35891 + 35891 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 35892 + 35892 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 35893 + 35893 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 35894 + 35894 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 35895 + 35895 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 35896 + 35896 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 35897 + 35897 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 35898 + 35898 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 35899 + 35899 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 35900 + 35900 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 35901 + 35901 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 35902 + 35902 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 35903 + 35903 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 35904 + 35904 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 35905 + 35905 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 38003 + 38003 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 0300000066000000ED000000A4020000 + + + 16 + F2000000090100000E02000049030000 + + + + 38007 + 38007 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 000000006A03000090050000E6030000 + + + 16 + F200000009010000BA03000099010000 + + + + 436 + 436 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000006D0300008D050000CD030000 + + + 16 + F2000000090100000E02000049030000 + + + + 437 + 437 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000300200008D05000090020000 + + + 16 + F200000009010000E2010000D4010000 + + + + 440 + 440 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000300200008D05000090020000 + + + 16 + F200000009010000E2010000D4010000 + + + + 463 + 463 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000006D0300008D050000CD030000 + + + 16 + F2000000090100000E02000049030000 + + + + 466 + 466 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 030000006D0300008D050000CD030000 + + + 16 + F2000000090100000E02000049030000 + + + + 470 + 470 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F7000000660000008D050000C6000000 + + + 16 + F200000009010000BA03000099010000 + + + + 50000 + 50000 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 50001 + 50001 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 50002 + 50002 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 50003 + 50003 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 50004 + 50004 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 50005 + 50005 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + F7000000660000008D05000081000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 50006 + 50006 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 50007 + 50007 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 50008 + 50008 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 50009 + 50009 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 50010 + 50010 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 50011 + 50011 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 50012 + 50012 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 50013 + 50013 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 50014 + 50014 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 50015 + 50015 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 50016 + 50016 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 50017 + 50017 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 50018 + 50018 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 50019 + 50019 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + A3040000660000008D0500007C010000 + + + 16 + F200000009010000E2010000D4010000 + + + + 59392 + 59392 + 1 + 0 + 0 + 0 + 32767 + 0 + 8192 + 0 + + 16 + 0000000000000000D10300001C000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59393 + 0 + 1 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 00000000E603000080070000F9030000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59399 + 59399 + 1 + 0 + 0 + 0 + 32767 + 0 + 8192 + 1 + + 16 + 000000001C000000E701000038000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 59400 + 59400 + 0 + 0 + 0 + 0 + 32767 + 0 + 8192 + 2 + + 16 + 00000000380000006F02000054000000 + + + 16 + 0A0000000A0000006E0000006E000000 + + + + 824 + 824 + 0 + 0 + 0 + 0 + 32767 + 0 + 4096 + 0 + + 16 + 03000000300200008D05000090020000 + + + 16 + F200000009010000E2010000D4010000 + + + + 3334 + 000000000B000000000000000020000000000000FFFFFFFFFFFFFFFFF4000000DF00000090050000E3000000000000000100001004000000010000000000000000000000FFFFFFFF08000000CB00000057010000CC000000F08B00005A01000079070000D601000045890000FFFF02000B004354616262656450616E650020000000000000F200000009010000BA03000099010000F40000004F00000090050000DF0000000000000040280046080000000B446973617373656D626C7900000000CB00000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A6572000000005701000001000000FFFFFFFFFFFFFFFF14506572666F726D616E636520416E616C797A657200000000CC00000001000000FFFFFFFFFFFFFFFF0E4C6F67696320416E616C797A657200000000F08B000001000000FFFFFFFFFFFFFFFF0D436F646520436F766572616765000000005A01000001000000FFFFFFFFFFFFFFFF11496E737472756374696F6E205472616365000000007907000001000000FFFFFFFFFFFFFFFF0F53797374656D20416E616C797A657200000000D601000001000000FFFFFFFFFFFFFFFF104576656E742053746174697374696373000000004589000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFCB00000001000000FFFFFFFFCB000000000000000040000000000000FFFFFFFFFFFFFFFF9C0400004F000000A004000029020000000000000200001004000000010000000000000000000000FFFFFFFF2B000000E2050000CA0900002D8C00002E8C00002F8C0000308C0000318C0000328C0000338C0000348C0000358C0000368C0000378C0000388C0000398C00003A8C00003B8C00003C8C00003D8C00003E8C00003F8C0000408C0000418C000050C3000051C3000052C3000053C3000054C3000055C3000056C3000057C3000058C3000059C300005AC300005BC300005CC300005DC300005EC300005FC3000060C3000061C3000062C3000063C3000001800040000000000000F200000009010000E2010000D4010000A00400004F000000900500002902000000000000404100462B0000000753796D626F6C7300000000E205000001000000FFFFFFFFFFFFFFFF0A5472616365204461746100000000CA09000001000000FFFFFFFFFFFFFFFF00000000002D8C000001000000FFFFFFFFFFFFFFFF00000000002E8C000001000000FFFFFFFFFFFFFFFF00000000002F8C000001000000FFFFFFFFFFFFFFFF0000000000308C000001000000FFFFFFFFFFFFFFFF0000000000318C000001000000FFFFFFFFFFFFFFFF0000000000328C000001000000FFFFFFFFFFFFFFFF0000000000338C000001000000FFFFFFFFFFFFFFFF0000000000348C000001000000FFFFFFFFFFFFFFFF0000000000358C000001000000FFFFFFFFFFFFFFFF0000000000368C000001000000FFFFFFFFFFFFFFFF0000000000378C000001000000FFFFFFFFFFFFFFFF0000000000388C000001000000FFFFFFFFFFFFFFFF0000000000398C000001000000FFFFFFFFFFFFFFFF00000000003A8C000001000000FFFFFFFFFFFFFFFF00000000003B8C000001000000FFFFFFFFFFFFFFFF00000000003C8C000001000000FFFFFFFFFFFFFFFF00000000003D8C000001000000FFFFFFFFFFFFFFFF00000000003E8C000001000000FFFFFFFFFFFFFFFF00000000003F8C000001000000FFFFFFFFFFFFFFFF0000000000408C000001000000FFFFFFFFFFFFFFFF0000000000418C000001000000FFFFFFFFFFFFFFFF000000000050C3000001000000FFFFFFFFFFFFFFFF000000000051C3000001000000FFFFFFFFFFFFFFFF000000000052C3000001000000FFFFFFFFFFFFFFFF000000000053C3000001000000FFFFFFFFFFFFFFFF000000000054C3000001000000FFFFFFFFFFFFFFFF000000000055C3000001000000FFFFFFFFFFFFFFFF000000000056C3000001000000FFFFFFFFFFFFFFFF000000000057C3000001000000FFFFFFFFFFFFFFFF000000000058C3000001000000FFFFFFFFFFFFFFFF000000000059C3000001000000FFFFFFFFFFFFFFFF00000000005AC3000001000000FFFFFFFFFFFFFFFF00000000005BC3000001000000FFFFFFFFFFFFFFFF00000000005CC3000001000000FFFFFFFFFFFFFFFF00000000005DC3000001000000FFFFFFFFFFFFFFFF00000000005EC3000001000000FFFFFFFFFFFFFFFF00000000005FC3000001000000FFFFFFFFFFFFFFFF000000000060C3000001000000FFFFFFFFFFFFFFFF000000000061C3000001000000FFFFFFFFFFFFFFFF000000000062C3000001000000FFFFFFFFFFFFFFFF000000000063C3000001000000FFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000001000000FFFFFFFFE205000001000000FFFFFFFFE2050000000000000010000001000000FFFFFFFFFFFFFFFFF00000004F000000F400000052030000010000000200001004000000010000000000000000000000FFFFFFFF05000000ED0300006D000000C3000000C40000007394000001800010000001000000F200000009010000E2010000D4010000000000004F000000F0000000520300000000000040410056050000000750726F6A65637401000000ED03000001000000FFFFFFFFFFFFFFFF05426F6F6B73010000006D00000001000000FFFFFFFFFFFFFFFF0946756E6374696F6E7301000000C300000001000000FFFFFFFFFFFFFFFF0954656D706C6174657301000000C400000001000000FFFFFFFFFFFFFFFF09526567697374657273000000007394000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFED03000001000000FFFFFFFFED030000000000000080000000000000FFFFFFFFFFFFFFFF0000000015020000900500001902000000000000010000100400000001000000000000000000000000000000000000000000000001000000C6000000FFFFFFFF0F0000008F070000930700009407000095070000960700009007000091070000B5010000B801000038030000B9050000BA050000BB050000BC050000CB09000001800080000000000000F200000009010000E2010000D4010000000000001902000090050000BD02000000000000404100460F0000001343616C6C20537461636B202B204C6F63616C73000000008F07000001000000FFFFFFFFFFFFFFFF0755415254202331000000009307000001000000FFFFFFFFFFFFFFFF0755415254202332000000009407000001000000FFFFFFFFFFFFFFFF0755415254202333000000009507000001000000FFFFFFFFFFFFFFFF15446562756720287072696E74662920566965776572000000009607000001000000FFFFFFFFFFFFFFFF0757617463682031000000009007000001000000FFFFFFFFFFFFFFFF0757617463682032000000009107000001000000FFFFFFFFFFFFFFFF10547261636520457863657074696F6E7300000000B501000001000000FFFFFFFFFFFFFFFF0E4576656E7420436F756E7465727300000000B801000001000000FFFFFFFFFFFFFFFF09554C494E4B706C7573000000003803000001000000FFFFFFFFFFFFFFFF084D656D6F7279203100000000B905000001000000FFFFFFFFFFFFFFFF084D656D6F7279203200000000BA05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203300000000BB05000001000000FFFFFFFFFFFFFFFF084D656D6F7279203400000000BC05000001000000FFFFFFFFFFFFFFFF105472616365204E617669676174696F6E00000000CB09000001000000FFFFFFFFFFFFFFFFFFFFFFFF0000000001000000000000000000000001000000FFFFFFFFC802000019020000CC020000BD02000000000000020000000400000000000000000000000000000000000000000000000000000002000000C6000000FFFFFFFF8F07000001000000FFFFFFFF8F07000001000000C6000000000000000080000001000000FFFFFFFFFFFFFFFF00000000520300008007000056030000010000000100001004000000010000000000000000000000FFFFFFFF06000000C5000000C7000000B4010000D2010000CF0100007794000001800080000001000000F200000009010000BA03000099010000000000005603000080070000E60300000000000040820056060000000C4275696C64204F757470757401000000C500000001000000FFFFFFFFFFFFFFFF0D46696E6420496E2046696C657301000000C700000001000000FFFFFFFFFFFFFFFF0A4572726F72204C69737400000000B401000001000000FFFFFFFFFFFFFFFF24536F757263652042726F77736572202D202A2A2A204E6F7420456E61626C6564202A2A2A00000000D201000001000000FFFFFFFFFFFFFFFF0E416C6C205265666572656E63657300000000CF01000001000000FFFFFFFFFFFFFFFF0742726F77736572000000007794000001000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000001000000FFFFFFFFC500000001000000FFFFFFFFC5000000000000000000000000000000 + + + 59392 + File + + 2948 + 00200000010000002800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000040004000000000000000000000000000000000100000001000000018022E100000000040005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000004000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000004000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000004000C0000000000000000000000000000000001000000010000000180F4B00000000004000D000000000000000000000000000000000100000001000000018036B10000000004000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF88000000000400460000000000000000000000000000000001000000010000000180FE880000000004004500000000000000000000000000000000010000000100000001800B810000000004001300000000000000000000000000000000010000000100000001800C810000000004001400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F0880000020000000F000000000000000000000000000000000100000001000000FFFF0100120043555646696E64436F6D626F427574746F6EE80300000000000000000000000000000000000000000000000100000001000000960000000200205000000000074755495F524544960000000000000014000864656C61795F6D730C7468726561645F736C656570096372656174655F75690E737461727448656C6C6F53746172074755495F524544086B5F74696D655F740C746F735F736C6565705F6D7316746F735F74665F6D6F64756C655F6D7174745F73756211746F735F6D61696C5F715F63726561746516746F735F74665F6D6F64756C655F6D7174745F70756221657370383236365F74656E63656E745F6669726D776172655F73616C5F696E69740448414C5F0F53797374656D436F7265436C6F636B11544F535F4346475F4350555F434C4F434B0F5379735469636B5F48616E646C65720F5F5F41524D43435F56455253494F4E13634A534F4E5F4765744F626A6563744974656D0B634A534F4E5F506172736516646973706C61795F6863686F5F6D61785F76616C756516646973706C61795F6863686F5F6D696E5F76616C75650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018024E10000000000001100000000000000000000000000000000010000000100000001800A810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E2280000002000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B46350000000000000000000000000100000001000000000000000000000001000000020021802280000000000000150000002153746172742F53746F70202644656275672053657373696F6E094374726C2B4635000000000000000000000000010000000100000000000000000000000100000000002180E0010000000000007500000021456E65726779204D6561737572656D656E742026776974686F75742044656275670000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000160000000000000000000000000000000001000000010000000180C988000000000400180000000000000000000000000000000001000000010000000180C788000000000000190000000000000000000000000000000001000000010000002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000003002180C8880000000000001700000027264B696C6C20416C6C20427265616B706F696E747320696E2043757272656E7420546172676574000000000000000000000000010000000100000000000000000000000100000000002180E50100000000000078000000264B696C6C20416C6C20427265616B706F696E747320696E204163746976652050726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180E601000000000000790000002F4B696C6C20416C6C20427265616B706F696E747320696E204D756C74692D50726F6A65637420576F726B73706163650000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000021804C010000020001001A0000000F2650726F6A6563742057696E646F77000000000000000000000000010000000100000000000000000000000100000008002180DD880000000000001A0000000750726F6A656374000000000000000000000000010000000100000000000000000000000100000000002180DC8B0000000000003A00000005426F6F6B73000000000000000000000000010000000100000000000000000000000100000000002180E18B0000000000003B0000000946756E6374696F6E73000000000000000000000000010000000100000000000000000000000100000000002180E28B000000000000400000000954656D706C6174657300000000000000000000000001000000010000000000000000000000010000000000218018890000000000003D0000000E536F757263652042726F777365720000000000000000000000000100000001000000000000000000000001000000000021800000000000000400FFFFFFFF00000000000000000000000000010000000100000000000000000000000100000000002180D988000000000000390000000C4275696C64204F7574707574000000000000000000000000010000000100000000000000000000000100000000002180E38B000000000000410000000B46696E64204F75747075740000000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001B000000000000000000000000000000000100000001000000000000000446696C65FF7F0000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E1000000000000FFFFFFFF000100000000000000010000000000000001000000018001E1000000000000FFFFFFFF000100000000000000010000000000000001000000018003E1000000000000FFFFFFFF0001000000000000000100000000000000010000000180CD7F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF000000000000000000010000000000000001000000018023E1000000000000FFFFFFFF000100000000000000010000000000000001000000018022E1000000000000FFFFFFFF000100000000000000010000000000000001000000018025E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802BE1000000000000FFFFFFFF00010000000000000001000000000000000100000001802CE1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001807A8A000000000000FFFFFFFF00010000000000000001000000000000000100000001807B8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180D3B0000000000000FFFFFFFF000100000000000000010000000000000001000000018015B1000000000000FFFFFFFF0001000000000000000100000000000000010000000180F4B0000000000000FFFFFFFF000100000000000000010000000000000001000000018036B1000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FF88000000000000FFFFFFFF0001000000000000000100000000000000010000000180FE88000000000000FFFFFFFF00010000000000000001000000000000000100000001800B81000000000000FFFFFFFF00010000000000000001000000000000000100000001800C81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180F088000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE7F000000000000FFFFFFFF000100000000000000010000000000000001000000018024E1000000000000FFFFFFFF00010000000000000001000000000000000100000001800A81000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001802280000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C488000000000000FFFFFFFF0001000000000000000100000000000000010000000180C988000000000000FFFFFFFF0001000000000000000100000000000000010000000180C788000000000000FFFFFFFF0001000000000000000100000000000000010000000180C888000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180DD88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180FB7F000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 1423 + 2800FFFF01001100434D4643546F6F6C426172427574746F6E00E100000000000000000000000000000000000000000000000100000001000000018001E100000000000001000000000000000000000000000000000100000001000000018003E1000000000000020000000000000000000000000000000001000000010000000180CD7F0000000000000300000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018023E100000000000004000000000000000000000000000000000100000001000000018022E100000000000005000000000000000000000000000000000100000001000000018025E10000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001802BE10000000000000700000000000000000000000000000000010000000100000001802CE10000000000000800000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001807A8A0000000000000900000000000000000000000000000000010000000100000001807B8A0000000000000A00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180D3B00000000000000B000000000000000000000000000000000100000001000000018015B10000000000000C0000000000000000000000000000000001000000010000000180F4B00000000000000D000000000000000000000000000000000100000001000000018036B10000000000000E00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FF880000000000000F0000000000000000000000000000000001000000010000000180FE880000000000001000000000000000000000000000000000010000000100000001800B810000000000001100000000000000000000000000000000010000000100000001800C810000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180F088000000000000130000000000000000000000000000000001000000010000000180EE7F00000000000014000000000000000000000000000000000100000001000000018024E10000000000001500000000000000000000000000000000010000000100000001800A810000000000001600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018022800000000000001700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C488000000000000180000000000000000000000000000000001000000010000000180C988000000000000190000000000000000000000000000000001000000010000000180C7880000000000001A0000000000000000000000000000000001000000010000000180C8880000000000001B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180DD880000000000001C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180FB7F0000000000001D000000000000000000000000000000000100000001000000 + + + + 59399 + Build + + 988 + 00200000010000001000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F0000000000001C0000000000000000000000000000000001000000010000000180D07F0000000000001D000000000000000000000000000000000100000001000000018030800000000000001E000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6EC7040000000000006A0000000C4261746368204275696C2664000000000000000000000000010000000100000000000000000000000100000004000580C7040000000000006A0000000C4261746368204275696C266400000000000000000000000001000000010000000000000000000000010000000000058046070000000000006B0000000D42617463682052656275696C640000000000000000000000000100000001000000000000000000000001000000000005804707000000000000FFFFFFFF0B426174636820436C65616E0100000000000000000000000100000001000000000000000000000001000000000005809E8A0000000000001F0000000F4261746326682053657475702E2E2E000000000000000000000000010000000100000000000000000000000100000000000180D17F0000000004002000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000002100000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000FFFF01001900434D4643546F6F6C426172436F6D626F426F78427574746F6EBA00000000000000000000000000000000000000000000000001000000010000009600000003002050000000000E54656E63656E744F535F74696E79960000000000000001000E54656E63656E744F535F74696E79000000000180EB880000000000002200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000230000000000000000000000000000000001000000010000000180B08A000000000400240000000000000000000000000000000001000000010000000180A8010000000000004E00000000000000000000000000000000010000000100000001807202000000000000530000000000000000000000000000000001000000010000000180BE010000000000005000000000000000000000000000000000010000000100000000000000054275696C64FF7F0000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000FFFFFFFF0001000000000000000100000000000000010000000180D07F000000000000FFFFFFFF00010000000000000001000000000000000100000001803080000000000000FFFFFFFF00010000000000000001000000000000000100000001809E8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D17F000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001804C8A000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001806680000000000000FFFFFFFF0001000000000000000100000000000000010000000180EB88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180C07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180B08A000000000000FFFFFFFF0001000000000000000100000000000000010000000180A801000000000000FFFFFFFF00010000000000000001000000000000000100000001807202000000000000FFFFFFFF0001000000000000000100000000000000010000000180BE01000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 583 + 1000FFFF01001100434D4643546F6F6C426172427574746F6ECF7F000000000000000000000000000000000000000000000001000000010000000180D07F00000000000001000000000000000000000000000000000100000001000000018030800000000000000200000000000000000000000000000000010000000100000001809E8A000000000000030000000000000000000000000000000001000000010000000180D17F0000000000000400000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001804C8A0000000000000500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001806680000000000000060000000000000000000000000000000001000000010000000180EB880000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180C07F000000000000080000000000000000000000000000000001000000010000000180B08A000000000000090000000000000000000000000000000001000000010000000180A8010000000000000A000000000000000000000000000000000100000001000000018072020000000000000B0000000000000000000000000000000001000000010000000180BE010000000000000C000000000000000000000000000000000100000001000000 + + + + 59400 + Debug + + 2373 + 00200000000000001900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000002500000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000002600000000000000000000000000000000010000000100000001801D800000000000002700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000002800000000000000000000000000000000010000000100000001801B80000000000000290000000000000000000000000000000001000000010000000180E57F0000000000002A00000000000000000000000000000000010000000100000001801C800000000000002B00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000002C00000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B0000000000002D0000000000000000000000000000000001000000010000000180F07F0000000000002E0000000000000000000000000000000001000000010000000180E8880000000000003700000000000000000000000000000000010000000100000001803B010000000000002F0000000000000000000000000000000001000000010000000180BB8A00000000000030000000000000000000000000000000000100000001000000FFFF01001500434D4643546F6F6C4261724D656E75427574746F6E0E01000000000000310000000D57617463682057696E646F7773000000000000000000000000010000000100000000000000000000000100000003001380D88B00000000000031000000085761746368202631000000000000000000000000010000000100000000000000000000000100000000001380D98B00000000000031000000085761746368202632000000000000000000000000010000000100000000000000000000000100000000001380CE01000000000000FFFFFFFF0C576174636820416E63686F720100000000000000000000000100000001000000000000000000000001000000000013800F01000000000000320000000E4D656D6F72792057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380D28B00000000000032000000094D656D6F7279202631000000000000000000000000010000000100000000000000000000000100000000001380D38B00000000000032000000094D656D6F7279202632000000000000000000000000010000000100000000000000000000000100000000001380D48B00000000000032000000094D656D6F7279202633000000000000000000000000010000000100000000000000000000000100000000001380D58B00000000000032000000094D656D6F72792026340000000000000000000000000100000001000000000000000000000001000000000013801001000000000000330000000E53657269616C2057696E646F77730000000000000000000000000100000001000000000000000000000001000000040013809307000000000000330000000855415254202326310000000000000000000000000100000001000000000000000000000001000000000013809407000000000000330000000855415254202326320000000000000000000000000100000001000000000000000000000001000000000013809507000000000000330000000855415254202326330000000000000000000000000100000001000000000000000000000001000000000013809607000000000000330000001626446562756720287072696E746629205669657765720000000000000000000000000100000001000000000000000000000001000000000013803C010000000000007200000010416E616C797369732057696E646F7773000000000000000000000000010000000100000000000000000000000100000004001380658A000000000000340000000F264C6F67696320416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380DC7F0000000000003E0000001526506572666F726D616E636520416E616C797A6572000000000000000000000000010000000100000000000000000000000100000000001380E788000000000000380000000E26436F646520436F766572616765000000000000000000000000010000000100000000000000000000000100000000001380CD01000000000000FFFFFFFF0F416E616C7973697320416E63686F7201000000000000000000000001000000010000000000000000000000010000000000138053010000000000003F0000000D54726163652057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013805401000000000000FFFFFFFF115472616365204D656E7520416E63686F720100000000000000000000000100000001000000000000000000000001000000000013802901000000000000350000001553797374656D205669657765722057696E646F77730000000000000000000000000100000001000000000000000000000001000000010013804B01000000000000FFFFFFFF1453797374656D2056696577657220416E63686F720100000000000000000000000100000001000000000000000000000001000000000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000013800189000000000000360000000F26546F6F6C626F782057696E646F7700000000000000000000000001000000010000000000000000000000010000000300138044C5000000000000FFFFFFFF0E5570646174652057696E646F77730100000000000000000000000100000001000000000000000000000001000000000013800000000000000400FFFFFFFF000000000000000000000000000100000001000000000000000000000001000000000013805B01000000000000FFFFFFFF12546F6F6C626F78204D656E75416E63686F720100000000000000000000000100000001000000000000000000000001000000000000000000054465627567FF7F0000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC88000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801780000000000000FFFFFFFF00010000000000000001000000000000000100000001801D80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001801A80000000000000FFFFFFFF00010000000000000001000000000000000100000001801B80000000000000FFFFFFFF0001000000000000000100000000000000010000000180E57F000000000000FFFFFFFF00010000000000000001000000000000000100000001801C80000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800089000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF0000000000000000000100000000000000010000000180E48B000000000000FFFFFFFF0001000000000000000100000000000000010000000180F07F000000000000FFFFFFFF0001000000000000000100000000000000010000000180E888000000000000FFFFFFFF00010000000000000001000000000000000100000001803B01000000000000FFFFFFFF0001000000000000000100000000000000010000000180BB8A000000000000FFFFFFFF0001000000000000000100000000000000010000000180D88B000000000000FFFFFFFF0001000000000000000100000000000000010000000180D28B000000000000FFFFFFFF00010000000000000001000000000000000100000001809307000000000000FFFFFFFF0001000000000000000100000000000000010000000180658A000000000000FFFFFFFF0001000000000000000100000000000000010000000180C18A000000000000FFFFFFFF0001000000000000000100000000000000010000000180EE8B000000000000FFFFFFFF00010000000000000001000000000000000100000001800000000000000000FFFFFFFF00000000000000000001000000000000000100000001800189000000000000FFFFFFFF000100000000000000010000000000000001000000 + + + 898 + 1900FFFF01001100434D4643546F6F6C426172427574746F6ECC880000000000000000000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018017800000000000000100000000000000000000000000000000010000000100000001801D800000000000000200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF00000000000000000000000000010000000100000001801A800000000000000300000000000000000000000000000000010000000100000001801B80000000000000040000000000000000000000000000000001000000010000000180E57F0000000000000500000000000000000000000000000000010000000100000001801C800000000000000600000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF000000000000000000000000000100000001000000018000890000000000000700000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180E48B000000000000080000000000000000000000000000000001000000010000000180F07F000000000000090000000000000000000000000000000001000000010000000180E8880000000000000A00000000000000000000000000000000010000000100000001803B010000000000000B0000000000000000000000000000000001000000010000000180BB8A0000000000000C0000000000000000000000000000000001000000010000000180D88B0000000000000D0000000000000000000000000000000001000000010000000180D28B0000000000000E000000000000000000000000000000000100000001000000018093070000000000000F0000000000000000000000000000000001000000010000000180658A000000000000100000000000000000000000000000000001000000010000000180C18A000000000000110000000000000000000000000000000001000000010000000180EE8B0000000000001200000000000000000000000000000000010000000100000001800000000001000000FFFFFFFF0000000000000000000000000001000000010000000180018900000000000013000000000000000000000000000000000100000001000000 + + + + 0 + 1920 + 1080 + + + + + + 1 + 0 + + 100 + 0 + + ..\..\..\..\examples\guilite_demo\guilite_demo.c + 33 + 1 + 31 + 1 + + 0 + + + .\BSP\Src\main.c + 44 + 1 + 21 + 1 + + 0 + + + .\BSP\Src\mcu_init.c + 21 + 28 + 42 + 1 + + 0 + + + + +
diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BearPi_STM32L31RC.uvoptx b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BearPi_STM32L31RC.uvoptx new file mode 100644 index 00000000..f5db1265 --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BearPi_STM32L31RC.uvoptx @@ -0,0 +1,1204 @@ + + + + 1.0 + +
### uVision Project, (C) Keil Software
+ + + *.c + *.s*; *.src; *.a* + *.obj; *.o + *.lib + *.txt; *.h; *.inc + *.plm + *.cpp + 0 + + + + 0 + 0 + + + + TencentOS_tiny + 0x4 + ARM-ADS + + 80000000 + + 1 + 1 + 0 + 1 + 0 + + + 1 + 65535 + 0 + 0 + 0 + + + 79 + 66 + 8 + .\list\ + + + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 0 + 0 + 0 + 0 + + + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + + + 1 + 0 + 1 + + 18 + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 6 + + + + + + + + + + + STLink\ST-LINKIII-KEIL_SWO.dll + + + + 0 + ARMRTXEVENTFLAGS + -L70 -Z18 -C0 -M0 -T1 + + + 0 + DLGTARM + (1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0) + + + 0 + ARMDBGFLAGS + + + + 0 + DLGUARM + (105=-1,-1,-1,-1,0) + + + 0 + UL2CM3 + UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_256 -FS08000000 -FL040000 -FP0($$Device:STM32L431RCTx$CMSIS\Flash\STM32L4xx_256.FLM)) + + + 0 + ST-LINKIII-KEIL_SWO + -U066CFF343637424257194226 -O10446 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(2BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_256.FLM -FS08000000 -FL040000 -FP0($$Device:STM32L431RCTx$CMSIS\Flash\STM32L4xx_256.FLM) + + + + + 0 + 0 + 245 + 1 +
134228264
+ 0 + 0 + 0 + 0 + 0 + 1 + ..\..\..\..\arch\arm\arm-v7m\common\tos_cpu.c + + \\TencentOS_tiny\../../../../arch/arm/arm-v7m/common/tos_cpu.c\245 +
+ + 1 + 0 + 251 + 1 +
134228282
+ 0 + 0 + 0 + 0 + 0 + 1 + ..\..\..\..\arch\arm\arm-v7m\common\tos_cpu.c + + \\TencentOS_tiny\../../../../arch/arm/arm-v7m/common/tos_cpu.c\251 +
+
+ + + 0 + 1 + tos_next_task + + + 1 + 1 + tos_rdyq.highest_prio + + + 2 + 1 + task_list + + + 3 + 1 + 0x20000280 + + + 4 + 1 + tos_rdyq.highest_prio + + + 5 + 1 + owner + + + 6 + 1 + tos_curr_task + + + 7 + 1 + highest_pending_prio + + + 8 + 1 + task + + + + + 1 + 0 + 0x200016F4 + 0 + + + + 0 + + + 0 + 1 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + 0 + 0 + 0 + + + + + + + + + + 0 + 0 + 0 + 2 + 10000000 + +
+
+ + + Application/MDK-ARM + 1 + 0 + 0 + 0 + + 1 + 1 + 2 + 0 + 0 + 0 + startup_stm32l431xx.s + startup_stm32l431xx.s + 0 + 0 + + + + + Application/User + 1 + 0 + 0 + 0 + + 2 + 2 + 1 + 0 + 0 + 0 + .\BSP\Src\gpio.c + gpio.c + 0 + 0 + + + 2 + 3 + 1 + 0 + 0 + 0 + .\BSP\Src\main.c + main.c + 0 + 0 + + + 2 + 4 + 1 + 0 + 0 + 0 + .\BSP\Src\mcu_init.c + mcu_init.c + 0 + 0 + + + 2 + 5 + 1 + 0 + 0 + 0 + .\BSP\Src\stm32l4xx_hal_msp.c + stm32l4xx_hal_msp.c + 0 + 0 + + + 2 + 6 + 1 + 0 + 0 + 0 + .\BSP\Src\stm32l4xx_it.c + stm32l4xx_it.c + 0 + 0 + + + 2 + 7 + 1 + 0 + 0 + 0 + .\BSP\Src\usart.c + usart.c + 0 + 0 + + + 2 + 8 + 1 + 0 + 0 + 0 + .\BSP\Src\adc.c + adc.c + 0 + 0 + + + 2 + 9 + 1 + 0 + 0 + 0 + .\BSP\Src\i2c.c + i2c.c + 0 + 0 + + + 2 + 10 + 1 + 0 + 0 + 0 + .\BSP\Src\spi.c + spi.c + 0 + 0 + + + + + examples + 1 + 0 + 0 + 0 + + 3 + 11 + 1 + 0 + 0 + 0 + ..\..\..\..\examples\guilite_demo\guilite_demo.c + guilite_demo.c + 0 + 0 + + + + + Drivers/STM32L4xx_HAL_Driver + 0 + 0 + 0 + 0 + + 4 + 12 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tim.c + stm32l4xx_hal_tim.c + 0 + 0 + + + 4 + 13 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tim_ex.c + stm32l4xx_hal_tim_ex.c + 0 + 0 + + + 4 + 14 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart.c + stm32l4xx_hal_uart.c + 0 + 0 + + + 4 + 15 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart_ex.c + stm32l4xx_hal_uart_ex.c + 0 + 0 + + + 4 + 16 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal.c + stm32l4xx_hal.c + 0 + 0 + + + 4 + 17 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_i2c.c + stm32l4xx_hal_i2c.c + 0 + 0 + + + 4 + 18 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_i2c_ex.c + stm32l4xx_hal_i2c_ex.c + 0 + 0 + + + 4 + 19 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc.c + stm32l4xx_hal_rcc.c + 0 + 0 + + + 4 + 20 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc_ex.c + stm32l4xx_hal_rcc_ex.c + 0 + 0 + + + 4 + 21 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash.c + stm32l4xx_hal_flash.c + 0 + 0 + + + 4 + 22 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash_ex.c + stm32l4xx_hal_flash_ex.c + 0 + 0 + + + 4 + 23 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash_ramfunc.c + stm32l4xx_hal_flash_ramfunc.c + 0 + 0 + + + 4 + 24 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_gpio.c + stm32l4xx_hal_gpio.c + 0 + 0 + + + 4 + 25 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma.c + stm32l4xx_hal_dma.c + 0 + 0 + + + 4 + 26 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma_ex.c + stm32l4xx_hal_dma_ex.c + 0 + 0 + + + 4 + 27 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr.c + stm32l4xx_hal_pwr.c + 0 + 0 + + + 4 + 28 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr_ex.c + stm32l4xx_hal_pwr_ex.c + 0 + 0 + + + 4 + 29 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cortex.c + stm32l4xx_hal_cortex.c + 0 + 0 + + + 4 + 30 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_adc_ex.c + stm32l4xx_hal_adc_ex.c + 0 + 0 + + + 4 + 31 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_adc.c + stm32l4xx_hal_adc.c + 0 + 0 + + + 4 + 32 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dac.c + stm32l4xx_hal_dac.c + 0 + 0 + + + 4 + 33 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dac_ex.c + stm32l4xx_hal_dac_ex.c + 0 + 0 + + + 4 + 34 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_spi.c + stm32l4xx_hal_spi.c + 0 + 0 + + + 4 + 35 + 1 + 0 + 0 + 0 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_spi_ex.c + stm32l4xx_hal_spi_ex.c + 0 + 0 + + + + + Drivers/CMSIS + 1 + 0 + 0 + 0 + + 5 + 36 + 1 + 0 + 0 + 0 + .\BSP\Src\system_stm32l4xx.c + system_stm32l4xx.c + 0 + 0 + + + + + Hardware + 1 + 0 + 0 + 0 + + 6 + 37 + 1 + 0 + 0 + 0 + .\BSP\Hardware\LCD_ST7789\lcd_spi2_drv.c + lcd_spi2_drv.c + 0 + 0 + + + 6 + 38 + 1 + 0 + 0 + 0 + .\BSP\Hardware\BH1750\BH1750.c + BH1750.c + 0 + 0 + + + + + kernel + 0 + 0 + 0 + 0 + + 7 + 39 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_mmblk.c + tos_mmblk.c + 0 + 0 + + + 7 + 40 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_mmheap.c + tos_mmheap.c + 0 + 0 + + + 7 + 41 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_mutex.c + tos_mutex.c + 0 + 0 + + + 7 + 42 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_sched.c + tos_sched.c + 0 + 0 + + + 7 + 43 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_sem.c + tos_sem.c + 0 + 0 + + + 7 + 44 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_sys.c + tos_sys.c + 0 + 0 + + + 7 + 45 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_task.c + tos_task.c + 0 + 0 + + + 7 + 46 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_tick.c + tos_tick.c + 0 + 0 + + + 7 + 47 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_time.c + tos_time.c + 0 + 0 + + + 7 + 48 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_timer.c + tos_timer.c + 0 + 0 + + + 7 + 49 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_event.c + tos_event.c + 0 + 0 + + + 7 + 50 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_global.c + tos_global.c + 0 + 0 + + + 7 + 51 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_pend.c + tos_pend.c + 0 + 0 + + + 7 + 52 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_robin.c + tos_robin.c + 0 + 0 + + + 7 + 53 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_binary_heap.c + tos_binary_heap.c + 0 + 0 + + + 7 + 54 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_char_fifo.c + tos_char_fifo.c + 0 + 0 + + + 7 + 55 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_completion.c + tos_completion.c + 0 + 0 + + + 7 + 56 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_countdownlatch.c + tos_countdownlatch.c + 0 + 0 + + + 7 + 57 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_mail_queue.c + tos_mail_queue.c + 0 + 0 + + + 7 + 58 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_message_queue.c + tos_message_queue.c + 0 + 0 + + + 7 + 59 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_priority_mail_queue.c + tos_priority_mail_queue.c + 0 + 0 + + + 7 + 60 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_priority_message_queue.c + tos_priority_message_queue.c + 0 + 0 + + + 7 + 61 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_priority_queue.c + tos_priority_queue.c + 0 + 0 + + + 7 + 62 + 1 + 0 + 0 + 0 + ..\..\..\..\kernel\core\tos_ring_queue.c + tos_ring_queue.c + 0 + 0 + + + + + cpu + 0 + 0 + 0 + 0 + + 8 + 63 + 2 + 0 + 0 + 0 + ..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc\port_s.S + port_s.S + 0 + 0 + + + 8 + 64 + 1 + 0 + 0 + 0 + ..\..\..\..\arch\arm\arm-v7m\common\tos_cpu.c + tos_cpu.c + 0 + 0 + + + 8 + 65 + 1 + 0 + 0 + 0 + ..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc\port_c.c + port_c.c + 0 + 0 + + + + + cmsis + 0 + 0 + 0 + 0 + + 9 + 66 + 1 + 0 + 0 + 0 + ..\..\..\..\osal\cmsis_os\cmsis_os.c + cmsis_os.c + 0 + 0 + + + + + config + 0 + 0 + 0 + 0 + + 10 + 67 + 5 + 0 + 0 + 0 + ..\..\TOS-CONFIG\tos_config.h + tos_config.h + 0 + 0 + + + + + UIcode + 1 + 0 + 0 + 0 + + 11 + 68 + 8 + 0 + 0 + 0 + ..\..\..\..\components\gui\GuiLite\UIcode\UIcode.cpp + UIcode.cpp + 0 + 0 + + + + + ::CMSIS + 0 + 0 + 0 + 1 + + +
diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BearPi_STM32L31RC.uvprojx b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BearPi_STM32L31RC.uvprojx new file mode 100644 index 00000000..90ca64f1 --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/BearPi_STM32L31RC.uvprojx @@ -0,0 +1,797 @@ + + + + 2.1 + +
### uVision Project, (C) Keil Software
+ + + + TencentOS_tiny + 0x4 + ARM-ADS + 5060750::V5.06 update 6 (build 750)::ARMCC + 0 + + + STM32L431RCTx + STMicroelectronics + Keil.STM32L4xx_DFP.2.0.0 + http://www.keil.com/pack + IRAM(0x20000000-0x2000FFFF) IROM(0x8000000-0x803FFFF) CLOCK(8000000) FPU2 CPUTYPE("Cortex-M4") + + + + + + + + + + + + + + + $$Device:STM32L431RCTx$CMSIS\SVD\STM32L4x1.svd + 0 + 0 + + + + + + + 0 + 0 + 0 + 0 + 1 + + .\obj\ + TencentOS_tiny + 1 + 0 + 1 + 1 + 0 + .\list\ + 1 + 0 + 0 + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + + 0 + 0 + + + 0 + 0 + 0 + 0 + + 0 + + + + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 3 + + + 0 + + + SARMCM3.DLL + -REMAP -MPU + DCM.DLL + -pCM4 + SARMCM3.DLL + -MPU + TCM.DLL + -pCM4 + + + + 1 + 0 + 0 + 0 + 16 + + + + + 1 + 0 + 0 + 1 + 1 + 4107 + + 1 + BIN\UL2CM3.DLL + + + + + + 0 + + + + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 1 + 1 + 0 + 1 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 0 + 0 + "Cortex-M4" + + 0 + 0 + 0 + 1 + 1 + 0 + 0 + 2 + 0 + 0 + 0 + 8 + 1 + 0 + 0 + 0 + 3 + 3 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 1 + 0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x10000 + + + 1 + 0x8000000 + 0x40000 + + + 0 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x0 + 0x0 + + + 1 + 0x8000000 + 0x40000 + + + 1 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x0 + 0x0 + + + 0 + 0x20000000 + 0x10000 + + + 0 + 0x0 + 0x0 + + + + + + 1 + 1 + 0 + 0 + 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 + 1 + 0 + 0 + 0 + + + USE_HAL_DRIVER,STM32L431xx,WITH_TOS_NET_ADAPTER,USE_ESP8266 + + .\BSP\Inc;..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Inc;..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Legacy;..\..\..\..\platform\vendor_bsp\st\CMSIS\Device\ST\STM32L4xx\Include;..\..\..\..\platform\vendor_bsp\st\CMSIS\Include;..\..\..\..\kernel\core\include;..\..\TOS-CONFIG;..\..\..\..\platform\arch\arm\cortex-m4\keil;..\..\..\..\kernel\pm\include;..\..\..\..\osal\cmsis_os;..\..\..\..\arch\arm\arm-v7m\common\include;..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc;.\BSP\Hardware\BH1750;.\BSP\Hardware\LCD_ST7789;..\..\..\..\components\gui\GuiLite\UIcode;..\..\..\..\examples\guilite_demo + + + + 1 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + + + + + + + 1 + 0 + 0 + 0 + 1 + 0 + 0x08000000 + 0x20000000 + + + + + + + + + + + + + Application/MDK-ARM + + + startup_stm32l431xx.s + 2 + startup_stm32l431xx.s + + + + + Application/User + + + gpio.c + 1 + .\BSP\Src\gpio.c + + + main.c + 1 + .\BSP\Src\main.c + + + mcu_init.c + 1 + .\BSP\Src\mcu_init.c + + + stm32l4xx_hal_msp.c + 1 + .\BSP\Src\stm32l4xx_hal_msp.c + + + stm32l4xx_it.c + 1 + .\BSP\Src\stm32l4xx_it.c + + + usart.c + 1 + .\BSP\Src\usart.c + + + adc.c + 1 + .\BSP\Src\adc.c + + + i2c.c + 1 + .\BSP\Src\i2c.c + + + spi.c + 1 + .\BSP\Src\spi.c + + + + + examples + + + guilite_demo.c + 1 + ..\..\..\..\examples\guilite_demo\guilite_demo.c + + + + + Drivers/STM32L4xx_HAL_Driver + + + stm32l4xx_hal_tim.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tim.c + + + stm32l4xx_hal_tim_ex.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_tim_ex.c + + + stm32l4xx_hal_uart.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart.c + + + stm32l4xx_hal_uart_ex.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_uart_ex.c + + + stm32l4xx_hal.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal.c + + + stm32l4xx_hal_i2c.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_i2c.c + + + stm32l4xx_hal_i2c_ex.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_i2c_ex.c + + + stm32l4xx_hal_rcc.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc.c + + + stm32l4xx_hal_rcc_ex.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_rcc_ex.c + + + stm32l4xx_hal_flash.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash.c + + + stm32l4xx_hal_flash_ex.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash_ex.c + + + stm32l4xx_hal_flash_ramfunc.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_flash_ramfunc.c + + + stm32l4xx_hal_gpio.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_gpio.c + + + stm32l4xx_hal_dma.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma.c + + + stm32l4xx_hal_dma_ex.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dma_ex.c + + + stm32l4xx_hal_pwr.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr.c + + + stm32l4xx_hal_pwr_ex.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_pwr_ex.c + + + stm32l4xx_hal_cortex.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_cortex.c + + + stm32l4xx_hal_adc_ex.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_adc_ex.c + + + stm32l4xx_hal_adc.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_adc.c + + + stm32l4xx_hal_dac.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dac.c + + + stm32l4xx_hal_dac_ex.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_dac_ex.c + + + stm32l4xx_hal_spi.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_spi.c + + + stm32l4xx_hal_spi_ex.c + 1 + ..\..\..\..\platform\vendor_bsp\st\STM32L4xx_HAL_Driver\Src\stm32l4xx_hal_spi_ex.c + + + + + Drivers/CMSIS + + + system_stm32l4xx.c + 1 + .\BSP\Src\system_stm32l4xx.c + + + + + Hardware + + + lcd_spi2_drv.c + 1 + .\BSP\Hardware\LCD_ST7789\lcd_spi2_drv.c + + + BH1750.c + 1 + .\BSP\Hardware\BH1750\BH1750.c + + + + + kernel + + + tos_mmblk.c + 1 + ..\..\..\..\kernel\core\tos_mmblk.c + + + tos_mmheap.c + 1 + ..\..\..\..\kernel\core\tos_mmheap.c + + + tos_mutex.c + 1 + ..\..\..\..\kernel\core\tos_mutex.c + + + tos_sched.c + 1 + ..\..\..\..\kernel\core\tos_sched.c + + + tos_sem.c + 1 + ..\..\..\..\kernel\core\tos_sem.c + + + tos_sys.c + 1 + ..\..\..\..\kernel\core\tos_sys.c + + + tos_task.c + 1 + ..\..\..\..\kernel\core\tos_task.c + + + tos_tick.c + 1 + ..\..\..\..\kernel\core\tos_tick.c + + + tos_time.c + 1 + ..\..\..\..\kernel\core\tos_time.c + + + tos_timer.c + 1 + ..\..\..\..\kernel\core\tos_timer.c + + + tos_event.c + 1 + ..\..\..\..\kernel\core\tos_event.c + + + tos_global.c + 1 + ..\..\..\..\kernel\core\tos_global.c + + + tos_pend.c + 1 + ..\..\..\..\kernel\core\tos_pend.c + + + tos_robin.c + 1 + ..\..\..\..\kernel\core\tos_robin.c + + + tos_binary_heap.c + 1 + ..\..\..\..\kernel\core\tos_binary_heap.c + + + tos_char_fifo.c + 1 + ..\..\..\..\kernel\core\tos_char_fifo.c + + + tos_completion.c + 1 + ..\..\..\..\kernel\core\tos_completion.c + + + tos_countdownlatch.c + 1 + ..\..\..\..\kernel\core\tos_countdownlatch.c + + + tos_mail_queue.c + 1 + ..\..\..\..\kernel\core\tos_mail_queue.c + + + tos_message_queue.c + 1 + ..\..\..\..\kernel\core\tos_message_queue.c + + + tos_priority_mail_queue.c + 1 + ..\..\..\..\kernel\core\tos_priority_mail_queue.c + + + tos_priority_message_queue.c + 1 + ..\..\..\..\kernel\core\tos_priority_message_queue.c + + + tos_priority_queue.c + 1 + ..\..\..\..\kernel\core\tos_priority_queue.c + + + tos_ring_queue.c + 1 + ..\..\..\..\kernel\core\tos_ring_queue.c + + + + + cpu + + + port_s.S + 2 + ..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc\port_s.S + + + tos_cpu.c + 1 + ..\..\..\..\arch\arm\arm-v7m\common\tos_cpu.c + + + port_c.c + 1 + ..\..\..\..\arch\arm\arm-v7m\cortex-m4\armcc\port_c.c + + + + + cmsis + + + cmsis_os.c + 1 + ..\..\..\..\osal\cmsis_os\cmsis_os.c + + + + + config + + + tos_config.h + 5 + ..\..\TOS-CONFIG\tos_config.h + + + + + UIcode + + + UIcode.cpp + 8 + ..\..\..\..\components\gui\GuiLite\UIcode\UIcode.cpp + + + + + ::CMSIS + + + + + + + + + + + + + + + + + + +
diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/RTE/_TencentOS_tiny/RTE_Components.h b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/RTE/_TencentOS_tiny/RTE_Components.h new file mode 100644 index 00000000..2111c83a --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/RTE/_TencentOS_tiny/RTE_Components.h @@ -0,0 +1,21 @@ + +/* + * Auto generated Run-Time-Environment Configuration File + * *** Do not modify ! *** + * + * Project: 'BearPi_STM32L31RC' + * Target: 'TencentOS_tiny' + */ + +#ifndef RTE_COMPONENTS_H +#define RTE_COMPONENTS_H + + +/* + * Define the Device Header File: + */ +#define CMSIS_device_header "stm32l4xx.h" + + + +#endif /* RTE_COMPONENTS_H */ diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/startup_stm32l431xx.s b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/startup_stm32l431xx.s new file mode 100644 index 00000000..d4906373 --- /dev/null +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_guilite_demo/startup_stm32l431xx.s @@ -0,0 +1,404 @@ +;********************** COPYRIGHT(c) 2017 STMicroelectronics ****************** +;* File Name : startup_stm32l431xx.s +;* Author : MCD Application Team +;* Description : STM32L431xx Ultra Low Power devices vector table for MDK-ARM toolchain. +;* This module performs: +;* - Set the initial SP +;* - Set the initial PC == Reset_Handler +;* - Set the vector table entries with the exceptions ISR address +;* - Branches to __main in the C library (which eventually +;* calls main()). +;* After Reset the Cortex-M4 processor is in Thread mode, +;* priority is Privileged, and the Stack is set to Main. +;* <<< Use Configuration Wizard in Context Menu >>> +;******************************************************************************* +;* +;* Redistribution and use in source and binary forms, with or without modification, +;* are permitted provided that the following conditions are met: +;* 1. Redistributions of source code must retain the above copyright notice, +;* this list of conditions and the following disclaimer. +;* 2. Redistributions in binary form must reproduce the above copyright notice, +;* this list of conditions and the following disclaimer in the documentation +;* and/or other materials provided with the distribution. +;* 3. Neither the name of STMicroelectronics nor the names of its contributors +;* may be used to endorse or promote products derived from this software +;* without specific prior written permission. +;* +;* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +;* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +;* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +;* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +;* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +;* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +;* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +;* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +;* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +;* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +;* +;******************************************************************************* +; +; Amount of memory (in bytes) allocated for Stack +; Tailor this value to your application needs +; Stack Configuration +; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Stack_Size EQU 0x100 + + AREA STACK, NOINIT, READWRITE, ALIGN=3 +Stack_Mem SPACE Stack_Size +__initial_sp + + +; Heap Configuration +; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> +; + +Heap_Size EQU 0x2000 + + AREA HEAP, NOINIT, READWRITE, ALIGN=3 +__heap_base +Heap_Mem SPACE Heap_Size +__heap_limit + + PRESERVE8 + THUMB + + +; Vector Table Mapped to Address 0 at Reset + AREA RESET, DATA, READONLY + EXPORT __Vectors + EXPORT __Vectors_End + EXPORT __Vectors_Size + +__Vectors DCD __initial_sp ; Top of Stack + DCD Reset_Handler ; Reset Handler + DCD NMI_Handler ; NMI Handler + DCD HardFault_Handler ; Hard Fault Handler + DCD MemManage_Handler ; MPU Fault Handler + DCD BusFault_Handler ; Bus Fault Handler + DCD UsageFault_Handler ; Usage Fault Handler + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SVC_Handler ; SVCall Handler + DCD DebugMon_Handler ; Debug Monitor Handler + DCD 0 ; Reserved + DCD PendSV_Handler ; PendSV Handler + DCD SysTick_Handler ; SysTick Handler + + ; External Interrupts + DCD WWDG_IRQHandler ; Window WatchDog + DCD PVD_PVM_IRQHandler ; PVD/PVM1/PVM2/PVM3/PVM4 through EXTI Line detection + DCD TAMP_STAMP_IRQHandler ; Tamper and TimeStamps through the EXTI line + DCD RTC_WKUP_IRQHandler ; RTC Wakeup through the EXTI line + DCD FLASH_IRQHandler ; FLASH + DCD RCC_IRQHandler ; RCC + DCD EXTI0_IRQHandler ; EXTI Line0 + DCD EXTI1_IRQHandler ; EXTI Line1 + DCD EXTI2_IRQHandler ; EXTI Line2 + DCD EXTI3_IRQHandler ; EXTI Line3 + DCD EXTI4_IRQHandler ; EXTI Line4 + DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1 + DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2 + DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3 + DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4 + DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5 + DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6 + DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7 + DCD ADC1_IRQHandler ; ADC1 + DCD CAN1_TX_IRQHandler ; CAN1 TX + DCD CAN1_RX0_IRQHandler ; CAN1 RX0 + DCD CAN1_RX1_IRQHandler ; CAN1 RX1 + DCD CAN1_SCE_IRQHandler ; CAN1 SCE + DCD EXTI9_5_IRQHandler ; External Line[9:5]s + DCD TIM1_BRK_TIM15_IRQHandler ; TIM1 Break and TIM15 + DCD TIM1_UP_TIM16_IRQHandler ; TIM1 Update and TIM16 + DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation + DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare + DCD TIM2_IRQHandler ; TIM2 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD I2C1_EV_IRQHandler ; I2C1 Event + DCD I2C1_ER_IRQHandler ; I2C1 Error + DCD I2C2_EV_IRQHandler ; I2C2 Event + DCD I2C2_ER_IRQHandler ; I2C2 Error + DCD SPI1_IRQHandler ; SPI1 + DCD SPI2_IRQHandler ; SPI2 + DCD USART1_IRQHandler ; USART1 + DCD USART2_IRQHandler ; USART2 + DCD USART3_IRQHandler ; USART3 + DCD EXTI15_10_IRQHandler ; External Line[15:10] + DCD RTC_Alarm_IRQHandler ; RTC Alarm (A and B) through EXTI Line + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD SDMMC1_IRQHandler ; SDMMC1 + DCD 0 ; Reserved + DCD SPI3_IRQHandler ; SPI3 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD TIM6_DAC_IRQHandler ; TIM6 and DAC1&2 underrun errors + DCD TIM7_IRQHandler ; TIM7 + DCD DMA2_Channel1_IRQHandler ; DMA2 Channel 1 + DCD DMA2_Channel2_IRQHandler ; DMA2 Channel 2 + DCD DMA2_Channel3_IRQHandler ; DMA2 Channel 3 + DCD DMA2_Channel4_IRQHandler ; DMA2 Channel 4 + DCD DMA2_Channel5_IRQHandler ; DMA2 Channel 5 + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD COMP_IRQHandler ; COMP Interrupt + DCD LPTIM1_IRQHandler ; LP TIM1 interrupt + DCD LPTIM2_IRQHandler ; LP TIM2 interrupt + DCD 0 ; Reserved + DCD DMA2_Channel6_IRQHandler ; DMA2 Channel 6 + DCD DMA2_Channel7_IRQHandler ; DMA2 Channel 7 + DCD LPUART1_IRQHandler ; LP UART1 interrupt + DCD QUADSPI_IRQHandler ; Quad SPI global interrupt + DCD I2C3_EV_IRQHandler ; I2C3 event + DCD I2C3_ER_IRQHandler ; I2C3 error + DCD SAI1_IRQHandler ; Serial Audio Interface 1 global interrupt + DCD 0 ; Reserved + DCD SWPMI1_IRQHandler ; Serial Wire Interface 1 global interrupt + DCD TSC_IRQHandler ; Touch Sense Controller global interrupt + DCD 0 ; Reserved + DCD 0 ; Reserved + DCD RNG_IRQHandler ; RNG global interrupt + DCD FPU_IRQHandler ; FPU + DCD CRS_IRQHandler ; CRS interrupt + +__Vectors_End + +__Vectors_Size EQU __Vectors_End - __Vectors + + AREA |.text|, CODE, READONLY + +; Reset handler +Reset_Handler PROC + EXPORT Reset_Handler [WEAK] + IMPORT SystemInit + IMPORT __main + + LDR R0, =SystemInit + BLX R0 + LDR R0, =__main + BX R0 + ENDP + +; Dummy Exception Handlers (infinite loops which can be modified) + +NMI_Handler PROC + EXPORT NMI_Handler [WEAK] + B . + ENDP +HardFault_Handler\ + PROC + EXPORT HardFault_Handler [WEAK] + B . + ENDP +MemManage_Handler\ + PROC + EXPORT MemManage_Handler [WEAK] + B . + ENDP +BusFault_Handler\ + PROC + EXPORT BusFault_Handler [WEAK] + B . + ENDP +UsageFault_Handler\ + PROC + EXPORT UsageFault_Handler [WEAK] + B . + ENDP +SVC_Handler PROC + EXPORT SVC_Handler [WEAK] + B . + ENDP +DebugMon_Handler\ + PROC + EXPORT DebugMon_Handler [WEAK] + B . + ENDP +PendSV_Handler PROC + EXPORT PendSV_Handler [WEAK] + B . + ENDP +SysTick_Handler PROC + EXPORT SysTick_Handler [WEAK] + B . + ENDP + +Default_Handler PROC + + EXPORT WWDG_IRQHandler [WEAK] + EXPORT PVD_PVM_IRQHandler [WEAK] + EXPORT TAMP_STAMP_IRQHandler [WEAK] + EXPORT RTC_WKUP_IRQHandler [WEAK] + EXPORT FLASH_IRQHandler [WEAK] + EXPORT RCC_IRQHandler [WEAK] + EXPORT EXTI0_IRQHandler [WEAK] + EXPORT EXTI1_IRQHandler [WEAK] + EXPORT EXTI2_IRQHandler [WEAK] + EXPORT EXTI3_IRQHandler [WEAK] + EXPORT EXTI4_IRQHandler [WEAK] + EXPORT DMA1_Channel1_IRQHandler [WEAK] + EXPORT DMA1_Channel2_IRQHandler [WEAK] + EXPORT DMA1_Channel3_IRQHandler [WEAK] + EXPORT DMA1_Channel4_IRQHandler [WEAK] + EXPORT DMA1_Channel5_IRQHandler [WEAK] + EXPORT DMA1_Channel6_IRQHandler [WEAK] + EXPORT DMA1_Channel7_IRQHandler [WEAK] + EXPORT ADC1_IRQHandler [WEAK] + EXPORT CAN1_TX_IRQHandler [WEAK] + EXPORT CAN1_RX0_IRQHandler [WEAK] + EXPORT CAN1_RX1_IRQHandler [WEAK] + EXPORT CAN1_SCE_IRQHandler [WEAK] + EXPORT EXTI9_5_IRQHandler [WEAK] + EXPORT TIM1_BRK_TIM15_IRQHandler [WEAK] + EXPORT TIM1_UP_TIM16_IRQHandler [WEAK] + EXPORT TIM1_TRG_COM_IRQHandler [WEAK] + EXPORT TIM1_CC_IRQHandler [WEAK] + EXPORT TIM2_IRQHandler [WEAK] + EXPORT I2C1_EV_IRQHandler [WEAK] + EXPORT I2C1_ER_IRQHandler [WEAK] + EXPORT I2C2_EV_IRQHandler [WEAK] + EXPORT I2C2_ER_IRQHandler [WEAK] + EXPORT SPI1_IRQHandler [WEAK] + EXPORT SPI2_IRQHandler [WEAK] + EXPORT USART1_IRQHandler [WEAK] + EXPORT USART2_IRQHandler [WEAK] + EXPORT USART3_IRQHandler [WEAK] + EXPORT EXTI15_10_IRQHandler [WEAK] + EXPORT RTC_Alarm_IRQHandler [WEAK] + EXPORT SDMMC1_IRQHandler [WEAK] + EXPORT SPI3_IRQHandler [WEAK] + EXPORT TIM6_DAC_IRQHandler [WEAK] + EXPORT TIM7_IRQHandler [WEAK] + EXPORT DMA2_Channel1_IRQHandler [WEAK] + EXPORT DMA2_Channel2_IRQHandler [WEAK] + EXPORT DMA2_Channel3_IRQHandler [WEAK] + EXPORT DMA2_Channel4_IRQHandler [WEAK] + EXPORT DMA2_Channel5_IRQHandler [WEAK] + EXPORT COMP_IRQHandler [WEAK] + EXPORT LPTIM1_IRQHandler [WEAK] + EXPORT LPTIM2_IRQHandler [WEAK] + EXPORT DMA2_Channel6_IRQHandler [WEAK] + EXPORT DMA2_Channel7_IRQHandler [WEAK] + EXPORT LPUART1_IRQHandler [WEAK] + EXPORT QUADSPI_IRQHandler [WEAK] + EXPORT I2C3_EV_IRQHandler [WEAK] + EXPORT I2C3_ER_IRQHandler [WEAK] + EXPORT SAI1_IRQHandler [WEAK] + EXPORT SWPMI1_IRQHandler [WEAK] + EXPORT TSC_IRQHandler [WEAK] + EXPORT RNG_IRQHandler [WEAK] + EXPORT FPU_IRQHandler [WEAK] + EXPORT CRS_IRQHandler [WEAK] + +WWDG_IRQHandler +PVD_PVM_IRQHandler +TAMP_STAMP_IRQHandler +RTC_WKUP_IRQHandler +FLASH_IRQHandler +RCC_IRQHandler +EXTI0_IRQHandler +EXTI1_IRQHandler +EXTI2_IRQHandler +EXTI3_IRQHandler +EXTI4_IRQHandler +DMA1_Channel1_IRQHandler +DMA1_Channel2_IRQHandler +DMA1_Channel3_IRQHandler +DMA1_Channel4_IRQHandler +DMA1_Channel5_IRQHandler +DMA1_Channel6_IRQHandler +DMA1_Channel7_IRQHandler +ADC1_IRQHandler +CAN1_TX_IRQHandler +CAN1_RX0_IRQHandler +CAN1_RX1_IRQHandler +CAN1_SCE_IRQHandler +EXTI9_5_IRQHandler +TIM1_BRK_TIM15_IRQHandler +TIM1_UP_TIM16_IRQHandler +TIM1_TRG_COM_IRQHandler +TIM1_CC_IRQHandler +TIM2_IRQHandler +I2C1_EV_IRQHandler +I2C1_ER_IRQHandler +I2C2_EV_IRQHandler +I2C2_ER_IRQHandler +SPI1_IRQHandler +SPI2_IRQHandler +USART1_IRQHandler +USART2_IRQHandler +USART3_IRQHandler +EXTI15_10_IRQHandler +RTC_Alarm_IRQHandler +SDMMC1_IRQHandler +SPI3_IRQHandler +TIM6_DAC_IRQHandler +TIM7_IRQHandler +DMA2_Channel1_IRQHandler +DMA2_Channel2_IRQHandler +DMA2_Channel3_IRQHandler +DMA2_Channel4_IRQHandler +DMA2_Channel5_IRQHandler +COMP_IRQHandler +LPTIM1_IRQHandler +LPTIM2_IRQHandler +DMA2_Channel6_IRQHandler +DMA2_Channel7_IRQHandler +LPUART1_IRQHandler +QUADSPI_IRQHandler +I2C3_EV_IRQHandler +I2C3_ER_IRQHandler +SAI1_IRQHandler +SWPMI1_IRQHandler +TSC_IRQHandler +RNG_IRQHandler +FPU_IRQHandler +CRS_IRQHandler + + B . + + ENDP + + ALIGN + +;******************************************************************************* +; User Stack and Heap initialization +;******************************************************************************* + IF :DEF:__MICROLIB + + EXPORT __initial_sp + EXPORT __heap_base + EXPORT __heap_limit + + ELSE + + IMPORT __use_two_region_memory + EXPORT __user_initial_stackheap + +__user_initial_stackheap + + LDR R0, = Heap_Mem + LDR R1, =(Stack_Mem + Stack_Size) + LDR R2, = (Heap_Mem + Heap_Size) + LDR R3, = Stack_Mem + BX LR + + ALIGN + + ENDIF + + END + +;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE***** diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_stemwin_demo/BearPi_STM32L31RC.uvoptx b/board/BearPi_STM32L431RC/KEIL/tencent_os_stemwin_demo/BearPi_STM32L31RC.uvoptx index 810275e2..296a7eaa 100644 --- a/board/BearPi_STM32L431RC/KEIL/tencent_os_stemwin_demo/BearPi_STM32L31RC.uvoptx +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_stemwin_demo/BearPi_STM32L31RC.uvoptx @@ -145,7 +145,7 @@ 0 ST-LINKIII-KEIL_SWO - -U066CFF343637424257194226 -O10446 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP") -D00(2BA01477) -L00(0) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_256.FLM -FS08000000 -FL040000 -FP0($$Device:STM32L431RCTx$CMSIS\Flash\STM32L4xx_256.FLM) + -U066CFF343637424257194226 -O10446 -SF10000 -C0 -A0 -I0 -HNlocalhost -HP7184 -P1 -N00("ARM CoreSight SW-DP (ARM Core") -D00(2BA01477) -L00(0) -TO131090 -TC10000000 -TT10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP8 -FO15 -FD20000000 -FC1000 -FN1 -FF0STM32L4xx_256.FLM -FS08000000 -FL040000 -FP0($$Device:STM32L431RCTx$CMSIS\Flash\STM32L4xx_256.FLM) @@ -280,7 +280,7 @@ - 1 + 0 0 0 2 diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_stemwin_demo/BearPi_STM32L31RC.uvprojx b/board/BearPi_STM32L431RC/KEIL/tencent_os_stemwin_demo/BearPi_STM32L31RC.uvprojx index cd8aa379..f0c360d3 100644 --- a/board/BearPi_STM32L431RC/KEIL/tencent_os_stemwin_demo/BearPi_STM32L31RC.uvprojx +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_stemwin_demo/BearPi_STM32L31RC.uvprojx @@ -16,7 +16,7 @@ STM32L431RCTx STMicroelectronics - Keil.STM32L4xx_DFP.2.1.0 + Keil.STM32L4xx_DFP.2.0.0 http://www.keil.com/pack IRAM(0x20000000-0x2000FFFF) IROM(0x8000000-0x803FFFF) CLOCK(8000000) FPU2 CPUTYPE("Cortex-M4") diff --git a/board/BearPi_STM32L431RC/KEIL/tencent_os_stemwin_demo/RTE/_TencentOS_tiny/RTE_Components.h b/board/BearPi_STM32L431RC/KEIL/tencent_os_stemwin_demo/RTE/_TencentOS_tiny/RTE_Components.h index 3347054c..2111c83a 100644 --- a/board/BearPi_STM32L431RC/KEIL/tencent_os_stemwin_demo/RTE/_TencentOS_tiny/RTE_Components.h +++ b/board/BearPi_STM32L431RC/KEIL/tencent_os_stemwin_demo/RTE/_TencentOS_tiny/RTE_Components.h @@ -1,6 +1,6 @@ /* - * Auto generated Run-Time-Environment Component Configuration File + * Auto generated Run-Time-Environment Configuration File * *** Do not modify ! *** * * Project: 'BearPi_STM32L31RC' @@ -17,4 +17,5 @@ #define CMSIS_device_header "stm32l4xx.h" + #endif /* RTE_COMPONENTS_H */ diff --git a/components/gui/GuiLite/UIcode/CMakeLists.txt b/components/gui/GuiLite/UIcode/CMakeLists.txt new file mode 100644 index 00000000..146450aa --- /dev/null +++ b/components/gui/GuiLite/UIcode/CMakeLists.txt @@ -0,0 +1,15 @@ +cmake_minimum_required(VERSION 2.8) + +PROJECT(UIcode) + +SET(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}) + +FILE(GLOB SOURCE *.cpp) +FILE(GLOB RESOURCE resource/*.cpp) + +ADD_LIBRARY(UIcode ${SOURCE} + ${RESOURCE}) + +execute_process( + COMMAND ${CMAKE_SOURCE_DIR}/.sync_build.sh HelloStar +) diff --git a/components/gui/GuiLite/UIcode/GuiLite.h b/components/gui/GuiLite/UIcode/GuiLite.h new file mode 100644 index 00000000..598a0f21 --- /dev/null +++ b/components/gui/GuiLite/UIcode/GuiLite.h @@ -0,0 +1,4798 @@ +#ifndef GUILITE_CORE_INCLUDE_API_H +#define GUILITE_CORE_INCLUDE_API_H + +#define REAL_TIME_TASK_CYCLE_MS 50 + +#define GL_ARGB(a, r, g, b) ((((unsigned int)(a)) << 24) | (((unsigned int)(r)) << 16) | (((unsigned int)(g)) << 8) | ((unsigned int)(b))) +#define GL_ARGB_A(rgb) ((((unsigned int)(rgb)) >> 24) & 0xFF) + +#define GL_RGB(r, g, b) ((0xFF << 24) | (((unsigned int)(r)) << 16) | (((unsigned int)(g)) << 8) | ((unsigned int)(b))) +#define GL_RGB_R(rgb) ((((unsigned int)(rgb)) >> 16) & 0xFF) +#define GL_RGB_G(rgb) ((((unsigned int)(rgb)) >> 8) & 0xFF) +#define GL_RGB_B(rgb) (((unsigned int)(rgb)) & 0xFF) +#define GL_RGB_32_to_16(rgb) (((((unsigned int)(rgb)) & 0xFF) >> 3) | ((((unsigned int)(rgb)) & 0xFC00) >> 5) | ((((unsigned int)(rgb)) & 0xF80000) >> 8)) +#define GL_RGB_16_to_32(rgb) ((0xFF << 24) | ((((unsigned int)(rgb)) & 0x1F) << 3) | ((((unsigned int)(rgb)) & 0x7E0) << 5) | ((((unsigned int)(rgb)) & 0xF800) << 8)) + +#define ALIGN_HCENTER 0x00000000L +#define ALIGN_LEFT 0x01000000L +#define ALIGN_RIGHT 0x02000000L +#define ALIGN_HMASK 0x03000000L + +#define ALIGN_VCENTER 0x00000000L +#define ALIGN_TOP 0x00100000L +#define ALIGN_BOTTOM 0x00200000L +#define ALIGN_VMASK 0x00300000L + +typedef struct +{ + unsigned short year; + unsigned short month; + unsigned short date; + unsigned short day; + unsigned short hour; + unsigned short minute; + unsigned short second; +}T_TIME; + +void register_debug_function(void(*my_assert)(const char* file, int line), void(*my_log_out)(const char* log)); +void _assert(const char* file, int line); +#define ASSERT(condition) \ + do{ \ + if(!(condition))_assert(__FILE__, __LINE__);\ + }while(0) +void log_out(const char* log); + +long get_time_in_second(); +T_TIME second_to_day(long second); +T_TIME get_time(); + +void start_real_timer(void (*func)(void* arg)); +void register_timer(int milli_second, void func(void* ptmr, void* parg)); + +unsigned int get_cur_thread_id(); +void create_thread(unsigned long* thread_id, void* attr, void *(*start_routine) (void *), void* arg); +void thread_sleep(unsigned int milli_seconds); +int build_bmp(const char *filename, unsigned int width, unsigned int height, unsigned char *data); + +#define FIFO_BUFFER_LEN 1024 +class c_fifo +{ +public: + c_fifo(); + int read(void* buf, int len); + int write(void* buf, int len); +private: + unsigned char m_buf[FIFO_BUFFER_LEN]; + int m_head; + int m_tail; + void* m_read_sem; + void* m_write_mutex; +}; +#endif +#ifndef GUILITE_CORE_INCLUDE_CMD_TARGET_H +#define GUILITE_CORE_INCLUDE_CMD_TARGET_H +#define MSG_TYPE_INVALID 0xFFFF +#define MSG_TYPE_WND 0x0001 +#define MSG_TYPE_USR 0x0002 +#define USR_MSG_MAX 32 +class c_cmd_target; +typedef void (c_cmd_target::*msgCallback)(int, int); +struct GL_MSG_ENTRY +{ + unsigned int msgType; + unsigned int msgId; + c_cmd_target* object; + msgCallback callBack; +}; +#define ON_GL_USER_MSG(msgId, func) \ +{MSG_TYPE_USR, msgId, 0, msgCallback(&func)}, +#define GL_DECLARE_MESSAGE_MAP() \ +protected: \ + virtual const GL_MSG_ENTRY* get_msg_entries() const;\ +private: \ + static const GL_MSG_ENTRY m_msg_entries[]; +#define GL_BEGIN_MESSAGE_MAP(theClass) \ +const GL_MSG_ENTRY* theClass::get_msg_entries() const \ +{ \ + return theClass::m_msg_entries; \ +} \ +const GL_MSG_ENTRY theClass::m_msg_entries[] = \ +{ +#define GL_END_MESSAGE_MAP() \ +{MSG_TYPE_INVALID, 0, 0, 0}}; +class c_cmd_target +{ +public: + static int handle_usr_msg(int msg_id, int resource_id, int param) + { + int i; + c_cmd_target* p_wnd = 0; + for (i = 0; i < ms_user_map_size; i++) + { + if (msg_id == ms_usr_map_entries[i].msgId) + { + p_wnd = (c_cmd_target*)ms_usr_map_entries[i].object; + (p_wnd->*ms_usr_map_entries[i].callBack)(resource_id, param); + } + } + return 1; + } +protected: + void load_cmd_msg() + { + const GL_MSG_ENTRY* p_entry = get_msg_entries(); + if (0 == p_entry) + { + return; + } + bool bExist = false; + while (MSG_TYPE_INVALID != p_entry->msgType) + { + if (MSG_TYPE_WND == p_entry->msgType) + { + p_entry++; + continue; + } + bExist = false; + for (int i = 0; i < ms_user_map_size; i++) + { + //repeat register, return. + if (p_entry->msgId == ms_usr_map_entries[i].msgId + && ms_usr_map_entries[i].object == this) + { + bExist = true; + break; + } + } + if (true == bExist) + { + p_entry++; + continue; + } + if (MSG_TYPE_USR == p_entry->msgType) + { + ms_usr_map_entries[ms_user_map_size] = *p_entry; + ms_usr_map_entries[ms_user_map_size].object = this; + ms_user_map_size++; + if (USR_MSG_MAX == ms_user_map_size) + { + ASSERT(false); + } + } + else + { + ASSERT(false); + break; + } + p_entry++; + } + } + const GL_MSG_ENTRY* find_msg_entry(const GL_MSG_ENTRY *pEntry, int msgType, int msgId) + { + if (MSG_TYPE_INVALID == msgType) + { + return 0; + } + while (MSG_TYPE_INVALID != pEntry->msgType) + { + if ((msgType == pEntry->msgType) && (msgId == pEntry->msgId)) + { + return pEntry; + } + pEntry++; + } + return 0; + } +private: + static GL_MSG_ENTRY ms_usr_map_entries[USR_MSG_MAX]; + static unsigned short ms_user_map_size; + GL_DECLARE_MESSAGE_MAP() +}; +#endif +#ifndef GUILITE_CORE_INCLUDE_RECT_H +#define GUILITE_CORE_INCLUDE_RECT_H +#define MAX(a,b) (((a)>(b))?(a):(b)) +#define MIN(a,b) (((a)<(b))?(a):(b)) +class c_rect +{ +public: + c_rect(){Empty();} + c_rect(int left, int top, int right, int bottom){m_left = left;m_top = top;m_right = right;m_bottom = bottom;}; + void SetRect(int Left, int Top, int Right, int Bottom) + { + m_left = MIN(Left, Right); + m_top = MIN(Top, Bottom); + m_right = MAX(Left, Right); + m_bottom = MAX(Top, Bottom); + } + c_rect(const c_rect& rect) + { + SetRect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom); + } + void Empty() + { + m_left = m_top = m_right = m_bottom = 0; + } + int IsEmpty() const + { + return m_top == m_bottom || m_left == m_right; + } + bool PtInRect(int x, int y) const + { + return x >= m_left && x <= m_right && y >= m_top && y <= m_bottom; + } + int operator==(const c_rect& rect) const + { + return (m_left == rect.m_left) && (m_top == rect.m_top) && + (m_right == rect.m_right) && (m_bottom == rect.m_bottom); + } + int Width() const {return m_right - m_left + 1;} + int Height() const {return m_bottom - m_top + 1;} + int m_left; + int m_top; + int m_right; + int m_bottom; +}; +#endif +#ifndef GUILITE_CORE_INCLUDE_RESOURCE_H +#define GUILITE_CORE_INCLUDE_RESOURCE_H +//BITMAP +typedef struct struct_bitmap_info +{ + unsigned short width; + unsigned short height; + unsigned short color_bits;//support 16 bits only + const unsigned short* pixel_color_array; +} BITMAP_INFO; +//FONT +typedef struct struct_lattice +{ + unsigned int utf8_code; + unsigned char width; + const unsigned char* pixel_gray_array; +} LATTICE; +typedef struct struct_font_info +{ + unsigned char height; + unsigned int count; + LATTICE* lattice_array; +} FONT_INFO; +#endif +#ifndef GUILITE_CORE_INCLUDE_THEME_H +#define GUILITE_CORE_INCLUDE_THEME_H +typedef struct struct_font_info FONT_INFO; +typedef struct struct_color_rect COLOR_RECT; +typedef struct struct_bitmap_info BITMAP_INFO; +//Rebuild gui library once you change this file +enum FONT_TYPE +{ + FONT_NULL, + FONT_DEFAULT, + FONT_CUSTOM1, + FONT_CUSTOM2, + FONT_CUSTOM3, + FONT_CUSTOM4, + FONT_CUSTOM5, + FONT_CUSTOM6, + FONT_MAX +}; +enum BITMAP_TYPE +{ + BITMAP_CUSTOM1, + BITMAP_CUSTOM2, + BITMAP_CUSTOM3, + BITMAP_CUSTOM4, + BITMAP_CUSTOM5, + BITMAP_CUSTOM6, + BITMAP_MAX +}; +enum COLOR_TYPE +{ + COLOR_WND_FONT, + COLOR_WND_NORMAL, + COLOR_WND_PUSHED, + COLOR_WND_FOCUS, + COLOR_WND_BORDER, + COLOR_CUSTOME1, + COLOR_CUSTOME2, + COLOR_CUSTOME3, + COLOR_CUSTOME4, + COLOR_CUSTOME5, + COLOR_CUSTOME6, + COLOR_MAX +}; +class c_theme +{ +public: + static int add_font(FONT_TYPE index, const FONT_INFO* font) + { + if (index >= FONT_MAX) + { + ASSERT(false); + return -1; + } + s_font_map[index] = font; + return 0; + } + static const FONT_INFO* get_font(FONT_TYPE index) + { + if (index >= FONT_MAX) + { + ASSERT(false); + return 0; + } + return s_font_map[index]; + } + static int add_bitmap(BITMAP_TYPE index, const BITMAP_INFO* bmp) + { + if (index >= BITMAP_MAX) + { + ASSERT(false); + return -1; + } + s_bmp_map[index] = bmp; + return 0; + } + static const BITMAP_INFO* get_bmp(BITMAP_TYPE index) + { + if (index >= BITMAP_MAX) + { + ASSERT(false); + return 0; + } + return s_bmp_map[index]; + } + static int add_color(COLOR_TYPE index, const unsigned int color) + { + if (index >= COLOR_MAX) + { + ASSERT(false); + return -1; + } + s_color_map[index] = color; + return 0; + } + static const unsigned int get_color(COLOR_TYPE index) + { + if (index >= COLOR_MAX) + { + ASSERT(false); + return 0; + } + return s_color_map[index]; + } +private: + static const FONT_INFO* s_font_map[FONT_MAX]; + static const BITMAP_INFO* s_bmp_map[BITMAP_MAX]; + static unsigned int s_color_map[COLOR_MAX]; +}; +#endif +#ifndef GUILITE_CORE_INCLUDE_DISPLAY_H +#define GUILITE_CORE_INCLUDE_DISPLAY_H +#include +#include +#include +#define SURFACE_CNT_MAX 6//root + pages +typedef enum +{ + Z_ORDER_LEVEL_0,//view/wave/page + Z_ORDER_LEVEL_1,//dialog + Z_ORDER_LEVEL_2,//editbox/spinbox/listbox/keyboard + Z_ORDER_LEVEL_MAX +}Z_ORDER_LEVEL; +struct EXTERNAL_GFX_OP +{ + void(*draw_pixel)(int x, int y, unsigned int rgb); + void(*fill_rect)(int x0, int y0, int x1, int y1, unsigned int rgb); +}; +class c_surface; +class c_display { + friend class c_surface; +public: + inline c_display(void* phy_fb, int display_width, int display_height, int surface_width, int surface_height, unsigned int color_bytes, int surface_cnt, EXTERNAL_GFX_OP* gfx_op = 0);//multiple surface or surface_no_fb + inline c_display(void* phy_fb, int display_width, int display_height, c_surface* surface);//single custom surface + inline c_surface* alloc_surface(Z_ORDER_LEVEL max_zorder);//for multiple surfaces + inline int swipe_surface(c_surface* s0, c_surface* s1, int x0, int x1, int y0, int y1, int offset); + int get_width() { return m_width; } + int get_height() { return m_height; } + void* get_updated_fb(int* width, int* height, bool force_update = false) + { + if (width && height) + { + *width = get_width(); + *height = get_height(); + } + if (force_update) + { + return m_phy_fb; + } + if (m_phy_read_index == m_phy_write_index) + {//No update + return 0; + } + m_phy_read_index = m_phy_write_index; + return m_phy_fb; + } + int snap_shot(const char* file_name) + { + if (!m_phy_fb) + { + return -1; + } + int width = get_width(); + int height = get_height(); + //16 bits framebuffer + if (m_color_bytes == 2) + { + return build_bmp(file_name, width, height, (unsigned char*)m_phy_fb); + } + //32 bits framebuffer + unsigned short* p_bmp565_data = new unsigned short[width * height]; + unsigned int* p_raw_data = (unsigned int*)m_phy_fb; + for (int i = 0; i < width * height; i++) + { + unsigned int rgb = *p_raw_data++; + p_bmp565_data[i] = GL_RGB_32_to_16(rgb); + } + int ret = build_bmp(file_name, width, height, (unsigned char*)p_bmp565_data); + delete[]p_bmp565_data; + return ret; + } +private: + int m_width; //in pixels + int m_height; //in pixels + int m_color_bytes; //16 bits, 32 bits only + void* m_phy_fb; + int m_phy_read_index; + int m_phy_write_index; + c_surface* m_surface_group[SURFACE_CNT_MAX]; + int m_surface_cnt; + int m_surface_index; +}; +class c_frame_layer +{ +public: + c_frame_layer() { fb = 0; } + void* fb; + c_rect visible_rect; +}; +class c_surface { + friend class c_display; friend class c_bitmap; +public: + c_surface(unsigned int width, unsigned int height, unsigned int color_bytes, Z_ORDER_LEVEL max_zorder = Z_ORDER_LEVEL_0) : m_width(width), m_height(height), m_color_bytes(color_bytes), m_fb(0), m_is_active(false), m_top_zorder(Z_ORDER_LEVEL_0), m_phy_fb(0), m_phy_write_index(0), m_display(0) + { + memset(m_frame_layers, 0, sizeof(m_frame_layers)); + m_frame_layers[Z_ORDER_LEVEL_0].visible_rect = c_rect(0, 0, m_width, m_height); + set_surface(max_zorder); + } + int get_width() { return m_width; } + int get_height() { return m_height; } + unsigned int get_pixel(int x, int y, unsigned int z_order) + { + if (x >= m_width || y >= m_height || x < 0 || y < 0 || z_order >= Z_ORDER_LEVEL_MAX) + { + ASSERT(false); + return 0; + } + if (m_frame_layers[z_order].fb) + { + return (m_color_bytes == 4) ? ((unsigned int*)(m_frame_layers[z_order].fb))[y * m_width + x] : GL_RGB_16_to_32(((unsigned short*)(m_frame_layers[z_order].fb))[y * m_width + x]); + } + else if (m_fb) + { + return (m_color_bytes == 4) ? ((unsigned int*)m_fb)[y * m_width + x] : GL_RGB_16_to_32(((unsigned short*)m_fb)[y * m_width + x]); + } + else if (m_phy_fb) + { + return (m_color_bytes == 4) ? ((unsigned int*)m_phy_fb)[y * m_width + x] : GL_RGB_16_to_32(((unsigned short*)m_phy_fb)[y * m_width + x]); + } + return 0; + } + virtual void draw_pixel(int x, int y, unsigned int rgb, unsigned int z_order) + { + if (x >= m_width || y >= m_height || x < 0 || y < 0) + { + return; + } + if (z_order > (unsigned int)m_max_zorder) + { + ASSERT(false); + return; + } + if (0 == m_frame_layers[z_order].visible_rect.PtInRect(x, y)) + { + ASSERT(false); + return; + } + if (z_order == m_max_zorder) + { + return draw_pixel_on_fb(x, y, rgb); + } + + if (z_order > (unsigned int)m_top_zorder) + { + m_top_zorder = (Z_ORDER_LEVEL)z_order; + } + if (m_color_bytes == 4) + { + ((unsigned int*)(m_frame_layers[z_order].fb))[x + y * m_width] = rgb; + } + else + { + ((unsigned short*)(m_frame_layers[z_order].fb))[x + y * m_width] = GL_RGB_32_to_16(rgb); + } + if (z_order == m_top_zorder) + { + return draw_pixel_on_fb(x, y, rgb); + } + bool is_covered = false; + for (unsigned int tmp_z_order = Z_ORDER_LEVEL_MAX - 1; tmp_z_order > z_order; tmp_z_order--) + { + if (true == m_frame_layers[tmp_z_order].visible_rect.PtInRect(x, y)) + { + is_covered = true; + break; + } + } + if (!is_covered) + { + draw_pixel_on_fb(x, y, rgb); + } + } + virtual void fill_rect(int x0, int y0, int x1, int y1, unsigned int rgb, unsigned int z_order) + { + x0 = (x0 < 0) ? 0 : x0; + y0 = (y0 < 0) ? 0 : y0; + x1 = (x1 > (m_width - 1)) ? (m_width - 1) : x1; + y1 = (y1 > (m_height - 1)) ? (m_height - 1) : y1; + if (z_order == m_max_zorder) + { + return fill_rect_on_fb(x0, y0, x1, y1, rgb); + } + if (z_order == m_top_zorder) + { + int x, y; + unsigned short* mem_fb_16 = 0; + unsigned int* mem_fb_32 = 0; + unsigned int rgb_16 = GL_RGB_32_to_16(rgb); + for (y = y0; y <= y1; y++) + { + x = x0; + if (m_color_bytes == 4) + { + mem_fb_32 = &((unsigned int*)m_frame_layers[z_order].fb)[y * m_width + x]; + } + else + { + mem_fb_16 = &((unsigned short*)m_frame_layers[z_order].fb)[y * m_width + x]; + } + for (; x <= x1; x++) + { + if (m_color_bytes == 4) + { + *mem_fb_32++ = rgb; + } + else + { + *mem_fb_16++ = rgb_16; + } + } + } + return fill_rect_on_fb(x0, y0, x1, y1, rgb); + } + for (; y0 <= y1; y0++) + { + draw_hline(x0, x1, y0, rgb, z_order); + } + } + void draw_hline(int x0, int x1, int y, unsigned int rgb, unsigned int z_order) + { + for (; x0 <= x1; x0++) + { + draw_pixel(x0, y, rgb, z_order); + } + } + void draw_vline(int x, int y0, int y1, unsigned int rgb, unsigned int z_order) + { + for (; y0 <= y1; y0++) + { + draw_pixel(x, y0, rgb, z_order); + } + } + void draw_line(int x1, int y1, int x2, int y2, unsigned int rgb, unsigned int z_order) + { + int dx, dy, x, y, e; + (x1 > x2) ? (dx = x1 - x2) : (dx = x2 - x1); + (y1 > y2) ? (dy = y1 - y2) : (dy = y2 - y1); + if (((dx > dy) && (x1 > x2)) || ((dx <= dy) && (y1 > y2))) + { + x = x2; y = y2; + x2 = x1; y2 = y1; + x1 = x; y1 = y; + } + x = x1; y = y1; + if (dx > dy) + { + e = dy - dx / 2; + for (; x1 <= x2; ++x1, e += dy) + { + draw_pixel(x1, y1, rgb, z_order); + if (e > 0) { e -= dx; (y > y2) ? --y1 : ++y1; } + } + } + else + { + e = dx - dy / 2; + for (; y1 <= y2; ++y1, e += dx) + { + draw_pixel(x1, y1, rgb, z_order); + if (e > 0) { e -= dy; (x > x2) ? --x1 : ++x1; } + } + } + } + void draw_rect(int x0, int y0, int x1, int y1, unsigned int rgb, unsigned int z_order, unsigned int size = 1) + { + for (unsigned int offset = 0; offset < size; offset++) + { + draw_hline(x0 + offset, x1 - offset, y0 + offset, rgb, z_order); + draw_hline(x0 + offset, x1 - offset, y1 - offset, rgb, z_order); + draw_vline(x0 + offset, y0 + offset, y1 - offset, rgb, z_order); + draw_vline(x1 - offset, y0 + offset, y1 - offset, rgb, z_order); + } + } + void draw_rect(c_rect rect, unsigned int rgb, unsigned int size, unsigned int z_order) + { + draw_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, rgb, z_order, size); + } + void fill_rect(c_rect rect, unsigned int rgb, unsigned int z_order) + { + fill_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, rgb, z_order); + } + int flush_screen(int left, int top, int right, int bottom) + { + if (left < 0 || left >= m_width || right < 0 || right >= m_width || + top < 0 || top >= m_height || bottom < 0 || bottom >= m_height) + { + ASSERT(false); + } + if (!m_is_active || (0 == m_phy_fb) || (0 == m_fb)) + { + return -1; + } + int display_width = m_display->get_width(); + int display_height = m_display->get_height(); + left = (left >= display_width) ? (display_width - 1) : left; + right = (right >= display_width) ? (display_width - 1) : right; + top = (top >= display_height) ? (display_height - 1) : top; + bottom = (bottom >= display_height) ? (display_height - 1) : bottom; + for (int y = top; y < bottom; y++) + { + void* s_addr = (char*)m_fb + ((y * m_width + left) * m_color_bytes); + void* d_addr = (char*)m_phy_fb + ((y * display_width + left) * m_color_bytes); + memcpy(d_addr, s_addr, (right - left) * m_color_bytes); + } + *m_phy_write_index = *m_phy_write_index + 1; + return 0; + } + bool is_active() { return m_is_active; } + c_display* get_display() { return m_display; } + int set_frame_layer_visible_rect(c_rect& rect, unsigned int z_order) + { + if (rect == m_frame_layers[z_order].visible_rect) + { + return 0; + } + if (rect.m_left < 0 || rect.m_left >= m_width || + rect.m_right < 0 || rect.m_right >= m_width || + rect.m_top < 0 || rect.m_top >= m_height || + rect.m_bottom < 0 || rect.m_bottom >= m_height) + { + ASSERT(false); + return -1; + } + if (!(z_order > Z_ORDER_LEVEL_0&& z_order < Z_ORDER_LEVEL_MAX)) + { + ASSERT(false); + return -2; + } + if (z_order < (unsigned int)m_top_zorder) + { + ASSERT(false); + return -3; + } + m_top_zorder = (Z_ORDER_LEVEL)z_order; + c_rect old_rect = m_frame_layers[z_order].visible_rect; + //Recover the lower layer + int src_zorder = (Z_ORDER_LEVEL)(z_order - 1); + for (int y = old_rect.m_top; y <= old_rect.m_bottom; y++) + { + for (int x = old_rect.m_left; x <= old_rect.m_right; x++) + { + if (!rect.PtInRect(x, y)) + { + unsigned int rgb = (m_color_bytes == 4) ? ((unsigned int*)(m_frame_layers[src_zorder].fb))[x + y * m_width] : GL_RGB_16_to_32(((unsigned short*)(m_frame_layers[src_zorder].fb))[x + y * m_width]); + draw_pixel_on_fb(x, y, rgb); + } + } + } + m_frame_layers[z_order].visible_rect = rect; + if (rect.IsEmpty()) + { + m_top_zorder = (Z_ORDER_LEVEL)(z_order - 1); + } + return 0; + } + void set_active(bool flag) { m_is_active = flag; } +protected: + virtual void fill_rect_on_fb(int x0, int y0, int x1, int y1, unsigned int rgb) + { + int display_width = m_display->get_width(); + int display_height = m_display->get_height(); + if (m_color_bytes == 4) + { + int x; + unsigned int* fb, * phy_fb; + for (; y0 <= y1; y0++) + { + x = x0; + fb = m_fb ? &((unsigned int*)m_fb)[y0 * m_width + x] : 0; + phy_fb = &((unsigned int*)m_phy_fb)[y0 * display_width + x]; + *m_phy_write_index = *m_phy_write_index + 1; + for (; x <= x1; x++) + { + if (fb) + { + *fb++ = rgb; + } + if (m_is_active && (x < display_width) && (y0 < display_height)) + { + *phy_fb++ = rgb; + } + } + } + } + else if (m_color_bytes == 2) + { + int x; + unsigned short* fb, * phy_fb; + rgb = GL_RGB_32_to_16(rgb); + for (; y0 <= y1; y0++) + { + x = x0; + fb = m_fb ? &((unsigned short*)m_fb)[y0 * m_width + x] : 0; + phy_fb = &((unsigned short*)m_phy_fb)[y0 * display_width + x]; + *m_phy_write_index = *m_phy_write_index + 1; + for (; x <= x1; x++) + { + if (fb) + { + *fb++ = rgb; + } + if (m_is_active && (x < display_width) && (y0 < display_height)) + { + *phy_fb++ = rgb; + } + } + } + } + } + virtual void draw_pixel_on_fb(int x, int y, unsigned int rgb) + { + if (m_fb) + { + (m_color_bytes == 4) ? ((unsigned int*)m_fb)[y * m_width + x] = rgb : ((unsigned short*)m_fb)[y * m_width + x] = GL_RGB_32_to_16(rgb); + } + if (m_is_active && (x < m_display->get_width()) && (y < m_display->get_height())) + { + if (m_color_bytes == 4) + { + ((unsigned int*)m_phy_fb)[y * (m_display->get_width()) + x] = rgb; + } + else + { + ((unsigned short*)m_phy_fb)[y * (m_display->get_width()) + x] = GL_RGB_32_to_16(rgb); + } + *m_phy_write_index = *m_phy_write_index + 1; + } + } + void attach_display(c_display* display) + { + ASSERT(display); + m_display = display; + m_phy_fb = display->m_phy_fb; + m_phy_write_index = &display->m_phy_write_index; + } + void set_surface(Z_ORDER_LEVEL max_z_order) + { + m_max_zorder = max_z_order; + if (m_display && (m_display->m_surface_cnt > 1)) + { + m_fb = calloc(m_width * m_height, m_color_bytes); + } + for (int i = Z_ORDER_LEVEL_0; i < m_max_zorder; i++) + {//Top layber fb always be 0 + ASSERT(!m_frame_layers[i].fb); + m_frame_layers[i].fb = calloc(m_width * m_height, m_color_bytes); + ASSERT(m_frame_layers[i].fb); + } + } + int m_width; //in pixels + int m_height; //in pixels + int m_color_bytes; //16 bits, 32 bits only + void* m_fb; //frame buffer you could see + c_frame_layer m_frame_layers[Z_ORDER_LEVEL_MAX];//Top layber fb always be 0 + bool m_is_active; + Z_ORDER_LEVEL m_max_zorder; + Z_ORDER_LEVEL m_top_zorder; + void* m_phy_fb; + int* m_phy_write_index; + c_display* m_display; +}; +class c_surface_no_fb : public c_surface {//No physical framebuffer + friend class c_display; +public: + c_surface_no_fb(unsigned int width, unsigned int height, unsigned int color_bytes, struct EXTERNAL_GFX_OP* gfx_op, Z_ORDER_LEVEL max_zorder = Z_ORDER_LEVEL_0) : c_surface(width, height, color_bytes, max_zorder), m_gfx_op(gfx_op) {} +protected: + virtual void fill_rect_on_fb(int x0, int y0, int x1, int y1, unsigned int rgb) + { + if (!m_gfx_op) + { + return; + } + if (m_gfx_op->fill_rect) + { + return m_gfx_op->fill_rect(x0, y0, x1, y1, rgb); + } + if (m_gfx_op->draw_pixel && m_is_active) + { + for (int y = y0; y <= y1; y++) + { + for (int x = x0; x <= x1; x++) + { + m_gfx_op->draw_pixel(x, y, rgb); + } + } + } + if (!m_fb) { return; } + if (m_color_bytes == 4) + { + unsigned int* fb; + for (int y = y0; y <= y1; y++) + { + fb = &((unsigned int*)m_fb)[y0 * m_width + x0]; + for (int x = x0; x <= x1; x++) + { + *fb++ = rgb; + } + } + } + else if (m_color_bytes == 2) + { + unsigned short* fb; + rgb = GL_RGB_32_to_16(rgb); + for (int y = y0; y <= y1; y++) + { + fb = &((unsigned short*)m_fb)[y0 * m_width + x0]; + for (int x = x0; x <= x1; x++) + { + *fb++ = rgb; + } + } + } + } + virtual void draw_pixel_on_fb(int x, int y, unsigned int rgb) + { + if (m_gfx_op && m_gfx_op->draw_pixel && m_is_active) + { + m_gfx_op->draw_pixel(x, y, rgb); + } + if (!m_fb) { return; } + if (m_color_bytes == 4) + { + ((unsigned int*)m_fb)[y * m_width + x] = rgb; + } + else if (m_color_bytes == 2) + { + ((unsigned short*)m_fb)[y * m_width + x] = GL_RGB_32_to_16(rgb); + } + } + struct EXTERNAL_GFX_OP* m_gfx_op;//Rendering by external method +}; +inline c_display::c_display(void* phy_fb, int display_width, int display_height, int surface_width, int surface_height, unsigned int color_bytes, int surface_cnt, EXTERNAL_GFX_OP* gfx_op) : m_width(display_width), m_height(display_height), m_color_bytes(color_bytes), m_phy_fb(phy_fb), m_phy_read_index(0), m_phy_write_index(0), m_surface_cnt(surface_cnt), m_surface_index(0) +{ + ASSERT(color_bytes == 2 || color_bytes == 4); + ASSERT(m_surface_cnt <= SURFACE_CNT_MAX); + memset(m_surface_group, 0, sizeof(m_surface_group)); + + for (int i = 0; i < m_surface_cnt; i++) + {// Avoid new operation, new operation maybe crash program on Keil platform sometimes. + if (phy_fb) + { + c_surface tmp(surface_width, surface_height, color_bytes); + c_surface* surface = (c_surface*)malloc(sizeof(c_surface)); + ASSERT(surface); + memcpy(surface, &tmp, sizeof(tmp)); + m_surface_group[i] = surface; + } + else + { + c_surface_no_fb tmp(surface_width, surface_height, color_bytes, gfx_op); + c_surface_no_fb* surface = (c_surface_no_fb*)malloc(sizeof(c_surface_no_fb)); + ASSERT(surface); + memcpy(surface, &tmp, sizeof(tmp)); + m_surface_group[i] = surface; + } + m_surface_group[i]->attach_display(this); + } +} +inline c_display::c_display(void* phy_fb, int display_width, int display_height, c_surface* surface) : m_width(display_width), m_height(display_height), m_phy_fb(phy_fb), m_phy_read_index(0), m_phy_write_index(0), m_surface_cnt(1), m_surface_index(0) +{ + surface->m_is_active = true; + (m_surface_group[0] = surface)->attach_display(this); +} +inline c_surface* c_display::alloc_surface(Z_ORDER_LEVEL max_zorder) +{ + ASSERT(max_zorder < Z_ORDER_LEVEL_MAX && m_surface_index < m_surface_cnt); + m_surface_group[m_surface_index]->set_surface(max_zorder); + return m_surface_group[m_surface_index++]; +} +inline int c_display::swipe_surface(c_surface* s0, c_surface* s1, int x0, int x1, int y0, int y1, int offset) +{ + int surface_width = s0->get_width(); + int surface_height = s0->get_height(); + if (offset < 0 || offset > surface_width || y0 < 0 || y0 >= surface_height || + y1 < 0 || y1 >= surface_height || x0 < 0 || x0 >= surface_width || x1 < 0 || x1 >= surface_width) + { + ASSERT(false); + return -1; + } + int width = (x1 - x0 + 1); + if (width < 0 || width > surface_width || width < offset) + { + ASSERT(false); + return -1; + } + x0 = (x0 >= m_width) ? (m_width - 1) : x0; + x1 = (x1 >= m_width) ? (m_width - 1) : x1; + y0 = (y0 >= m_height) ? (m_height - 1) : y0; + y1 = (y1 >= m_height) ? (m_height - 1) : y1; + if (m_phy_fb) + { + for (int y = y0; y <= y1; y++) + { + //Left surface + char* addr_s = ((char*)(s0->m_fb) + (y * (s0->get_width()) + x0 + offset) * m_color_bytes); + char* addr_d = ((char*)(m_phy_fb)+(y * m_width + x0) * m_color_bytes); + memcpy(addr_d, addr_s, (width - offset) * m_color_bytes); + //Right surface + addr_s = ((char*)(s1->m_fb) + (y * (s1->get_width()) + x0) * m_color_bytes); + addr_d = ((char*)(m_phy_fb)+(y * m_width + x0 + (width - offset)) * m_color_bytes); + memcpy(addr_d, addr_s, offset * m_color_bytes); + } + } + else if (m_color_bytes == 4) + { + void(*draw_pixel)(int x, int y, unsigned int rgb) = ((c_surface_no_fb*)s0)->m_gfx_op->draw_pixel; + for (int y = y0; y <= y1; y++) + { + //Left surface + for (int x = x0; x <= (x1 - offset); x++) + { + draw_pixel(x, y, ((unsigned int*)s0->m_fb)[y * m_width + x + offset]); + } + //Right surface + for (int x = x1 - offset; x <= x1; x++) + { + draw_pixel(x, y, ((unsigned int*)s1->m_fb)[y * m_width + x + offset - x1 + x0]); + } + } + } + else if (m_color_bytes == 2) + { + void(*draw_pixel)(int x, int y, unsigned int rgb) = ((c_surface_no_fb*)s0)->m_gfx_op->draw_pixel; + for (int y = y0; y <= y1; y++) + { + //Left surface + for (int x = x0; x <= (x1 - offset); x++) + { + draw_pixel(x, y, GL_RGB_16_to_32(((unsigned short*)s0->m_fb)[y * m_width + x + offset])); + } + //Right surface + for (int x = x1 - offset; x <= x1; x++) + { + draw_pixel(x, y, GL_RGB_16_to_32(((unsigned short*)s1->m_fb)[y * m_width + x + offset - x1 + x0])); + } + } + } + m_phy_write_index++; + return 0; +} +#endif +#ifndef GUILITE_CORE_INCLUDE_WORD_H +#define GUILITE_CORE_INCLUDE_WORD_H +#include +#include +#define BUFFER_LEN 16 +class c_surface; +class c_word +{ +public: + static void draw_string(c_surface* surface, int z_order, const char *s, int x, int y, const FONT_INFO* font, unsigned int font_color, unsigned int bg_color, unsigned int align_type = ALIGN_LEFT) + { + if (0 == s) + { + return; + } + int offset = 0; + unsigned int utf8_code; + while (*s) + { + s += get_utf8_code(s, utf8_code); + offset += draw_single_char(surface, z_order, utf8_code, (x + offset), y, font, font_color, bg_color); + } + } + static void draw_string_in_rect(c_surface* surface, int z_order, const char *s, c_rect rect, const FONT_INFO* font, unsigned int font_color, unsigned int bg_color, unsigned int align_type = ALIGN_LEFT) + { + if (0 == s) + { + return; + } + int x, y; + get_string_pos(s, font, rect, align_type, x, y); + draw_string(surface, z_order, s, rect.m_left + x, rect.m_top + y, font, font_color, bg_color, ALIGN_LEFT); + } + static void draw_value(c_surface* surface, int z_order, int value, int dot_position, int x, int y, const FONT_INFO* font, unsigned int font_color, unsigned int bg_color, unsigned int align_type = ALIGN_LEFT) + { + char buf[BUFFER_LEN]; + value_2_string(value, dot_position, buf, BUFFER_LEN); + draw_string(surface, z_order, buf, x, y, font, font_color, bg_color, align_type); + } + static void draw_value_in_rect(c_surface* surface, int z_order, int value, int dot_position, c_rect rect, const FONT_INFO* font, unsigned int font_color, unsigned int bg_color, unsigned int align_type = ALIGN_LEFT) + { + char buf[BUFFER_LEN]; + value_2_string(value, dot_position, buf, BUFFER_LEN); + draw_string_in_rect(surface, z_order, buf, rect, font, font_color, bg_color, align_type); + } + static void value_2_string(int value, int dot_position, char* buf, int len) + { + memset(buf, 0, len); + switch (dot_position) + { + case 0: + sprintf(buf, "%d", value); + break; + case 1: + sprintf(buf, "%.1f", value * 1.0 / 10); + break; + case 2: + sprintf(buf, "%.2f", value * 1.0 / 100); + break; + case 3: + sprintf(buf, "%.3f", value * 1.0 / 1000); + break; + default: + ASSERT(false); + break; + } + } + static int get_str_size(const char *s, const FONT_INFO* font, int& width, int& height) + { + if (0 == s || 0 == font) + { + width = height = 0; + return -1; + } + int lattice_width = 0; + unsigned int utf8_code; + int utf8_bytes; + while (*s) + { + utf8_bytes = get_utf8_code(s, utf8_code); + const LATTICE* p_lattice = get_lattice(font, utf8_code); + lattice_width += p_lattice ? p_lattice->width : font->height; + s += utf8_bytes; + } + width = lattice_width; + height = font->height; + return 0; + } +private: + static int draw_single_char(c_surface* surface, int z_order, unsigned int utf8_code, int x, int y, const FONT_INFO* font, unsigned int font_color, unsigned int bg_color) + { + unsigned int error_color = 0xFFFFFFFF; + if (font) + { + const LATTICE* p_lattice = get_lattice(font, utf8_code); + if (p_lattice) + { + draw_lattice(surface, z_order, x, y, p_lattice->width, font->height, p_lattice->pixel_gray_array, font_color, bg_color); + return p_lattice->width; + } + } + else + { + error_color = GL_RGB(255, 0, 0); + } + //lattice/font not found, draw "X" + int len = 16; + for (int y_ = 0; y_ < len; y_++) + { + for (int x_ = 0; x_ < len; x_++) + { + int diff = (x_ - y_); + int sum = (x_ + y_); + (diff == 0 || diff == -1 || diff == 1 || sum == len || sum == (len - 1) || sum == (len + 1)) ? + surface->draw_pixel((x + x_), (y + y_), error_color, z_order) : surface->draw_pixel((x + x_), (y + y_), 0, z_order); + } + } + return len; + } + static void draw_lattice(c_surface* surface, int z_order, int x, int y, int width, int height, const unsigned char* p_data, unsigned int font_color, unsigned int bg_color) + { + unsigned int r, g, b, rgb; + unsigned char blk_value = *p_data++; + unsigned char blk_cnt = *p_data++; + b = (GL_RGB_B(font_color) * blk_value + GL_RGB_B(bg_color) * (255 - blk_value)) >> 8; + g = (GL_RGB_G(font_color) * blk_value + GL_RGB_G(bg_color) * (255 - blk_value)) >> 8; + r = (GL_RGB_R(font_color) * blk_value + GL_RGB_R(bg_color) * (255 - blk_value)) >> 8; + rgb = GL_RGB(r, g, b); + for (int y_ = 0; y_ < height; y_++) + { + for (int x_ = 0; x_ < width; x_++) + { + ASSERT(blk_cnt); + if (0x00 == blk_value) + { + if (GL_ARGB_A(bg_color)) + { + surface->draw_pixel(x + x_, y + y_, bg_color, z_order); + } + } + else + { + surface->draw_pixel((x + x_), (y + y_), rgb, z_order); + } + if (--blk_cnt == 0) + {//reload new block + blk_value = *p_data++; + blk_cnt = *p_data++; + b = (GL_RGB_B(font_color) * blk_value + GL_RGB_B(bg_color) * (255 - blk_value)) >> 8; + g = (GL_RGB_G(font_color) * blk_value + GL_RGB_G(bg_color) * (255 - blk_value)) >> 8; + r = (GL_RGB_R(font_color) * blk_value + GL_RGB_R(bg_color) * (255 - blk_value)) >> 8; + rgb = GL_RGB(r, g, b); + } + } + } + } + + static const LATTICE* get_lattice(const FONT_INFO* font, unsigned int utf8_code) + { + int first = 0; + int last = font->count - 1; + int middle = (first + last) / 2; + while (first <= last) + { + if (font->lattice_array[middle].utf8_code < utf8_code) + first = middle + 1; + else if (font->lattice_array[middle].utf8_code == utf8_code) + { + return &font->lattice_array[middle]; + } + else + { + last = middle - 1; + } + middle = (first + last) / 2; + } + return 0; + } + static void get_string_pos(const char *s, const FONT_INFO* font, c_rect rect, unsigned int align_type, int &x, int &y) + { + int x_size, y_size; + get_str_size(s, font, x_size, y_size); + int height = rect.m_bottom - rect.m_top + 1; + int width = rect.m_right - rect.m_left + 1; + x = y = 0; + switch (align_type & ALIGN_HMASK) + { + case ALIGN_HCENTER: + //m_text_org_x=0 + if (width > x_size) + { + x = (width - x_size) / 2; + } + break; + case ALIGN_LEFT: + x = 0; + break; + case ALIGN_RIGHT: + //m_text_org_x=0 + if (width > x_size) + { + x = width - x_size; + } + break; + default: + ASSERT(0); + break; + } + switch (align_type & ALIGN_VMASK) + { + case ALIGN_VCENTER: + //m_text_org_y=0 + if (height > y_size) + { + y = (height - y_size) / 2; + } + break; + case ALIGN_TOP: + y = 0; + break; + case ALIGN_BOTTOM: + //m_text_org_y=0 + if (height > y_size) + { + y = height - y_size; + } + break; + default: + ASSERT(0); + break; + } + } + static int get_utf8_code(const char* s, unsigned int& output_utf8_code) + { + static unsigned char s_utf8_length_table[256] = + { + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 1, 1 + }; + unsigned char* us = (unsigned char*)s; + int utf8_bytes = s_utf8_length_table[*us]; + switch (utf8_bytes) + { + case 1: + output_utf8_code = *us; + break; + case 2: + output_utf8_code = (*us << 8) | (*(us + 1)); + break; + case 3: + output_utf8_code = (*us << 16) | ((*(us + 1)) << 8) | *(us + 2); + break; + case 4: + output_utf8_code = (*us << 24) | ((*(us + 1)) << 16) | (*(us + 2) << 8) | *(us + 3); + break; + default: + ASSERT(false); + break; + } + return utf8_bytes; + } +}; +#endif +#ifndef GUILITE_CORE_INCLUDE_BITMAP_H +#define GUILITE_CORE_INCLUDE_BITMAP_H +#define DEFAULT_MASK_COLOR 0xFF080408 +class c_surface; +class c_bitmap +{ +public: + static void draw_bitmap(c_surface* surface, int z_order, const BITMAP_INFO *pBitmap, int x, int y, unsigned int mask_rgb = DEFAULT_MASK_COLOR) + { + if (0 == pBitmap) + { + return; + } + unsigned short* lower_fb_16 = 0; + unsigned int* lower_fb_32 = 0; + int lower_fb_width = surface->m_width; + if (z_order >= Z_ORDER_LEVEL_1) + { + lower_fb_16 = (unsigned short*)surface->m_frame_layers[z_order - 1].fb; + lower_fb_32 = (unsigned int*)surface->m_frame_layers[z_order - 1].fb; + } + unsigned int mask_rgb_16 = GL_RGB_32_to_16(mask_rgb); + int xsize = pBitmap->width; + int ysize = pBitmap->height; + const unsigned short* pData = (const unsigned short*)pBitmap->pixel_color_array; + int color_bytes = surface->m_color_bytes; + for (int j = 0; j < ysize; j++) + { + for (int i = 0; i < xsize; i++) + { + unsigned int rgb = *pData++; + if (mask_rgb_16 == rgb) + { + if (lower_fb_16) + {//restore lower layer + surface->draw_pixel(x + i, y + j, (color_bytes == 4) ? lower_fb_32[(y + j) * lower_fb_width + x + i] : GL_RGB_16_to_32(lower_fb_16[(y + j) * lower_fb_width + x + i]), z_order); + } + } + else + { + surface->draw_pixel(x + i, y + j, GL_RGB_16_to_32(rgb), z_order); + } + } + } + } + static void draw_bitmap(c_surface* surface, int z_order, const BITMAP_INFO* pBitmap, int x, int y, int src_x, int src_y, int width, int height, unsigned int mask_rgb = DEFAULT_MASK_COLOR) + { + if (0 == pBitmap || (src_x + width > pBitmap->width) || (src_y + height > pBitmap->height)) + { + return; + } + unsigned short* lower_fb_16 = 0; + unsigned int* lower_fb_32 = 0; + int lower_fb_width = surface->m_width; + if (z_order >= Z_ORDER_LEVEL_1) + { + lower_fb_16 = (unsigned short*)surface->m_frame_layers[z_order - 1].fb; + lower_fb_32 = (unsigned int*)surface->m_frame_layers[z_order - 1].fb; + } + unsigned int mask_rgb_16 = GL_RGB_32_to_16(mask_rgb); + const unsigned short* pData = (const unsigned short*)pBitmap->pixel_color_array; + int color_bytes = surface->m_color_bytes; + for (int j = 0; j < height; j++) + { + const unsigned short* p = &pData[src_x + (src_y + j) * pBitmap->width]; + for (int i = 0; i < width; i++) + { + unsigned int rgb = *p++; + if (mask_rgb_16 == rgb) + { + if (lower_fb_16) + {//restore lower layer + surface->draw_pixel(x + i, y + j, (color_bytes == 4) ? lower_fb_32[(y + j) * lower_fb_width + x + i] : GL_RGB_16_to_32(lower_fb_16[(y + j) * lower_fb_width + x + i]), z_order); + } + } + else + { + surface->draw_pixel(x + i, y + j, GL_RGB_16_to_32(rgb), z_order); + } + } + } + } +}; +#endif +#ifndef GUILITE_CORE_INCLUDE_WND_H +#define GUILITE_CORE_INCLUDE_WND_H +typedef struct struct_font_info FONT_INFO; +typedef struct struct_color_rect COLOR_RECT; +class c_wnd; +class c_surface; +typedef enum +{ + ATTR_VISIBLE = 0x40000000L, + ATTR_FOCUS = 0x20000000L, + ATTR_PRIORITY = 0x10000000L// Handle touch action at high priority +}WND_ATTRIBUTION; +typedef enum +{ + STATUS_NORMAL, + STATUS_PUSHED, + STATUS_FOCUSED, + STATUS_DISABLED +}WND_STATUS; +typedef enum +{ + KEY_FORWARD, + KEY_BACKWARD, + KEY_ENTER +}KEY_TYPE; +typedef enum +{ + TOUCH_DOWN, + TOUCH_UP +}TOUCH_ACTION; +typedef struct struct_wnd_tree +{ + c_wnd* p_wnd; + unsigned int resource_id; + const char* str; + short x; + short y; + short width; + short height; + struct struct_wnd_tree* p_child_tree; +}WND_TREE; +class c_wnd : public c_cmd_target +{ + friend class c_dialog; +public: + c_wnd() : m_status(STATUS_NORMAL), m_attr((WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)), m_parent(0), m_top_child(0), m_prev_sibling(0), m_next_sibling(0), + m_str(0), m_font_color(0), m_bg_color(0), m_id(0), m_z_order(Z_ORDER_LEVEL_0), m_focus_child(0), m_surface(0) {}; + virtual ~c_wnd() {}; + virtual int connect(c_wnd *parent, unsigned short resource_id, const char* str, + short x, short y, short width, short height, WND_TREE* p_child_tree = 0) + { + if (0 == resource_id) + { + ASSERT(false); + return -1; + } + m_id = resource_id; + set_str(str); + m_parent = parent; + m_status = STATUS_NORMAL; + if (parent) + { + m_z_order = parent->m_z_order; + m_surface = parent->m_surface; + } + if (0 == m_surface) + { + ASSERT(false); + return -2; + } + /* (cs.x = x * 1024 / 768) for 1027*768=>800*600 quickly*/ + m_wnd_rect.m_left = x; + m_wnd_rect.m_top = y; + m_wnd_rect.m_right = (x + width - 1); + m_wnd_rect.m_bottom = (y + height - 1); + pre_create_wnd(); + if (0 != parent) + { + parent->add_child_2_tail(this); + } + if (load_child_wnd(p_child_tree) >= 0) + { + load_cmd_msg(); + on_init_children(); + } + return 0; + } + void disconnect() + { + if (0 == m_id) + { + return; + } + if (0 != m_top_child) + { + c_wnd* child = m_top_child; + c_wnd* next_child = 0; + while (child) + { + next_child = child->m_next_sibling; + child->disconnect(); + child = next_child; + } + } + if (0 != m_parent) + { + m_parent->unlink_child(this); + } + m_focus_child = 0; + m_id = 0; + } + virtual void on_init_children() {} + virtual void on_paint() {} + virtual void show_window() + { + if (ATTR_VISIBLE == (m_attr & ATTR_VISIBLE)) + { + on_paint(); + c_wnd* child = m_top_child; + if (0 != child) + { + while (child) + { + child->show_window(); + child = child->m_next_sibling; + } + } + } + } + unsigned short get_id() const { return m_id; } + int get_z_order() { return m_z_order; } + c_wnd* get_wnd_ptr(unsigned short id) const + { + c_wnd* child = m_top_child; + while (child) + { + if (child->get_id() == id) + { + break; + } + child = child->m_next_sibling; + } + return child; + } + unsigned int get_attr() const { return m_attr; } + void set_str(const char* str) { m_str = str; } + void set_attr(WND_ATTRIBUTION attr) { m_attr = attr; } + bool is_focus_wnd() const + { + return ((m_attr & ATTR_VISIBLE) && (m_attr & ATTR_FOCUS)) ? true : false; + } + void set_font_color(unsigned int color) { m_font_color = color; } + unsigned int get_font_color() { return m_font_color; } + void set_bg_color(unsigned int color) { m_bg_color = color; } + unsigned int get_bg_color() { return m_bg_color; } + void set_font_type(const FONT_INFO *font_type) { m_font_type = font_type; } + const FONT_INFO* get_font_type() { return m_font_type; } + void set_wnd_pos(short x, short y, short width, short height) + { + m_wnd_rect.m_left = x; + m_wnd_rect.m_top = y; + m_wnd_rect.m_right = x + width - 1; + m_wnd_rect.m_bottom = y + height - 1; + } + void get_wnd_rect(c_rect &rect) const { rect = m_wnd_rect; } + void get_screen_rect(c_rect &rect) const + { + rect.SetRect(0, 0, (m_wnd_rect.Width() - 1), (m_wnd_rect.Height() - 1)); + wnd2screen(rect); + } + c_wnd* set_child_focus(c_wnd *focus_child) + { + ASSERT(0 != focus_child); + ASSERT(focus_child->m_parent == this); + c_wnd* old_focus_child = m_focus_child; + if (focus_child->is_focus_wnd()) + { + if (focus_child != old_focus_child) + { + if (old_focus_child) + { + old_focus_child->on_kill_focus(); + } + m_focus_child = focus_child; + m_focus_child->on_focus(); + } + } + return m_focus_child; + } + c_wnd* get_parent() const { return m_parent; } + c_wnd* get_last_child() const + { + if (0 == m_top_child) + { + return 0; + } + c_wnd* child = m_top_child; + while (child->m_next_sibling) + { + child = child->m_next_sibling; + } + return child; + } + int unlink_child(c_wnd *child) + { + if ((0 == child) + || (this != child->m_parent)) + { + return -1; + } + if (0 == m_top_child) + { + return -2; + } + bool find = false; + c_wnd* tmp_child = m_top_child; + if (tmp_child == child) + { + m_top_child = child->m_next_sibling; + if (0 != child->m_next_sibling) + { + child->m_next_sibling->m_prev_sibling = 0; + } + find = true; + } + else + { + while (tmp_child->m_next_sibling) + { + if (child == tmp_child->m_next_sibling) + { + tmp_child->m_next_sibling = child->m_next_sibling; + if (0 != child->m_next_sibling) + { + child->m_next_sibling->m_prev_sibling = tmp_child; + } + find = true; + break; + } + tmp_child = tmp_child->m_next_sibling; + } + } + if (true == find) + { + if (m_focus_child == child) + { + m_focus_child = 0; + } + child->m_next_sibling = 0; + child->m_prev_sibling = 0; + return 1; + } + else + { + return 0; + } + } + c_wnd* get_prev_sibling() const { return m_prev_sibling; } + c_wnd* get_next_sibling() const { return m_next_sibling; } + void notify_parent(int msg_id, int param) + { + if (!m_parent) + { + return; + } + const GL_MSG_ENTRY* entry = m_parent->find_msg_entry(m_parent->get_msg_entries(), MSG_TYPE_WND, msg_id); + if (0 == entry) + { + return; + } + (m_parent->*(entry->callBack))(m_id, param); + } + virtual void on_touch(int x, int y, TOUCH_ACTION action) + { + x -= m_wnd_rect.m_left; + y -= m_wnd_rect.m_top; + c_wnd* priority_wnd = 0; + c_wnd* tmp_child = m_top_child; + while (tmp_child) + { + if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) + { + priority_wnd = tmp_child; + break; + } + tmp_child = tmp_child->m_next_sibling; + } + if (priority_wnd) + { + return priority_wnd->on_touch(x, y, action); + } + c_wnd* child = m_top_child; + while (child) + { + if (child->is_focus_wnd()) + { + c_rect rect; + child->get_wnd_rect(rect); + if (true == rect.PtInRect(x, y)) + { + return child->on_touch(x, y, action); + } + } + child = child->m_next_sibling; + } + } + virtual void on_key(KEY_TYPE key) + { + c_wnd* priority_wnd = 0; + c_wnd* tmp_child = m_top_child; + while (tmp_child) + { + if ((tmp_child->m_attr & ATTR_PRIORITY) && (tmp_child->m_attr & ATTR_VISIBLE)) + { + priority_wnd = tmp_child; + break; + } + tmp_child = tmp_child->m_next_sibling; + } + if (priority_wnd) + { + return priority_wnd->on_key(key); + } + if (!is_focus_wnd()) + { + return; + } + if (key != KEY_BACKWARD && key != KEY_FORWARD) + { + if (m_focus_child) + { + m_focus_child->on_key(key); + } + return; + } + // Move focus + c_wnd* old_focus_wnd = m_focus_child; + // No current focus wnd, new one. + if (!old_focus_wnd) + { + c_wnd* child = m_top_child; + c_wnd* new_focus_wnd = 0; + while (child) + { + if (child->is_focus_wnd()) + { + new_focus_wnd = child; + new_focus_wnd->m_parent->set_child_focus(new_focus_wnd); + child = child->m_top_child; + continue; + } + child = child->m_next_sibling; + } + return; + } + // Move focus from old wnd to next wnd + c_wnd* next_focus_wnd = (key == KEY_FORWARD) ? old_focus_wnd->m_next_sibling : old_focus_wnd->m_prev_sibling; + while (next_focus_wnd && (!next_focus_wnd->is_focus_wnd())) + {// Search neighbor of old focus wnd + next_focus_wnd = (key == KEY_FORWARD) ? next_focus_wnd->m_next_sibling : next_focus_wnd->m_prev_sibling; + } + if (!next_focus_wnd) + {// Search whole brother wnd + next_focus_wnd = (key == KEY_FORWARD) ? old_focus_wnd->m_parent->m_top_child : old_focus_wnd->m_parent->get_last_child(); + while (next_focus_wnd && (!next_focus_wnd->is_focus_wnd())) + { + next_focus_wnd = (key == KEY_FORWARD) ? next_focus_wnd->m_next_sibling : next_focus_wnd->m_prev_sibling; + } + } + if (next_focus_wnd) + { + next_focus_wnd->m_parent->set_child_focus(next_focus_wnd); + } + } + c_surface* get_surface() { return m_surface; } + void set_surface(c_surface* surface) { m_surface = surface; } +protected: + virtual void pre_create_wnd() {}; + void add_child_2_tail(c_wnd *child) + { + if (0 == child)return; + if (child == get_wnd_ptr(child->m_id))return; + if (0 == m_top_child) + { + m_top_child = child; + child->m_prev_sibling = 0; + child->m_next_sibling = 0; + } + else + { + c_wnd* last_child = get_last_child(); + if (0 == last_child) + { + ASSERT(false); + } + last_child->m_next_sibling = child; + child->m_prev_sibling = last_child; + child->m_next_sibling = 0; + } + } + void wnd2screen(int &x, int &y) const + { + c_wnd* parent = m_parent; + c_rect rect; + x += m_wnd_rect.m_left; + y += m_wnd_rect.m_top; + while (0 != parent) + { + parent->get_wnd_rect(rect); + x += rect.m_left; + y += rect.m_top; + parent = parent->m_parent; + } + } + void wnd2screen(c_rect &rect) const + { + int l = rect.m_left; + int t = rect.m_top; + wnd2screen(l, t); + int r = (l + rect.Width() - 1); + int b = (t + rect.Height() - 1); + rect.SetRect(l, t, r, b); + } + int load_child_wnd(WND_TREE *p_child_tree) + { + if (0 == p_child_tree) + { + return 0; + } + int sum = 0; + WND_TREE* p_cur = p_child_tree; + while (p_cur->p_wnd) + { + if (0 != p_cur->p_wnd->m_id) + {//This wnd has been used! Do not share! + ASSERT(false); + return -1; + } + else + { + p_cur->p_wnd->connect(this, p_cur->resource_id, p_cur->str, + p_cur->x, p_cur->y, p_cur->width, p_cur->height, p_cur->p_child_tree); + } + p_cur++; + sum++; + } + return sum; + } + void set_active_child(c_wnd* child) { m_focus_child = child; } + virtual void on_focus() {}; + virtual void on_kill_focus() {}; +protected: + WND_STATUS m_status; + WND_ATTRIBUTION m_attr; + c_rect m_wnd_rect;// position relative to parent wnd. + c_wnd* m_parent; + c_wnd* m_top_child; + c_wnd* m_prev_sibling; + c_wnd* m_next_sibling; + const char* m_str; + const FONT_INFO* m_font_type; + unsigned int m_font_color; + unsigned int m_bg_color; + unsigned short m_id; + int m_z_order; + c_wnd* m_focus_child;//current focused wnd + c_surface* m_surface; +private: + c_wnd(const c_wnd &win); + c_wnd& operator=(const c_wnd &win); +}; +#endif +#ifndef GUILITE_CORE_INCLUDE_AUDIO_H +#define GUILITE_CORE_INCLUDE_AUDIO_H +enum AUDIO_TYPE +{ + AUDIO_HEART_BEAT, + AUDIO_ALARM, + AUDIO_MAX +}; +class c_audio +{ +public: + static int play(AUDIO_TYPE type); +private: + static void init(); +}; +#endif +#ifndef GUILITE_WIDGETS_INCLUDE_BUTTON_H +#define GUILITE_WIDGETS_INCLUDE_BUTTON_H +#define GL_BN_CLICKED 0x1111 +#define ON_GL_BN_CLICKED(func) \ +{MSG_TYPE_WND, GL_BN_CLICKED, 0, msgCallback(&func)}, +typedef struct struct_bitmap_info BITMAP_INFO; +class c_button : public c_wnd +{ +protected: + virtual void on_paint() + { + c_rect rect; + get_screen_rect(rect); + switch (m_status) + { + case STATUS_NORMAL: + m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); + if (m_str) + { + c_word::draw_string_in_rect(m_surface, m_z_order, m_str, rect, m_font_type, m_font_color, c_theme::get_color(COLOR_WND_NORMAL), ALIGN_HCENTER | ALIGN_VCENTER); + } + break; + case STATUS_FOCUSED: + m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); + if (m_str) + { + c_word::draw_string_in_rect(m_surface, m_z_order, m_str, rect, m_font_type, m_font_color, c_theme::get_color(COLOR_WND_FOCUS), ALIGN_HCENTER | ALIGN_VCENTER); + } + break; + case STATUS_PUSHED: + m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_PUSHED), m_z_order); + m_surface->draw_rect(rect, c_theme::get_color(COLOR_WND_BORDER), 2, m_z_order); + if (m_str) + { + c_word::draw_string_in_rect(m_surface, m_z_order, m_str, rect, m_font_type, m_font_color, c_theme::get_color(COLOR_WND_PUSHED), ALIGN_HCENTER | ALIGN_VCENTER); + } + break; + default: + ASSERT(false); + break; + } + } + virtual void on_focus() + { + m_status = STATUS_FOCUSED; + on_paint(); + } + virtual void on_kill_focus() + { + m_status = STATUS_NORMAL; + on_paint(); + } + virtual void pre_create_wnd() + { + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + m_font_type = c_theme::get_font(FONT_DEFAULT); + m_font_color = c_theme::get_color(COLOR_WND_FONT); + } + virtual void on_touch(int x, int y, TOUCH_ACTION action) + { + if (action == TOUCH_DOWN) + { + m_parent->set_child_focus(this); + m_status = STATUS_PUSHED; + on_paint(); + } + else + { + m_status = STATUS_FOCUSED; + on_paint(); + notify_parent(GL_BN_CLICKED, 0); + } + } + virtual void on_key(KEY_TYPE key) + { + switch (key) + { + case KEY_ENTER: + on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_DOWN); + on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_UP); + break; + case KEY_FORWARD: + case KEY_BACKWARD: + break; + } + return c_wnd::on_key(key); + } +}; +#endif +#ifndef GUILITE_WIDGETS_INCLUDE_DIALOG_H +#define GUILITE_WIDGETS_INCLUDE_DIALOG_H +class c_surface; +class c_dialog; +typedef struct +{ + c_dialog* dialog; + c_surface* surface; +} DIALOG_ARRAY; +class c_dialog : public c_wnd +{ +public: + static int open_dialog(c_dialog* p_dlg, bool modal_mode = true) + { + if (0 == p_dlg) + { + ASSERT(false); + return 0; + } + c_dialog* cur_dlg = get_the_dialog(p_dlg->get_surface()); + if (cur_dlg == p_dlg) + { + return 1; + } + if (cur_dlg) + { + cur_dlg->set_attr(WND_ATTRIBUTION(0)); + } + c_rect rc; + p_dlg->get_screen_rect(rc); + p_dlg->get_surface()->set_frame_layer_visible_rect(rc, Z_ORDER_LEVEL_1); + p_dlg->set_attr(modal_mode ? (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY) : (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS)); + p_dlg->show_window(); + p_dlg->set_me_the_dialog(); + return 1; + } + static int close_dialog(c_surface* surface) + { + c_dialog* dlg = get_the_dialog(surface); + if (0 == dlg) + { + return 0; + } + c_rect rc; + dlg->set_attr(WND_ATTRIBUTION(0)); + surface->set_frame_layer_visible_rect(rc, dlg->m_z_order); + //clear the dialog + for (int i = 0; i < SURFACE_CNT_MAX; i++) + { + if (ms_the_dialogs[i].surface == surface) + { + ms_the_dialogs[i].dialog = 0; + return 1; + } + } + ASSERT(false); + return -1; + } + static c_dialog* get_the_dialog(c_surface* surface) + { + for (int i = 0; i < SURFACE_CNT_MAX; i++) + { + if (ms_the_dialogs[i].surface == surface) + { + return ms_the_dialogs[i].dialog; + } + } + return 0; + } +protected: + virtual void pre_create_wnd() + { + m_attr = WND_ATTRIBUTION(0);// no focus/visible + m_z_order = Z_ORDER_LEVEL_1; + m_bg_color = GL_RGB(33, 42, 53); + } + virtual void on_paint() + { + c_rect rect; + get_screen_rect(rect); + m_surface->fill_rect(rect, m_bg_color, m_z_order); + if (m_str) + { + c_word::draw_string(m_surface, m_z_order, m_str, rect.m_left + 35, rect.m_top, c_theme::get_font(FONT_DEFAULT), GL_RGB(255, 255, 255), GL_ARGB(0, 0, 0, 0), ALIGN_LEFT); + } + } +private: + int set_me_the_dialog() + { + c_surface* surface = get_surface(); + for (int i = 0; i < SURFACE_CNT_MAX; i++) + { + if (ms_the_dialogs[i].surface == surface) + { + ms_the_dialogs[i].dialog = this; + return 0; + } + } + for (int i = 0; i < SURFACE_CNT_MAX; i++) + { + if (ms_the_dialogs[i].surface == 0) + { + ms_the_dialogs[i].dialog = this; + ms_the_dialogs[i].surface = surface; + return 1; + } + } + ASSERT(false); + return -2; + } + static DIALOG_ARRAY ms_the_dialogs[SURFACE_CNT_MAX]; +}; +#endif +#ifndef GUILITE_WIDGETS_INCLUDE_KEYBOARD_H +#define GUILITE_WIDGETS_INCLUDE_KEYBOARD_H +#include +//Changing key width/height will change the width/height of keyboard +#define KEY_WIDTH 65 +#define KEY_HEIGHT 38 +#define KEYBOARD_WIDTH ((KEY_WIDTH + 2) * 10) +#define KEYBOARD_HEIGHT ((KEY_HEIGHT + 2) * 4) +#define NUM_BOARD_WIDTH ((KEY_WIDTH + 2) * 4) +#define NUM_BOARD_HEIGHT ((KEY_HEIGHT + 2) * 4) +#define CAPS_WIDTH (KEY_WIDTH * 3 / 2) +#define DEL_WIDTH (KEY_WIDTH * 3 / 2 + 1) +#define ESC_WIDTH (KEY_WIDTH * 2 + 2) +#define SWITCH_WIDTH (KEY_WIDTH * 3 / 2 ) +#define SPACE_WIDTH (KEY_WIDTH * 3 + 2 * 2) +#define DOT_WIDTH (KEY_WIDTH * 3 / 2 + 3) +#define ENTER_WIDTH (KEY_WIDTH * 2 + 2) +#define POS_X(c) ((KEY_WIDTH * c) + (c + 1) * 2) +#define POS_Y(r) ((KEY_HEIGHT * r) + (r + 1) * 2) +#define KEYBORAD_CLICK 0x5014 +#define ON_KEYBORAD_UPDATE(func) \ +{MSG_TYPE_WND, KEYBORAD_CLICK, 0, msgCallback(&func)}, +typedef enum +{ + STATUS_UPPERCASE, + STATUS_LOWERCASE +}KEYBOARD_STATUS; +typedef enum +{ + STYLE_ALL_BOARD, + STYLE_NUM_BOARD +}KEYBOARD_STYLE; +typedef enum +{ + CLICK_CHAR, + CLICK_ENTER, + CLICK_ESC +}CLICK_STATUS; +extern WND_TREE g_key_board_children[]; +extern WND_TREE g_number_board_children[]; +class c_keyboard: public c_wnd +{ +public: + virtual int connect(c_wnd *user, unsigned short resource_id, KEYBOARD_STYLE style) + { + c_rect user_rect; + user->get_wnd_rect(user_rect); + if (style == STYLE_ALL_BOARD) + {//Place keyboard at the bottom of user's parent window. + c_rect user_parent_rect; + user->get_parent()->get_wnd_rect(user_parent_rect); + return c_wnd::connect(user, resource_id, 0, (0 - user_rect.m_left), (user_parent_rect.Height() - user_rect.m_top - KEYBOARD_HEIGHT), KEYBOARD_WIDTH, KEYBOARD_HEIGHT, g_key_board_children); + } + else if (style == STYLE_NUM_BOARD) + {//Place keyboard below the user window. + return c_wnd::connect(user, resource_id, 0, 0, user_rect.Height(), NUM_BOARD_WIDTH, NUM_BOARD_HEIGHT, g_number_board_children); + } + else + { + ASSERT(false); + } + return -1; + } + KEYBOARD_STATUS get_cap_status(){return m_cap_status;} + char* get_str() { return m_str; } +protected: + virtual void pre_create_wnd() + { + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + m_cap_status = STATUS_UPPERCASE; + memset(m_str, 0, sizeof(m_str)); + m_str_len = 0; + } + virtual void on_paint() + { + c_rect rect; + get_screen_rect(rect); + m_surface->fill_rect(rect, GL_RGB(0, 0, 0), m_z_order); + } + void on_key_clicked(int id, int param) + { + switch (id) + { + case 0x14: + on_caps_clicked(id, param); + break; + case '\n': + on_enter_clicked(id, param); + break; + case 0x1B: + on_esc_clicked(id, param); + break; + case 0x7F: + on_del_clicked(id, param); + break; + default: + on_char_clicked(id, param); + break; + } + } + void on_char_clicked(int id, int param) + {//id = char ascii code. + if (m_str_len >= sizeof(m_str)) + { + return; + } + if ((id >= '0' && id <= '9') || id == ' ' || id == '.') + { + goto InputChar; + } + if (id >= 'A' && id <= 'Z') + { + if (STATUS_LOWERCASE == m_cap_status) + { + id += 0x20; + } + goto InputChar; + } + ASSERT(false); + InputChar: + m_str[m_str_len++] = id; + notify_parent(KEYBORAD_CLICK, CLICK_CHAR); + } + void on_del_clicked(int id, int param) + { + if (m_str_len <= 0) + { + return; + } + m_str[--m_str_len] = 0; + notify_parent(KEYBORAD_CLICK, CLICK_CHAR); + } + void on_caps_clicked(int id, int param) + { + m_cap_status = (m_cap_status == STATUS_LOWERCASE) ? STATUS_UPPERCASE : STATUS_LOWERCASE; + show_window(); + } + void on_enter_clicked(int id, int param) + { + memset(m_str, 0, sizeof(m_str)); + return notify_parent(KEYBORAD_CLICK, CLICK_ENTER); + } + void on_esc_clicked(int id, int param) + { + memset(m_str, 0, sizeof(m_str)); + notify_parent(KEYBORAD_CLICK, CLICK_ESC); + } + GL_DECLARE_MESSAGE_MAP() +private: + char m_str[32]; + int m_str_len; + KEYBOARD_STATUS m_cap_status; +}; +class c_keyboard_button : public c_button +{ +protected: + virtual void on_paint() + { + c_rect rect; + get_screen_rect(rect); + switch (m_status) + { + case STATUS_NORMAL: + m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); + break; + case STATUS_FOCUSED: + m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); + break; + case STATUS_PUSHED: + m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_PUSHED), m_z_order); + m_surface->draw_rect(rect, c_theme::get_color(COLOR_WND_BORDER), 2, m_z_order); + break; + default: + ASSERT(false); + break; + } + if (m_id == 0x14) + { + return c_word::draw_string_in_rect(m_surface, m_z_order, "Caps", rect, m_font_type, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + } + else if (m_id == 0x1B) + { + return c_word::draw_string_in_rect(m_surface, m_z_order, "Esc", rect, m_font_type, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + } + else if (m_id == ' ') + { + return c_word::draw_string_in_rect(m_surface, m_z_order, "Space", rect, m_font_type, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + } + else if (m_id == '\n') + { + return c_word::draw_string_in_rect(m_surface, m_z_order, "Enter", rect, m_font_type, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + } + else if (m_id == '.') + { + return c_word::draw_string_in_rect(m_surface, m_z_order, ".", rect, m_font_type, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + } + else if (m_id == 0x7F) + { + return c_word::draw_string_in_rect(m_surface, m_z_order, "Back", rect, m_font_type, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + } + else if (m_id == 0x90) + { + return c_word::draw_string_in_rect(m_surface, m_z_order, "?123", rect, m_font_type, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + } + char letter[] = { 0, 0 }; + if (m_id >= 'A' && m_id <= 'Z') + { + letter[0] = (((c_keyboard*)m_parent)->get_cap_status() == STATUS_UPPERCASE) ? m_id : (m_id + 0x20); + } + else if (m_id >= '0' && m_id <= '9') + { + letter[0] = (char)m_id; + } + c_word::draw_string_in_rect(m_surface, m_z_order, letter, rect, m_font_type, m_font_color, GL_ARGB(0, 0, 0, 0), m_attr); + } +}; +#endif /* KEYBOARD_H_ */ +#ifndef GUILITE_WIDGETS_INCLUDE_EDIT_H +#define GUILITE_WIDGETS_INCLUDE_EDIT_H +#include +#define MAX_EDIT_STRLEN 32 +#define IDD_KEY_BOARD 0x1 +class c_edit : public c_wnd +{ + friend class c_keyboard; +public: + const char* get_text(){return m_str;} + void set_text(const char* str) + { + if (str != 0 && strlen(str) < sizeof(m_str)) + { + strcpy(m_str, str); + } + } + void set_keyboard_style(KEYBOARD_STYLE kb_sytle) { m_kb_style = kb_sytle; } + +protected: + virtual void pre_create_wnd() + { + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + m_kb_style = STYLE_ALL_BOARD; + m_font_type = c_theme::get_font(FONT_DEFAULT); + m_font_color = c_theme::get_color(COLOR_WND_FONT); + memset(m_str_input, 0, sizeof(m_str_input)); + memset(m_str, 0, sizeof(m_str)); + set_text(c_wnd::m_str); + } + virtual void on_paint() + { + c_rect rect; + get_screen_rect(rect); + c_rect empty_rect; + empty_rect.Empty(); + switch (m_status) + { + case STATUS_NORMAL: + if (m_z_order > m_parent->get_z_order()) + { + s_keyboard.disconnect(); + m_surface->set_frame_layer_visible_rect(empty_rect, s_keyboard.get_z_order()); + m_z_order = m_parent->get_z_order(); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + } + m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); + c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font_type, m_font_color, c_theme::get_color(COLOR_WND_NORMAL), ALIGN_HCENTER | ALIGN_VCENTER); + break; + case STATUS_FOCUSED: + if (m_z_order > m_parent->get_z_order()) + { + s_keyboard.disconnect(); + m_surface->set_frame_layer_visible_rect(empty_rect, s_keyboard.get_z_order()); + m_z_order = m_parent->get_z_order(); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + } + m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); + c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font_type, m_font_color, c_theme::get_color(COLOR_WND_FOCUS), ALIGN_HCENTER | ALIGN_VCENTER); + break; + case STATUS_PUSHED: + if (m_z_order == m_parent->get_z_order()) + { + m_z_order++; + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); + show_keyboard(); + } + m_surface->fill_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_PUSHED), m_parent->get_z_order()); + m_surface->draw_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, c_theme::get_color(COLOR_WND_BORDER), m_parent->get_z_order(), 2); + strlen(m_str_input) ? c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str_input, rect, m_font_type, m_font_color, c_theme::get_color(COLOR_WND_PUSHED), ALIGN_HCENTER | ALIGN_VCENTER) : + c_word::draw_string_in_rect(m_surface, m_parent->get_z_order(), m_str, rect, m_font_type, m_font_color, c_theme::get_color(COLOR_WND_PUSHED), ALIGN_HCENTER | ALIGN_VCENTER); + break; + default: + ASSERT(false); + } + } + virtual void on_focus() + { + m_status = STATUS_FOCUSED; + on_paint(); + } + virtual void on_kill_focus() + { + m_status = STATUS_NORMAL; + on_paint(); + } + virtual void on_key(KEY_TYPE key) + { + switch (key) + { + case KEY_ENTER: + (m_status == STATUS_PUSHED) ? s_keyboard.on_key(key) : (on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_DOWN), on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_UP)); + return; + case KEY_BACKWARD: + case KEY_FORWARD: + return (m_status == STATUS_PUSHED) ? s_keyboard.on_key(key) : c_wnd::on_key(key); + } + } + virtual void on_touch(int x, int y, TOUCH_ACTION action) + { + (action == TOUCH_DOWN) ? on_touch_down(x, y) : on_touch_up(x, y); + } + void on_key_board_click(int id, int param) + { + switch (param) + { + case CLICK_CHAR: + strcpy(m_str_input, s_keyboard.get_str()); + on_paint(); + break; + case CLICK_ENTER: + if (strlen(m_str_input)) + { + memcpy(m_str, m_str_input, sizeof(m_str_input)); + } + m_status = STATUS_FOCUSED; + on_paint(); + break; + case CLICK_ESC: + memset(m_str_input, 0, sizeof(m_str_input)); + m_status = STATUS_FOCUSED; + on_paint(); + break; + default: + ASSERT(false); + break; + } + } + GL_DECLARE_MESSAGE_MAP() +private: + void show_keyboard() + { + s_keyboard.connect(this, IDD_KEY_BOARD, m_kb_style); + c_rect kb_rect; + s_keyboard.get_screen_rect(kb_rect); + m_surface->set_frame_layer_visible_rect(kb_rect, s_keyboard.get_z_order()); + s_keyboard.show_window(); + } + void on_touch_down(int x, int y) + { + c_rect kb_rect_relate_2_edit_parent; + s_keyboard.get_wnd_rect(kb_rect_relate_2_edit_parent); + kb_rect_relate_2_edit_parent.m_left += m_wnd_rect.m_left; + kb_rect_relate_2_edit_parent.m_right += m_wnd_rect.m_left; + kb_rect_relate_2_edit_parent.m_top += m_wnd_rect.m_top; + kb_rect_relate_2_edit_parent.m_bottom += m_wnd_rect.m_top; + if (m_wnd_rect.PtInRect(x, y)) + {//click edit box + if (STATUS_NORMAL == m_status) + { + m_parent->set_child_focus(this); + } + } + else if (kb_rect_relate_2_edit_parent.PtInRect(x, y)) + {//click key board + c_wnd::on_touch(x, y, TOUCH_DOWN); + } + else + { + if (STATUS_PUSHED == m_status) + { + m_status = STATUS_FOCUSED; + on_paint(); + } + } + } + void on_touch_up(int x, int y) + { + if (STATUS_FOCUSED == m_status) + { + m_status = STATUS_PUSHED; + on_paint(); + } + else if (STATUS_PUSHED == m_status) + { + if (m_wnd_rect.PtInRect(x, y)) + {//click edit box + m_status = STATUS_FOCUSED; + on_paint(); + } + else + { + c_wnd::on_touch(x, y, TOUCH_UP); + } + } + } + static c_keyboard s_keyboard; + KEYBOARD_STYLE m_kb_style; + char m_str_input[MAX_EDIT_STRLEN]; + char m_str[MAX_EDIT_STRLEN]; +}; +#endif +#ifndef GUILITE_WIDGETS_INCLUDE_LABEL_H +#define GUILITE_WIDGETS_INCLUDE_LABEL_H +class c_label : public c_wnd +{ +public: + virtual void on_paint() + { + c_rect rect; + get_screen_rect(rect); + if (m_str) + { + m_surface->fill_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, m_parent->get_bg_color(), m_z_order); + c_word::draw_string_in_rect(m_surface, m_z_order, m_str, rect, m_font_type, m_font_color, m_parent->get_bg_color(), ALIGN_LEFT | ALIGN_VCENTER); + } + } +protected: + virtual void pre_create_wnd() + { + m_attr = ATTR_VISIBLE; + m_font_color = c_theme::get_color(COLOR_WND_FONT); + m_font_type = c_theme::get_font(FONT_DEFAULT); + } +}; +#endif +#ifndef GUILITE_WIDGETS_INCLUDE_LIST_BOX_H +#define GUILITE_WIDGETS_INCLUDE_LIST_BOX_H +#include +#define MAX_ITEM_NUM 4 +#define GL_LIST_CONFIRM 0x1 +#define ITEM_HEIGHT 45 +#define ON_LIST_CONFIRM(func) \ +{MSG_TYPE_WND, GL_LIST_CONFIRM, 0, msgCallback(&func)}, +class c_list_box : public c_wnd +{ +public: + int add_item(char* str) + { + if (m_item_total >= MAX_ITEM_NUM) + { + ASSERT(false); + return -1; + } + m_item_array[m_item_total++] = str; + update_list_size(); + return 0; + } + void clear_item() + { + m_selected_item = m_item_total = 0; + memset(m_item_array, 0, sizeof(m_item_array)); + update_list_size(); + } + short get_item_count() { return m_item_total; } + void select_item(short index) + { + if (index < 0 || index >= m_item_total) + { + ASSERT(false); + } + m_selected_item = index; + } + +protected: + virtual void pre_create_wnd() + { + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + memset(m_item_array, 0, sizeof(m_item_array)); + m_item_total = 0; + m_selected_item = 0; + m_font_type = c_theme::get_font(FONT_DEFAULT); + m_font_color = c_theme::get_color(COLOR_WND_FONT); + } + virtual void on_paint() + { + c_rect rect, empty_rect; + get_screen_rect(rect); + switch (m_status) + { + case STATUS_NORMAL: + if (m_z_order > m_parent->get_z_order()) + { + m_surface->set_frame_layer_visible_rect(empty_rect, m_z_order); + m_z_order = m_parent->get_z_order(); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + } + m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); + c_word::draw_string_in_rect(m_surface, m_z_order, m_item_array[m_selected_item], rect, m_font_type, m_font_color, c_theme::get_color(COLOR_WND_NORMAL), ALIGN_HCENTER | ALIGN_VCENTER); + break; + case STATUS_FOCUSED: + if (m_z_order > m_parent->get_z_order()) + { + m_surface->set_frame_layer_visible_rect(empty_rect, m_z_order); + m_z_order = m_parent->get_z_order(); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS); + } + m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); + c_word::draw_string_in_rect(m_surface, m_z_order, m_item_array[m_selected_item], rect, m_font_type, m_font_color, c_theme::get_color(COLOR_WND_FOCUS), ALIGN_HCENTER | ALIGN_VCENTER); + break; + case STATUS_PUSHED: + m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_PUSHED), m_z_order); + m_surface->draw_rect(rect, c_theme::get_color(COLOR_WND_BORDER), 2, m_z_order); + c_word::draw_string_in_rect(m_surface, m_z_order, m_item_array[m_selected_item], rect, m_font_type, GL_RGB(2, 124, 165), GL_ARGB(0, 0, 0, 0), ALIGN_HCENTER | ALIGN_VCENTER); + //draw list + if (m_item_total > 0) + { + if (m_z_order == m_parent->get_z_order()) + { + m_z_order++; + } + m_surface->set_frame_layer_visible_rect(m_list_screen_rect, m_z_order); + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE | ATTR_FOCUS | ATTR_PRIORITY); + show_list(); + } + break; + default: + ASSERT(false); + } + } + virtual void on_focus() + { + m_status = STATUS_FOCUSED; + on_paint(); + } + virtual void on_kill_focus() + { + m_status = STATUS_NORMAL; + on_paint(); + } + virtual void on_key(KEY_TYPE key) + { + switch (key) + { + case KEY_ENTER: + on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_DOWN); + on_touch(m_wnd_rect.m_left, m_wnd_rect.m_top, TOUCH_UP); + return; + case KEY_BACKWARD: + if (m_status != STATUS_PUSHED) + { + return c_wnd::on_key(key); + } + m_selected_item = (m_selected_item > 0) ? (m_selected_item - 1) : m_selected_item; + return show_list(); + case KEY_FORWARD: + if (m_status != STATUS_PUSHED) + { + return c_wnd::on_key(key); + } + m_selected_item = (m_selected_item < (m_item_total - 1)) ? (m_selected_item + 1) : m_selected_item; + return show_list(); + } + } + virtual void on_touch(int x, int y, TOUCH_ACTION action) + { + (action == TOUCH_DOWN) ? on_touch_down(x, y) : on_touch_up(x, y); + } + +private: + void update_list_size() + { + m_list_wnd_rect = m_wnd_rect; + m_list_wnd_rect.m_top = m_wnd_rect.m_bottom + 1; + m_list_wnd_rect.m_bottom = m_list_wnd_rect.m_top + m_item_total * ITEM_HEIGHT; + get_screen_rect(m_list_screen_rect); + m_list_screen_rect.m_top = m_list_screen_rect.m_bottom + 1; + m_list_screen_rect.m_bottom = m_list_screen_rect.m_top + m_item_total * ITEM_HEIGHT; + } + void show_list() + { + //draw all items + c_rect tmp_rect; + for (int i = 0; i < m_item_total; i++) + { + tmp_rect.m_left = m_list_screen_rect.m_left; + tmp_rect.m_right = m_list_screen_rect.m_right; + tmp_rect.m_top = m_list_screen_rect.m_top + i * ITEM_HEIGHT; + tmp_rect.m_bottom = tmp_rect.m_top + ITEM_HEIGHT; + if (m_selected_item == i) + { + m_surface->fill_rect(tmp_rect, c_theme::get_color(COLOR_WND_FOCUS), m_z_order); + c_word::draw_string_in_rect(m_surface, m_z_order, m_item_array[i], tmp_rect, m_font_type, m_font_color, c_theme::get_color(COLOR_WND_FOCUS), ALIGN_HCENTER | ALIGN_VCENTER); + } + else + { + m_surface->fill_rect(tmp_rect, GL_RGB(17, 17, 17), m_z_order); + c_word::draw_string_in_rect(m_surface, m_z_order, m_item_array[i], tmp_rect, m_font_type, m_font_color, GL_RGB(17, 17, 17), ALIGN_HCENTER | ALIGN_VCENTER); + } + } + } + void on_touch_down(int x, int y) + { + if (m_wnd_rect.PtInRect(x, y)) + {//click base + if (STATUS_NORMAL == m_status) + { + m_parent->set_child_focus(this); + } + } + else if (m_list_wnd_rect.PtInRect(x, y)) + {//click extend list + c_wnd::on_touch(x, y, TOUCH_DOWN); + } + else + { + if (STATUS_PUSHED == m_status) + { + m_status = STATUS_FOCUSED; + on_paint(); + notify_parent(GL_LIST_CONFIRM, m_selected_item); + } + } + } + void on_touch_up(int x, int y) + { + if (STATUS_FOCUSED == m_status) + { + m_status = STATUS_PUSHED; + on_paint(); + } + else if (STATUS_PUSHED == m_status) + { + if (m_wnd_rect.PtInRect(x, y)) + {//click base + m_status = STATUS_FOCUSED; + on_paint(); + } + else if (m_list_wnd_rect.PtInRect(x, y)) + {//click extend list + m_status = STATUS_FOCUSED; + select_item((y - m_list_wnd_rect.m_top) / ITEM_HEIGHT); + on_paint(); + notify_parent(GL_LIST_CONFIRM, m_selected_item); + } + else + { + c_wnd::on_touch(x, y, TOUCH_UP); + } + } + } + short m_selected_item; + short m_item_total; + char* m_item_array[MAX_ITEM_NUM]; + c_rect m_list_wnd_rect; //rect relative to parent wnd. + c_rect m_list_screen_rect; //rect relative to physical screen(frame buffer) +}; +#endif +#ifndef GUILITE_WIDGETS_INCLUDE_SLIDE_GROUP_H +#define GUILITE_WIDGETS_INCLUDE_SLIDE_GROUP_H +#include +#define MAX_PAGES 5 +class c_gesture; +class c_slide_group : public c_wnd { +public: + inline c_slide_group(); + int set_active_slide(int index, bool is_redraw = true) + { + if (index >= MAX_PAGES || index < 0) + { + return -1; + } + if (0 == m_slides[index]) + { + return -2; + } + m_active_slide_index = index; + for (int i = 0; i < MAX_PAGES; i++) + { + if (m_slides[i] == 0) + { + continue; + } + if (i == index) + { + m_slides[i]->get_surface()->set_active(true); + add_child_2_tail(m_slides[i]); + if (is_redraw) + { + c_rect rc; + get_screen_rect(rc); + m_slides[i]->get_surface()->flush_screen(rc.m_left, rc.m_top, rc.m_right, rc.m_bottom); + } + } + else + { + m_slides[i]->get_surface()->set_active(false); + } + } + return 0; + } + c_wnd* get_slide(int index){return m_slides[index];} + c_wnd* get_active_slide(){return m_slides[m_active_slide_index];} + int get_active_slide_index(){return m_active_slide_index;} + int add_slide(c_wnd* slide, unsigned short resource_id, short x, short y, short width, short height, WND_TREE* p_child_tree = 0, Z_ORDER_LEVEL max_zorder = Z_ORDER_LEVEL_0) + { + if (0 == slide) + { + return -1; + } + c_surface* old_surface = get_surface(); + c_surface* new_surface = old_surface->get_display()->alloc_surface(max_zorder); + new_surface->set_active(false); + set_surface(new_surface); + slide->connect(this, resource_id, 0, x, y, width, height, p_child_tree); + set_surface(old_surface); + int i = 0; + while (i < MAX_PAGES) + { + if (m_slides[i] == slide) + {//slide has lived + ASSERT(false); + return -2; + } + i++; + } + //new slide + i = 0; + while (i < MAX_PAGES) + { + if (m_slides[i] == 0) + { + m_slides[i] = slide; + slide->show_window(); + return 0; + } + i++; + } + //no more slide can be add + ASSERT(false); + return -3; + } + void disabel_all_slide() + { + for (int i = 0; i < MAX_PAGES; i++) + { + if (m_slides[i]) + { + m_slides[i]->get_surface()->set_active(false); + } + } + } + inline virtual void on_touch(int x, int y, TOUCH_ACTION action); + virtual void on_key(KEY_TYPE key) + { + if (m_slides[m_active_slide_index]) + { + m_slides[m_active_slide_index]->on_key(key); + } + } +protected: + c_wnd* m_slides[MAX_PAGES]; + int m_active_slide_index; + c_gesture* m_gesture; +}; +//#define SWIPE_STEP 300//for arm +#define SWIPE_STEP 10//for PC & ANDROID +#define MOVE_THRESHOLD 10 +typedef enum { + TOUCH_MOVE, + TOUCH_IDLE +}TOUCH_STATE; +class c_slide_group; +class c_gesture { +public: + c_gesture(c_slide_group* group) + { + m_slide_group = group; + m_state = TOUCH_IDLE; + m_down_x = m_down_y = m_move_x = m_move_y = 0; + } + bool handle_swipe(int x, int y, TOUCH_ACTION action) + { + if (action == TOUCH_DOWN)//MOUSE_LBUTTONDOWN + { + if (m_state == TOUCH_IDLE) + { + m_state = TOUCH_MOVE; + m_move_x = m_down_x = x; + return true; + } + else//TOUCH_MOVE + { + return on_move(x); + } + } + else if (action == TOUCH_UP)//MOUSE_LBUTTONUP + { + if (m_state == TOUCH_MOVE) + { + m_state = TOUCH_IDLE; + return on_swipe(x); + } + else + { + return false; + //ASSERT(false); + } + } + return true; + } +private: + bool on_move(int x) + { + if (m_slide_group == 0) + { + return true; + } + if (abs(x - m_move_x) < MOVE_THRESHOLD) + { + return false; + } + m_slide_group->disabel_all_slide(); + m_move_x = x; + if ((m_move_x - m_down_x) > 0) + { + move_right(); + } + else + { + move_left(); + } + return false; + } + bool on_swipe(int x) + { + if (m_slide_group == 0) + { + return true; + } + if ((m_down_x == m_move_x) && (abs(x - m_down_x) < MOVE_THRESHOLD)) + { + return true; + } + m_slide_group->disabel_all_slide(); + int page = -1; + m_move_x = x; + if ((m_move_x - m_down_x) > 0) + { + page = swipe_right(); + } + else + { + page = swipe_left(); + } + if (page >= 0) + { + m_slide_group->set_active_slide(page); + } + else + { + m_slide_group->set_active_slide(m_slide_group->get_active_slide_index(), false); + } + return false; + } + int swipe_left() + { + if (m_slide_group == 0) + { + return -1; + } + int index = m_slide_group->get_active_slide_index(); + if ((index + 1) >= MAX_PAGES || + m_slide_group->get_slide(index + 1) == 0 || + m_slide_group->get_slide(index) == 0) + { + return -2; + } + c_surface* s1 = m_slide_group->get_slide(index + 1)->get_surface(); + c_surface * s2 = m_slide_group->get_slide(index)->get_surface(); + if (s1->get_display() != s2->get_display()) + { + return -3; + } + int step = m_down_x - m_move_x; + c_rect rc; + m_slide_group->get_screen_rect(rc); + while (step < rc.Width()) + { + s1->get_display()->swipe_surface(s2, s1, rc.m_left, rc.m_right, rc.m_top, rc.m_bottom, step); + step += SWIPE_STEP; + } + if (step != rc.Width()) + { + s1->get_display()->swipe_surface(s2, s1, rc.m_left, rc.m_right, rc.m_top, rc.m_bottom, rc.Width()); + } + return (index + 1); + } + int swipe_right() + { + if (m_slide_group == 0) + { + return -1; + } + int index = m_slide_group->get_active_slide_index(); + if (index <= 0 || + m_slide_group->get_slide(index - 1) == 0 || + m_slide_group->get_slide(index) == 0) + { + return -2; + } + c_surface* s1 = m_slide_group->get_slide(index - 1)->get_surface(); + c_surface * s2 = m_slide_group->get_slide(index)->get_surface(); + if (s1->get_display() != s2->get_display()) + { + return -3; + } + c_rect rc; + m_slide_group->get_screen_rect(rc); + int step = rc.Width() - (m_move_x - m_down_x); + while (step > 0) + { + s1->get_display()->swipe_surface(s1, s2, rc.m_left, rc.m_right, rc.m_top, rc.m_bottom, step); + step -= SWIPE_STEP; + } + if (step != 0) + { + s1->get_display()->swipe_surface(s1, s2, rc.m_left, rc.m_right, rc.m_top, rc.m_bottom, 0); + } + return (index - 1); + } + void move_left() + { + int index = m_slide_group->get_active_slide_index(); + if ((index + 1) >= MAX_PAGES || + m_slide_group->get_slide(index + 1) == 0 || + m_slide_group->get_slide(index) == 0) + { + return; + } + c_surface* s1 = m_slide_group->get_slide(index + 1)->get_surface(); + c_surface * s2 = m_slide_group->get_slide(index)->get_surface(); + c_rect rc; + m_slide_group->get_screen_rect(rc); + if (s1->get_display() == s2->get_display()) + { + s1->get_display()->swipe_surface(s2, s1, rc.m_left, rc.m_right, rc.m_top, rc.m_bottom, (m_down_x - m_move_x)); + } + } + void move_right() + { + int index = m_slide_group->get_active_slide_index(); + if (index <= 0 || + m_slide_group->get_slide(index - 1) == 0 || + m_slide_group->get_slide(index) == 0) + { + return; + } + c_surface* s1 = m_slide_group->get_slide(index - 1)->get_surface(); + c_surface * s2 = m_slide_group->get_slide(index)->get_surface(); + c_rect rc; + m_slide_group->get_screen_rect(rc); + if (s1->get_display() == s2->get_display()) + { + s1->get_display()->swipe_surface(s1, s2, rc.m_left, rc.m_right, rc.m_top, rc.m_bottom, (rc.Width() - (m_move_x - m_down_x))); + } + } + int m_down_x; + int m_down_y; + int m_move_x; + int m_move_y; + TOUCH_STATE m_state; + c_slide_group* m_slide_group; +}; +inline c_slide_group::c_slide_group() +{ + m_gesture = new c_gesture(this); + for (int i = 0; i < MAX_PAGES; i++) + { + m_slides[i] = 0; + } + m_active_slide_index = 0; +} +inline void c_slide_group::on_touch(int x, int y, TOUCH_ACTION action) +{ + x -= m_wnd_rect.m_left; + y -= m_wnd_rect.m_top; + if (m_gesture->handle_swipe(x, y, action)) + { + if (m_slides[m_active_slide_index]) + { + m_slides[m_active_slide_index]->on_touch(x, y, action); + } + } +} +#endif +#ifndef GUILITE_WIDGETS_INCLUDE_SPINBOX_H +#define GUILITE_WIDGETS_INCLUDE_SPINBOX_H +#define ID_BT_ARROW_UP 0x1111 +#define ID_BT_ARROW_DOWN 0x2222 +#define GL_SPIN_CHANGE 0x3333 +#define ON_SPIN_CHANGE(func) \ +{MSG_TYPE_WND, GL_SPIN_CHANGE, 0, msgCallback(&func)}, +class c_spin_box; +class c_spin_button : public c_button +{ + friend class c_spin_box; + inline virtual void on_touch(int x, int y, TOUCH_ACTION action); + c_spin_box* m_spin_box; +}; +class c_spin_box : public c_wnd +{ + friend class c_spin_button; +public: + short get_value() { return m_value; } + void set_value(unsigned short value) { m_value = m_cur_value = value; } + void set_max_min(short max, short min) { m_max = max; m_min = min; } + void set_step(short step) { m_step = step; } + short get_min() { return m_min; } + short get_max() { return m_max; } + short get_step() { return m_step; } + void set_value_digit(short digit) { m_digit = digit; } + short get_value_digit() { return m_digit; } +protected: + virtual void on_paint() + { + c_rect rect; + get_screen_rect(rect); + rect.m_right = rect.m_left + (rect.Width() * 2 / 3); + m_surface->fill_rect(rect, c_theme::get_color(COLOR_WND_NORMAL), m_z_order); + c_word::draw_value_in_rect(m_surface, m_parent->get_z_order(), m_cur_value, m_digit, rect, m_font_type, m_font_color, c_theme::get_color(COLOR_WND_NORMAL), ALIGN_HCENTER | ALIGN_VCENTER); + } + virtual void pre_create_wnd() + { + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE); + m_font_type = c_theme::get_font(FONT_DEFAULT); + m_font_color = c_theme::get_color(COLOR_WND_FONT); + m_max = 6; + m_min = 1; + m_digit = 0; + m_step = 1; + //link arrow button position. + c_rect rect; + get_wnd_rect(rect); + m_bt_down.m_spin_box = m_bt_up.m_spin_box = this; + m_bt_up.connect(m_parent, ID_BT_ARROW_UP, "+", (rect.m_left + rect.Width() * 2 / 3), rect.m_top, (rect.Width() / 3), (rect.Height() / 2)); + m_bt_down.connect(m_parent, ID_BT_ARROW_DOWN, "-", (rect.m_left + rect.Width() * 2 / 3), (rect.m_top + rect.Height() / 2), (rect.Width() / 3), (rect.Height() / 2)); + } + void on_arrow_up_bt_click() + { + if (m_cur_value + m_step > m_max) + { + return; + } + m_cur_value += m_step; + notify_parent(GL_SPIN_CHANGE, m_cur_value); + on_paint(); + } + void on_arrow_down_bt_click() + { + if (m_cur_value - m_step < m_min) + { + return; + } + m_cur_value -= m_step; + notify_parent(GL_SPIN_CHANGE, m_cur_value); + on_paint(); + } + short m_cur_value; + short m_value; + short m_step; + short m_max; + short m_min; + short m_digit; + c_spin_button m_bt_up; + c_spin_button m_bt_down; +}; +inline void c_spin_button::on_touch(int x, int y, TOUCH_ACTION action) +{ + if (action == TOUCH_UP) + { + (m_id == ID_BT_ARROW_UP) ? m_spin_box->on_arrow_up_bt_click() : m_spin_box->on_arrow_down_bt_click(); + } + c_button::on_touch(x, y, action); +} +#endif +#ifndef GUILITE_WIDGETS_INCLUDE_TABLE_H +#define GUILITE_WIDGETS_INCLUDE_TABLE_H +#define MAX_COL_NUM 30 +#define MAX_ROW_NUM 30 +class c_table: public c_wnd +{ +public: + void set_sheet_align(unsigned int align_type){ m_align_type = align_type;} + void set_row_num(unsigned int row_num){ m_row_num = row_num;} + void set_col_num(unsigned int col_num){ m_col_num = col_num;} + void set_row_height(unsigned int height) + { + for (unsigned int i = 0; i < m_row_num; i++) + { + m_row_height[i] = height; + } + } + void set_col_width(unsigned int width) + { + for (unsigned int i = 0; i < m_col_num; i++) + { + m_col_width[i] = width; + } + } + int set_row_height(unsigned int index, unsigned int height) + { + if (m_row_num > index) + { + m_row_height[index] = height; + return index; + } + return -1; + } + int set_col_width(unsigned int index, unsigned int width) + { + if (m_col_num > index) + { + m_col_width[index] = width; + return index; + } + return -1; + } + void set_item(int row, int col, char* str, unsigned int color) + { + draw_item(row, col, str, color); + } + unsigned int get_row_num(){ return m_row_num;} + unsigned int get_col_num(){ return m_col_num;} + c_rect get_item_rect(int row, int col) + { + static c_rect rect; + if (row >= MAX_ROW_NUM || col >= MAX_COL_NUM) + { + return rect; + } + unsigned int width = 0; + unsigned int height = 0; + for (int i = 0; i < col; i++) + { + width += m_col_width[i]; + } + for (int j = 0; j < row; j++) + { + height += m_row_height[j]; + } + c_rect wRect; + get_screen_rect(wRect); + rect.m_left = wRect.m_left + width; + rect.m_right = rect.m_left + m_col_width[col]; + if (rect.m_right > wRect.m_right) + { + rect.m_right = wRect.m_right; + } + rect.m_top = wRect.m_top + height; + rect.m_bottom = rect.m_top + m_row_height[row]; + if (rect.m_bottom > wRect.m_bottom) + { + rect.m_bottom = wRect.m_bottom; + } + return rect; + } +protected: + virtual void pre_create_wnd() + { + m_attr = (WND_ATTRIBUTION)(ATTR_VISIBLE); + m_font_type = c_theme::get_font(FONT_DEFAULT); + m_font_color = c_theme::get_color(COLOR_WND_FONT); + } + void draw_item(int row, int col, const char* str, unsigned int color) + { + c_rect rect = get_item_rect(row, col); + m_surface->fill_rect(rect.m_left + 1, rect.m_top + 1, rect.m_right - 1, rect.m_bottom - 1, color, m_z_order); + c_word::draw_string_in_rect(m_surface, m_z_order, str, rect, m_font_type, m_font_color, GL_ARGB(0, 0, 0, 0), m_align_type); + } + unsigned int m_align_type; + unsigned int m_row_num; + unsigned int m_col_num; + unsigned int m_row_height[MAX_ROW_NUM]; + unsigned int m_col_width[MAX_COL_NUM]; +}; +#endif +#ifndef GUILITE_WIDGETS_INCLUDE_WAVE_BUFFER_H +#define GUILITE_WIDGETS_INCLUDE_WAVE_BUFFER_H +#include +#include +#define WAVE_BUFFER_LEN 1024 +#define WAVE_READ_CACHE_LEN 8 +#define BUFFER_EMPTY -1111 +#define BUFFER_FULL -2222; +#define MAX(a,b) (((a)>(b))?(a):(b)) +#define MIN(a,b) (((a)<(b))?(a):(b)) +class c_wave_buffer +{ +public: + c_wave_buffer() + { + m_head = m_tail = m_min_old = m_max_old = + m_min_older = m_max_older = m_last_data = m_read_cache_sum = m_refresh_sequence = 0; + memset(m_wave_buf, 0, sizeof(m_wave_buf)); + memset(m_read_cache_min, 0, sizeof(m_read_cache_min)); + memset(m_read_cache_mid, 0, sizeof(m_read_cache_mid)); + memset(m_read_cache_max, 0, sizeof(m_read_cache_max)); + } + int write_wave_data(short data) + { + if ((m_tail + 1) % WAVE_BUFFER_LEN == m_head) + {//full + //log_out("wave buf full\n"); + return BUFFER_FULL; + } + m_wave_buf[m_tail] = data; + m_tail = (m_tail + 1) % WAVE_BUFFER_LEN; + return 1; + } + int read_wave_data_by_frame(short &max, short &min, short frame_len, unsigned int sequence, short offset) + { + if (m_refresh_sequence != sequence) + { + m_refresh_sequence = sequence; + m_read_cache_sum = 0; + } + else if (offset < m_read_cache_sum)//(m_refresh_sequence == sequence && offset < m_fb_sum) + { + max = m_read_cache_max[offset]; + min = m_read_cache_min[offset]; + return m_read_cache_mid[offset]; + } + m_read_cache_sum++; + ASSERT(m_read_cache_sum <= WAVE_READ_CACHE_LEN); + int i, data; + int tmp_min = m_last_data; + int tmp_max = m_last_data; + int mid = (m_min_old + m_max_old) >> 1; + i = 0; + while (i++ < frame_len) + { + data = read_data(); + if (BUFFER_EMPTY == data) + { + break; + } + m_last_data = data; + if (data < tmp_min) { tmp_min = data; } + if (data > tmp_max) { tmp_max = data; } + } + min = m_read_cache_min[offset] = MIN(m_min_old, MIN(tmp_min, m_min_older)); + max = m_read_cache_max[offset] = MAX(m_max_old, MAX(tmp_max, m_max_older)); + m_min_older = m_min_old; + m_max_older = m_max_old; + m_min_old = tmp_min; + m_max_old = tmp_max; + return (m_read_cache_mid[offset] = mid); + } + void reset() + { + m_head = m_tail; + } + void clear_data() + { + m_head = m_tail = 0; + memset(m_wave_buf, 0, sizeof(m_wave_buf)); + } + short get_cnt() + { + return (m_tail >= m_head) ? (m_tail - m_head) : (m_tail - m_head + WAVE_BUFFER_LEN); + } +private: + int read_data() + { + if (m_head == m_tail) + {//empty + //log_out("wave buf empty\n"); + return BUFFER_EMPTY; + } + int ret = m_wave_buf[m_head]; + m_head = (m_head + 1) % WAVE_BUFFER_LEN; + return ret; + } + short m_wave_buf[WAVE_BUFFER_LEN]; + short m_head; + short m_tail; + int m_min_old; + int m_max_old; + int m_min_older; + int m_max_older; + int m_last_data; + short m_read_cache_min[WAVE_READ_CACHE_LEN]; + short m_read_cache_mid[WAVE_READ_CACHE_LEN]; + short m_read_cache_max[WAVE_READ_CACHE_LEN]; + short m_read_cache_sum; + unsigned int m_refresh_sequence; +}; +#endif +#ifndef GUILITE_WIDGETS_INCLUDE_WAVE_CTRL_H +#define GUILITE_WIDGETS_INCLUDE_WAVE_CTRL_H +#include +#include +#define CORRECT(x, high_limit, low_limit) {\ + x = (x > high_limit) ? high_limit : x;\ + x = (x < low_limit) ? low_limit : x;\ +}while(0) +#define WAVE_CURSOR_WIDTH 8 +#define WAVE_LINE_WIDTH 1 +#define WAVE_MARGIN 5 +typedef enum +{ + FILL_MODE, + SCAN_MODE +}E_WAVE_DRAW_MODE; +class c_wave_buffer; +class c_wave_ctrl : public c_wnd +{ +public: + c_wave_ctrl() + { + m_wave = 0; + m_bg_fb = 0; + m_wave_name_font = m_wave_unit_font = 0; + m_wave_name = m_wave_unit = 0; + m_max_data = 500; + m_min_data = 0; + m_wave_speed = 1; + m_wave_data_rate = 0; + m_wave_refresh_rate = 1000; + m_frame_len_map_index = 0; + m_wave_name_color = m_wave_unit_color = m_wave_color = GL_RGB(255, 0, 0); + m_back_color = GL_RGB(0, 0, 0); + } + virtual void on_init_children()//should be pre_create + { + c_rect rect; + get_screen_rect(rect); + m_wave_left = rect.m_left + WAVE_MARGIN; + m_wave_right = rect.m_right - WAVE_MARGIN; + m_wave_top = rect.m_top + WAVE_MARGIN; + m_wave_bottom = rect.m_bottom - WAVE_MARGIN; + m_wave_cursor = m_wave_left; + m_bg_fb = (unsigned int*)calloc(rect.Width() * rect.Height(), 4); + } + virtual void on_paint() + { + c_rect rect; + get_screen_rect(rect); + m_surface->fill_rect(rect.m_left, rect.m_top, rect.m_right, rect.m_bottom, m_back_color, m_z_order); + //show name + c_word::draw_string(m_surface, m_z_order, m_wave_name, m_wave_left + 10, rect.m_top, m_wave_name_font, m_wave_name_color, GL_ARGB(0, 0, 0, 0), ALIGN_LEFT); + //show unit + c_word::draw_string(m_surface, m_z_order, m_wave_unit, m_wave_left + 60, rect.m_top, m_wave_unit_font, m_wave_unit_color, GL_ARGB(0, 0, 0, 0), ALIGN_LEFT); + save_background(); + } + void set_wave_name(char* wave_name){ m_wave_name = wave_name;} + void set_wave_unit(char* wave_unit){ m_wave_unit = wave_unit;} + void set_wave_name_font(const FONT_INFO* wave_name_font_type){ m_wave_name_font = wave_name_font_type;} + void set_wave_unit_font(const FONT_INFO* wave_unit_font_type){ m_wave_unit_font = wave_unit_font_type;} + void set_wave_name_color(unsigned int wave_name_color){ m_wave_name_color = wave_name_color;} + void set_wave_unit_color(unsigned int wave_unit_color){ m_wave_unit_color = wave_unit_color;} + void set_wave_color(unsigned int color){ m_wave_color = color;} + void set_wave_in_out_rate(unsigned int data_rate, unsigned int refresh_rate) + { + m_wave_data_rate = data_rate; + m_wave_refresh_rate = refresh_rate; + int read_times_per_second = m_wave_speed * 1000 / m_wave_refresh_rate; + memset(m_frame_len_map, 0, sizeof(m_frame_len_map)); + for (unsigned int i = 1; i < sizeof(m_frame_len_map) + 1; i++) + { + m_frame_len_map[i - 1] = data_rate * i / read_times_per_second - data_rate * (i - 1) / read_times_per_second; + } + m_frame_len_map_index = 0; + } + void set_wave_speed(unsigned int speed) + { + m_wave_speed = speed; + set_wave_in_out_rate(m_wave_data_rate, m_wave_refresh_rate); + } + void set_max_min(short max_data, short min_data) + { + m_max_data = max_data; + m_min_data = min_data; + } + void set_wave(c_wave_buffer* wave){m_wave = wave;} + c_wave_buffer* get_wave(){return m_wave;} + void clear_data() + { + if (m_wave == 0) + { + ASSERT(false); + return; + } + m_wave->clear_data(); + } + bool is_data_enough() + { + if (m_wave == 0) + { + ASSERT(false); + return false; + } + return (m_wave->get_cnt() - m_frame_len_map[m_frame_len_map_index] * m_wave_speed); + } + void refresh_wave(unsigned char frame) + { + if (m_wave == 0) + { + ASSERT(false); + return; + } + short max, min, mid; + for (short offset = 0; offset < m_wave_speed; offset++) + { + //get wave value + mid = m_wave->read_wave_data_by_frame(max, min, + m_frame_len_map[m_frame_len_map_index++], + frame, offset); + m_frame_len_map_index %= sizeof(m_frame_len_map); + //map to wave ctrl + int y_min, y_max; + if (m_max_data == m_min_data) + { + ASSERT(false); + } + y_max = m_wave_bottom + WAVE_LINE_WIDTH - (m_wave_bottom - m_wave_top) * (min - m_min_data) / (m_max_data - m_min_data); + y_min = m_wave_bottom - WAVE_LINE_WIDTH - (m_wave_bottom - m_wave_top) * (max - m_min_data) / (m_max_data - m_min_data); + mid = m_wave_bottom - (m_wave_bottom - m_wave_top) * (mid - m_min_data) / (m_max_data - m_min_data); + CORRECT(y_min, m_wave_bottom, m_wave_top); + CORRECT(y_max, m_wave_bottom, m_wave_top); + CORRECT(mid, m_wave_bottom, m_wave_top); + if (m_wave_cursor > m_wave_right) + { + m_wave_cursor = m_wave_left; + } + draw_smooth_vline(y_min, y_max, mid, m_wave_color); + restore_background(); + m_wave_cursor++; + } + } + void clear_wave() + { + m_surface->fill_rect(m_wave_left, m_wave_top, m_wave_right, m_wave_bottom, m_back_color, m_z_order); + m_wave_cursor = m_wave_left; + } +protected: + void draw_smooth_vline(int y_min, int y_max, int mid, unsigned int rgb) + { + int dy = y_max - y_min; + short r = GL_RGB_R(rgb); + short g = GL_RGB_G(rgb); + short b = GL_RGB_B(rgb); + int index = (dy >> 1) + 2; + int y; + m_surface->draw_pixel(m_wave_cursor, mid, rgb, m_z_order); + if (dy < 1) + { + return; + } + unsigned char cur_r, cur_g, cur_b; + unsigned int cur_rgb; + for (int i = 1; i <= (dy >> 1) + 1; ++i) + { + if ((mid + i) <= y_max) + { + y = mid + i; + cur_r = r * (index - i) / index; + cur_g = g * (index - i) / index; + cur_b = b * (index - i) / index; + cur_rgb = GL_RGB(cur_r, cur_g, cur_b); + m_surface->draw_pixel(m_wave_cursor, y, cur_rgb, m_z_order); + } + if ((mid - i) >= y_min) + { + y = mid - i; + cur_r = r * (index - i) / index; + cur_g = g * (index - i) / index; + cur_b = b * (index - i) / index; + cur_rgb = GL_RGB(cur_r, cur_g, cur_b); + m_surface->draw_pixel(m_wave_cursor, y, cur_rgb, m_z_order); + } + } + } + void restore_background() + { + int x = m_wave_cursor + WAVE_CURSOR_WIDTH; + if (x > m_wave_right) + { + x -= (m_wave_right - m_wave_left + 1); + } + c_rect rect; + get_screen_rect(rect); + register int width = rect.Width(); + register int top = rect.m_top; + register int left = rect.m_left; + for (int y_pos = (m_wave_top - 1); y_pos <= (m_wave_bottom + 1); y_pos++) + { + (m_bg_fb) ? m_surface->draw_pixel(x, y_pos, m_bg_fb[(y_pos - top) * width + (x - left)], m_z_order) : m_surface->draw_pixel(x, y_pos, 0, m_z_order); + } + } + void save_background() + { + if (!m_bg_fb) + { + return; + } + c_rect rect; + get_screen_rect(rect); + register unsigned int* p_des = m_bg_fb; + for (int y = rect.m_top; y <= rect.m_bottom; y++) + { + for (int x = rect.m_left; x <= rect.m_right; x++) + { + *p_des++ = m_surface->get_pixel(x, y, m_z_order); + } + } + } + char* m_wave_name; + char* m_wave_unit; + const FONT_INFO* m_wave_name_font; + const FONT_INFO* m_wave_unit_font; + unsigned int m_wave_name_color; + unsigned int m_wave_unit_color; + unsigned int m_wave_color; + unsigned int m_back_color; + int m_wave_left; + int m_wave_right; + int m_wave_top; + int m_wave_bottom; + short m_max_data; + short m_min_data; + +private: + c_wave_buffer* m_wave; + unsigned int* m_bg_fb; //background frame buffer, could be used to draw scale line. + int m_wave_cursor; + int m_wave_speed; //pixels per refresh + unsigned int m_wave_data_rate; //data sample rate + unsigned int m_wave_refresh_rate;//refresh cycle in millisecond + unsigned char m_frame_len_map[64]; + unsigned char m_frame_len_map_index; +}; +#endif +#ifdef GUILITE_ON +GL_MSG_ENTRY c_cmd_target::ms_usr_map_entries[USR_MSG_MAX]; +unsigned short c_cmd_target::ms_user_map_size; +GL_BEGIN_MESSAGE_MAP(c_cmd_target) +GL_END_MESSAGE_MAP() +#endif + +#ifdef GUILITE_ON + +const FONT_INFO* c_theme::s_font_map[FONT_MAX]; +const BITMAP_INFO* c_theme::s_bmp_map[BITMAP_MAX]; +unsigned int c_theme::s_color_map[COLOR_MAX]; + +#endif +#ifdef GUILITE_ON +#if (defined __linux__) || (defined __APPLE__) +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define MAX_TIMER_CNT 10 +#define TIMER_UNIT 50//ms +static void(*do_assert)(const char* file, int line); +static void(*do_log_out)(const char* log); +void register_debug_function(void(*my_assert)(const char* file, int line), void(*my_log_out)(const char* log)) +{ + do_assert = my_assert; + do_log_out = my_log_out; +} +void _assert(const char* file, int line) +{ + if(do_assert) + { + do_assert(file, line); + } + else + { + printf("assert@ file:%s, line:%d, error no: %d\n", file, line, errno); + } +} +void log_out(const char* log) +{ + if (do_log_out) + { + do_log_out(log); + } + else + { + printf("%s", log); + fflush(stdout); + } +} +typedef struct _timer_manage +{ + struct _timer_info + { + int state; /* on or off */ + int interval; + int elapse; /* 0~interval */ + void (* timer_proc) (void* ptmr, void* parg); + }timer_info[MAX_TIMER_CNT]; + void (* old_sigfunc)(int); + void (* new_sigfunc)(int); +}_timer_manage_t; +static struct _timer_manage timer_manage; +static void* timer_routine(void*) +{ + int i; + while(true) + { + for(i = 0; i < MAX_TIMER_CNT; i++) + { + if(timer_manage.timer_info[i].state == 0) + { + continue; + } + timer_manage.timer_info[i].elapse++; + if(timer_manage.timer_info[i].elapse == timer_manage.timer_info[i].interval) + { + timer_manage.timer_info[i].elapse = 0; + timer_manage.timer_info[i].timer_proc(0, 0); + } + } + usleep(1000 * TIMER_UNIT); + } + return NULL; +} +static int init_mul_timer() +{ + static bool s_is_init = false; + if(s_is_init == true) + { + return 0; + } + memset(&timer_manage, 0, sizeof(struct _timer_manage)); + pthread_t pid; + pthread_create(&pid, NULL, timer_routine, NULL); + s_is_init = true; + return 1; +} +static int set_a_timer(int interval, void (* timer_proc) (void* ptmr, void* parg)) +{ + init_mul_timer(); + int i; + if(timer_proc == NULL || interval <= 0) + { + return (-1); + } + for(i = 0; i < MAX_TIMER_CNT; i++) + { + if(timer_manage.timer_info[i].state == 1) + { + continue; + } + memset(&timer_manage.timer_info[i], 0, sizeof(timer_manage.timer_info[i])); + timer_manage.timer_info[i].timer_proc = timer_proc; + timer_manage.timer_info[i].interval = interval; + timer_manage.timer_info[i].elapse = 0; + timer_manage.timer_info[i].state = 1; + break; + } + if(i >= MAX_TIMER_CNT) + { + ASSERT(false); + return (-1); + } + return (i); +} +typedef void (*EXPIRE_ROUTINE)(void* arg); +EXPIRE_ROUTINE s_expire_function; +static c_fifo s_real_timer_fifo; +static void* real_timer_routine(void*) +{ + char dummy; + while(1) + { + if(s_real_timer_fifo.read(&dummy, 1) > 0) + { + if(s_expire_function)s_expire_function(0); + } + else + { + ASSERT(false); + } + } + return 0; +} +static void expire_real_timer(int sigo) +{ + char dummy = 0x33; + if(s_real_timer_fifo.write(&dummy, 1) <= 0) + { + ASSERT(false); + } +} +void start_real_timer(void (*func)(void* arg)) +{ + if(NULL == func) + { + return; + } + s_expire_function = func; + signal(SIGALRM, expire_real_timer); + struct itimerval value, ovalue; + value.it_value.tv_sec = 0; + value.it_value.tv_usec = REAL_TIME_TASK_CYCLE_MS * 1000; + value.it_interval.tv_sec = 0; + value.it_interval.tv_usec = REAL_TIME_TASK_CYCLE_MS * 1000; + setitimer(ITIMER_REAL, &value, &ovalue); + static pthread_t s_pid; + if(s_pid == 0) + { + pthread_create(&s_pid, NULL, real_timer_routine, NULL); + } +} +unsigned int get_cur_thread_id() +{ + return (unsigned long)pthread_self(); +} +void register_timer(int milli_second,void func(void* ptmr, void* parg)) +{ + set_a_timer(milli_second/TIMER_UNIT,func); +} +long get_time_in_second() +{ + return time(NULL); /* + 8*60*60*/ +} +T_TIME get_time() +{ + T_TIME ret = {0}; + struct tm *fmt; + time_t timer; + timer = get_time_in_second(); + fmt = localtime(&timer); + ret.year = fmt->tm_year + 1900; + ret.month = fmt->tm_mon + 1; + ret.day = fmt->tm_mday; + ret.hour = fmt->tm_hour; + ret.minute = fmt->tm_min; + ret.second = fmt->tm_sec; + return ret; +} +T_TIME second_to_day(long second) +{ + T_TIME ret = {0}; + struct tm *fmt; + fmt = localtime(&second); + ret.year = fmt->tm_year + 1900; + ret.month = fmt->tm_mon + 1; + ret.day = fmt->tm_mday; + ret.hour = fmt->tm_hour; + ret.minute = fmt->tm_min; + ret.second = fmt->tm_sec; + return ret; +} +void create_thread(unsigned long* thread_id, void* attr, void *(*start_routine) (void *), void* arg) +{ + pthread_create((pthread_t*)thread_id, (pthread_attr_t const*)attr, start_routine, arg); +} +void thread_sleep(unsigned int milli_seconds) +{ + usleep(milli_seconds * 1000); +} +typedef struct { + unsigned short bfType; + unsigned int bfSize; + unsigned short bfReserved1; + unsigned short bfReserved2; + unsigned int bfOffBits; +}__attribute__((packed))FileHead; +typedef struct{ + unsigned int biSize; + int biWidth; + int biHeight; + unsigned short biPlanes; + unsigned short biBitCount; + unsigned int biCompress; + unsigned int biSizeImage; + int biXPelsPerMeter; + int biYPelsPerMeter; + unsigned int biClrUsed; + unsigned int biClrImportant; + unsigned int biRedMask; + unsigned int biGreenMask; + unsigned int biBlueMask; +}__attribute__((packed))Infohead; +int build_bmp(const char *filename, unsigned int width, unsigned int height, unsigned char *data) +{ + FileHead bmp_head; + Infohead bmp_info; + int size = width * height * 2; + //initialize bmp head. + bmp_head.bfType = 0x4d42; + bmp_head.bfSize = size + sizeof(FileHead) + sizeof(Infohead); + bmp_head.bfReserved1 = bmp_head.bfReserved2 = 0; + bmp_head.bfOffBits = bmp_head.bfSize - size; + //initialize bmp info. + bmp_info.biSize = 40; + bmp_info.biWidth = width; + bmp_info.biHeight = height; + bmp_info.biPlanes = 1; + bmp_info.biBitCount = 16; + bmp_info.biCompress = 3; + bmp_info.biSizeImage = size; + bmp_info.biXPelsPerMeter = 0; + bmp_info.biYPelsPerMeter = 0; + bmp_info.biClrUsed = 0; + bmp_info.biClrImportant = 0; + //RGB565 + bmp_info.biRedMask = 0xF800; + bmp_info.biGreenMask = 0x07E0; + bmp_info.biBlueMask = 0x001F; + //copy the data + FILE *fp; + if(!(fp=fopen(filename,"wb"))) + { + return -1; + } + fwrite(&bmp_head, 1, sizeof(FileHead),fp); + fwrite(&bmp_info, 1, sizeof(Infohead),fp); + //fwrite(data, 1, size, fp);//top <-> bottom + for (int i = (height - 1); i >= 0; --i) + { + fwrite(&data[i * width * 2], 1, width * 2, fp); + } + + fclose(fp); + return 0; +} +c_fifo::c_fifo() +{ + m_head = m_tail = 0; + m_read_sem = malloc(sizeof(sem_t)); + m_write_mutex = malloc(sizeof(pthread_mutex_t)); + + sem_init((sem_t*)m_read_sem, 0, 0); + pthread_mutex_init((pthread_mutex_t*)m_write_mutex, 0); +} +int c_fifo::read(void* buf, int len) +{ + unsigned char* pbuf = (unsigned char*)buf; + int i = 0; + while(i < len) + { + if (m_tail == m_head) + {//empty + sem_wait((sem_t*)m_read_sem); + continue; + } + *pbuf++ = m_buf[m_head]; + m_head = (m_head + 1) % FIFO_BUFFER_LEN; + i++; + } + if(i != len) + { + ASSERT(false); + } + return i; +} +int c_fifo::write(void* buf, int len) +{ + unsigned char* pbuf = (unsigned char*)buf; + int i = 0; + int tail = m_tail; + pthread_mutex_lock((pthread_mutex_t*)m_write_mutex); + while(i < len) + { + if ((m_tail + 1) % FIFO_BUFFER_LEN == m_head) + {//full, clear data has been written; + m_tail = tail; + log_out("Warning: fifo full\n"); + pthread_mutex_unlock((pthread_mutex_t*)m_write_mutex); + return 0; + } + m_buf[m_tail] = *pbuf++; + m_tail = (m_tail + 1) % FIFO_BUFFER_LEN; + i++; + } + pthread_mutex_unlock((pthread_mutex_t*)m_write_mutex); + if(i != len) + { + ASSERT(false); + } + else + { + sem_post((sem_t*)m_read_sem); + } + return i; +} +#endif +#endif +#ifdef GUILITE_ON +#if (!defined _WIN32) && (!defined WIN32) && (!defined _WIN64) && (!defined WIN64) && (!defined __linux__) && (!defined __APPLE__) + +#include + +static void(*do_assert)(const char* file, int line); +static void(*do_log_out)(const char* log); +void register_debug_function(void(*my_assert)(const char* file, int line), void(*my_log_out)(const char* log)) +{ + do_assert = my_assert; + do_log_out = my_log_out; +} + +void _assert(const char* file, int line) +{ + if(do_assert) + { + do_assert(file, line); + } + while(1); +} + +void log_out(const char* log) +{ + if (do_log_out) + { + do_log_out(log); + } +} + +long get_time_in_second() +{ + return 0; +} + +T_TIME second_to_day(long second) +{ + T_TIME ret = {0}; + return ret; +} + +T_TIME get_time() +{ + T_TIME ret = {0}; + return ret; +} + +void start_real_timer(void (*func)(void* arg)) +{ + log_out("Not support now"); +} + +void register_timer(int milli_second, void func(void* ptmr, void* parg)) +{ + log_out("Not support now"); +} + +unsigned int get_cur_thread_id() +{ + log_out("Not support now"); + return 0; +} + +void create_thread(unsigned long* thread_id, void* attr, void *(*start_routine) (void *), void* arg) +{ + log_out("Not support now"); +} + +extern "C" void delay_ms(unsigned short nms); +void thread_sleep(unsigned int milli_seconds) +{//MCU alway implemnet driver code in APP. + delay_ms(milli_seconds); +} + +int build_bmp(const char *filename, unsigned int width, unsigned int height, unsigned char *data) +{ + log_out("Not support now"); + return 0; +} + +c_fifo::c_fifo() +{ + m_head = m_tail = 0; + m_read_sem = m_write_mutex = 0; +} + +int c_fifo::read(void* buf, int len) +{ + unsigned char* pbuf = (unsigned char*)buf; + int i = 0; + while(i < len) + { + if (m_tail == m_head) + {//empty + continue; + } + *pbuf++ = m_buf[m_head]; + m_head = (m_head + 1) % FIFO_BUFFER_LEN; + i++; + } + if(i != len) + { + ASSERT(false); + } + return i; +} + +int c_fifo::write(void* buf, int len) +{ + unsigned char* pbuf = (unsigned char*)buf; + int i = 0; + int tail = m_tail; + + while(i < len) + { + if ((m_tail + 1) % FIFO_BUFFER_LEN == m_head) + {//full, clear data has been written; + m_tail = tail; + log_out("Warning: fifo full\n"); + return 0; + } + m_buf[m_tail] = *pbuf++; + m_tail = (m_tail + 1) % FIFO_BUFFER_LEN; + i++; + } + + if(i != len) + { + ASSERT(false); + } + return i; +} + +#endif +#endif +#ifdef GUILITE_ON +#if (defined _WIN32) || (defined WIN32) || (defined _WIN64) || (defined WIN64) +#include +#include +#include +#include +#include +#include +#define MAX_TIMER_CNT 10 +#define TIMER_UNIT 50//ms +static void(*do_assert)(const char* file, int line); +static void(*do_log_out)(const char* log); +void register_debug_function(void(*my_assert)(const char* file, int line), void(*my_log_out)(const char* log)) +{ + do_assert = my_assert; + do_log_out = my_log_out; +} +void _assert(const char* file, int line) +{ + static char s_buf[192]; + if (do_assert) + { + do_assert(file, line); + } + else + { + memset(s_buf, 0, sizeof(s_buf)); + sprintf_s(s_buf, sizeof(s_buf), "vvvvvvvvvvvvvvvvvvvvvvvvvvvv\n\nAssert@ file = %s, line = %d\n\n^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n", file, line); + OutputDebugStringA(s_buf); + printf("%s", s_buf); + fflush(stdout); + assert(false); + } +} +void log_out(const char* log) +{ + if (do_log_out) + { + do_log_out(log); + } + else + { + printf("%s", log); + fflush(stdout); + OutputDebugStringA(log); + } +} +typedef struct _timer_manage +{ + struct _timer_info + { + int state; /* on or off */ + int interval; + int elapse; /* 0~interval */ + void (* timer_proc) (void* ptmr, void* parg); + }timer_info[MAX_TIMER_CNT]; + void (* old_sigfunc)(int); + void (* new_sigfunc)(int); +}_timer_manage_t; +static struct _timer_manage timer_manage; +DWORD WINAPI timer_routine(LPVOID lpParam) +{ + int i; + while(true) + { + for(i = 0; i < MAX_TIMER_CNT; i++) + { + if(timer_manage.timer_info[i].state == 0) + { + continue; + } + timer_manage.timer_info[i].elapse++; + if(timer_manage.timer_info[i].elapse == timer_manage.timer_info[i].interval) + { + timer_manage.timer_info[i].elapse = 0; + timer_manage.timer_info[i].timer_proc(0, 0); + } + } + Sleep(TIMER_UNIT); + } + return 0; +} +static int init_mul_timer() +{ + static bool s_is_init = false; + if(s_is_init == true) + { + return 0; + } + memset(&timer_manage, 0, sizeof(struct _timer_manage)); + DWORD pid; + CreateThread(0, 0, timer_routine, 0, 0, &pid); + s_is_init = true; + return 1; +} +static int set_a_timer(int interval, void (* timer_proc) (void* ptmr, void* parg)) +{ + init_mul_timer(); + int i; + if(timer_proc == 0 || interval <= 0) + { + return (-1); + } + for(i = 0; i < MAX_TIMER_CNT; i++) + { + if(timer_manage.timer_info[i].state == 1) + { + continue; + } + memset(&timer_manage.timer_info[i], 0, sizeof(timer_manage.timer_info[i])); + timer_manage.timer_info[i].timer_proc = timer_proc; + timer_manage.timer_info[i].interval = interval; + timer_manage.timer_info[i].elapse = 0; + timer_manage.timer_info[i].state = 1; + break; + } + if(i >= MAX_TIMER_CNT) + { + ASSERT(false); + return (-1); + } + return (i); +} +typedef void (*EXPIRE_ROUTINE)(void* arg); +EXPIRE_ROUTINE s_expire_function; +static c_fifo s_real_timer_fifo; +static DWORD WINAPI fire_real_timer(LPVOID lpParam) +{ + char dummy; + while(1) + { + if(s_real_timer_fifo.read(&dummy, 1) > 0) + { + if(s_expire_function)s_expire_function(0); + } + else + { + ASSERT(false); + } + } + return 0; +} +/*Win32 desktop only +static void CALLBACK trigger_real_timer(UINT, UINT, DWORD_PTR, DWORD_PTR, DWORD_PTR) +{ + char dummy = 0x33; + s_real_timer_fifo.write(&dummy, 1); +} +*/ +static DWORD WINAPI trigger_real_timer(LPVOID lpParam) +{ + char dummy = 0x33; + while (1) + { + s_real_timer_fifo.write(&dummy, 1); + Sleep(REAL_TIME_TASK_CYCLE_MS); + } + return 0; +} +void start_real_timer(void (*func)(void* arg)) +{ + if(0 == func) + { + return; + } + s_expire_function = func; + //timeSetEvent(REAL_TIME_TASK_CYCLE_MS, 0, trigger_real_timer, 0, TIME_PERIODIC);//Win32 desktop only + static DWORD s_pid; + if(s_pid == 0) + { + CreateThread(0, 0, trigger_real_timer, 0, 0, &s_pid); + CreateThread(0, 0, fire_real_timer, 0, 0, &s_pid); + } +} +unsigned int get_cur_thread_id() +{ + return GetCurrentThreadId(); +} +void register_timer(int milli_second,void func(void* ptmr, void* parg)) +{ + set_a_timer(milli_second/TIMER_UNIT,func); +} +long get_time_in_second() +{ + return (long)time(0); +} +T_TIME get_time() +{ + T_TIME ret = {0}; + + SYSTEMTIME time; + GetLocalTime(&time); + ret.year = time.wYear; + ret.month = time.wMonth; + ret.day = time.wDay; + ret.hour = time.wHour; + ret.minute = time.wMinute; + ret.second = time.wSecond; + return ret; +} +T_TIME second_to_day(long second) +{ + T_TIME ret; + ret.year = 1999; + ret.month = 10; + ret.date = 1; + ret.second = second % 60; + second /= 60; + ret.minute = second % 60; + second /= 60; + ret.hour = (second + 8) % 24;//China time zone. + return ret; +} +void create_thread(unsigned long* thread_id, void* attr, void *(*start_routine) (void *), void* arg) +{ + DWORD pid = 0; + CreateThread(0, 0, LPTHREAD_START_ROUTINE(start_routine), arg, 0, &pid); + *thread_id = pid; +} +void thread_sleep(unsigned int milli_seconds) +{ + Sleep(milli_seconds); +} +#pragma pack(push,1) +typedef struct { + unsigned short bfType; + unsigned int bfSize; + unsigned short bfReserved1; + unsigned short bfReserved2; + unsigned int bfOffBits; +}FileHead; +typedef struct { + unsigned int biSize; + int biWidth; + int biHeight; + unsigned short biPlanes; + unsigned short biBitCount; + unsigned int biCompress; + unsigned int biSizeImage; + int biXPelsPerMeter; + int biYPelsPerMeter; + unsigned int biClrUsed; + unsigned int biClrImportant; + unsigned int biRedMask; + unsigned int biGreenMask; + unsigned int biBlueMask; +}Infohead; +#pragma pack(pop) +int build_bmp(const char *filename, unsigned int width, unsigned int height, unsigned char *data) +{ + FileHead bmp_head; + Infohead bmp_info; + int size = width * height * 2; + //initialize bmp head. + bmp_head.bfType = 0x4d42; + bmp_head.bfSize = size + sizeof(FileHead) + sizeof(Infohead); + bmp_head.bfReserved1 = bmp_head.bfReserved2 = 0; + bmp_head.bfOffBits = bmp_head.bfSize - size; + //initialize bmp info. + bmp_info.biSize = 40; + bmp_info.biWidth = width; + bmp_info.biHeight = height; + bmp_info.biPlanes = 1; + bmp_info.biBitCount = 16; + bmp_info.biCompress = 3; + bmp_info.biSizeImage = size; + bmp_info.biXPelsPerMeter = 0; + bmp_info.biYPelsPerMeter = 0; + bmp_info.biClrUsed = 0; + bmp_info.biClrImportant = 0; + //RGB565 + bmp_info.biRedMask = 0xF800; + bmp_info.biGreenMask = 0x07E0; + bmp_info.biBlueMask = 0x001F; + //copy the data + FILE *fp; + if (!(fp = fopen(filename, "wb"))) + { + return -1; + } + fwrite(&bmp_head, 1, sizeof(FileHead), fp); + fwrite(&bmp_info, 1, sizeof(Infohead), fp); + //fwrite(data, 1, size, fp);//top <-> bottom + for (int i = (height - 1); i >= 0; --i) + { + fwrite(&data[i * width * 2], 1, width * 2, fp); + } + fclose(fp); + return 0; +} +c_fifo::c_fifo() +{ + m_head = m_tail = 0; + m_read_sem = CreateSemaphore(0, // default security attributes + 0, // initial count + 1, // maximum count + 0); // unnamed semaphore + m_write_mutex = CreateMutex(0, false, 0); +} +int c_fifo::read(void* buf, int len) +{ + unsigned char* pbuf = (unsigned char*)buf; + int i = 0; + while (i < len) + { + if (m_tail == m_head) + {//empty + WaitForSingleObject(m_read_sem, INFINITE); + continue; + } + *pbuf++ = m_buf[m_head]; + m_head = (m_head + 1) % FIFO_BUFFER_LEN; + i++; + } + if (i != len) + { + ASSERT(false); + } + return i; +} +int c_fifo::write(void* buf, int len) +{ + unsigned char* pbuf = (unsigned char*)buf; + int i = 0; + int tail = m_tail; + WaitForSingleObject(m_write_mutex, INFINITE); + while (i < len) + { + if ((m_tail + 1) % FIFO_BUFFER_LEN == m_head) + {//full, clear data has been written; + m_tail = tail; + log_out("Warning: fifo full\n"); + ReleaseMutex(m_write_mutex); + return 0; + } + m_buf[m_tail] = *pbuf++; + m_tail = (m_tail + 1) % FIFO_BUFFER_LEN; + i++; + } + ReleaseMutex(m_write_mutex); + if (i != len) + { + ASSERT(false); + } + else + { + ReleaseSemaphore(m_read_sem, 1, 0); + } + return i; +} +#endif +#endif +#ifdef GUILITE_ON +#if (defined __linux__) || (defined __APPLE__) +#include +#include +#include +#include +#include +typedef void(*ANDROID_PLAY_WAV)(const char* fileName); +ANDROID_PLAY_WAV gAndroidPlayWav; +typedef struct +{ + AUDIO_TYPE type; +}AUDIO_REQUEST; +static c_fifo s_request_fifo; +static void* render_thread(void* param) +{ + while (true) + { + AUDIO_REQUEST request; + s_request_fifo.read(&request, sizeof(request)); + + if (AUDIO_MAX <= request.type) + { + continue; + } + if(gAndroidPlayWav) + { + gAndroidPlayWav("heart_beat.wav"); + } + } +} +void c_audio::init() +{ + static bool s_flag = false; + if (s_flag) + { + return; + } + unsigned long pid; + create_thread(&pid, 0, render_thread, 0); + s_flag = true; +} +int c_audio::play(AUDIO_TYPE type) +{ + if (AUDIO_MAX <= type) + { + return -1; + } + init(); + AUDIO_REQUEST request; + request.type = type; + s_request_fifo.write(&request, sizeof(request)); + return 0; +} +#endif +#endif +#ifdef GUILITE_ON +#if (defined _WIN32) || (defined WIN32) || (defined _WIN64) || (defined WIN64) +#include +#include +#include +#ifndef AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM + #define AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM 0x80000000 +#endif +#define AUDIO_CHANNELS_MONO 1 +#define AUDIO_SAMPLE_RATE 44000 +#define AUDIO_BITS 16 +#define AUDIO_BLOCK_ALIGN (AUDIO_CHANNELS_MONO * (AUDIO_BITS >> 3)) +#define AUDIO_BYTE_RATE (AUDIO_SAMPLE_RATE * AUDIO_BLOCK_ALIGN) +#define AUDIO_OUTPUT_BUF_LEN (10000000 * 5) //5 seconds long. +#define CHECK_ERROR(ret) if(ret != 0){ASSERT(false);} +typedef struct +{ + AUDIO_TYPE type; +}AUDIO_REQUEST; +typedef struct +{ + BYTE* p_data; + int size; +}WAV_RESOURCE; +static WAV_RESOURCE s_wav_resource[AUDIO_MAX]; +static c_fifo s_request_fifo; +static IAudioClient* s_audio_client; +static IAudioRenderClient* s_audio_render_client; +static HANDLE s_audio_event; +//Should be call by UWP, and UWP create audio client. +void set_audio_client(IAudioClient* audio_client) +{ + s_audio_client = audio_client; +} +static WAVEFORMATEX s_wav_format = { + WAVE_FORMAT_PCM, + AUDIO_CHANNELS_MONO, + AUDIO_SAMPLE_RATE, + AUDIO_BYTE_RATE, + AUDIO_BLOCK_ALIGN, + AUDIO_BITS, + 0 +}; +static int register_wav_resouce(AUDIO_TYPE type, const wchar_t* wav_path) +{ + if (s_wav_resource[type].p_data) + { + return 0; + } + + void* hFile = CreateFile(wav_path, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); + if (INVALID_HANDLE_VALUE == hFile) + { + log_out("Open wave file failed\n"); + return -1; + } + LARGE_INTEGER ret; + GetFileSizeEx(hFile, &ret); + int size = ret.LowPart; + if (INVALID_SET_FILE_POINTER == SetFilePointer(hFile, 0x2C, 0, FILE_BEGIN)) + { + ASSERT(false); + return -2; + } + size -= 0x2C; + BYTE* p_data = (BYTE*)malloc(size); + DWORD read_num; + ReadFile(hFile, p_data, size, &read_num, 0); + s_wav_resource[type].p_data = p_data; + s_wav_resource[type].size = size; + return 0; +} +static int load_wav_chunk(BYTE* p_des, int des_size, BYTE* p_src, int src_size) +{ + if (des_size <= 0 || src_size <= 0) + { + return -1; + } + int write_size = (src_size > des_size) ? des_size : src_size; + memcpy(p_des, p_src, write_size); + memset(p_des + write_size, 0, (des_size - write_size)); + return write_size; +} +static int play_wav(BYTE* p_data, int size) +{ + if (0 == p_data || 0 >= size) + { + return -1; + } + UINT32 bufferFrameCount; + UINT32 numFramesAvailable; + UINT32 numFramesPadding; + BYTE* p_buffer = 0; + int ret = s_audio_client->GetBufferSize(&bufferFrameCount); + CHECK_ERROR(ret); + + int offset = 0; + while (WaitForSingleObject(s_audio_event, INFINITE) == WAIT_OBJECT_0) + { + ret = s_audio_client->GetCurrentPadding(&numFramesPadding); + CHECK_ERROR(ret); + numFramesAvailable = bufferFrameCount - numFramesPadding; + if (numFramesAvailable < 1600) + { + Sleep(10); + continue; + } + ret = s_audio_render_client->GetBuffer(numFramesAvailable, &p_buffer); + CHECK_ERROR(ret); + ret = load_wav_chunk(p_buffer, numFramesAvailable * s_wav_format.nBlockAlign, p_data + offset, (size - offset)); + if (ret > 0) + { + s_audio_render_client->ReleaseBuffer((ret / s_wav_format.nBlockAlign), 0); + offset += ret; + } + else + { + s_audio_render_client->ReleaseBuffer(0, AUDCLNT_BUFFERFLAGS_SILENT); + break; + } + } + return 0; +} +static void* render_thread(void* param) +{ + s_audio_client->Start(); + while (true) + { + AUDIO_REQUEST request; + s_request_fifo.read(&request, sizeof(request)); + + if (AUDIO_MAX <= request.type) + { + ASSERT(false); + continue; + } + play_wav(s_wav_resource[request.type].p_data, s_wav_resource[request.type].size); + } + s_audio_client->Stop(); +} +static int init_audio_client() +{ + if (s_audio_client) + { + return 0; + } + //For desktop only, could not pass Windows Store certification. + /* + int ret = CoInitializeEx(0, COINIT_MULTITHREADED); + CHECK_ERROR(ret); + IMMDeviceEnumerator *pEnumerator = nullptr; + ret = CoCreateInstance(__uuidof(MMDeviceEnumerator), 0, + CLSCTX_ALL, __uuidof(IMMDeviceEnumerator), + (void**)&pEnumerator); + CHECK_ERROR(ret); + IMMDevice* audio_output_device; + pEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &audio_output_device); + if (0 == audio_output_device) + { + ASSERT(false); + } + ret = audio_output_device->Activate(__uuidof(IAudioClient), CLSCTX_ALL, 0, (void**)&s_audio_client); + CHECK_ERROR(ret); + return 0; + */ + return -1; +} +void c_audio::init() +{ + static bool s_flag = false; + if (s_flag) + { + return; + } + register_wav_resouce(AUDIO_HEART_BEAT, L"heart_beat.wav"); + + if (0 > init_audio_client()) + { + return; + } + int ret = s_audio_client->Initialize(AUDCLNT_SHAREMODE_SHARED, + AUDCLNT_STREAMFLAGS_AUTOCONVERTPCM | AUDCLNT_STREAMFLAGS_EVENTCALLBACK, + AUDIO_OUTPUT_BUF_LEN * 2, 0, &s_wav_format, 0); + CHECK_ERROR(ret); + //s_audio_event = CreateEventEx(0, 0, 0, EVENT_ALL_ACCESS); + s_audio_event = CreateEvent(0, 0, 0, 0); + ret = s_audio_client->SetEventHandle(s_audio_event); + CHECK_ERROR(ret); + ret = s_audio_client->GetService(__uuidof(IAudioRenderClient), (void**)&s_audio_render_client); + CHECK_ERROR(ret); + unsigned long pid; + create_thread(&pid, 0, render_thread, 0); + s_flag = true; +} +int c_audio::play(AUDIO_TYPE type) +{ + if (AUDIO_MAX <= type) + { + return -1; + } + init(); + if (!s_audio_client || !s_audio_render_client) + { + return -2; + } + AUDIO_REQUEST request; + request.type = type; + s_request_fifo.write(&request, sizeof(request)); + return 0; +} +#endif +#endif +#ifdef GUILITE_ON +DIALOG_ARRAY c_dialog::ms_the_dialogs[SURFACE_CNT_MAX]; +#endif +#ifdef GUILITE_ON +c_keyboard c_edit::s_keyboard; +GL_BEGIN_MESSAGE_MAP(c_edit) +ON_KEYBORAD_UPDATE(c_edit::on_key_board_click) +GL_END_MESSAGE_MAP() +#endif +#ifdef GUILITE_ON +static c_keyboard_button s_key_0, s_key_1, s_key_2, s_key_3, s_key_4, s_key_5, s_key_6, s_key_7, s_key_8, s_key_9; +static c_keyboard_button s_key_A, s_key_B, s_key_C, s_key_D, s_key_E, s_key_F, s_key_G, s_key_H, s_key_I, s_key_J; +static c_keyboard_button s_key_K, s_key_L, s_key_M, s_key_N, s_key_O, s_key_P, s_key_Q, s_key_R, s_key_S, s_key_T; +static c_keyboard_button s_key_U, s_key_V, s_key_W, s_key_X, s_key_Y, s_key_Z; +static c_keyboard_button s_key_dot, s_key_caps, s_key_space, s_key_enter, s_key_del, s_key_esc, s_key_num_switch; +WND_TREE g_key_board_children[] = +{ + //Row 1 + {&s_key_Q, 'Q', 0, POS_X(0), POS_Y(0), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_W, 'W', 0, POS_X(1), POS_Y(0), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_E, 'E', 0, POS_X(2), POS_Y(0), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_R, 'R', 0, POS_X(3), POS_Y(0), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_T, 'T', 0, POS_X(4), POS_Y(0), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_Y, 'Y', 0, POS_X(5), POS_Y(0), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_U, 'U', 0, POS_X(6), POS_Y(0), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_I, 'I', 0, POS_X(7), POS_Y(0), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_O, 'O', 0, POS_X(8), POS_Y(0), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_P, 'P', 0, POS_X(9), POS_Y(0), KEY_WIDTH, KEY_HEIGHT}, + //Row 2 + {&s_key_A, 'A', 0, ((KEY_WIDTH / 2) + POS_X(0)), POS_Y(1), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_S, 'S', 0, ((KEY_WIDTH / 2) + POS_X(1)), POS_Y(1), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_D, 'D', 0, ((KEY_WIDTH / 2) + POS_X(2)), POS_Y(1), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_F, 'F', 0, ((KEY_WIDTH / 2) + POS_X(3)), POS_Y(1), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_G, 'G', 0, ((KEY_WIDTH / 2) + POS_X(4)), POS_Y(1), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_H, 'H', 0, ((KEY_WIDTH / 2) + POS_X(5)), POS_Y(1), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_J, 'J', 0, ((KEY_WIDTH / 2) + POS_X(6)), POS_Y(1), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_K, 'K', 0, ((KEY_WIDTH / 2) + POS_X(7)), POS_Y(1), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_L, 'L', 0, ((KEY_WIDTH / 2) + POS_X(8)), POS_Y(1), KEY_WIDTH, KEY_HEIGHT}, + //Row 3 + {&s_key_caps, 0x14, 0, POS_X(0), POS_Y(2), CAPS_WIDTH, KEY_HEIGHT}, + {&s_key_Z, 'Z', 0, ((KEY_WIDTH / 2) + POS_X(1)), POS_Y(2), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_X, 'X', 0, ((KEY_WIDTH / 2) + POS_X(2)), POS_Y(2), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_C, 'C', 0, ((KEY_WIDTH / 2) + POS_X(3)), POS_Y(2), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_V, 'V', 0, ((KEY_WIDTH / 2) + POS_X(4)), POS_Y(2), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_B, 'B', 0, ((KEY_WIDTH / 2) + POS_X(5)), POS_Y(2), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_N, 'N', 0, ((KEY_WIDTH / 2) + POS_X(6)), POS_Y(2), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_M, 'M', 0, ((KEY_WIDTH / 2) + POS_X(7)), POS_Y(2), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_del, 0x7F, 0, ((KEY_WIDTH / 2) + POS_X(8)), POS_Y(2), DEL_WIDTH, KEY_HEIGHT}, + //Row 4 + {&s_key_esc, 0x1B, 0, POS_X(0), POS_Y(3), ESC_WIDTH, KEY_HEIGHT}, + {&s_key_num_switch, 0x90, 0, POS_X(2), POS_Y(3), SWITCH_WIDTH, KEY_HEIGHT}, + {&s_key_space, ' ', 0, ((KEY_WIDTH / 2) + POS_X(3)), POS_Y(3), SPACE_WIDTH, KEY_HEIGHT}, + {&s_key_dot, '.', 0, ((KEY_WIDTH / 2) + POS_X(6)), POS_Y(3), DOT_WIDTH, KEY_HEIGHT}, + {&s_key_enter, '\n', 0, POS_X(8), POS_Y(3), ENTER_WIDTH, KEY_HEIGHT}, + {0,0,0,0,0,0,0} +}; +WND_TREE g_number_board_children[] = +{ + {&s_key_1, '1', 0, POS_X(0), POS_Y(0), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_2, '2', 0, POS_X(1), POS_Y(0), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_3, '3', 0, POS_X(2), POS_Y(0), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_4, '4', 0, POS_X(0), POS_Y(1), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_5, '5', 0, POS_X(1), POS_Y(1), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_6, '6', 0, POS_X(2), POS_Y(1), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_7, '7', 0, POS_X(0), POS_Y(2), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_8, '8', 0, POS_X(1), POS_Y(2), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_9, '9', 0, POS_X(2), POS_Y(2), KEY_WIDTH, KEY_HEIGHT}, + + {&s_key_esc, 0x1B, 0, POS_X(0), POS_Y(3), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_0, '0', 0, POS_X(1), POS_Y(3), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_dot, '.', 0, POS_X(2), POS_Y(3), KEY_WIDTH, KEY_HEIGHT}, + {&s_key_del, 0x7F, 0, POS_X(3), POS_Y(0), KEY_WIDTH, KEY_HEIGHT * 2 + 2}, + {&s_key_enter,'\n', 0, POS_X(3), POS_Y(2), KEY_WIDTH, KEY_HEIGHT * 2 + 2}, + {0,0,0,0,0,0,0} +}; +GL_BEGIN_MESSAGE_MAP(c_keyboard) +ON_GL_BN_CLICKED(c_keyboard::on_key_clicked) +GL_END_MESSAGE_MAP() +#endif diff --git a/components/gui/GuiLite/UIcode/UIcode.cpp b/components/gui/GuiLite/UIcode/UIcode.cpp new file mode 100644 index 00000000..6f2b7131 --- /dev/null +++ b/components/gui/GuiLite/UIcode/UIcode.cpp @@ -0,0 +1,97 @@ +#define GUILITE_ON //Do not define this macro once more!!! +#include "GuiLite.h" +#include + +#define UI_WIDTH 240 +#define UI_HEIGHT 240 + +static c_surface* s_surface; +static c_display* s_display; + +class c_star { +public: + c_star(){ + initialize(); + } + void initialize() { + m_x = m_start_x = rand() % UI_WIDTH; + m_y = m_start_y = rand() % UI_HEIGHT; + m_size = 1; + m_x_factor = UI_WIDTH; + m_y_factor = UI_HEIGHT; + m_size_factor = 1; + } + void move() { + s_surface->fill_rect(m_x, m_y, m_x + m_size - 1, m_y + m_size - 1, 0, Z_ORDER_LEVEL_0);//clear star footprint + + m_x_factor -= 6; + m_y_factor -= 6; + m_size += m_size / 20; + if (m_x_factor < 1 || m_y_factor < 1) + { + return initialize(); + } + if (m_start_x > (UI_WIDTH / 2) && m_start_y > (UI_HEIGHT / 2)) + { + m_x = (UI_WIDTH / 2) + (UI_WIDTH * (m_start_x - (UI_WIDTH / 2)) / m_x_factor); + m_y = (UI_HEIGHT / 2) + (UI_HEIGHT * (m_start_y - (UI_HEIGHT / 2)) / m_y_factor); + } + else if (m_start_x <= (UI_WIDTH / 2) && m_start_y > (UI_HEIGHT / 2)) + { + m_x = (UI_WIDTH / 2) - (UI_WIDTH * ((UI_WIDTH / 2) - m_start_x) / m_x_factor); + m_y = (UI_HEIGHT / 2) + (UI_HEIGHT * (m_start_y - (UI_HEIGHT / 2)) / m_y_factor); + } + else if (m_start_x > (UI_WIDTH / 2) && m_start_y <= (UI_HEIGHT / 2)) + { + m_x = (UI_WIDTH / 2) + (UI_WIDTH * (m_start_x - (UI_WIDTH / 2)) / m_x_factor); + m_y = (UI_HEIGHT / 2) - (UI_HEIGHT * ((UI_HEIGHT / 2) - m_start_y) / m_y_factor); + } + else if (m_start_x <= (UI_WIDTH / 2) && m_start_y <= (UI_HEIGHT / 2)) + { + m_x = (UI_WIDTH / 2) - (UI_WIDTH * ((UI_WIDTH / 2) - m_start_x) / m_x_factor); + m_y = (UI_HEIGHT / 2) - (UI_HEIGHT * ((UI_HEIGHT / 2) - m_start_y) / m_y_factor); + } + + if (m_x < 0 || (m_x + m_size - 1) >= UI_WIDTH || + m_y < 0 || (m_y + m_size - 1) >= UI_HEIGHT) + { + return initialize(); + } + s_surface->fill_rect(m_x, m_y, m_x + m_size - 1, m_y + m_size - 1, GL_RGB(255, 255, 255), Z_ORDER_LEVEL_0);//draw star + } + int m_start_x, m_start_y; + float m_x, m_y, m_x_factor, m_y_factor, m_size_factor, m_size; +}; + +//////////////////////// start UI //////////////////////// + +c_star stars[100]; +void create_ui(void* phy_fb, int screen_width, int screen_height, int color_bytes, struct EXTERNAL_GFX_OP* gfx_op) { + c_display display = c_display(phy_fb, screen_width, screen_height, UI_WIDTH, UI_HEIGHT, color_bytes, 1, gfx_op); + s_display = &display; + s_surface = display.alloc_surface(Z_ORDER_LEVEL_0); + s_surface->set_active(true); + + s_surface->fill_rect(0, 0, UI_WIDTH - 1, UI_HEIGHT - 1, 0, Z_ORDER_LEVEL_0); + + while(1) { + for (int i = 0; i < sizeof(stars)/sizeof(c_star); i++) { + stars[i].move(); + } + thread_sleep(50); + } +} + +//////////////////////// interface for all platform //////////////////////// +extern "C" void startHelloStar(void* phy_fb, int width, int height, int color_bytes, struct EXTERNAL_GFX_OP* gfx_op) { + create_ui(phy_fb, width, height, color_bytes, gfx_op); +} + +void* getUiOfHelloStar(int* width, int* height, bool force_update) +{ + if (s_display) + { + return s_display->get_updated_fb(width, height, force_update); + } + return NULL; +} diff --git a/components/gui/GuiLite/UIcode/UIcode.sln b/components/gui/GuiLite/UIcode/UIcode.sln new file mode 100644 index 00000000..517aed90 --- /dev/null +++ b/components/gui/GuiLite/UIcode/UIcode.sln @@ -0,0 +1,22 @@ +锘 +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.28010.2050 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "UIcode", "UIcode.vcxproj", "{8BE32B2A-F5E4-49E7-A2C9-0FAEA62B7FED}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x86 = Debug|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8BE32B2A-F5E4-49E7-A2C9-0FAEA62B7FED}.Debug|x86.ActiveCfg = Debug|Win32 + {8BE32B2A-F5E4-49E7-A2C9-0FAEA62B7FED}.Debug|x86.Build.0 = Debug|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {30A9AE4B-6122-4B94-AF72-DAB8B75463BF} + EndGlobalSection +EndGlobal diff --git a/components/gui/GuiLite/UIcode/UIcode.vcxproj b/components/gui/GuiLite/UIcode/UIcode.vcxproj new file mode 100644 index 00000000..538c16be --- /dev/null +++ b/components/gui/GuiLite/UIcode/UIcode.vcxproj @@ -0,0 +1,158 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + + + + 15.0 + {8BE32B2A-F5E4-49E7-A2C9-0FAEA62B7FED} + Win32Proj + UIcode + 10.0 + + + + StaticLibrary + true + v142 + Unicode + + + StaticLibrary + false + v142 + true + Unicode + + + StaticLibrary + true + v142 + Unicode + + + StaticLibrary + false + v142 + true + Unicode + + + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + NotUsing + Level3 + Disabled + true + _CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) + true + + + Windows + true + + + call "$(MSBuildProjectDirectory)\sync_build.bat" "HelloStar" + + + + + Use + Level3 + Disabled + true + _DEBUG;_LIB;%(PreprocessorDefinitions) + true + + + Windows + true + + + + + Use + Level3 + MaxSpeed + true + true + true + WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) + true + + + Windows + true + true + true + + + + + Use + Level3 + MaxSpeed + true + true + true + NDEBUG;_LIB;%(PreprocessorDefinitions) + true + + + Windows + true + true + true + + + + + + \ No newline at end of file diff --git a/components/gui/GuiLite/UIcode/UIcode.vcxproj.filters b/components/gui/GuiLite/UIcode/UIcode.vcxproj.filters new file mode 100644 index 00000000..e8e932cc --- /dev/null +++ b/components/gui/GuiLite/UIcode/UIcode.vcxproj.filters @@ -0,0 +1,6 @@ +锘 + + + + + \ No newline at end of file diff --git a/components/gui/GuiLite/UIcode/curl.exe b/components/gui/GuiLite/UIcode/curl.exe new file mode 100644 index 0000000000000000000000000000000000000000..7b11cd89adb5b41a6e1657a37098ab27a259c2e0 GIT binary patch literal 424448 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

&AprRW@RG#!;g{ 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

Tk9+{-1VZhrHOy@@xcA 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�-KTaTj*bFMz&uygef_n6bo03X(x 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 RRMuFb5NH1T_n(l!{{lYSR2l#P literal 0 HcmV?d00001 diff --git a/components/gui/GuiLite/UIcode/sync_build.bat b/components/gui/GuiLite/UIcode/sync_build.bat new file mode 100644 index 00000000..cf1ea892 --- /dev/null +++ b/components/gui/GuiLite/UIcode/sync_build.bat @@ -0,0 +1,28 @@ +echo off +set argC=0 +for %%x in (%*) do Set /A argC+=1 +if NOT "1" == "%argC%" ( + echo "Invalidate arguments" + goto :eof + ) + +set url="https://api.powerbi.com/beta/72f988bf-86f1-41af-91ab-2d7cd011db47/datasets/2ff1e8a8-2f6f-4d73-a75d-86829e3f4574/rows?key=8f5xLp1gP8%%2FzSee4vCUBcyjR65I9zZ6nb%%2B%%2F7bbzex%%2FSctLX3ntIlAR0sxWpDdguuYyDtLdHK%%2Fxbxj%%2FrSBkX7eQ%%3D%%3D" + +for /f "tokens=2-4 delims=/ " %%a in ("%date%") do (set MM=%%a& set DD=%%b& set YYYY=%%c) +set YY=%YYYY:~0,2% +if not "%YY%" == "20" (rem For Chinese date format + for /f "tokens=1-3 delims=/ " %%a in ("%date%") do (set YYYY=%%a& set MM=%%b& set DD=%%c)) + +set datetime=%YYYY%-%MM%-%DD%T%time: =0%0+0800 +set devie_info=Win-%USERNAME% +set raw_data=[{^ +\"device_info\" :\"%devie_info%\",^ +\"project_info\" :\"%1\",^ +\"time\" :\"%datetime%\",^ +\"weight\" : 1^ +}] + +curl.exe --include --request POST --header "Content-Type: application/json" --data-binary^ + "%raw_data%" "%url%" + +exit /B 0 \ No newline at end of file diff --git a/examples/guilite_demo/guilite_demo.c b/examples/guilite_demo/guilite_demo.c new file mode 100644 index 00000000..55521ddd --- /dev/null +++ b/examples/guilite_demo/guilite_demo.c @@ -0,0 +1,38 @@ +#include "cmsis_os.h" +#include "lcd_spi2_drv.h" + + +void delay_ms(int ms) +{ + tos_task_delay(ms); +} + +//Transfer GuiLite 32 bits color to your LCD color +#define GL_RGB_32_to_16(rgb) (((((unsigned int)(rgb)) & 0xFF) >> 3) | ((((unsigned int)(rgb)) & 0xFC00) >> 5) | ((((unsigned int)(rgb)) & 0xF80000) >> 8)) +//Encapsulate your LCD driver: +void gfx_draw_pixel(int x, int y, unsigned int rgb) +{ + //LCD_Fast_DrawPoint(x, y, GL_RGB_32_to_16(rgb)); + LCD_Draw_ColorPoint(x, y, GL_RGB_32_to_16(rgb)); +} +//Implement it, if you have more fast solution than drawing pixels one by one. +//void gfx_fill_rect(int x0, int y0, int x1, int y1, unsigned int rgb){} + +//UI entry +struct EXTERNAL_GFX_OP +{ + void (*draw_pixel)(int x, int y, unsigned int rgb); + void (*fill_rect)(int x0, int y0, int x1, int y1, unsigned int rgb); +} my_gfx_op; +extern void startHelloStar(void* phy_fb, int width, int height, int color_bytes, struct EXTERNAL_GFX_OP* gfx_op); + +void application_entry(void *arg) +{ + printf("This is GuiLite Demo!\r\n"); + my_gfx_op.draw_pixel = gfx_draw_pixel; + my_gfx_op.fill_rect = NULL;//gfx_fill_rect; + startHelloStar(NULL, 240, 240, 2, &my_gfx_op); + +} + + -- GitLab