diff --git a/Core/Inc/FreeRTOSConfig.h b/Core/Inc/FreeRTOSConfig.h index 3f7d10b..d5f564e 100644 --- a/Core/Inc/FreeRTOSConfig.h +++ b/Core/Inc/FreeRTOSConfig.h @@ -167,6 +167,34 @@ standard names. */ /* USER CODE BEGIN Defines */ /* Section where parameter definitions can be added (for instance, to override default ones in FreeRTOS.h) */ +#include CMSIS_device_header + +#define INCLUDE_xTaskGetIdleTaskHandle 1 +#define configGENERATE_RUN_TIME_STATS 1 +#define configUSE_STATS_FORMATTING_FUNCTIONS 0 +#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() \ + do { \ + CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk; \ + DWT->CYCCNT = 0U; \ + DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk; \ + } while (0) +#define portGET_RUN_TIME_COUNTER_VALUE() DWT->CYCCNT + +#ifndef traceTASK_SWITCHED_IN + #define traceTASK_SWITCHED_IN() \ + do { \ + extern void lv_freertos_task_switch_in(const char * name); \ + lv_freertos_task_switch_in(pxCurrentTCB->pcTaskName); \ + } while (0) +#endif + +#ifndef traceTASK_SWITCHED_OUT +#define traceTASK_SWITCHED_OUT() \ + do { \ + extern void lv_freertos_task_switch_out(void); \ + lv_freertos_task_switch_out(); \ + } while (0) +#endif /* USER CODE END Defines */ #endif /* FREERTOS_CONFIG_H */ diff --git a/Core/Src/adc.c b/Core/Src/adc.c index a197598..209bafe 100644 --- a/Core/Src/adc.c +++ b/Core/Src/adc.c @@ -78,7 +78,7 @@ void MX_ADC1_Init(void) */ sConfig.Channel = ADC_CHANNEL_4; sConfig.Rank = ADC_REGULAR_RANK_1; - sConfig.SamplingTime = ADC_SAMPLETIME_1CYCLE_5; + sConfig.SamplingTime = ADC_SAMPLETIME_64CYCLES_5; sConfig.SingleDiff = ADC_SINGLE_ENDED; sConfig.OffsetNumber = ADC_OFFSET_NONE; sConfig.Offset = 0; @@ -90,7 +90,9 @@ void MX_ADC1_Init(void) /** Configure Regular Channel */ + sConfig.Channel = ADC_CHANNEL_19; sConfig.Rank = ADC_REGULAR_RANK_2; + sConfig.SamplingTime = ADC_SAMPLETIME_64CYCLES_5; if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) { Error_Handler(); diff --git a/Core/Src/freertos.c b/Core/Src/freertos.c index d146eb1..f2410f7 100644 --- a/Core/Src/freertos.c +++ b/Core/Src/freertos.c @@ -48,7 +48,7 @@ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ #define PRTS_STATUS_UPDATE_PERIOD_MS 50U -#define PRTS_TASK_SLEEP_CAP_MS 2U +#define PRTS_TASK_SLEEP_CAP_MS 1U /* USER CODE END PD */ @@ -169,7 +169,7 @@ const osThreadAttr_t prts_attributes = { .cb_size = sizeof(prtsTaskControlBlock), .stack_mem = prtsTaskStack, .stack_size = sizeof(prtsTaskStack), - .priority = osPriorityBelowNormal + .priority = osPriorityNormal }; osThreadId_t prtsHandle; void StartPRTSTask(void *argument); diff --git a/Core/Src/spi.c b/Core/Src/spi.c index cc178e1..924d67d 100644 --- a/Core/Src/spi.c +++ b/Core/Src/spi.c @@ -49,7 +49,7 @@ void MX_SPI1_Init(void) hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; - hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_16; + hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; hspi1.Init.TIMode = SPI_TIMODE_DISABLE; hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; diff --git a/TronOneH7_Scaffold.ioc b/TronOneH7_Scaffold.ioc index fc0ddf1..ae1e32b 100644 --- a/TronOneH7_Scaffold.ioc +++ b/TronOneH7_Scaffold.ioc @@ -1,6 +1,6 @@ #MicroXplorer Configuration settings - do not modify ADC1.Channel-0\#ChannelRegularConversion=ADC_CHANNEL_4 -ADC1.Channel-1\#ChannelRegularConversion=ADC_CHANNEL_4 +ADC1.Channel-1\#ChannelRegularConversion=ADC_CHANNEL_19 ADC1.ClockPrescaler=ADC_CLOCK_ASYNC_DIV64 ADC1.ContinuousConvMode=ENABLE ADC1.ConversionDataManagement=ADC_CONVERSIONDATA_DMA_CIRCULAR @@ -13,8 +13,8 @@ ADC1.OffsetSignedSaturation-0\#ChannelRegularConversion=DISABLE ADC1.OffsetSignedSaturation-1\#ChannelRegularConversion=DISABLE ADC1.Rank-0\#ChannelRegularConversion=1 ADC1.Rank-1\#ChannelRegularConversion=2 -ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_1CYCLE_5 -ADC1.SamplingTime-1\#ChannelRegularConversion=ADC_SAMPLETIME_1CYCLE_5 +ADC1.SamplingTime-0\#ChannelRegularConversion=ADC_SAMPLETIME_64CYCLES_5 +ADC1.SamplingTime-1\#ChannelRegularConversion=ADC_SAMPLETIME_64CYCLES_5 ADC1.master=1 ADC3.Channel-0\#ChannelRegularConversion=ADC_CHANNEL_TEMPSENSOR ADC3.ClockPrescaler=ADC_CLOCK_ASYNC_DIV64 @@ -920,9 +920,9 @@ SH.S_TIM3_CH4.ConfNb=1 SH.SharedStack_PC12.0=SPI3_MOSI SH.SharedStack_PC12.1=UART5_TX,Asynchronous SH.SharedStack_PC12.ConfNb=2 -SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_16 +SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_4 SPI1.CLKPolarity=SPI_POLARITY_LOW -SPI1.CalculateBaudRate=7.5 MBits/s +SPI1.CalculateBaudRate=30 MBits/s SPI1.DataSize=SPI_DATASIZE_8BIT SPI1.Direction=SPI_DIRECTION_2LINES SPI1.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,DataSize,BaudRatePrescaler,CLKPolarity diff --git a/User_Code/bsp/adc/bsp_adc.c b/User_Code/bsp/adc/bsp_adc.c index ddae2f4..91200c6 100644 --- a/User_Code/bsp/adc/bsp_adc.c +++ b/User_Code/bsp/adc/bsp_adc.c @@ -15,11 +15,14 @@ /* Includes ------------------------------------------------------------------*/ #include "bsp_adc.h" #include "adc.h" +#include /** * @brief ADC sampling voltage array */ -__attribute__((section (".AXI_SRAM"))) uint16_t ADC_Voltage_Val[2]; +__attribute__((section(".dma_buffer"), aligned(32))) volatile uint16_t ADC_Voltage_Val[BSP_ADC_CHANNEL_COUNT]; + +static bool bsp_adc_started = false; /** * @brief Configures the ADC. @@ -28,8 +31,16 @@ __attribute__((section (".AXI_SRAM"))) uint16_t ADC_Voltage_Val[2]; */ void BSP_ADC_Init(void) { - HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED); - HAL_ADC_Start_DMA(&hadc1, (uint32_t *) ADC_Voltage_Val, 2); + if (bsp_adc_started) + { + return; + } + + (void) HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED); + if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *) ADC_Voltage_Val, BSP_ADC_CHANNEL_COUNT) == HAL_OK) + { + bsp_adc_started = true; + } } //------------------------------------------------------------------------------ @@ -41,8 +52,33 @@ void BSP_ADC_Init(void) */ float USER_ADC_Voltage_Update(void) { - auto Voltage = (ADC_Voltage_Val[0] * 3.3f / 65535) * 11.0f; - return Voltage; + float voltage = ((float) ADC_Voltage_Val[BSP_ADC_BOARD_VOLTAGE_INDEX] * 3.3f / 65535.0f) * 11.0f; + return voltage; } //------------------------------------------------------------------------------ + +uint16_t BSP_ADC_GetRaw(uint32_t index) +{ + if (index >= BSP_ADC_CHANNEL_COUNT) + { + return 0U; + } + + return ADC_Voltage_Val[index]; +} + +uint16_t BSP_ADC_GetJoystickRaw(void) +{ + return BSP_ADC_GetRaw(BSP_ADC_JOYSTICK_INDEX); +} + +uint16_t BSP_ADC_GetJoystickRaw12(void) +{ + return (uint16_t) (BSP_ADC_GetJoystickRaw() >> 4U); +} + +float BSP_ADC_GetJoystickVoltage(void) +{ + return (float) BSP_ADC_GetJoystickRaw() * 3.3f / 65535.0f; +} diff --git a/User_Code/bsp/adc/bsp_adc.h b/User_Code/bsp/adc/bsp_adc.h index a561e2c..c65399b 100644 --- a/User_Code/bsp/adc/bsp_adc.h +++ b/User_Code/bsp/adc/bsp_adc.h @@ -26,9 +26,20 @@ extern "C" /* Includes ------------------------------------------------------------------*/ #include "adc.h" +#include + +#define BSP_ADC_CHANNEL_COUNT 2U +#define BSP_ADC_BOARD_VOLTAGE_INDEX 0U +#define BSP_ADC_JOYSTICK_INDEX 1U + +extern volatile uint16_t ADC_Voltage_Val[BSP_ADC_CHANNEL_COUNT]; /* Externs ---------------------------------------------*/ void BSP_ADC_Init(void); float USER_ADC_Voltage_Update(void); +uint16_t BSP_ADC_GetRaw(uint32_t index); +uint16_t BSP_ADC_GetJoystickRaw(void); +uint16_t BSP_ADC_GetJoystickRaw12(void); +float BSP_ADC_GetJoystickVoltage(void); #endif //BSP_ADC_H diff --git a/User_Code/module/periph/tft/tft.c b/User_Code/module/periph/tft/tft.c index 1b638c3..5108d71 100644 --- a/User_Code/module/periph/tft/tft.c +++ b/User_Code/module/periph/tft/tft.c @@ -224,13 +224,18 @@ static void lcd_write_data8(uint8_t data) tft_cs_high(); } -static void lcd_write_data16(uint16_t data) +static void lcd_write_reg_data(uint8_t reg, const uint8_t *data, uint32_t len) { - uint8_t buf[2] = {(uint8_t) (data >> 8), (uint8_t) data}; tft_cs_low(); - tft_dc_data(); - tft_write_bytes(buf, sizeof(buf)); + tft_dc_command(); + tft_write_bytes(®, 1U); + if (data != NULL && len > 0U && tft_transfer_ok) + { + tft_dc_data(); + tft_write_bytes(data, len); + } tft_cs_high(); + tft_dc_data(); } static void tft_write_color_block(uint16_t color, uint32_t count) @@ -284,14 +289,22 @@ void LCD_Address_Set(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) uint16_t xe = x2 + TFT_X_OFFSET; uint16_t ys = y1 + TFT_Y_OFFSET; uint16_t ye = y2 + TFT_Y_OFFSET; + uint8_t col_data[4] = { + (uint8_t) (xs >> 8), + (uint8_t) xs, + (uint8_t) (xe >> 8), + (uint8_t) xe + }; + uint8_t row_data[4] = { + (uint8_t) (ys >> 8), + (uint8_t) ys, + (uint8_t) (ye >> 8), + (uint8_t) ye + }; - lcd_write_reg(0x2A); - lcd_write_data16(xs); - lcd_write_data16(xe); - lcd_write_reg(0x2B); - lcd_write_data16(ys); - lcd_write_data16(ye); - lcd_write_reg(0x2C); + lcd_write_reg_data(0x2A, col_data, sizeof(col_data)); + lcd_write_reg_data(0x2B, row_data, sizeof(row_data)); + lcd_write_reg_data(0x2C, NULL, 0U); } void TFT_FillRect(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t color) diff --git a/User_Code/module/periph/tft/tft.h b/User_Code/module/periph/tft/tft.h index 9402e95..82f104a 100644 --- a/User_Code/module/periph/tft/tft.h +++ b/User_Code/module/periph/tft/tft.h @@ -13,8 +13,8 @@ extern "C" { #define TFT_USE_HORIZONTAL 2U #define TFT_USE_SOFT_SPI 0U -#define TFT_HW_SPI_BYTE_MODE 1U -#define TFT_HW_SPI_PULSE_CS 1U +#define TFT_HW_SPI_BYTE_MODE 0U +#define TFT_HW_SPI_PULSE_CS 0U #define TFT_HW_SPI_STREAM_COLOR 1U #if (TFT_USE_HORIZONTAL == 0U) || (TFT_USE_HORIZONTAL == 1U) diff --git a/User_Code/module/software/prts/assets/prts_font_14.c b/User_Code/module/software/prts/assets/prts_font_14.c new file mode 100644 index 0000000..dabc240 --- /dev/null +++ b/User_Code/module/software/prts/assets/prts_font_14.c @@ -0,0 +1,1418 @@ +/******************************************************************************* + * Size: 14 px + * Bpp: 2 + * Opts: --font C:\Windows\Fonts\HarmonyOS_Sans_SC_Regular.ttf --range 0x20-0x7E --symbols 主菜单状态温度遥控监视摇杆性能资源字体存储返回电压当前详情外置未生成接口准备就绪按键确认方向左右上下进入电池电机云台底盘发射裁判视觉错误正常离线在线丢失报警监视器资源页字体库外部内部 --size 14 --bpp 2 --no-compress --no-kerning --format lvgl --lv-font-name prts_font_14 --lv-include lvgl.h --output User_Code\module\software\prts\assets\prts_font_14.c + ******************************************************************************/ + +#ifdef LV_LVGL_H_INCLUDE_SIMPLE +#include "lvgl.h" +#else +#include "lvgl.h" +#endif + +#ifndef PRTS_FONT_14 +#define PRTS_FONT_14 1 +#endif + +#if PRTS_FONT_14 + +/*----------------- + * BITMAPS + *----------------*/ + +/*Store the image of the glyphs*/ +static LV_ATTRIBUTE_LARGE_CONST const uint8_t glyph_bitmap[] = { + /* U+0020 " " */ + + /* U+0021 "!" */ + 0x30, 0xc3, 0xc, 0x30, 0xc3, 0xc, 0x10, 0x83, + 0x40, + + /* U+0022 "\"" */ + 0x22, 0xc, 0xc3, 0x30, 0xcc, + + /* U+0023 "#" */ + 0x2, 0x83, 0x0, 0xd1, 0x80, 0x30, 0x90, 0xff, + 0xff, 0xa, 0x1c, 0x2, 0x47, 0x0, 0xc2, 0x83, + 0xff, 0xfc, 0x2c, 0x34, 0xa, 0xc, 0x3, 0x46, + 0x0, + + /* U+0024 "$" */ + 0x1, 0x80, 0x1, 0x80, 0xf, 0xf0, 0x3a, 0xac, + 0x31, 0x88, 0x31, 0x80, 0x2f, 0x80, 0x7, 0xe0, + 0x1, 0xfc, 0x1, 0x8d, 0x71, 0x8d, 0x3a, 0xec, + 0xb, 0xf0, 0x1, 0x80, 0x1, 0x80, + + /* U+0025 "%" */ + 0x2e, 0x1, 0xc2, 0xca, 0xd, 0x9, 0x1c, 0xa0, + 0x28, 0xa3, 0x0, 0x3f, 0x28, 0x0, 0x1, 0xc0, + 0x0, 0xd, 0x3e, 0x0, 0x73, 0x8d, 0x3, 0x4c, + 0x24, 0x1c, 0x34, 0xd0, 0xd0, 0x3e, 0x0, + + /* U+0026 "&" */ + 0x2, 0xf4, 0x0, 0x38, 0xb0, 0x0, 0xd0, 0xc0, + 0x3, 0x47, 0x0, 0xb, 0x74, 0x0, 0x1f, 0x42, + 0x1, 0xed, 0x1c, 0xd, 0x1d, 0xa0, 0x70, 0x1f, + 0x0, 0xc0, 0x3c, 0x3, 0x81, 0xfc, 0x2, 0xf8, + 0x38, + + /* U+0027 "'" */ + 0x23, 0x33, + + /* U+0028 "(" */ + 0x3, 0x2, 0x80, 0xc0, 0x70, 0x34, 0xd, 0x3, + 0x40, 0xd0, 0x34, 0xd, 0x1, 0x80, 0x30, 0xa, + 0x0, 0xc0, + + /* U+0029 ")" */ + 0x60, 0x34, 0x1c, 0xd, 0xa, 0xa, 0x7, 0x7, + 0xa, 0xa, 0xd, 0x1c, 0x34, 0x60, + + /* U+002A "*" */ + 0x5, 0x6, 0xa9, 0x1f, 0x43, 0xfc, 0x15, 0x40, + 0x50, + + /* U+002B "+" */ + 0x0, 0x0, 0x2, 0x80, 0x2, 0x80, 0x2, 0x80, + 0x7f, 0xfd, 0x2, 0x80, 0x2, 0x80, 0x2, 0x80, + + /* U+002C "," */ + 0x24, 0xe1, 0x8c, 0x0, + + /* U+002D "-" */ + 0x3f, 0xf0, 0x0, + + /* U+002E "." */ + 0x20, 0xc0, + + /* U+002F "/" */ + 0x0, 0xc0, 0x18, 0x3, 0x40, 0x30, 0xa, 0x0, + 0xd0, 0xc, 0x2, 0x80, 0x34, 0x7, 0x0, 0xa0, + 0x0, + + /* U+0030 "0" */ + 0xb, 0xe0, 0x1d, 0x74, 0x34, 0x1c, 0x30, 0xc, + 0x70, 0xd, 0x70, 0xd, 0x70, 0xd, 0x30, 0xc, + 0x34, 0x1c, 0x2d, 0x74, 0xb, 0xe0, + + /* U+0031 "1" */ + 0x7, 0x4f, 0xda, 0x34, 0xd, 0x3, 0x40, 0xd0, + 0x34, 0xd, 0x3, 0x40, 0xd0, 0x34, + + /* U+0032 "2" */ + 0xb, 0xe0, 0x2d, 0x78, 0x30, 0x1c, 0x0, 0x1c, + 0x0, 0x28, 0x0, 0x70, 0x0, 0xd0, 0x3, 0x80, + 0xe, 0x0, 0x2c, 0x0, 0x7f, 0xfc, + + /* U+0033 "3" */ + 0xb, 0xe0, 0x39, 0x78, 0x10, 0x2c, 0x0, 0x38, + 0x3, 0xf0, 0x0, 0x78, 0x0, 0x1c, 0x0, 0xc, + 0x30, 0x1c, 0x3d, 0x78, 0xb, 0xe0, + + /* U+0034 "4" */ + 0x0, 0xd0, 0x1, 0xc0, 0x3, 0x40, 0x7, 0x0, + 0xd, 0x20, 0x2c, 0x34, 0x30, 0x34, 0x7f, 0xff, + 0x0, 0x34, 0x0, 0x34, 0x0, 0x34, + + /* U+0035 "5" */ + 0xf, 0xf8, 0x1c, 0x0, 0x1c, 0x0, 0x28, 0x0, + 0x2f, 0xe0, 0x39, 0x78, 0x0, 0x1c, 0x0, 0xc, + 0x10, 0x1c, 0x2d, 0x78, 0xb, 0xe0, + + /* U+0036 "6" */ + 0x0, 0xe0, 0x1, 0xc0, 0x3, 0x40, 0xa, 0x0, + 0xf, 0xe0, 0x2d, 0x7c, 0x34, 0xd, 0x30, 0xd, + 0x34, 0xc, 0x2d, 0x7c, 0xb, 0xe0, + + /* U+0037 "7" */ + 0x3f, 0xfc, 0x0, 0x2c, 0x0, 0x38, 0x0, 0x30, + 0x0, 0xb0, 0x0, 0xd0, 0x1, 0xc0, 0x2, 0x80, + 0x3, 0x40, 0x7, 0x0, 0xe, 0x0, + + /* U+0038 "8" */ + 0xb, 0xe0, 0x2d, 0x78, 0x34, 0x1c, 0x28, 0x28, + 0xf, 0xf0, 0x2d, 0x78, 0x30, 0xc, 0x70, 0xd, + 0x30, 0xc, 0x3d, 0x78, 0xb, 0xe0, + + /* U+0039 "9" */ + 0xb, 0xe0, 0x3d, 0x78, 0x30, 0x1c, 0x70, 0xc, + 0x70, 0x1c, 0x38, 0x38, 0xf, 0xf0, 0x0, 0xa0, + 0x0, 0xc0, 0x3, 0x40, 0x7, 0x0, + + /* U+003A ":" */ + 0xd8, 0x0, 0x0, 0x9d, + + /* U+003B ";" */ + 0x28, 0x50, 0x0, 0x0, 0x1, 0x4a, 0x8, 0xc0, + 0x0, + + /* U+003C "<" */ + 0x0, 0x8, 0x1, 0xb8, 0x1f, 0x80, 0x7c, 0x0, + 0x1f, 0x40, 0x1, 0xf8, 0x0, 0x19, 0x0, 0x0, + + /* U+003D "=" */ + 0x7f, 0xfd, 0x0, 0x0, 0x0, 0x0, 0x7f, 0xfd, + 0x0, 0x0, + + /* U+003E ">" */ + 0x60, 0x0, 0x2e, 0x40, 0x2, 0xf4, 0x0, 0x3d, + 0x1, 0xf4, 0x2f, 0x40, 0x64, 0x0, 0x0, 0x0, + + /* U+003F "?" */ + 0x0, 0x0, 0x2f, 0x82, 0xd7, 0x88, 0x7, 0x0, + 0x28, 0x1, 0xc0, 0xd, 0x0, 0xa0, 0x3, 0x0, + 0x4, 0x0, 0x0, 0x0, 0x50, 0x2, 0x80, + + /* U+0040 "@" */ + 0x0, 0x7f, 0xd0, 0x0, 0x3d, 0x6, 0xc0, 0xe, + 0x0, 0x7, 0x2, 0x82, 0xf7, 0x28, 0x30, 0xb5, + 0xf1, 0xc3, 0xc, 0xb, 0xc, 0x70, 0xc0, 0x70, + 0xc3, 0xc, 0x7, 0xc, 0x30, 0xe0, 0xf1, 0x82, + 0x83, 0xf6, 0xf0, 0xd, 0x0, 0x0, 0x0, 0x78, + 0x2, 0x0, 0x0, 0xbf, 0xe0, 0x0, 0x0, 0x0, + 0x0, + + /* U+0041 "A" */ + 0x0, 0xd0, 0x0, 0x2e, 0x0, 0x3, 0xb0, 0x0, + 0x33, 0x40, 0xa, 0x2c, 0x0, 0xd1, 0xc0, 0x1c, + 0xe, 0x2, 0xff, 0xf0, 0x34, 0x7, 0x47, 0x0, + 0x38, 0xa0, 0x1, 0xc0, + + /* U+0042 "B" */ + 0xff, 0xd0, 0xe0, 0x78, 0xd0, 0x1c, 0xd0, 0x1c, + 0xd0, 0x38, 0xff, 0xf0, 0xe0, 0x2c, 0xd0, 0xe, + 0xd0, 0xe, 0xe0, 0x6c, 0xff, 0xf4, + + /* U+0043 "C" */ + 0x2, 0xfd, 0x3, 0xd6, 0xd2, 0xc0, 0x14, 0xd0, + 0x0, 0x30, 0x0, 0x1c, 0x0, 0x3, 0x0, 0x0, + 0xd0, 0x0, 0x2c, 0x1, 0x43, 0xd6, 0xd0, 0x2f, + 0xd0, + + /* U+0044 "D" */ + 0xff, 0xd0, 0x38, 0x1e, 0xd, 0x0, 0xe3, 0x40, + 0x1c, 0xd0, 0x3, 0x34, 0x0, 0xdd, 0x0, 0x33, + 0x40, 0x1c, 0xd0, 0xe, 0x38, 0x1e, 0xf, 0xfd, + 0x0, + + /* U+0045 "E" */ + 0xff, 0xfb, 0x80, 0xd, 0x0, 0x34, 0x0, 0xd0, + 0x3, 0xff, 0xce, 0x0, 0x34, 0x0, 0xd0, 0x3, + 0x80, 0xf, 0xff, 0x80, + + /* U+0046 "F" */ + 0xff, 0xfb, 0x80, 0xd, 0x0, 0x34, 0x0, 0xd0, + 0x3, 0xff, 0xce, 0x0, 0x34, 0x0, 0xd0, 0x3, + 0x40, 0xd, 0x0, 0x0, + + /* U+0047 "G" */ + 0x1, 0xfe, 0x0, 0xf5, 0x78, 0x2c, 0x0, 0x43, + 0x40, 0x0, 0x30, 0x0, 0x7, 0x1, 0xfc, 0x30, + 0x1, 0xc3, 0x40, 0xc, 0x2c, 0x0, 0xc0, 0xf5, + 0x7c, 0x1, 0xfe, 0x0, + + /* U+0048 "H" */ + 0xd0, 0x3, 0x34, 0x0, 0xcd, 0x0, 0x33, 0x40, + 0xc, 0xd0, 0x3, 0x3f, 0xff, 0xce, 0x0, 0x33, + 0x40, 0xc, 0xd0, 0x3, 0x34, 0x0, 0xcd, 0x0, + 0x30, + + /* U+0049 "I" */ + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd0, + + /* U+004A "J" */ + 0x0, 0xd0, 0xd, 0x0, 0xd0, 0xd, 0x0, 0xd0, + 0xd, 0x0, 0xd0, 0xd, 0x40, 0xce, 0x6c, 0x3f, + 0x0, + + /* U+004B "K" */ + 0xd0, 0xe, 0x34, 0xe, 0xd, 0xb, 0x3, 0x4b, + 0x0, 0xd7, 0x0, 0x3b, 0xe0, 0xf, 0x5c, 0x3, + 0x82, 0xc0, 0xd0, 0x38, 0x34, 0x3, 0x4d, 0x0, + 0x70, + + /* U+004C "L" */ + 0xd0, 0x3, 0x40, 0xd, 0x0, 0x34, 0x0, 0xd0, + 0x3, 0x40, 0xd, 0x0, 0x34, 0x0, 0xd0, 0x3, + 0x80, 0xf, 0xff, 0x80, + + /* U+004D "M" */ + 0xe0, 0x0, 0x7f, 0x0, 0xf, 0xfc, 0x2, 0xfe, + 0xd0, 0x3b, 0xd7, 0xa, 0x7d, 0x35, 0xc7, 0xd1, + 0xf4, 0x7d, 0xb, 0x7, 0xd0, 0x0, 0x7d, 0x0, + 0x7, 0xd0, 0x0, 0x70, + + /* U+004E "N" */ + 0xe0, 0x3, 0x3d, 0x0, 0xcf, 0xc0, 0x33, 0x78, + 0xc, 0xd3, 0x43, 0x34, 0xb0, 0xcd, 0xe, 0x33, + 0x40, 0xdc, 0xd0, 0x2f, 0x34, 0x3, 0xcd, 0x0, + 0x30, + + /* U+004F "O" */ + 0x2, 0xfd, 0x0, 0xf5, 0x78, 0x2c, 0x0, 0xd3, + 0x40, 0xa, 0x30, 0x0, 0x77, 0x0, 0x7, 0x30, + 0x0, 0x73, 0x40, 0xa, 0x2c, 0x1, 0xd0, 0xf5, + 0x78, 0x2, 0xfd, 0x0, + + /* U+0050 "P" */ + 0xff, 0xd3, 0x82, 0xdd, 0x2, 0xf4, 0x7, 0xd0, + 0x2f, 0x41, 0xdf, 0xfe, 0x38, 0x0, 0xd0, 0x3, + 0x40, 0xd, 0x0, 0x0, + + /* U+0051 "Q" */ + 0x2, 0xfd, 0x0, 0x3d, 0x5e, 0x2, 0xc0, 0xd, + 0xd, 0x0, 0x28, 0x30, 0x0, 0x71, 0xc0, 0x1, + 0xc3, 0x0, 0x7, 0xd, 0x0, 0x28, 0x2c, 0x1, + 0xd0, 0x3d, 0x5e, 0x0, 0x2f, 0xf0, 0x0, 0x0, + 0xf0, 0x0, 0x0, 0xb0, + + /* U+0052 "R" */ + 0xff, 0xd0, 0xe0, 0x74, 0xd0, 0x1c, 0xd0, 0x1c, + 0xd0, 0x78, 0xff, 0xe0, 0xe1, 0xc0, 0xd0, 0xb0, + 0xd0, 0x34, 0xd0, 0x1c, 0xd0, 0xe, + + /* U+0053 "S" */ + 0xb, 0xe0, 0x3d, 0x6c, 0x70, 0x8, 0x30, 0x0, + 0x2e, 0x0, 0x6, 0xf4, 0x0, 0x2d, 0x0, 0xe, + 0xa0, 0xe, 0x39, 0x6c, 0xb, 0xf4, + + /* U+0054 "T" */ + 0xff, 0xff, 0x2, 0x80, 0x2, 0x80, 0x2, 0x80, + 0x2, 0x80, 0x2, 0x80, 0x2, 0x80, 0x2, 0x80, + 0x2, 0x80, 0x2, 0x80, 0x2, 0x80, + + /* U+0055 "U" */ + 0xd0, 0x3, 0x34, 0x0, 0xcd, 0x0, 0x33, 0x40, + 0xc, 0xd0, 0x3, 0x34, 0x0, 0xcd, 0x0, 0x33, + 0x80, 0x1c, 0xb0, 0xa, 0xf, 0x5b, 0x0, 0xbf, + 0x0, + + /* U+0056 "V" */ + 0xa0, 0x1, 0xc7, 0x0, 0x28, 0x34, 0x3, 0x2, + 0x80, 0x70, 0xc, 0xa, 0x0, 0xd0, 0xc0, 0x7, + 0x1c, 0x0, 0x32, 0x40, 0x3, 0xb0, 0x0, 0x1e, + 0x0, 0x0, 0xd0, 0x0, + + /* U+0057 "W" */ + 0xa0, 0xd, 0x0, 0xc7, 0x0, 0xf0, 0xc, 0x30, + 0x1f, 0x1, 0x83, 0x42, 0xb4, 0x24, 0x28, 0x32, + 0x83, 0x0, 0xc3, 0x1c, 0x70, 0xd, 0x60, 0xca, + 0x0, 0xa9, 0xa, 0xd0, 0x7, 0xc0, 0x7c, 0x0, + 0x3c, 0x3, 0x80, 0x2, 0x80, 0x34, 0x0, + + /* U+0058 "X" */ + 0x70, 0x3, 0x82, 0xc0, 0x70, 0xd, 0xd, 0x0, + 0x73, 0x80, 0x2, 0xf0, 0x0, 0x1d, 0x0, 0x3, + 0xf0, 0x0, 0x73, 0x80, 0xc, 0xd, 0x3, 0x80, + 0x70, 0x70, 0x3, 0x80, + + /* U+0059 "Y" */ + 0xb0, 0x3, 0x4d, 0x2, 0x81, 0xc0, 0xc0, 0x38, + 0xa0, 0x7, 0x70, 0x0, 0xb4, 0x0, 0x1c, 0x0, + 0x3, 0x0, 0x0, 0xc0, 0x0, 0x30, 0x0, 0xc, + 0x0, + + /* U+005A "Z" */ + 0x3f, 0xfe, 0x0, 0x2c, 0x0, 0x34, 0x0, 0xb0, + 0x0, 0xd0, 0x2, 0x80, 0x7, 0x0, 0xd, 0x0, + 0x2c, 0x0, 0x34, 0x0, 0xbf, 0xff, + + /* U+005B "[" */ + 0xfe, 0xe0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, + 0xd0, 0xd0, 0xd0, 0xd0, 0xd0, 0xfe, 0x0, + + /* U+005C "\\" */ + 0xa0, 0x7, 0x0, 0x34, 0x2, 0x80, 0xc, 0x0, + 0xd0, 0xa, 0x0, 0x30, 0x3, 0x40, 0x18, 0x0, + 0xc0, + + /* U+005D "]" */ + 0xbe, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, 0xa, + 0xa, 0xa, 0xa, 0xa, 0xa, 0xbe, 0x0, + + /* U+005E "^" */ + 0x1, 0x0, 0x2d, 0x0, 0xe8, 0xa, 0x30, 0x34, + 0xa1, 0xc0, 0xc0, + + /* U+005F "_" */ + 0xff, 0xf0, 0x0, + + /* U+0060 "`" */ + 0x10, 0x28, 0xc, + + /* U+0061 "a" */ + 0xb, 0xd0, 0xa1, 0xd0, 0x2, 0x82, 0xfe, 0x38, + 0x28, 0xc0, 0xa3, 0x47, 0x87, 0xfa, + + /* U+0062 "b" */ + 0xd0, 0x3, 0x40, 0xd, 0x0, 0x36, 0xf4, 0xf9, + 0xb3, 0x80, 0xad, 0x1, 0xf4, 0x7, 0xe0, 0x2b, + 0xd2, 0xcd, 0xbd, 0x0, + + /* U+0063 "c" */ + 0xb, 0xe0, 0xb5, 0xd3, 0x40, 0x1c, 0x0, 0x70, + 0x0, 0xd0, 0x2, 0xd7, 0x42, 0xf8, + + /* U+0064 "d" */ + 0x0, 0xd, 0x0, 0xd, 0x0, 0xd, 0xb, 0xdd, + 0x2d, 0x7d, 0x30, 0xd, 0x70, 0xd, 0x70, 0xd, + 0x30, 0xd, 0x2c, 0x2d, 0xb, 0xd9, + + /* U+0065 "e" */ + 0xb, 0xe0, 0x2d, 0x78, 0x30, 0xc, 0x7f, 0xfc, + 0x70, 0x0, 0x34, 0x0, 0x2d, 0x28, 0xb, 0xe0, + + /* U+0066 "f" */ + 0x7, 0xc0, 0xd4, 0x1c, 0x1, 0x80, 0xbf, 0x82, + 0xc0, 0x18, 0x1, 0x80, 0x18, 0x1, 0x80, 0x18, + 0x1, 0x80, + + /* U+0067 "g" */ + 0xb, 0xd9, 0x2d, 0x7d, 0x30, 0xd, 0x70, 0xd, + 0x70, 0xd, 0x30, 0xd, 0x2d, 0x7d, 0xb, 0xdd, + 0x0, 0xc, 0x39, 0x6c, 0xb, 0xe0, + + /* U+0068 "h" */ + 0xd0, 0x3, 0x40, 0xd, 0x0, 0x36, 0xf0, 0xf5, + 0xf3, 0x40, 0xcd, 0x3, 0x34, 0xc, 0xd0, 0x33, + 0x40, 0xcd, 0x3, 0x0, + + /* U+0069 "i" */ + 0x34, 0x80, 0xd, 0x34, 0xd3, 0x4d, 0x34, 0xd3, + 0x40, + + /* U+006A "j" */ + 0x3, 0x40, 0x80, 0x0, 0xd, 0x3, 0x40, 0xd0, + 0x34, 0xd, 0x3, 0x40, 0xd0, 0x34, 0xc, 0x17, + 0x1f, 0x40, + + /* U+006B "k" */ + 0xd0, 0x3, 0x40, 0xd, 0x0, 0x34, 0x38, 0xd2, + 0xc3, 0x5c, 0xd, 0xe0, 0x3e, 0xc0, 0xe2, 0xc3, + 0x43, 0x4d, 0x7, 0x0, + + /* U+006C "l" */ + 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xd0, + + /* U+006D "m" */ + 0xdf, 0x8b, 0xcf, 0xf, 0x4a, 0xd0, 0xb0, 0x7d, + 0xa, 0x3, 0xd0, 0xa0, 0x3d, 0xa, 0x3, 0xd0, + 0xa0, 0x3d, 0xa, 0x3, + + /* U+006E "n" */ + 0xdf, 0xc3, 0xd2, 0xcd, 0x3, 0x34, 0xc, 0xd0, + 0x33, 0x40, 0xcd, 0x3, 0x34, 0xc, + + /* U+006F "o" */ + 0x7, 0xe0, 0x2d, 0x6c, 0x30, 0xd, 0x70, 0xa, + 0x70, 0xa, 0x30, 0xd, 0x2d, 0x6c, 0x7, 0xe0, + + /* U+0070 "p" */ + 0xdf, 0xd3, 0xd1, 0xce, 0x2, 0xb4, 0x7, 0xd0, + 0x1f, 0x80, 0xaf, 0x4b, 0x36, 0xf4, 0xd0, 0x3, + 0x40, 0xd, 0x0, 0x0, + + /* U+0071 "q" */ + 0xb, 0xd9, 0x2d, 0x7d, 0x30, 0xd, 0x70, 0xd, + 0x70, 0xd, 0x30, 0xd, 0x2d, 0x7d, 0xb, 0xdd, + 0x0, 0xd, 0x0, 0xd, 0x0, 0xd, + + /* U+0072 "r" */ + 0xdf, 0x3c, 0xd, 0x3, 0x40, 0xd0, 0x34, 0xd, + 0x3, 0x40, + + /* U+0073 "s" */ + 0x1f, 0x83, 0x4a, 0x70, 0x2, 0xe4, 0x2, 0xe0, + 0x7, 0x74, 0xb1, 0xf8, + + /* U+0074 "t" */ + 0x28, 0x2, 0x80, 0xff, 0x82, 0x80, 0x28, 0x2, + 0x80, 0x28, 0x2, 0x80, 0x1d, 0x40, 0xbc, + + /* U+0075 "u" */ + 0x30, 0xc, 0x30, 0xc, 0x30, 0xc, 0x30, 0xc, + 0x30, 0xc, 0x34, 0x1c, 0x28, 0x3c, 0xb, 0xdc, + + /* U+0076 "v" */ + 0xa0, 0x1c, 0x70, 0x28, 0x34, 0x30, 0x28, 0x70, + 0xc, 0x90, 0xe, 0xc0, 0x7, 0x80, 0x3, 0x40, + + /* U+0077 "w" */ + 0xa0, 0x30, 0x29, 0xc1, 0xd0, 0xd3, 0xb, 0xc3, + 0x9, 0x33, 0x18, 0x1d, 0x8d, 0x90, 0x39, 0x1b, + 0x0, 0xb0, 0x38, 0x1, 0xc0, 0xd0, + + /* U+0078 "x" */ + 0xb0, 0x34, 0xe2, 0xc0, 0xdc, 0x2, 0xd0, 0xb, + 0x80, 0x37, 0x3, 0x8b, 0x2c, 0xd, + + /* U+0079 "y" */ + 0xa0, 0x1c, 0x70, 0x28, 0x34, 0x30, 0x2c, 0x70, + 0xc, 0x90, 0xa, 0xc0, 0x7, 0x80, 0x3, 0x40, + 0x7, 0x0, 0x1d, 0x0, 0xb8, 0x0, + + /* U+007A "z" */ + 0x7f, 0xf0, 0x3, 0x40, 0x2c, 0x0, 0xc0, 0xe, + 0x0, 0x70, 0x3, 0x40, 0x2f, 0xfc, + + /* U+007B "{" */ + 0x3, 0xc2, 0x80, 0xd0, 0x34, 0xd, 0x3, 0x41, + 0xc1, 0xd0, 0x2c, 0x3, 0x40, 0xd0, 0x34, 0xe, + 0x1, 0xf0, 0x0, + + /* U+007C "|" */ + 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, 0x77, + + /* U+007D "}" */ + 0xb4, 0xb, 0x0, 0xc0, 0x30, 0xc, 0x3, 0x0, + 0xe0, 0x1e, 0xe, 0x3, 0x0, 0xc0, 0x30, 0x1c, + 0x2e, 0x0, 0x0, + + /* U+007E "~" */ + 0x1e, 0xc, 0x36, 0x8c, 0x30, 0xf4, 0x0, 0x0, + + /* U+4E0A "上" */ + 0x0, 0xc, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, + 0xc, 0x0, 0x0, 0x0, 0xc0, 0x0, 0x0, 0xf, + 0xff, 0x0, 0x0, 0xd0, 0x0, 0x0, 0xc, 0x0, + 0x0, 0x0, 0xc0, 0x0, 0x0, 0xc, 0x0, 0x0, + 0x0, 0xc0, 0x0, 0x0, 0xc, 0x0, 0x3, 0xff, + 0xff, 0xfc, 0x0, 0x0, 0x0, 0x0, + + /* U+4E0B "下" */ + 0x3f, 0xff, 0xff, 0xc0, 0x0, 0xd0, 0x0, 0x0, + 0xd, 0x0, 0x0, 0x0, 0xe0, 0x0, 0x0, 0xf, + 0xd0, 0x0, 0x0, 0xd7, 0xd0, 0x0, 0xd, 0xb, + 0x0, 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, + 0x0, 0xd0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, + 0xd0, 0x0, + + /* U+4E22 "丢" */ + 0x0, 0x0, 0x0, 0x0, 0x5, 0x6a, 0xf4, 0x1f, + 0xaf, 0x54, 0x0, 0x0, 0x60, 0x0, 0xf, 0xff, + 0xff, 0x40, 0x0, 0x70, 0x0, 0x0, 0x6, 0x0, + 0x3, 0xff, 0xff, 0xfd, 0x0, 0x78, 0x10, 0x0, + 0xa, 0x2, 0x80, 0x2, 0x80, 0x1d, 0x0, 0xff, + 0xff, 0xf0, 0x5, 0x40, 0x1, 0x40, + + /* U+4E3B "主" */ + 0x0, 0x8, 0x0, 0x0, 0x0, 0xb0, 0x0, 0x0, + 0x3, 0x0, 0x2, 0xff, 0xff, 0xfc, 0x0, 0x7, + 0x0, 0x0, 0x0, 0x70, 0x0, 0x0, 0x7, 0x0, + 0x0, 0xff, 0xff, 0xf4, 0x0, 0x7, 0x0, 0x0, + 0x0, 0x70, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, + 0x70, 0x0, 0x3f, 0xff, 0xff, 0xd0, + + /* U+4E91 "云" */ + 0xf, 0xff, 0xff, 0x0, 0x0, 0x0, 0x0, 0x0, + 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3f, 0xff, + 0xff, 0xc0, 0x2, 0x80, 0x0, 0x0, 0x70, 0x20, + 0x0, 0xd, 0x3, 0x40, 0x3, 0x80, 0x1c, 0x0, + 0xb0, 0x5, 0xe0, 0x2f, 0xff, 0xeb, 0x40, 0x40, + 0x0, 0x14, + + /* U+4F53 "体" */ + 0x3, 0x1, 0xc0, 0x0, 0x30, 0x1c, 0x0, 0xa, + 0x1, 0xc0, 0x0, 0xdf, 0xff, 0xf8, 0x2c, 0x7, + 0xf0, 0x3, 0xc0, 0xef, 0x0, 0xbc, 0xd, 0xd8, + 0x4, 0xc3, 0x5c, 0xc0, 0xc, 0x71, 0xc7, 0x0, + 0xdd, 0x1c, 0x38, 0xe, 0x9f, 0xfc, 0xc0, 0xc0, + 0x1c, 0x0, 0xc, 0x1, 0xc0, 0x0, + + /* U+50A8 "储" */ + 0x3, 0x0, 0x60, 0x0, 0x77, 0x6, 0x8, 0xa, + 0x37, 0xfe, 0x80, 0xc0, 0x6, 0x30, 0x1c, 0x40, + 0x7a, 0x3, 0xdf, 0x6b, 0xe8, 0x7c, 0x30, 0x70, + 0x0, 0xc3, 0x2f, 0xf4, 0xc, 0x3a, 0x82, 0x40, + 0xc3, 0x1f, 0xf4, 0xc, 0x3d, 0x82, 0x40, 0xc7, + 0x1f, 0xf4, 0xc, 0x1, 0x82, 0x40, 0x0, 0x0, + 0x0, + + /* U+5165 "入" */ + 0x2, 0xfc, 0x0, 0x0, 0x0, 0xa0, 0x0, 0x0, + 0xa, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, 0x1f, + 0x0, 0x0, 0x2, 0x58, 0x0, 0x0, 0x70, 0xc0, + 0x0, 0xd, 0xa, 0x0, 0x2, 0x80, 0x38, 0x0, + 0xb0, 0x0, 0xe0, 0x3c, 0x0, 0x3, 0x82, 0x0, + 0x0, 0x8, 0x0, 0x0, 0x0, 0x0, + + /* U+5185 "内" */ + 0x0, 0x1c, 0x0, 0x0, 0x1c, 0x0, 0x3f, 0xff, + 0xfd, 0x35, 0x6d, 0x5a, 0x30, 0x28, 0xa, 0x30, + 0x3c, 0xa, 0x30, 0x7b, 0xa, 0x30, 0xd2, 0xca, + 0x33, 0x80, 0xea, 0x3a, 0x0, 0x2a, 0x30, 0x0, + 0xa, 0x30, 0x0, 0xd, 0x30, 0x0, 0xfc, 0x0, + 0x0, 0x0, + + /* U+51C6 "准" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xc9, 0x0, 0x38, + 0x28, 0x70, 0x0, 0xc3, 0xff, 0xfc, 0xa, 0x74, + 0x74, 0x0, 0xf, 0x3, 0x0, 0x2, 0xbf, 0xff, + 0x80, 0x3, 0x3, 0x0, 0xa, 0x30, 0x30, 0x0, + 0xd3, 0xff, 0xfc, 0x1c, 0x30, 0x30, 0x2, 0x83, + 0x3, 0x0, 0x34, 0x3f, 0xff, 0xd1, 0x3, 0x0, + 0x0, + + /* U+5224 "判" */ + 0x0, 0xc0, 0x1, 0x88, 0x30, 0x84, 0x72, 0x8c, + 0x93, 0x1c, 0x33, 0x70, 0xc7, 0x0, 0xc0, 0x31, + 0xcf, 0xff, 0x8c, 0x70, 0xc, 0x3, 0x1c, 0x3, + 0x0, 0xc7, 0x3f, 0xff, 0x31, 0xc0, 0x70, 0xc, + 0x70, 0x34, 0x0, 0x1c, 0x1c, 0x0, 0xb, 0x1c, + 0x0, 0x2f, 0x40, 0x0, 0x0, 0x0, + + /* U+524D "前" */ + 0x1, 0x80, 0x20, 0x0, 0xc, 0xa, 0x0, 0x7f, + 0xff, 0xff, 0xc0, 0x0, 0x0, 0x0, 0xa, 0xa4, + 0x3, 0x1, 0xeb, 0x8c, 0x30, 0x18, 0x28, 0xc3, + 0x1, 0xff, 0x8c, 0x30, 0x18, 0x18, 0xc3, 0x1, + 0xff, 0x8c, 0x30, 0x18, 0x28, 0x83, 0x1, 0x82, + 0x80, 0x70, 0x18, 0xf4, 0xbe, 0x0, 0x0, 0x0, + 0x0, + + /* U+5355 "单" */ + 0x0, 0x0, 0x0, 0x0, 0xc, 0x3, 0x0, 0x0, + 0xa0, 0xa0, 0x0, 0xff, 0xff, 0xf0, 0xd, 0xa, + 0x7, 0x0, 0xd0, 0xa0, 0x70, 0xf, 0xff, 0xff, + 0x0, 0xc0, 0xa0, 0x30, 0xf, 0xff, 0xff, 0x0, + 0x0, 0xa0, 0x0, 0x0, 0xa, 0x0, 0x3, 0xff, + 0xff, 0xfc, 0x0, 0xa, 0x0, 0x0, 0x0, 0xa0, + 0x0, + + /* U+538B "压" */ + 0xf, 0xff, 0xff, 0xc0, 0xd0, 0x8, 0x0, 0xd, + 0x1, 0xc0, 0x0, 0xc0, 0x1c, 0x0, 0xc, 0x1, + 0xc0, 0x0, 0xdf, 0xff, 0xf8, 0xc, 0x1, 0xc4, + 0x0, 0xc0, 0x1c, 0xd0, 0x1c, 0x1, 0xc3, 0x42, + 0x80, 0x1c, 0x0, 0x37, 0xff, 0xff, 0xd2, 0x0, + 0x0, 0x0, + + /* U+53D1 "发" */ + 0x4, 0x14, 0x60, 0x0, 0xc2, 0x82, 0xd0, 0x1c, + 0x34, 0x0, 0x2, 0xff, 0xff, 0xfc, 0x0, 0x70, + 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0xff, 0xfd, + 0x0, 0x1f, 0x0, 0xc0, 0x3, 0x6c, 0x34, 0x0, + 0xb0, 0xbe, 0x0, 0x1c, 0x7, 0xd0, 0x7, 0x47, + 0xd7, 0xe0, 0x13, 0x90, 0x7, 0xc0, 0x0, 0x0, + 0x0, + + /* U+53E3 "口" */ + 0x15, 0x55, 0x54, 0x3f, 0xff, 0xfc, 0x30, 0x0, + 0xc, 0x30, 0x0, 0xc, 0x30, 0x0, 0xc, 0x30, + 0x0, 0xc, 0x30, 0x0, 0xc, 0x30, 0x0, 0xc, + 0x30, 0x0, 0xc, 0x3f, 0xff, 0xfc, 0x35, 0x55, + 0x5c, 0x30, 0x0, 0xc, 0x0, 0x0, 0x0, + + /* U+53F0 "台" */ + 0x0, 0x0, 0x0, 0x0, 0x9, 0x0, 0x0, 0x7, + 0x0, 0x0, 0x7, 0x1, 0xc0, 0x3, 0x40, 0x2c, + 0x7, 0xda, 0xaf, 0xc3, 0xea, 0x54, 0x34, 0x0, + 0x0, 0x0, 0xf, 0xff, 0xfc, 0x3, 0x40, 0x3, + 0x0, 0xc0, 0x0, 0xc0, 0x30, 0x0, 0x30, 0xf, + 0xff, 0xfc, 0x3, 0x40, 0x3, 0x0, + + /* U+53F3 "右" */ + 0x0, 0x9, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x3f, + 0xff, 0xff, 0xd0, 0x3, 0x40, 0x0, 0x0, 0xb0, + 0x0, 0x0, 0xc, 0x0, 0x0, 0x3, 0xff, 0xff, + 0x0, 0xf8, 0x0, 0x70, 0x7a, 0x80, 0x3, 0x2, + 0x28, 0x0, 0x30, 0x2, 0x80, 0x7, 0x0, 0x2f, + 0xff, 0xf0, 0x2, 0x80, 0x3, 0x0, + + /* U+5411 "向" */ + 0x0, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x30, + 0x0, 0x7f, 0xff, 0xff, 0x70, 0x0, 0x7, 0x70, + 0x0, 0x7, 0x71, 0xff, 0xc7, 0x71, 0xc0, 0xc7, + 0x71, 0xc0, 0xc7, 0x71, 0xc0, 0xc7, 0x71, 0xff, + 0xc7, 0x70, 0x0, 0x7, 0x70, 0x0, 0x7, 0x70, + 0x0, 0xbd, 0x0, 0x0, 0x0, + + /* U+5668 "器" */ + 0x1f, 0xf5, 0xff, 0x41, 0x82, 0x58, 0x24, 0x1f, + 0xf5, 0xff, 0x40, 0x0, 0x41, 0x40, 0x0, 0xd, + 0x1c, 0x3, 0xff, 0xff, 0xfc, 0x1, 0xe0, 0xb4, + 0x7, 0xe4, 0x1, 0xfd, 0x1e, 0xb5, 0xeb, 0x40, + 0xc2, 0x58, 0x30, 0xf, 0xf5, 0xff, 0x0, 0xc2, + 0x58, 0x30, + + /* U+56DE "回" */ + 0xff, 0xff, 0xfc, 0xd0, 0x0, 0xc, 0xd0, 0x0, + 0xc, 0xd3, 0xff, 0xc, 0xd3, 0x3, 0xc, 0xd3, + 0x3, 0xc, 0xd3, 0x3, 0xc, 0xd3, 0xff, 0xc, + 0xd0, 0x0, 0xc, 0xd0, 0x0, 0xc, 0xff, 0xff, + 0xfc, 0xd0, 0x0, 0xc, + + /* U+5728 "在" */ + 0x0, 0x24, 0x0, 0x0, 0x3, 0x40, 0x0, 0x7f, + 0xff, 0xff, 0xc0, 0xd, 0x0, 0x0, 0x1, 0xc0, + 0x40, 0x0, 0x34, 0xc, 0x0, 0xf, 0x15, 0xd5, + 0x2, 0xf3, 0xff, 0xf4, 0x77, 0x0, 0xc0, 0x0, + 0x70, 0xc, 0x0, 0x7, 0x0, 0xc0, 0x0, 0x70, + 0xd, 0x0, 0x7, 0xbf, 0xff, 0xc0, + + /* U+5907 "备" */ + 0x0, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x2f, + 0xff, 0xc0, 0x2e, 0x0, 0xf0, 0x2c, 0xe1, 0xe0, + 0x8, 0xf, 0xd0, 0x0, 0x6e, 0x6f, 0x91, 0xe4, + 0x0, 0x6f, 0xf, 0xff, 0xfc, 0x3, 0x3, 0x3, + 0x0, 0xff, 0xff, 0xc0, 0x30, 0x30, 0x30, 0xf, + 0xff, 0xfc, 0x3, 0x40, 0x3, 0x0, + + /* U+5916 "外" */ + 0x0, 0x0, 0x0, 0x0, 0x18, 0x3, 0x0, 0x3, + 0x80, 0x30, 0x0, 0x39, 0x43, 0x0, 0x7, 0xfe, + 0x30, 0x0, 0xd0, 0x93, 0x0, 0x1d, 0xc, 0x3d, + 0x3, 0xf5, 0xc3, 0x38, 0x21, 0x74, 0x30, 0x90, + 0x7, 0x3, 0x0, 0x0, 0xd0, 0x30, 0x0, 0x38, + 0x3, 0x0, 0x1e, 0x0, 0x30, 0x2, 0x40, 0x3, + 0x0, + + /* U+5931 "失" */ + 0x1, 0x6, 0x0, 0x0, 0x34, 0x60, 0x0, 0x7, + 0xa, 0x0, 0x0, 0xbf, 0xff, 0xf4, 0xc, 0x6, + 0x0, 0x0, 0x40, 0xa0, 0x0, 0x3f, 0xff, 0xff, + 0xc0, 0x0, 0xf0, 0x0, 0x0, 0x1e, 0x80, 0x0, + 0x7, 0x4d, 0x0, 0x2, 0xd0, 0x38, 0x1, 0xf0, + 0x0, 0xb8, 0x24, 0x0, 0x1, 0x80, + + /* U+5B57 "字" */ + 0x0, 0x8, 0x0, 0x0, 0x0, 0xa0, 0x0, 0x3f, + 0xff, 0xff, 0xc3, 0x40, 0x0, 0x1c, 0x37, 0xff, + 0xfd, 0xc0, 0x0, 0xb, 0x80, 0x0, 0x2, 0xc0, + 0x0, 0x0, 0xb0, 0x0, 0x7f, 0xff, 0xff, 0xc0, + 0x0, 0xa0, 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, + 0xa0, 0x0, 0x0, 0xfd, 0x0, 0x0, + + /* U+5B58 "存" */ + 0x0, 0x24, 0x0, 0x0, 0x3, 0x40, 0x0, 0x3f, + 0xff, 0xff, 0xd0, 0xd, 0x0, 0x0, 0x2, 0x9f, + 0xff, 0x40, 0x70, 0x0, 0xf4, 0x1f, 0x0, 0x3c, + 0x7, 0xb0, 0x7, 0x0, 0x13, 0x7f, 0xff, 0xd0, + 0x30, 0x6, 0x0, 0x3, 0x0, 0x60, 0x0, 0x30, + 0xa, 0x0, 0x3, 0x7, 0xd0, 0x0, + + /* U+5C04 "射" */ + 0x0, 0x0, 0x0, 0x0, 0xc, 0x0, 0x30, 0x1, + 0xc0, 0x3, 0x0, 0xff, 0xc0, 0x30, 0xc, 0xd, + 0xab, 0x80, 0xff, 0xd5, 0x78, 0xc, 0xc, 0x3, + 0x0, 0xff, 0xcc, 0x30, 0xc, 0xc, 0xa3, 0x3, + 0xff, 0xc3, 0x30, 0x1, 0xcc, 0x3, 0x0, 0x70, + 0xc0, 0x30, 0x2c, 0xc, 0x3, 0x2, 0x1f, 0x87, + 0xe0, + + /* U+5C31 "就" */ + 0x0, 0x0, 0x0, 0x0, 0x24, 0x3, 0x0, 0x1, + 0xc0, 0x33, 0x3, 0xff, 0xd3, 0x18, 0x0, 0x1, + 0x75, 0x41, 0xff, 0x9b, 0xa8, 0x18, 0x18, 0x64, + 0x1, 0x81, 0x86, 0x80, 0x1f, 0xf8, 0xa8, 0x0, + 0x5c, 0xd, 0x80, 0x19, 0xd8, 0xc8, 0x83, 0x5c, + 0xa8, 0x88, 0x31, 0x87, 0x9, 0xc0, 0xb4, 0xd0, + 0x7c, 0x0, 0x0, 0x0, 0x0, + + /* U+5DE6 "左" */ + 0x0, 0x28, 0x0, 0x0, 0x3, 0x80, 0x0, 0x3f, + 0xff, 0xff, 0xd0, 0x7, 0x0, 0x0, 0x0, 0xa0, + 0x0, 0x0, 0xd, 0x0, 0x0, 0x1, 0xff, 0xff, + 0x40, 0x34, 0x2c, 0x0, 0xa, 0x1, 0x80, 0x1, + 0xc0, 0x18, 0x0, 0x34, 0x1, 0x80, 0x6, 0x0, + 0x28, 0x0, 0x7, 0xff, 0xff, 0xc0, + + /* U+5E38 "常" */ + 0x14, 0x30, 0x20, 0xd, 0x30, 0xe0, 0xaf, 0xbe, + 0xea, 0xd5, 0x55, 0x5a, 0xdf, 0xff, 0xe6, 0xc, + 0x0, 0x30, 0xe, 0xaa, 0xb0, 0x0, 0x34, 0x0, + 0x3f, 0xff, 0xfc, 0x30, 0x34, 0xc, 0x30, 0x30, + 0xc, 0x30, 0x30, 0xfc, 0x0, 0x30, 0x0, + + /* U+5E93 "库" */ + 0x0, 0x1, 0x0, 0x0, 0x0, 0x70, 0x0, 0xf, + 0xff, 0xff, 0xc0, 0xc0, 0xd0, 0x0, 0xd, 0xff, + 0xff, 0x40, 0xc3, 0x40, 0x0, 0xc, 0x60, 0xc0, + 0x0, 0xcf, 0xff, 0xf0, 0xc, 0x1, 0xc0, 0x1, + 0x80, 0x1c, 0x0, 0x2a, 0xff, 0xff, 0xc3, 0x0, + 0xc, 0x0, 0x20, 0x0, 0xc0, 0x0, + + /* U+5E95 "底" */ + 0x0, 0x1, 0x0, 0x0, 0x55, 0x75, 0x54, 0xf, + 0xff, 0xff, 0xc0, 0xc0, 0x0, 0x10, 0xc, 0x3f, + 0xfe, 0x40, 0xc7, 0xd, 0x0, 0xc, 0x70, 0x90, + 0x0, 0xc7, 0xff, 0xfd, 0xc, 0x70, 0x60, 0x0, + 0xc7, 0x3, 0x0, 0x18, 0x72, 0x34, 0x93, 0x47, + 0xf1, 0xdc, 0x30, 0x62, 0x8b, 0x80, 0x0, 0x0, + 0x0, + + /* U+5EA6 "度" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x0, 0xa, + 0xab, 0xea, 0x80, 0xd7, 0x55, 0xd4, 0xc, 0x30, + 0xc, 0x0, 0xff, 0xff, 0xfc, 0xc, 0x30, 0xc, + 0x0, 0xc3, 0xff, 0xc0, 0xc, 0x0, 0x0, 0x1, + 0xdf, 0xff, 0xf0, 0x18, 0x34, 0x1d, 0x2, 0x40, + 0xeb, 0x0, 0x30, 0x6f, 0xf5, 0x6, 0x7e, 0x1, + 0xbc, 0x0, 0x0, 0x0, 0x0, + + /* U+5F53 "当" */ + 0x4, 0xd, 0x1, 0x7, 0x43, 0x42, 0xc0, 0x70, + 0xd1, 0xc0, 0xa, 0x34, 0xd0, 0x0, 0xd, 0x10, + 0xf, 0xff, 0xff, 0xc0, 0x0, 0x0, 0x30, 0x0, + 0x0, 0xc, 0x1f, 0xff, 0xff, 0x0, 0x0, 0x0, + 0xc0, 0x0, 0x0, 0x30, 0xff, 0xff, 0xfc, 0x0, + 0x0, 0x3, 0x0, + + /* U+6001 "态" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xa0, 0x0, 0x0, + 0xd, 0x0, 0x3, 0xff, 0xff, 0xfc, 0x0, 0x1f, + 0x40, 0x0, 0x7, 0x4d, 0x0, 0x2, 0xf8, 0x38, + 0x2, 0xe0, 0xd0, 0xbc, 0x20, 0x0, 0x0, 0x40, + 0x8c, 0x60, 0xa0, 0x1c, 0xc3, 0x43, 0x3, 0x4c, + 0x2, 0x6c, 0x70, 0xd0, 0x34, 0xc0, 0xb, 0xff, + 0x0, 0x0, 0x0, 0x0, 0x0, + + /* U+6027 "性" */ + 0x3, 0x0, 0x30, 0x0, 0x30, 0x93, 0x0, 0x17, + 0x4d, 0x30, 0x2, 0x7d, 0xff, 0xfd, 0x37, 0x1c, + 0x30, 0x3, 0x32, 0x43, 0x0, 0x33, 0x10, 0x30, + 0x2, 0x30, 0xff, 0xfc, 0x3, 0x0, 0x30, 0x0, + 0x30, 0x3, 0x0, 0x3, 0x0, 0x30, 0x0, 0x30, + 0x3, 0x0, 0x3, 0x3f, 0xff, 0xe0, + + /* U+60C5 "情" */ + 0x9, 0x0, 0xc0, 0x0, 0xd3, 0xff, 0xf4, 0x1e, + 0x0, 0xc0, 0x6, 0xfb, 0xff, 0xf4, 0x6d, 0x55, + 0xd5, 0x49, 0xd5, 0x55, 0x54, 0x9d, 0x2a, 0xaa, + 0x4, 0xd3, 0x40, 0x30, 0xd, 0x3f, 0xff, 0x0, + 0xd3, 0x0, 0x30, 0xd, 0x3f, 0xff, 0x0, 0xd3, + 0x0, 0x30, 0xd, 0x30, 0x3e, 0x0, + + /* U+6210 "成" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x25, 0xc0, 0x0, + 0x2, 0x8a, 0x0, 0xff, 0xff, 0xfc, 0xd, 0x56, + 0xd5, 0x40, 0xc0, 0x1c, 0x10, 0xd, 0x50, 0xc3, + 0x0, 0xff, 0x8c, 0xa0, 0xc, 0x24, 0xdc, 0x0, + 0xc2, 0x4b, 0x40, 0x1c, 0x34, 0xb0, 0x92, 0xaf, + 0x2f, 0x4c, 0x30, 0xb, 0x1d, 0xc7, 0x1, 0x80, + 0xb4, 0x0, 0x0, 0x0, 0x0, + + /* U+62A5 "报" */ + 0x3, 0x0, 0x0, 0x0, 0x30, 0xff, 0xfc, 0x3, + 0xd, 0x1, 0x83, 0xfe, 0xc0, 0x28, 0x3, 0xc, + 0x3f, 0x0, 0x30, 0xd5, 0x50, 0x3, 0x9f, 0xff, + 0xc2, 0xf4, 0xc9, 0x18, 0x13, 0xc, 0x73, 0x40, + 0x30, 0xc3, 0xf0, 0x3, 0xc, 0x1e, 0x0, 0x30, + 0xdb, 0x78, 0x2e, 0xe, 0xc0, 0x90, 0x0, 0x0, + 0x0, + + /* U+6309 "按" */ + 0x0, 0x0, 0x0, 0x0, 0xd0, 0xc, 0x0, 0xd, + 0x0, 0xe0, 0x0, 0xd3, 0xff, 0xf8, 0x7f, 0xb0, + 0x2, 0x80, 0xd1, 0x28, 0x14, 0xd, 0x3, 0x40, + 0x0, 0xf7, 0xff, 0xfc, 0x7e, 0xa, 0xd, 0x4, + 0xd0, 0xd0, 0xc0, 0xd, 0xb, 0xb8, 0x0, 0xd0, + 0x1f, 0x40, 0xc, 0x1b, 0x9e, 0x7, 0xcb, 0x80, + 0x28, 0x0, 0x0, 0x0, 0x0, + + /* U+63A5 "接" */ + 0x0, 0x0, 0x0, 0x0, 0xd0, 0xc, 0x0, 0xd, + 0x0, 0xe0, 0x0, 0xd3, 0xff, 0xf8, 0x7f, 0x4a, + 0xc, 0x0, 0xd0, 0x71, 0xc0, 0xd, 0x3f, 0xff, + 0xc0, 0xf4, 0x34, 0x0, 0xbd, 0xbf, 0xff, 0xc0, + 0xd0, 0xd0, 0xd0, 0xd, 0x1e, 0x1c, 0x0, 0xd0, + 0x2f, 0x40, 0xd, 0x7, 0xee, 0x3, 0xcb, 0xd0, + 0x2c, 0x0, 0x0, 0x0, 0x0, + + /* U+63A7 "控" */ + 0x0, 0x0, 0x0, 0x0, 0xc0, 0xc, 0x0, 0xc, + 0x15, 0xe5, 0x0, 0xd3, 0xff, 0xf8, 0x7f, 0xb0, + 0x1, 0x80, 0xc2, 0x22, 0x44, 0xc, 0xe, 0xe, + 0x0, 0xfb, 0x80, 0x2c, 0x7d, 0x10, 0x0, 0x4, + 0xc2, 0xff, 0xf0, 0xc, 0x0, 0xd0, 0x0, 0xc0, + 0xd, 0x0, 0xc, 0x0, 0xd0, 0x7, 0xcb, 0xff, + 0xfc, + + /* U+6447 "摇" */ + 0xc, 0x0, 0x16, 0x40, 0xc7, 0xfe, 0xa4, 0xc, + 0x10, 0xc2, 0x47, 0xf5, 0xc9, 0x30, 0xc, 0x8, + 0x15, 0x0, 0xd1, 0xea, 0xa4, 0x1f, 0x75, 0xe5, + 0xb, 0xc1, 0xd, 0x0, 0xc, 0xbf, 0xff, 0xc0, + 0xc1, 0xd, 0x0, 0xc, 0x30, 0xd2, 0x40, 0xc3, + 0xae, 0xb4, 0x7c, 0x15, 0x57, 0x40, 0x0, 0x0, + 0x0, + + /* U+65B9 "方" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x0, + 0x7, 0x0, 0x3, 0xff, 0xff, 0xfc, 0x0, 0xa0, + 0x0, 0x0, 0xa, 0x0, 0x0, 0x0, 0xa5, 0x54, + 0x0, 0xb, 0xff, 0xe0, 0x0, 0xd0, 0x9, 0x0, + 0xc, 0x0, 0xd0, 0x2, 0x80, 0xd, 0x0, 0x30, + 0x0, 0xc0, 0xe, 0x0, 0x1c, 0x3, 0x80, 0xbf, + 0x40, 0x0, 0x0, 0x0, 0x0, + + /* U+672A "未" */ + 0x0, 0xa, 0x0, 0x0, 0x0, 0xa0, 0x0, 0xf, + 0xff, 0xff, 0x0, 0x0, 0xa0, 0x0, 0x0, 0xa, + 0x0, 0x0, 0x0, 0xa0, 0x0, 0x3f, 0xff, 0xff, + 0xc0, 0x3, 0xac, 0x0, 0x0, 0xda, 0x70, 0x0, + 0x28, 0xa2, 0xc0, 0x1e, 0xa, 0xb, 0x43, 0x40, + 0xa0, 0x1c, 0x0, 0xa, 0x0, 0x0, + + /* U+673A "机" */ + 0x3, 0x0, 0x0, 0x0, 0x30, 0x7f, 0xc0, 0x3, + 0x7, 0xc, 0x3, 0xff, 0x60, 0xc0, 0x7, 0x6, + 0xc, 0x0, 0xb4, 0x60, 0xc0, 0xf, 0xc6, 0xc, + 0x2, 0xb7, 0x60, 0xc0, 0x33, 0xa, 0xc, 0x1, + 0x30, 0x90, 0xc9, 0x3, 0xc, 0xc, 0xd0, 0x31, + 0xc0, 0xdc, 0x3, 0x30, 0xb, 0xc0, 0x0, 0x0, + 0x0, + + /* U+6746 "杆" */ + 0x3, 0x0, 0x0, 0x0, 0x30, 0x7f, 0xfc, 0x7, + 0x1, 0x75, 0x43, 0xfe, 0x3, 0x0, 0x7, 0x0, + 0x30, 0x0, 0xf0, 0x3, 0x0, 0xf, 0xcf, 0xff, + 0xd2, 0x7a, 0x3, 0x40, 0x33, 0x0, 0x30, 0x0, + 0x30, 0x3, 0x0, 0x3, 0x0, 0x30, 0x0, 0x30, + 0x3, 0x0, 0x3, 0x0, 0x30, 0x0, + + /* U+6B63 "正" */ + 0x3f, 0xff, 0xff, 0xc0, 0x0, 0x30, 0x0, 0x0, + 0x3, 0x0, 0x0, 0x70, 0x30, 0x0, 0x7, 0x3, + 0x0, 0x0, 0x70, 0x3f, 0xf4, 0x7, 0x3, 0x0, + 0x0, 0x70, 0x30, 0x0, 0x7, 0x3, 0x0, 0x0, + 0x70, 0x30, 0x0, 0xbf, 0xff, 0xff, 0xc0, 0x0, + 0x0, 0x0, + + /* U+6C60 "池" */ + 0x0, 0x0, 0xc0, 0x2, 0xc2, 0xc, 0x0, 0x7, + 0x30, 0xc1, 0x0, 0x3, 0xe, 0xf4, 0x70, 0x3f, + 0xd3, 0x42, 0xdf, 0x4c, 0x30, 0x5, 0x30, 0xc3, + 0x0, 0x3, 0xc, 0x30, 0x6, 0x30, 0xde, 0x0, + 0xd3, 0xc, 0xc, 0x1c, 0x30, 0x0, 0xc3, 0x43, + 0x80, 0x1c, 0x30, 0x1f, 0xff, 0x40, + + /* U+6E29 "温" */ + 0x0, 0x0, 0x0, 0x3, 0x83, 0xff, 0xe0, 0xe, + 0x30, 0x6, 0x0, 0x3, 0xff, 0xe0, 0xb0, 0x30, + 0x6, 0x2, 0xc3, 0xff, 0xe0, 0x4, 0x0, 0x0, + 0x0, 0x8b, 0xff, 0xf0, 0xc, 0x96, 0x33, 0x1, + 0x89, 0x63, 0x30, 0x24, 0x96, 0x33, 0x3, 0x9, + 0x63, 0x30, 0x33, 0xff, 0xff, 0xc0, 0x0, 0x0, + 0x0, + + /* U+6E90 "源" */ + 0x0, 0x0, 0x0, 0x1, 0xc3, 0xff, 0xfe, 0x7, + 0x30, 0x30, 0x1, 0x3, 0x3f, 0xf8, 0x38, 0x33, + 0x1, 0xc0, 0xa3, 0x3f, 0xfc, 0x0, 0x33, 0x1, + 0xc0, 0x53, 0x3a, 0xbc, 0xd, 0x70, 0x34, 0x0, + 0xc6, 0x23, 0x14, 0x1c, 0x99, 0x30, 0xc2, 0x8c, + 0xc3, 0x9, 0x25, 0x85, 0xf0, 0x0, 0x0, 0x0, + 0x0, + + /* U+72B6 "状" */ + 0x0, 0xc0, 0x31, 0x0, 0xc, 0x3, 0x30, 0x30, + 0xc0, 0x31, 0xc2, 0x8c, 0x3, 0x0, 0xd, 0xdf, + 0xff, 0xd0, 0xac, 0x7, 0x40, 0x0, 0xc0, 0x74, + 0x0, 0x3c, 0xb, 0x80, 0x1e, 0xc0, 0xcc, 0x3, + 0x4c, 0x28, 0xa0, 0x0, 0xc7, 0x3, 0x40, 0xd, + 0xd0, 0x1d, 0x0, 0xd8, 0x0, 0x50, 0x0, 0x0, + 0x0, + + /* U+751F "生" */ + 0x1, 0x7, 0x0, 0x0, 0x34, 0x70, 0x0, 0x7, + 0x7, 0x0, 0x0, 0xbf, 0xff, 0xfc, 0xd, 0x7, + 0x0, 0x3, 0x80, 0x70, 0x0, 0x20, 0x7, 0x0, + 0x0, 0xbf, 0xff, 0xf4, 0x0, 0x7, 0x0, 0x0, + 0x0, 0x70, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, + 0x70, 0x0, 0x3f, 0xff, 0xff, 0xd0, + + /* U+7535 "电" */ + 0x0, 0x30, 0x0, 0x0, 0xc, 0x0, 0x3, 0xff, + 0xff, 0xc0, 0xc0, 0xd0, 0x30, 0x30, 0x30, 0xc, + 0xf, 0xff, 0xff, 0x3, 0x3, 0x40, 0xc0, 0xc0, + 0xc0, 0x30, 0x3f, 0xff, 0xfc, 0x0, 0xd, 0x0, + 0x90, 0x3, 0x0, 0x24, 0x0, 0xd0, 0xd, 0x0, + 0x1f, 0xfe, 0x0, 0x0, 0x0, 0x0, + + /* U+76D1 "监" */ + 0x0, 0x0, 0x0, 0x0, 0x7, 0xd, 0x0, 0xc, + 0x70, 0xc0, 0x0, 0xc7, 0x1f, 0xfc, 0xc, 0x73, + 0x90, 0x0, 0xc7, 0x33, 0x40, 0xc, 0x76, 0xd, + 0x0, 0xc2, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, + 0xbf, 0xff, 0xf0, 0x9, 0x30, 0xc3, 0x0, 0x93, + 0xc, 0x30, 0x9, 0x30, 0xc3, 0x3, 0xff, 0xff, + 0xfe, + + /* U+76D8 "盘" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0xd0, 0x0, 0x3, + 0xff, 0xfd, 0x0, 0x30, 0x80, 0x90, 0x3, 0x7, + 0x9, 0x1, 0x75, 0x55, 0xe4, 0x2f, 0xee, 0xaf, + 0x80, 0xb0, 0xe0, 0xd0, 0x28, 0x1, 0x38, 0x0, + 0xbf, 0xff, 0xe0, 0xd, 0x30, 0xc7, 0x0, 0xc3, + 0xc, 0x30, 0xc, 0x30, 0xc3, 0x7, 0xff, 0xff, + 0xfd, + + /* U+786E "确" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x3, 0xfe, + 0x3f, 0xf0, 0x28, 0x1c, 0x28, 0xd, 0xd, 0x1c, + 0x3, 0xb, 0xff, 0xf2, 0xe8, 0xc3, 0xc, 0xf3, + 0x3f, 0xff, 0x7c, 0xcd, 0x30, 0xc7, 0x33, 0x4c, + 0x30, 0xcc, 0xff, 0xfc, 0x33, 0x30, 0xc3, 0xf, + 0xdc, 0x30, 0xc0, 0xd, 0xd, 0xe0, 0x0, 0x0, + 0x0, + + /* U+79BB "离" */ + 0x0, 0x0, 0x0, 0x0, 0x0, 0x90, 0x0, 0x3f, + 0xff, 0xff, 0xc0, 0x5, 0x5, 0x0, 0x8, 0xb5, + 0xe2, 0x0, 0xd2, 0xf8, 0x70, 0xd, 0x90, 0x67, + 0x0, 0xff, 0xff, 0xe0, 0x0, 0xd, 0x0, 0x1, + 0xff, 0xff, 0xf4, 0x18, 0x34, 0xc2, 0x41, 0x8b, + 0x5f, 0x24, 0x18, 0xe9, 0x63, 0x41, 0x80, 0x2, + 0xf0, + + /* U+7EBF "线" */ + 0x0, 0x0, 0x0, 0x0, 0xc0, 0xc9, 0x0, 0xa0, + 0x30, 0xc0, 0x31, 0x4d, 0x14, 0x28, 0xdf, 0xfe, + 0x5e, 0xe0, 0x90, 0x1, 0x70, 0x29, 0xa8, 0x28, + 0xbf, 0x94, 0x1d, 0x81, 0x83, 0xf, 0xe0, 0x37, + 0x40, 0x0, 0xf, 0x44, 0x1b, 0xf, 0x86, 0xbe, + 0x7d, 0x37, 0x40, 0x4, 0x7, 0xc0, + + /* U+7EEA "绪" */ + 0x0, 0x0, 0x0, 0x0, 0x30, 0xc, 0x0, 0xa, + 0x0, 0xc1, 0x80, 0xc0, 0xff, 0xf4, 0x28, 0xc0, + 0xc7, 0x3, 0x68, 0x5d, 0xd4, 0x7f, 0x2a, 0xfa, + 0x80, 0xa0, 0x2c, 0x0, 0xd, 0x5f, 0xff, 0x3, + 0xf6, 0xa0, 0x30, 0x10, 0x7, 0xff, 0x0, 0x6d, + 0x60, 0x30, 0xbd, 0x7, 0xff, 0x0, 0x0, 0x60, + 0x30, + + /* U+7F6E "置" */ + 0xf, 0xff, 0xff, 0x80, 0xc3, 0x49, 0x28, 0x5, + 0x5b, 0x55, 0x41, 0xff, 0xff, 0xfc, 0x1, 0x5a, + 0x54, 0x0, 0x3a, 0xaa, 0xe0, 0x3, 0xaa, 0xae, + 0x0, 0x34, 0x0, 0xa0, 0x3, 0x95, 0x5e, 0x0, + 0x3a, 0xaa, 0xe0, 0x3, 0x0, 0xa, 0x3, 0xff, + 0xff, 0xfd, + + /* U+80FD "能" */ + 0x0, 0x0, 0x0, 0x2, 0x80, 0xc0, 0x0, 0xc8, + 0x30, 0xa0, 0xd1, 0xcf, 0xd0, 0xff, 0xf7, 0x42, + 0x0, 0x1, 0xc0, 0xc3, 0xff, 0x2f, 0xf0, 0xc0, + 0xc0, 0x0, 0x3a, 0xb3, 0x1, 0xc, 0x1c, 0xef, + 0x43, 0xff, 0x38, 0x10, 0xc0, 0xcc, 0x9, 0x30, + 0x33, 0x43, 0xc, 0xb8, 0xbf, 0x80, 0x0, 0x0, + 0x0, + + /* U+83DC "菜" */ + 0x0, 0xd0, 0x70, 0x3, 0xff, 0xff, 0xfc, 0x0, + 0xd0, 0x60, 0x0, 0x0, 0x5, 0xa0, 0x2f, 0xff, + 0xaa, 0x0, 0x60, 0x90, 0xa0, 0x3, 0x43, 0x1c, + 0x0, 0x0, 0x50, 0x0, 0x3f, 0xff, 0xff, 0xc0, + 0xb, 0xee, 0x0, 0x7, 0x8a, 0x2d, 0x3, 0xd0, + 0xa0, 0x7c, 0x10, 0xa, 0x0, 0x40, + + /* U+88C1 "裁" */ + 0x0, 0x0, 0x0, 0x0, 0xc, 0xc, 0x0, 0x1, + 0xc0, 0xcd, 0x2, 0xff, 0xdc, 0x34, 0x1, 0xc0, + 0xc1, 0xb, 0xff, 0xff, 0xfc, 0x1, 0x80, 0x91, + 0x3, 0xff, 0xe9, 0x30, 0x3, 0x40, 0x6a, 0x0, + 0xe9, 0xd7, 0xc0, 0x7e, 0x38, 0x34, 0xc5, 0x61, + 0xcb, 0x4c, 0x7, 0xe2, 0xdd, 0x80, 0xa0, 0x60, + 0xb0, 0x0, 0x0, 0x0, 0x0, + + /* U+89C6 "视" */ + 0x4, 0x0, 0x0, 0x0, 0x60, 0xff, 0xf0, 0x3f, + 0xcd, 0x3, 0x0, 0x1c, 0xd3, 0x30, 0x2, 0x4d, + 0x33, 0x0, 0x70, 0xd3, 0x30, 0xf, 0x4d, 0x33, + 0x3, 0xed, 0xd6, 0x30, 0x66, 0xd, 0xb3, 0x0, + 0x60, 0xf, 0x40, 0x6, 0x3, 0x64, 0xc0, 0x61, + 0xd2, 0x4c, 0x6, 0x70, 0x1f, 0x80, 0x0, 0x0, + 0x0, + + /* U+89C9 "觉" */ + 0x4, 0x8, 0x4, 0x2, 0xc3, 0x43, 0x0, 0x34, + 0xa3, 0x80, 0xff, 0xff, 0xfe, 0x30, 0x0, 0x2, + 0x8a, 0xff, 0xff, 0x50, 0x60, 0x0, 0xc0, 0x18, + 0x34, 0x30, 0x6, 0xd, 0xc, 0x1, 0x87, 0xc3, + 0x50, 0x7, 0x70, 0x1c, 0x1b, 0x4c, 0xa, 0x3e, + 0x3, 0xff, 0x44, 0x0, 0x0, 0x0, + + /* U+8B66 "警" */ + 0x0, 0x0, 0x0, 0x0, 0x63, 0x2, 0x0, 0x2f, + 0xba, 0xfa, 0x82, 0xea, 0xac, 0x30, 0x6a, 0x4c, + 0x39, 0x0, 0x8c, 0xc7, 0xd0, 0xa, 0x6e, 0x92, + 0xc1, 0x55, 0xa5, 0x54, 0x6a, 0xaa, 0xaa, 0x80, + 0xaa, 0xaa, 0x90, 0xa, 0xaa, 0xa9, 0x0, 0xaa, + 0xaa, 0x90, 0xc, 0x0, 0x6, 0x0, 0xea, 0xaa, + 0xe0, + + /* U+8BA4 "认" */ + 0x8, 0x0, 0x30, 0x0, 0xe0, 0x3, 0x0, 0x3, + 0x40, 0x70, 0x0, 0x4, 0x7, 0x0, 0x0, 0x0, + 0x70, 0x3, 0xf0, 0xb, 0x0, 0x7, 0x0, 0xf8, + 0x0, 0x70, 0xd, 0xc0, 0x7, 0x2, 0xcd, 0x0, + 0x76, 0x34, 0xb0, 0x7, 0xce, 0x3, 0x40, 0xb2, + 0xc0, 0x1d, 0x0, 0x30, 0x0, 0x60, 0x0, 0x0, + 0x0, + + /* U+8BE6 "详" */ + 0x0, 0x8, 0x4, 0x2, 0x80, 0xe0, 0xd0, 0xe, + 0x6, 0x2c, 0x0, 0x13, 0xff, 0xf8, 0x0, 0x0, + 0xd0, 0xb, 0xc0, 0xd, 0x0, 0xc, 0x3f, 0xff, + 0x40, 0xc0, 0xd, 0x0, 0xc, 0x0, 0xd0, 0x0, + 0xcb, 0xff, 0xfc, 0xe, 0x0, 0xd0, 0x0, 0xf0, + 0xd, 0x0, 0x4, 0x0, 0xd0, 0x0, + + /* U+8BEF "误" */ + 0x0, 0x0, 0x0, 0x2, 0xc2, 0xff, 0xf0, 0xe, + 0x24, 0x3, 0x0, 0x22, 0x80, 0x30, 0x0, 0x1f, + 0xff, 0x7, 0xc0, 0x0, 0x0, 0xc, 0x3f, 0xff, + 0x80, 0xc0, 0xc, 0x0, 0xc, 0xbf, 0xff, 0xc0, + 0xc0, 0x1f, 0x0, 0xf, 0x87, 0x78, 0x0, 0xd6, + 0xd0, 0xb8, 0x0, 0x90, 0x1, 0x80, + + /* U+8D44 "资" */ + 0x0, 0x0, 0x0, 0x1, 0x40, 0xd0, 0x0, 0xb, + 0x1f, 0xff, 0xd0, 0x13, 0x4c, 0x1c, 0x2, 0x51, + 0xd3, 0x0, 0xb0, 0x7b, 0x40, 0x38, 0xbc, 0xb, + 0xd1, 0x9, 0x0, 0x5, 0x3, 0xff, 0xff, 0x0, + 0x30, 0x20, 0x30, 0x3, 0xb, 0x3, 0x0, 0x21, + 0xf8, 0x20, 0x1, 0xf4, 0x7e, 0x2, 0xe4, 0x0, + 0x6c, 0x0, 0x0, 0x0, 0x0, + + /* U+8FD4 "返" */ + 0x4, 0x0, 0x1, 0x40, 0xd0, 0xff, 0xf8, 0x7, + 0xc, 0x0, 0x0, 0x10, 0xc0, 0x0, 0x0, 0xf, + 0xff, 0xc3, 0xf0, 0xc0, 0x28, 0x7, 0x1e, 0x87, + 0x0, 0x31, 0x8f, 0xd0, 0x3, 0x24, 0x7c, 0x0, + 0x33, 0x2e, 0xb0, 0xb, 0x57, 0x41, 0xc2, 0xde, + 0x40, 0x0, 0x20, 0x2f, 0xff, 0xe0, 0x0, 0x0, + 0x0, + + /* U+8FDB "进" */ + 0x10, 0x9, 0xc, 0x3, 0x80, 0x90, 0xc0, 0xd, + 0xe, 0x1c, 0x0, 0x67, 0xff, 0xf8, 0x0, 0x9, + 0xc, 0x7, 0xc0, 0x90, 0xc0, 0xd, 0xbf, 0xff, + 0xc0, 0xd1, 0xd5, 0xd4, 0xd, 0xc, 0xc, 0x0, + 0xd2, 0x80, 0xc0, 0x2f, 0x20, 0x8, 0x7, 0x1d, + 0x0, 0x0, 0x50, 0x7f, 0xff, 0xc0, 0x0, 0x0, + 0x0, + + /* U+9065 "遥" */ + 0x0, 0x0, 0x1, 0x2, 0x4b, 0xff, 0xa4, 0x1c, + 0x20, 0x83, 0x0, 0xa3, 0x4c, 0x60, 0x0, 0x18, + 0x0, 0x7, 0xc3, 0xff, 0xf4, 0x1c, 0x10, 0xc0, + 0x0, 0xcf, 0xff, 0xfc, 0xc, 0x10, 0xc0, 0x0, + 0xc3, 0xc, 0x34, 0x1d, 0x3f, 0xff, 0x3, 0x78, + 0x0, 0x0, 0x60, 0xbf, 0xff, 0xc0, 0x0, 0x0, + 0x0, + + /* U+90E8 "部" */ + 0x1, 0x80, 0x0, 0x0, 0x1c, 0x7, 0xfc, 0x3f, + 0xfe, 0x60, 0xc0, 0xd1, 0x86, 0x18, 0xa, 0x34, + 0x63, 0x47, 0xff, 0xf6, 0x30, 0x0, 0x0, 0x62, + 0x80, 0x0, 0x6, 0xc, 0x1f, 0xfc, 0x60, 0xd1, + 0x80, 0xc6, 0xc, 0x18, 0xc, 0x6f, 0xc1, 0x80, + 0xc6, 0x0, 0x1f, 0xfc, 0x60, 0x0, + + /* U+9519 "错" */ + 0x0, 0x0, 0x0, 0x0, 0xd0, 0x30, 0xc0, 0xc, + 0x3, 0xc, 0x2, 0xfd, 0xff, 0xfc, 0x30, 0x3, + 0xc, 0x6, 0x0, 0x30, 0xd0, 0x2f, 0xaf, 0xff, + 0xc0, 0x90, 0x0, 0x0, 0x2f, 0x8f, 0xff, 0x1, + 0xe4, 0xc0, 0x30, 0x9, 0xf, 0xff, 0x0, 0xa8, + 0xc0, 0x30, 0xf, 0x4f, 0xff, 0x0, 0x40, 0xd0, + 0x30, + + /* U+952E "键" */ + 0x0, 0x0, 0x0, 0x0, 0xc0, 0x1, 0x80, 0x1c, + 0x3d, 0xbe, 0x42, 0xf5, 0xc6, 0xa8, 0x30, 0x19, + 0xbe, 0xc3, 0xa3, 0x1, 0x98, 0xc, 0x3d, 0xff, + 0x80, 0xc0, 0x81, 0x80, 0x7f, 0x6d, 0xff, 0x80, + 0xc3, 0xc1, 0x80, 0xc, 0x29, 0xff, 0xc0, 0xe6, + 0xc1, 0x80, 0xf, 0x77, 0x40, 0x0, 0x85, 0xb, + 0xfd, 0x0, 0x0, 0x0, 0x0, + + /* U+9875 "页" */ + 0x3f, 0xff, 0xff, 0xc0, 0x3, 0x80, 0x0, 0x0, + 0xd0, 0x0, 0x2f, 0xff, 0xf8, 0x9, 0x0, 0xa, + 0x2, 0x42, 0x82, 0x80, 0x90, 0xa0, 0xa0, 0x24, + 0x34, 0x28, 0x5, 0x1f, 0x45, 0x0, 0x1d, 0x7d, + 0x1, 0xbd, 0x2, 0xf4, 0xe4, 0x0, 0xa, 0x0, + 0x0, 0x0, 0x0 +}; + + +/*--------------------- + * GLYPH DESCRIPTION + *--------------------*/ + +static const lv_font_fmt_txt_glyph_dsc_t glyph_dsc[] = { + {.bitmap_index = 0, .adv_w = 0, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0} /* id = 0 reserved */, + {.bitmap_index = 0, .adv_w = 60, .box_w = 0, .box_h = 0, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 0, .adv_w = 53, .box_w = 3, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 9, .adv_w = 77, .box_w = 5, .box_h = 4, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 14, .adv_w = 144, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 39, .adv_w = 128, .box_w = 8, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 69, .adv_w = 173, .box_w = 11, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 100, .adv_w = 158, .box_w = 11, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 133, .adv_w = 42, .box_w = 2, .box_h = 4, .ofs_x = 0, .ofs_y = 8}, + {.bitmap_index = 135, .adv_w = 77, .box_w = 5, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 153, .adv_w = 77, .box_w = 4, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 167, .adv_w = 96, .box_w = 6, .box_h = 6, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 176, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 2}, + {.bitmap_index = 192, .adv_w = 54, .box_w = 3, .box_h = 5, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 196, .adv_w = 109, .box_w = 6, .box_h = 2, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 199, .adv_w = 52, .box_w = 3, .box_h = 2, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 201, .adv_w = 87, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 218, .adv_w = 128, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 240, .adv_w = 128, .box_w = 5, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 254, .adv_w = 128, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 276, .adv_w = 128, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 298, .adv_w = 128, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 320, .adv_w = 128, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 342, .adv_w = 128, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 364, .adv_w = 128, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 386, .adv_w = 128, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 408, .adv_w = 128, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 430, .adv_w = 57, .box_w = 2, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 434, .adv_w = 59, .box_w = 3, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 443, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 459, .adv_w = 128, .box_w = 8, .box_h = 5, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 469, .adv_w = 128, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 1}, + {.bitmap_index = 485, .adv_w = 97, .box_w = 7, .box_h = 13, .ofs_x = -1, .ofs_y = 0}, + {.bitmap_index = 508, .adv_w = 218, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 557, .adv_w = 149, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 585, .adv_w = 146, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 607, .adv_w = 146, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 632, .adv_w = 160, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 657, .adv_w = 134, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 677, .adv_w = 127, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 697, .adv_w = 157, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 725, .adv_w = 167, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 750, .adv_w = 59, .box_w = 2, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 756, .adv_w = 102, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 773, .adv_w = 152, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 798, .adv_w = 127, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 818, .adv_w = 194, .box_w = 10, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 846, .adv_w = 166, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 871, .adv_w = 171, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 899, .adv_w = 133, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 919, .adv_w = 171, .box_w = 11, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 955, .adv_w = 144, .box_w = 8, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 977, .adv_w = 128, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 999, .adv_w = 127, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1021, .adv_w = 164, .box_w = 9, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1046, .adv_w = 147, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1074, .adv_w = 216, .box_w = 14, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1113, .adv_w = 147, .box_w = 10, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1141, .adv_w = 138, .box_w = 9, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1166, .adv_w = 129, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1188, .adv_w = 77, .box_w = 4, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 1203, .adv_w = 87, .box_w = 6, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1220, .adv_w = 77, .box_w = 4, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1235, .adv_w = 106, .box_w = 7, .box_h = 6, .ofs_x = 0, .ofs_y = 5}, + {.bitmap_index = 1246, .adv_w = 93, .box_w = 6, .box_h = 2, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1249, .adv_w = 68, .box_w = 4, .box_h = 3, .ofs_x = 0, .ofs_y = 9}, + {.bitmap_index = 1252, .adv_w = 122, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1266, .adv_w = 136, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1286, .adv_w = 110, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1300, .adv_w = 136, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1322, .adv_w = 123, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1338, .adv_w = 77, .box_w = 6, .box_h = 12, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1356, .adv_w = 136, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1378, .adv_w = 130, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1398, .adv_w = 54, .box_w = 3, .box_h = 11, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1407, .adv_w = 54, .box_w = 5, .box_h = 14, .ofs_x = -2, .ofs_y = -3}, + {.bitmap_index = 1425, .adv_w = 117, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1445, .adv_w = 54, .box_w = 2, .box_h = 11, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1451, .adv_w = 191, .box_w = 10, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1471, .adv_w = 130, .box_w = 7, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1485, .adv_w = 132, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1501, .adv_w = 136, .box_w = 7, .box_h = 11, .ofs_x = 1, .ofs_y = -3}, + {.bitmap_index = 1521, .adv_w = 136, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1543, .adv_w = 84, .box_w = 5, .box_h = 8, .ofs_x = 1, .ofs_y = 0}, + {.bitmap_index = 1553, .adv_w = 102, .box_w = 6, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1565, .adv_w = 82, .box_w = 6, .box_h = 10, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1580, .adv_w = 130, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1596, .adv_w = 115, .box_w = 8, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1612, .adv_w = 174, .box_w = 11, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1634, .adv_w = 111, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1648, .adv_w = 116, .box_w = 8, .box_h = 11, .ofs_x = 0, .ofs_y = -3}, + {.bitmap_index = 1670, .adv_w = 106, .box_w = 7, .box_h = 8, .ofs_x = 0, .ofs_y = 0}, + {.bitmap_index = 1684, .adv_w = 83, .box_w = 5, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1703, .adv_w = 41, .box_w = 2, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1710, .adv_w = 83, .box_w = 5, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 1729, .adv_w = 128, .box_w = 8, .box_h = 4, .ofs_x = 0, .ofs_y = 3}, + {.bitmap_index = 1737, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1783, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1825, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1871, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1917, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 1959, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2005, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2054, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2100, .adv_w = 224, .box_w = 12, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 2142, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2191, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2237, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2286, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2335, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2377, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 2426, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 2465, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2511, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2557, .adv_w = 224, .box_w = 12, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 2602, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2644, .adv_w = 224, .box_w = 12, .box_h = 12, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 2680, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2726, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2772, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2821, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2867, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2913, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 2959, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3008, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3061, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3107, .adv_w = 224, .box_w = 12, .box_h = 13, .ofs_x = 1, .ofs_y = -1}, + {.bitmap_index = 3146, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3192, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3241, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3294, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3337, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3390, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3436, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3482, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3535, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3584, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3637, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3690, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3739, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3788, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3841, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3887, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 3936, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 3982, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4024, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4070, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4119, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4168, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4217, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4263, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 4309, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4358, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4407, .adv_w = 224, .box_w = 13, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4456, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4505, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4551, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4600, .adv_w = 224, .box_w = 14, .box_h = 12, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4642, .adv_w = 224, .box_w = 13, .box_h = 15, .ofs_x = 1, .ofs_y = -2}, + {.bitmap_index = 4691, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4737, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4790, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4839, .adv_w = 224, .box_w = 13, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4885, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 4934, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 4983, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5029, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5075, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5128, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5177, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5226, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5275, .adv_w = 224, .box_w = 14, .box_h = 13, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5321, .adv_w = 224, .box_w = 14, .box_h = 14, .ofs_x = 0, .ofs_y = -1}, + {.bitmap_index = 5370, .adv_w = 224, .box_w = 14, .box_h = 15, .ofs_x = 0, .ofs_y = -2}, + {.bitmap_index = 5423, .adv_w = 224, .box_w = 13, .box_h = 13, .ofs_x = 0, .ofs_y = -2} +}; + +/*--------------------- + * CHARACTER MAPPING + *--------------------*/ + +static const uint16_t unicode_list_1[] = { + 0x0, 0x1, 0x18, 0x31, 0x87, 0x149, 0x29e, 0x35b, + 0x37b, 0x3bc, 0x41a, 0x443, 0x54b, 0x581, 0x5c7, 0x5d9, + 0x5e6, 0x5e9, 0x607, 0x85e, 0x8d4, 0x91e, 0xafd, 0xb0c, + 0xb27, 0xd4d, 0xd4e, 0xdfa, 0xe27, 0xfdc, 0x102e, 0x1089, + 0x108b, 0x109c, 0x1149, 0x11f7, 0x121d, 0x12bb, 0x1406, 0x149b, + 0x14ff, 0x159b, 0x159d, 0x163d, 0x17af, 0x1920, 0x1930, 0x193c, + 0x1d59, 0x1e56, 0x201f, 0x2086, 0x24ac, 0x2715, 0x272b, 0x28c7, + 0x28ce, 0x2a64, 0x2bb1, 0x30b5, 0x30e0, 0x3164, 0x32f3, 0x35d2, + 0x3ab7, 0x3bbc, 0x3bbf, 0x3d5c, 0x3d9a, 0x3ddc, 0x3de5, 0x3f3a, + 0x41ca, 0x41d1, 0x425b, 0x42de, 0x470f, 0x4724, 0x4a6b +}; + +/*Collect the unicode lists and glyph_id offsets*/ +static const lv_font_fmt_txt_cmap_t cmaps[] = +{ + { + .range_start = 32, .range_length = 95, .glyph_id_start = 1, + .unicode_list = NULL, .glyph_id_ofs_list = NULL, .list_length = 0, .type = LV_FONT_FMT_TXT_CMAP_FORMAT0_TINY + }, + { + .range_start = 19978, .range_length = 19052, .glyph_id_start = 96, + .unicode_list = unicode_list_1, .glyph_id_ofs_list = NULL, .list_length = 79, .type = LV_FONT_FMT_TXT_CMAP_SPARSE_TINY + } +}; + + + +/*-------------------- + * ALL CUSTOM DATA + *--------------------*/ + +#if LVGL_VERSION_MAJOR == 8 +/*Store all the custom data of the font*/ +static lv_font_fmt_txt_glyph_cache_t cache; +#endif + +#if LVGL_VERSION_MAJOR >= 8 +static const lv_font_fmt_txt_dsc_t font_dsc = { +#else +static lv_font_fmt_txt_dsc_t font_dsc = { +#endif + .glyph_bitmap = glyph_bitmap, + .glyph_dsc = glyph_dsc, + .cmaps = cmaps, + .kern_dsc = NULL, + .kern_scale = 0, + .cmap_num = 2, + .bpp = 2, + .kern_classes = 0, + .bitmap_format = 0, +#if LVGL_VERSION_MAJOR == 8 + .cache = &cache +#endif +}; + + + +/*----------------- + * PUBLIC FONT + *----------------*/ + +/*Initialize a public general font descriptor*/ +#if LVGL_VERSION_MAJOR >= 8 +const lv_font_t prts_font_14 = { +#else +lv_font_t prts_font_14 = { +#endif + .get_glyph_dsc = lv_font_get_glyph_dsc_fmt_txt, /*Function pointer to get glyph's data*/ + .get_glyph_bitmap = lv_font_get_bitmap_fmt_txt, /*Function pointer to get glyph's bitmap*/ + .line_height = 16, /*The maximum line height required by the font*/ + .base_line = 3, /*Baseline measured from the bottom of the line*/ +#if !(LVGL_VERSION_MAJOR == 6 && LVGL_VERSION_MINOR == 0) + .subpx = LV_FONT_SUBPX_NONE, +#endif +#if LV_VERSION_CHECK(7, 4, 0) || LVGL_VERSION_MAJOR >= 8 + .underline_position = -1, + .underline_thickness = 1, +#endif + .dsc = &font_dsc, /*The custom font data. Will be accessed by `get_glyph_bitmap/dsc` */ +#if LV_VERSION_CHECK(8, 2, 0) || LVGL_VERSION_MAJOR >= 9 + .fallback = NULL, +#endif + .user_data = NULL, +}; + + + +#endif /*#if PRTS_FONT_14*/ + diff --git a/User_Code/module/software/prts/lvgl/lv_conf.h b/User_Code/module/software/prts/lvgl/lv_conf.h index a3de13c..8c7032f 100644 --- a/User_Code/module/software/prts/lvgl/lv_conf.h +++ b/User_Code/module/software/prts/lvgl/lv_conf.h @@ -69,7 +69,7 @@ #if LV_USE_STDLIB_MALLOC == LV_STDLIB_BUILTIN /** Size of memory available for `lv_malloc()` in bytes (>= 2kB) */ - #define LV_MEM_SIZE (32 * 1024U) /**< [bytes] */ + #define LV_MEM_SIZE (80 * 1024U) /**< [bytes] */ /** Size of the memory expand for `lv_malloc()` in bytes */ #define LV_MEM_POOL_EXPAND_SIZE 0 @@ -107,7 +107,7 @@ * - LV_OS_MQX * - LV_OS_SDL2 * - LV_OS_CUSTOM */ -#define LV_USE_OS LV_OS_NONE +#define LV_USE_OS LV_OS_FREERTOS #if LV_USE_OS == LV_OS_CUSTOM #define LV_OS_CUSTOM_INCLUDE @@ -203,7 +203,7 @@ /** * - 0: Use a simple renderer capable of drawing only simple rectangles with gradient, images, text, and straight lines only. * - 1: Use a complex renderer capable of drawing rounded corners, shadow, skew lines, and arcs too. */ - #define LV_DRAW_SW_COMPLEX 0 +#define LV_DRAW_SW_COMPLEX 1 #if LV_DRAW_SW_COMPLEX == 1 /** Allow buffering some shadow calculation. @@ -691,10 +691,10 @@ * #define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(my_font_1) LV_FONT_DECLARE(my_font_2) * @endcode */ -#define LV_FONT_CUSTOM_DECLARE +#define LV_FONT_CUSTOM_DECLARE LV_FONT_DECLARE(prts_font_14) /** Always set a default font */ -#define LV_FONT_DEFAULT &lv_font_montserrat_14 +#define LV_FONT_DEFAULT &prts_font_14 /** Enable handling large font and/or fonts with a lot of characters. * The limit depends on the font size, font face and bpp. @@ -1096,7 +1096,7 @@ #define LV_USE_SNAPSHOT 0 /** 1: Enable system monitor component */ -#define LV_USE_SYSMON 0 +#define LV_USE_SYSMON 1 #if LV_USE_SYSMON /** Get the idle percentage. E.g. uint32_t my_get_idle(void); */ #define LV_SYSMON_GET_IDLE lv_os_get_idle_percent diff --git a/User_Code/module/software/prts/port/prts_lvgl_port.c b/User_Code/module/software/prts/port/prts_lvgl_port.c index dab7e15..a967d9a 100644 --- a/User_Code/module/software/prts/port/prts_lvgl_port.c +++ b/User_Code/module/software/prts/port/prts_lvgl_port.c @@ -7,11 +7,12 @@ #include #include -#define PRTS_LVGL_BUF_LINES 40U +#define PRTS_LVGL_BUF_LINES 64U #define PRTS_DMA_BUFFER_ATTR __attribute__((section(".dma_buffer"), aligned(32))) static lv_display_t *prts_display = NULL; static uint8_t prts_lvgl_buf[TFT_LCD_W * PRTS_LVGL_BUF_LINES * 2U] PRTS_DMA_BUFFER_ATTR; +static volatile uint32_t prts_lvgl_frame_count = 0U; static uint32_t prts_lvgl_tick_get(void) { @@ -30,6 +31,10 @@ static void prts_lvgl_flush(lv_display_t *disp, const lv_area_t *area, uint8_t * if (area->x2 < 0 || area->y2 < 0 || area->x1 >= (int32_t) TFT_LCD_W || area->y1 >= (int32_t) TFT_LCD_H) { + if (lv_display_flush_is_last(disp)) + { + prts_lvgl_frame_count++; + } lv_display_flush_ready(disp); return; } @@ -38,6 +43,10 @@ static void prts_lvgl_flush(lv_display_t *disp, const lv_area_t *area, uint8_t * area_height = lv_area_get_height(area); if (area_width <= 0 || area_height <= 0) { + if (lv_display_flush_is_last(disp)) + { + prts_lvgl_frame_count++; + } lv_display_flush_ready(disp); return; } @@ -72,9 +81,18 @@ static void prts_lvgl_flush(lv_display_t *disp, const lv_area_t *area, uint8_t * } } + if (lv_display_flush_is_last(disp)) + { + prts_lvgl_frame_count++; + } lv_display_flush_ready(disp); } +uint32_t PRTS_LVGLPortGetFrameCount(void) +{ + return prts_lvgl_frame_count; +} + bool PRTS_LVGLPortInit(void) { if (prts_display != NULL) diff --git a/User_Code/module/software/prts/port/prts_lvgl_port.h b/User_Code/module/software/prts/port/prts_lvgl_port.h index e0a6a9f..618ae08 100644 --- a/User_Code/module/software/prts/port/prts_lvgl_port.h +++ b/User_Code/module/software/prts/port/prts_lvgl_port.h @@ -2,12 +2,14 @@ #define PRTS_LVGL_PORT_H #include +#include #ifdef __cplusplus extern "C" { #endif bool PRTS_LVGLPortInit(void); +uint32_t PRTS_LVGLPortGetFrameCount(void); #ifdef __cplusplus } diff --git a/User_Code/module/software/prts/prts.c b/User_Code/module/software/prts/prts.c index a1e92fe..cee527a 100644 --- a/User_Code/module/software/prts/prts.c +++ b/User_Code/module/software/prts/prts.c @@ -1,23 +1,96 @@ #include "prts.h" +#include "bsp_adc.h" #include "lvgl.h" +#include "main.h" #include "prts_lvgl_port.h" +#include "src/debugging/sysmon/lv_sysmon.h" #include #include +#include #include +#include -#define PRTS_CARD_BG_COLOR 0x0E1B24 -#define PRTS_VALUE_BG_COLOR 0x132530 -#define PRTS_VALUE_PANEL_WIDTH 228 -#define PRTS_VALUE_PANEL_HEIGHT 34 -#define PRTS_VALUE_LABEL_WIDTH 210 -#define PRTS_VALUE_LABEL_HEIGHT 28 -#define PRTS_VALUE_LABEL_X 12 -#define PRTS_VALUE_LABEL_Y 4 -#define PRTS_VALUE_ACCENT_WIDTH 4 +#define PRTS_SCREEN_W 280 +#define PRTS_SCREEN_H 240 +#define PRTS_STATUS_H 30 +#define PRTS_HINT_H 24 +#define PRTS_CONTENT_H (PRTS_SCREEN_H - PRTS_STATUS_H - PRTS_HINT_H) + +#define PRTS_CARD_W 130 +#define PRTS_CARD_H 140 +#define PRTS_CARD_GAP 15 +#define PRTS_CARD_PAD_HOR 75 +#define PRTS_DOT_SIZE_NORMAL 8 +#define PRTS_DOT_SIZE_ACTIVE 12 +#define PRTS_MENU_CARD_COUNT 3U + +#define PRTS_VALUE_PANEL_WIDTH 228 +#define PRTS_VALUE_PANEL_HEIGHT 34 +#define PRTS_VALUE_ACCENT_WIDTH 4 +#define PRTS_VALUE_BG_COLOR 0x132530 + +#define PRTS_JOY_DEBOUNCE_MS 25U +#define PRTS_JOY_LONG_PRESS_MS 700U +#define PRTS_MONITOR_UPDATE_MS 150U +#define PRTS_SCREEN_ANIM_MS 140U + +typedef enum +{ + PRTS_PAGE_MAIN = 0, + PRTS_PAGE_STATUS, + PRTS_PAGE_MONITOR, + PRTS_PAGE_ASSETS +} PRTS_Page_t; + +typedef enum +{ + PRTS_JOY_NONE = 0, + PRTS_JOY_ENTER, + PRTS_JOY_UP, + PRTS_JOY_DOWN, + PRTS_JOY_LEFT, + PRTS_JOY_RIGHT +} PRTS_JoyKey_t; + +typedef struct +{ + const char *title; + const char *subtitle; + const char *hint; + uint32_t color; + PRTS_Page_t page; +} PRTS_MenuCard_t; + +static const PRTS_MenuCard_t prts_menu_cards_data[PRTS_MENU_CARD_COUNT] = { + {"状态", "温度 / 遥控", "STATUS", 0x40C4FF, PRTS_PAGE_STATUS}, + {"监视", "摇杆 / 性能", "MONITOR", 0xFFD666, PRTS_PAGE_MONITOR}, + {"资源", "字体 / 存储", "ASSETS", 0x25D366, PRTS_PAGE_ASSETS}, +}; static bool prts_initialized = false; static bool prts_lvgl_initialized = false; + +static lv_group_t *prts_key_group = NULL; +static lv_indev_t *prts_key_indev = NULL; + +static lv_style_t prts_style_card_normal; +static lv_style_t prts_style_card_focused; +static lv_style_t prts_style_title_text; +static lv_style_transition_dsc_t prts_card_transition; +static bool prts_styles_ready = false; + +static lv_obj_t *prts_main_screen = NULL; +static lv_obj_t *prts_status_screen = NULL; +static lv_obj_t *prts_monitor_screen = NULL; +static lv_obj_t *prts_assets_screen = NULL; + +static lv_obj_t *prts_main_status_title = NULL; +static lv_obj_t *prts_menu_cards[PRTS_MENU_CARD_COUNT] = {NULL}; +static lv_obj_t *prts_menu_dots[PRTS_MENU_CARD_COUNT] = {NULL}; +static lv_obj_t *prts_menu_status_value = NULL; +static lv_obj_t *prts_menu_monitor_value = NULL; + static lv_obj_t *prts_temperature_panel = NULL; static lv_obj_t *prts_temperature_label = NULL; static lv_obj_t *prts_temperature_accent = NULL; @@ -25,8 +98,39 @@ static lv_obj_t *prts_mode_panel = NULL; static lv_obj_t *prts_mode_label = NULL; static lv_obj_t *prts_mode_accent = NULL; static lv_obj_t *prts_status_bar = NULL; + +static lv_obj_t *prts_adc0_label = NULL; +static lv_obj_t *prts_adc1_label = NULL; +static lv_obj_t *prts_joy12_label = NULL; +static lv_obj_t *prts_joy_key_label = NULL; +static lv_obj_t *prts_joy_voltage_label = NULL; + +static uint8_t prts_current_card = 0U; +static PRTS_Page_t prts_current_page = PRTS_PAGE_MAIN; static int16_t prts_last_temperature_tenths = INT16_MIN; static RobotMode_t prts_last_mode = (RobotMode_t) 0xFF; +static uint32_t prts_last_monitor_update_ms = 0U; + +static const lv_font_t *prts_font(void) +{ + return &prts_font_14; +} + +static void prts_label_set_text_if_changed(lv_obj_t *label, const char *text) +{ + const char *old_text; + + if (label == NULL || text == NULL) + { + return; + } + + old_text = lv_label_get_text(label); + if (old_text == NULL || strcmp(old_text, text) != 0) + { + lv_label_set_text(label, text); + } +} static int16_t prts_temperature_to_tenths(float temperature_c) { @@ -115,10 +219,250 @@ static lv_color_t prts_robot_mode_text_color(RobotMode_t mode) } } +static const char *prts_joy_key_text(PRTS_JoyKey_t key) +{ + switch (key) + { + case PRTS_JOY_ENTER: + return "ENTER"; + case PRTS_JOY_UP: + return "UP"; + case PRTS_JOY_DOWN: + return "DOWN"; + case PRTS_JOY_LEFT: + return "LEFT"; + case PRTS_JOY_RIGHT: + return "RIGHT"; + case PRTS_JOY_NONE: + default: + return "NONE"; + } +} + +static PRTS_JoyKey_t prts_joy_from_adc12(uint16_t raw12) +{ + if (raw12 > 3800U) + { + return PRTS_JOY_NONE; + } + if (raw12 < 200U) + { + return PRTS_JOY_ENTER; + } + if (raw12 > 600U && raw12 < 1050U) + { + return PRTS_JOY_DOWN; + } + if (raw12 > 1400U && raw12 < 1850U) + { + return PRTS_JOY_UP; + } + if (raw12 > 2200U && raw12 < 2700U) + { + return PRTS_JOY_LEFT; + } + if (raw12 > 3000U && raw12 < 3500U) + { + return PRTS_JOY_RIGHT; + } + return PRTS_JOY_NONE; +} + +static void prts_keypad_read_cb(lv_indev_t *indev, lv_indev_data_t *data) +{ + static PRTS_JoyKey_t candidate_key = PRTS_JOY_NONE; + static PRTS_JoyKey_t stable_key = PRTS_JOY_NONE; + static uint32_t candidate_since_ms = 0U; + static uint32_t stable_since_ms = 0U; + static uint32_t last_lv_key = 0U; + uint32_t now_ms = HAL_GetTick(); + PRTS_JoyKey_t raw_key = prts_joy_from_adc12(BSP_ADC_GetJoystickRaw12()); + + (void) indev; + + if (raw_key != candidate_key) + { + candidate_key = raw_key; + candidate_since_ms = now_ms; + } + + if (stable_key != candidate_key && (now_ms - candidate_since_ms) >= PRTS_JOY_DEBOUNCE_MS) + { + stable_key = candidate_key; + stable_since_ms = now_ms; + } + + if (stable_key == PRTS_JOY_NONE) + { + data->state = LV_INDEV_STATE_RELEASED; + data->key = last_lv_key; + return; + } + + switch (stable_key) + { + case PRTS_JOY_ENTER: + last_lv_key = LV_KEY_ENTER; + break; + case PRTS_JOY_UP: + last_lv_key = LV_KEY_UP; + break; + case PRTS_JOY_DOWN: + last_lv_key = LV_KEY_DOWN; + break; + case PRTS_JOY_LEFT: + if (prts_current_page == PRTS_PAGE_MAIN) + { + last_lv_key = LV_KEY_PREV; + } + else + { + last_lv_key = ((now_ms - stable_since_ms) >= PRTS_JOY_LONG_PRESS_MS) ? LV_KEY_ESC : LV_KEY_LEFT; + } + break; + case PRTS_JOY_RIGHT: + last_lv_key = (prts_current_page == PRTS_PAGE_MAIN) ? LV_KEY_NEXT : LV_KEY_RIGHT; + break; + case PRTS_JOY_NONE: + default: + break; + } + + data->state = LV_INDEV_STATE_PRESSED; + data->key = last_lv_key; +} + +static void prts_init_styles(void) +{ + static const lv_style_prop_t card_transition_props[] = { + LV_STYLE_BG_COLOR, + LV_STYLE_BORDER_COLOR, + LV_STYLE_BORDER_WIDTH, + LV_STYLE_TRANSFORM_WIDTH, + LV_STYLE_TRANSFORM_HEIGHT, + LV_STYLE_SHADOW_OPA, + 0 + }; + + if (prts_styles_ready) + { + return; + } + + lv_style_transition_dsc_init(&prts_card_transition, + card_transition_props, + lv_anim_path_ease_out, + 120, + 0, + NULL); + + lv_style_init(&prts_style_card_normal); + lv_style_set_bg_color(&prts_style_card_normal, lv_color_hex(0x2C2C2E)); + lv_style_set_radius(&prts_style_card_normal, 8); + lv_style_set_border_width(&prts_style_card_normal, 0); + lv_style_set_pad_all(&prts_style_card_normal, 10); + lv_style_set_text_font(&prts_style_card_normal, prts_font()); + lv_style_set_text_color(&prts_style_card_normal, lv_color_hex(0xEBEBF5)); + lv_style_set_transform_width(&prts_style_card_normal, 0); + lv_style_set_transform_height(&prts_style_card_normal, 0); + lv_style_set_shadow_width(&prts_style_card_normal, 0); + lv_style_set_shadow_opa(&prts_style_card_normal, LV_OPA_0); + lv_style_set_transition(&prts_style_card_normal, &prts_card_transition); + + lv_style_init(&prts_style_card_focused); + lv_style_set_bg_color(&prts_style_card_focused, lv_color_hex(0x3A3A3C)); + lv_style_set_border_color(&prts_style_card_focused, lv_color_hex(0x0A84FF)); + lv_style_set_border_width(&prts_style_card_focused, 2); + lv_style_set_transform_width(&prts_style_card_focused, 4); + lv_style_set_transform_height(&prts_style_card_focused, 3); + lv_style_set_shadow_width(&prts_style_card_focused, 0); + lv_style_set_shadow_color(&prts_style_card_focused, lv_color_hex(0x0A84FF)); + lv_style_set_shadow_opa(&prts_style_card_focused, LV_OPA_0); + lv_style_set_transition(&prts_style_card_focused, &prts_card_transition); + + lv_style_init(&prts_style_title_text); + lv_style_set_text_color(&prts_style_title_text, lv_color_hex(0xEBEBF5)); + lv_style_set_text_font(&prts_style_title_text, prts_font()); + + prts_styles_ready = true; +} + +static void prts_create_keypad(void) +{ + if (prts_key_indev != NULL) + { + return; + } + + prts_key_indev = lv_indev_create(); + lv_indev_set_type(prts_key_indev, LV_INDEV_TYPE_KEYPAD); + lv_indev_set_read_cb(prts_key_indev, prts_keypad_read_cb); + + prts_key_group = lv_group_create(); + lv_indev_set_group(prts_key_indev, prts_key_group); + lv_group_set_default(prts_key_group); +} + static void prts_style_label(lv_obj_t *label, lv_color_t color) { - lv_obj_set_style_bg_opa(label, LV_OPA_TRANSP, 0); + lv_obj_set_style_text_font(label, prts_font(), 0); lv_obj_set_style_text_color(label, color, 0); + lv_obj_set_style_text_opa(label, LV_OPA_COVER, 0); + lv_obj_set_style_bg_opa(label, LV_OPA_TRANSP, 0); +} + +static lv_obj_t *prts_create_bar(lv_obj_t *parent, const char *hint) +{ + lv_obj_t *bar = lv_obj_create(parent); + lv_obj_t *label; + + lv_obj_set_size(bar, PRTS_SCREEN_W, PRTS_HINT_H); + lv_obj_align(bar, LV_ALIGN_BOTTOM_MID, 0, 0); + lv_obj_set_style_bg_color(bar, lv_color_hex(0x111111), 0); + lv_obj_set_style_border_width(bar, 0, 0); + lv_obj_set_style_radius(bar, 0, 0); + lv_obj_set_style_pad_all(bar, 0, 0); + lv_obj_remove_flag(bar, LV_OBJ_FLAG_SCROLLABLE); + + label = lv_label_create(bar); + lv_label_set_text(label, hint); + lv_obj_add_style(label, &prts_style_title_text, 0); + lv_obj_center(label); + + return bar; +} + +static lv_obj_t *prts_create_status_bar(lv_obj_t *parent, const char *title_text) +{ + lv_obj_t *bar = lv_obj_create(parent); + lv_obj_t *brand; + lv_obj_t *title; + + lv_obj_set_size(bar, PRTS_SCREEN_W, PRTS_STATUS_H); + lv_obj_align(bar, LV_ALIGN_TOP_MID, 0, 0); + lv_obj_set_style_bg_color(bar, lv_color_hex(0x111111), 0); + lv_obj_set_style_border_width(bar, 0, 0); + lv_obj_set_style_radius(bar, 0, 0); + lv_obj_set_style_pad_all(bar, 0, 0); + lv_obj_remove_flag(bar, LV_OBJ_FLAG_SCROLLABLE); + + brand = lv_label_create(bar); + lv_label_set_text(brand, "PRTS"); + prts_style_label(brand, lv_color_hex(0x6EE7F9)); + lv_obj_set_pos(brand, 10, 6); + + title = lv_label_create(bar); + lv_label_set_text(title, title_text); + prts_style_label(title, lv_color_hex(0xEBEBF5)); + lv_obj_set_pos(title, 74, 6); + lv_obj_set_size(title, 130, 18); + + if (parent == prts_main_screen) + { + prts_main_status_title = title; + } + + return bar; } static lv_obj_t *prts_create_value_panel(lv_obj_t *parent, int32_t x, int32_t y) @@ -149,16 +493,232 @@ static lv_obj_t *prts_create_value_accent(lv_obj_t *parent, lv_color_t color) return accent; } -static void prts_style_value_label(lv_obj_t *label, lv_color_t color) +static lv_obj_t *prts_create_card_text(lv_obj_t *parent, const char *text, int32_t y, lv_color_t color) { + lv_obj_t *label = lv_label_create(parent); + lv_label_set_text(label, text); lv_label_set_long_mode(label, LV_LABEL_LONG_MODE_CLIP); - lv_obj_set_size(label, PRTS_VALUE_LABEL_WIDTH, PRTS_VALUE_LABEL_HEIGHT); - lv_obj_set_style_radius(label, 0, 0); - lv_obj_set_style_border_width(label, 0, 0); - lv_obj_set_style_pad_all(label, 0, 0); - lv_obj_set_style_bg_opa(label, LV_OPA_TRANSP, 0); - lv_obj_set_style_text_align(label, LV_TEXT_ALIGN_LEFT, 0); - lv_obj_set_style_text_color(label, color, 0); + prts_style_label(label, color); + lv_obj_set_pos(label, 14, y); + lv_obj_set_size(label, PRTS_CARD_W - 30, 20); + return label; +} + +static void prts_update_dots(void) +{ + for (uint8_t i = 0U; i < PRTS_MENU_CARD_COUNT; i++) + { + bool active = (i == prts_current_card); + lv_obj_set_size(prts_menu_dots[i], + active ? PRTS_DOT_SIZE_ACTIVE : PRTS_DOT_SIZE_NORMAL, + active ? PRTS_DOT_SIZE_ACTIVE : PRTS_DOT_SIZE_NORMAL); + lv_obj_set_style_bg_color(prts_menu_dots[i], + active ? lv_color_hex(0xFFFFFF) : lv_color_hex(0x888888), + 0); + lv_obj_set_style_radius(prts_menu_dots[i], LV_RADIUS_CIRCLE, 0); + } + + if (prts_main_status_title != NULL) + { + prts_label_set_text_if_changed(prts_main_status_title, prts_menu_cards_data[prts_current_card].title); + } +} + +static void prts_focus_card(uint8_t index, lv_anim_enable_t anim) +{ + if (index >= PRTS_MENU_CARD_COUNT) + { + return; + } + + prts_current_card = index; + if (prts_key_group != NULL) + { + lv_group_focus_obj(prts_menu_cards[index]); + } + lv_obj_scroll_to_view(prts_menu_cards[index], anim); + prts_update_dots(); +} + +static void prts_show_page(PRTS_Page_t page, lv_screen_load_anim_t anim) +{ + lv_obj_t *screen = prts_main_screen; + + prts_current_page = page; + if (prts_key_group != NULL) + { + lv_group_remove_all_objs(prts_key_group); + } + + switch (page) + { + case PRTS_PAGE_STATUS: + screen = prts_status_screen; + if (prts_key_group != NULL) lv_group_add_obj(prts_key_group, prts_status_screen); + break; + case PRTS_PAGE_MONITOR: + screen = prts_monitor_screen; + if (prts_key_group != NULL) lv_group_add_obj(prts_key_group, prts_monitor_screen); + break; + case PRTS_PAGE_ASSETS: + screen = prts_assets_screen; + if (prts_key_group != NULL) lv_group_add_obj(prts_key_group, prts_assets_screen); + break; + case PRTS_PAGE_MAIN: + default: + screen = prts_main_screen; + if (prts_key_group != NULL) + { + for (uint8_t i = 0U; i < PRTS_MENU_CARD_COUNT; i++) + { + lv_group_add_obj(prts_key_group, prts_menu_cards[i]); + } + } + break; + } + + if (anim == LV_SCREEN_LOAD_ANIM_NONE || PRTS_SCREEN_ANIM_MS == 0U) + { + lv_screen_load(screen); + } + else + { + lv_screen_load_anim(screen, anim, PRTS_SCREEN_ANIM_MS, 0, false); + } + + if (page == PRTS_PAGE_MAIN) + { + prts_focus_card(prts_current_card, LV_ANIM_ON); + } + else if (prts_key_group != NULL) + { + lv_group_focus_obj(screen); + } +} + +static void prts_page_key_event_cb(lv_event_t *e) +{ + if (lv_event_get_code(e) != LV_EVENT_KEY) + { + return; + } + + if (lv_event_get_key(e) == LV_KEY_ESC) + { + prts_show_page(PRTS_PAGE_MAIN, LV_SCREEN_LOAD_ANIM_OVER_RIGHT); + } +} + +static void prts_card_event_cb(lv_event_t *e) +{ + lv_event_code_t code = lv_event_get_code(e); + lv_obj_t *card = lv_event_get_target_obj(e); + uint32_t index = (uint32_t) lv_event_get_user_data(e); + + if (index >= PRTS_MENU_CARD_COUNT) + { + return; + } + + if (code == LV_EVENT_FOCUSED) + { + prts_current_card = (uint8_t) index; + lv_obj_scroll_to_view(card, LV_ANIM_ON); + prts_update_dots(); + } + else if (code == LV_EVENT_CLICKED) + { + prts_current_card = (uint8_t) index; + prts_show_page(prts_menu_cards_data[index].page, LV_SCREEN_LOAD_ANIM_OVER_LEFT); + } +} + +static void prts_create_main_screen(void) +{ + lv_obj_t *banner; + lv_obj_t *dot_row; + + prts_main_screen = lv_obj_create(NULL); + lv_obj_set_style_bg_color(prts_main_screen, lv_color_hex(0x1A1A1A), 0); + lv_obj_remove_flag(prts_main_screen, LV_OBJ_FLAG_SCROLLABLE); + + prts_create_status_bar(prts_main_screen, "主菜单"); + prts_create_bar(prts_main_screen, "LEFT RIGHT ENTER"); + + banner = lv_obj_create(prts_main_screen); + lv_obj_set_size(banner, PRTS_SCREEN_W, PRTS_CONTENT_H); + lv_obj_align(banner, LV_ALIGN_TOP_MID, 0, PRTS_STATUS_H); + lv_obj_set_style_bg_opa(banner, LV_OPA_TRANSP, 0); + lv_obj_set_style_border_width(banner, 0, 0); + lv_obj_set_style_pad_hor(banner, PRTS_CARD_PAD_HOR, 0); + lv_obj_set_style_pad_column(banner, PRTS_CARD_GAP, 0); + lv_obj_set_scrollbar_mode(banner, LV_SCROLLBAR_MODE_OFF); + lv_obj_set_scroll_dir(banner, LV_DIR_HOR); + lv_obj_set_scroll_snap_x(banner, LV_SCROLL_SNAP_CENTER); + lv_obj_set_flex_flow(banner, LV_FLEX_FLOW_ROW); + lv_obj_set_flex_align(banner, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_START); + + for (uint8_t i = 0U; i < PRTS_MENU_CARD_COUNT; i++) + { + lv_obj_t *card = lv_button_create(banner); + lv_obj_t *accent; + + lv_obj_set_size(card, PRTS_CARD_W, PRTS_CARD_H); + lv_obj_add_style(card, &prts_style_card_normal, 0); + lv_obj_add_style(card, &prts_style_card_focused, LV_STATE_FOCUSED); + lv_obj_remove_flag(card, LV_OBJ_FLAG_SCROLL_ON_FOCUS); + lv_obj_add_event_cb(card, prts_card_event_cb, LV_EVENT_FOCUSED, (void *) (uintptr_t) i); + lv_obj_add_event_cb(card, prts_card_event_cb, LV_EVENT_CLICKED, (void *) (uintptr_t) i); + + accent = lv_obj_create(card); + lv_obj_remove_flag(accent, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_set_pos(accent, 0, 0); + lv_obj_set_size(accent, 4, PRTS_CARD_H - 20); + lv_obj_set_style_radius(accent, 0, 0); + lv_obj_set_style_border_width(accent, 0, 0); + lv_obj_set_style_pad_all(accent, 0, 0); + lv_obj_set_style_bg_color(accent, lv_color_hex(prts_menu_cards_data[i].color), 0); + lv_obj_set_style_bg_opa(accent, LV_OPA_COVER, 0); + + (void) prts_create_card_text(card, prts_menu_cards_data[i].hint, 8, lv_color_hex(prts_menu_cards_data[i].color)); + + (void) prts_create_card_text(card, prts_menu_cards_data[i].title, 42, lv_color_hex(0xFFFFFF)); + (void) prts_create_card_text(card, prts_menu_cards_data[i].subtitle, 70, lv_color_hex(0xD1D1D6)); + + if (i == 0U) + { + prts_menu_status_value = prts_create_card_text(card, "UNKNOWN", 108, lv_color_hex(0xD9D9D9)); + } + else if (i == 1U) + { + prts_menu_monitor_value = prts_create_card_text(card, "ADC --", 108, lv_color_hex(0xFFD666)); + } + + prts_menu_cards[i] = card; + } + + dot_row = lv_obj_create(prts_main_screen); + lv_obj_remove_style_all(dot_row); + lv_obj_set_size(dot_row, LV_SIZE_CONTENT, LV_SIZE_CONTENT); + lv_obj_set_flex_flow(dot_row, LV_FLEX_FLOW_ROW); + lv_obj_set_flex_align(dot_row, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + lv_obj_align(dot_row, LV_ALIGN_BOTTOM_MID, 0, -PRTS_HINT_H - 2); + + for (uint8_t i = 0U; i < PRTS_MENU_CARD_COUNT; i++) + { + prts_menu_dots[i] = lv_obj_create(dot_row); + lv_obj_remove_style_all(prts_menu_dots[i]); + lv_obj_set_size(prts_menu_dots[i], PRTS_DOT_SIZE_NORMAL, PRTS_DOT_SIZE_NORMAL); + lv_obj_set_style_radius(prts_menu_dots[i], LV_RADIUS_CIRCLE, 0); + lv_obj_set_style_bg_color(prts_menu_dots[i], lv_color_hex(0x888888), 0); + lv_obj_set_style_bg_opa(prts_menu_dots[i], LV_OPA_COVER, 0); + if (i > 0U) + { + lv_obj_set_style_margin_left(prts_menu_dots[i], 10, 0); + } + } + + prts_update_dots(); } static lv_obj_t *prts_create_card(lv_obj_t *parent, int32_t x, int32_t y, int32_t w, int32_t h) @@ -167,10 +727,9 @@ static lv_obj_t *prts_create_card(lv_obj_t *parent, int32_t x, int32_t y, int32_ lv_obj_remove_flag(card, LV_OBJ_FLAG_SCROLLABLE); lv_obj_set_pos(card, x, y); lv_obj_set_size(card, w, h); - lv_obj_set_style_radius(card, 4, 0); - lv_obj_set_style_border_width(card, 1, 0); - lv_obj_set_style_border_color(card, lv_color_hex(0x27475A), 0); - lv_obj_set_style_bg_color(card, lv_color_hex(PRTS_CARD_BG_COLOR), 0); + lv_obj_set_style_radius(card, 6, 0); + lv_obj_set_style_border_width(card, 0, 0); + lv_obj_set_style_bg_color(card, lv_color_hex(0x20262D), 0); lv_obj_set_style_bg_opa(card, LV_OPA_COVER, 0); lv_obj_set_style_pad_all(card, 10, 0); return card; @@ -178,64 +737,123 @@ static lv_obj_t *prts_create_card(lv_obj_t *parent, int32_t x, int32_t y, int32_ static void prts_create_status_screen(void) { - lv_obj_t *screen = lv_obj_create(NULL); - lv_obj_t *title; - lv_obj_t *subtitle; lv_obj_t *temp_card; lv_obj_t *mode_card; lv_obj_t *caption; - lv_obj_remove_flag(screen, LV_OBJ_FLAG_SCROLLABLE); - lv_obj_set_style_bg_color(screen, lv_color_hex(0x071016), 0); - lv_obj_set_style_bg_opa(screen, LV_OPA_COVER, 0); - lv_obj_set_style_pad_all(screen, 0, 0); + prts_status_screen = lv_obj_create(NULL); + lv_obj_set_style_bg_color(prts_status_screen, lv_color_hex(0x1A1A1A), 0); + lv_obj_remove_flag(prts_status_screen, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_add_event_cb(prts_status_screen, prts_page_key_event_cb, LV_EVENT_KEY, NULL); - title = lv_label_create(screen); - lv_label_set_text(title, "PRTS"); - prts_style_label(title, lv_color_hex(0x6EE7F9)); - lv_obj_set_pos(title, 16, 12); + prts_create_status_bar(prts_status_screen, "状态详情"); + prts_create_bar(prts_status_screen, "HOLD LEFT 返回"); - subtitle = lv_label_create(screen); - lv_label_set_text(subtitle, "PORTABLE RM TELEMETRY"); - prts_style_label(subtitle, lv_color_hex(0xB5C8D5)); - lv_obj_set_pos(subtitle, 16, 34); - - prts_status_bar = lv_obj_create(screen); - lv_obj_remove_flag(prts_status_bar, LV_OBJ_FLAG_SCROLLABLE); - lv_obj_set_pos(prts_status_bar, 190, 16); - lv_obj_set_size(prts_status_bar, 74, 8); - lv_obj_set_style_radius(prts_status_bar, 2, 0); - lv_obj_set_style_border_width(prts_status_bar, 0, 0); - lv_obj_set_style_bg_color(prts_status_bar, lv_color_hex(0xD9D9D9), 0); - lv_obj_set_style_bg_opa(prts_status_bar, LV_OPA_COVER, 0); - - temp_card = prts_create_card(screen, 16, 62, 248, 68); + temp_card = prts_create_card(prts_status_screen, 16, 48, 248, 62); caption = lv_label_create(temp_card); lv_label_set_text(caption, "TEMPERATURE"); prts_style_label(caption, lv_color_hex(0xFFD666)); lv_obj_set_pos(caption, 0, 0); - prts_temperature_panel = prts_create_value_panel(temp_card, 0, 25); + prts_temperature_panel = prts_create_value_panel(temp_card, 0, 23); prts_temperature_accent = prts_create_value_accent(prts_temperature_panel, lv_color_hex(0x40C4FF)); prts_temperature_label = lv_label_create(prts_temperature_panel); lv_label_set_text(prts_temperature_label, "--.- C"); - prts_style_value_label(prts_temperature_label, lv_color_hex(0xFFFFFF)); - lv_obj_set_pos(prts_temperature_label, PRTS_VALUE_LABEL_X, PRTS_VALUE_LABEL_Y); + prts_style_label(prts_temperature_label, lv_color_hex(0xFFFFFF)); + lv_obj_set_pos(prts_temperature_label, 12, 7); + lv_obj_set_size(prts_temperature_label, 210, 18); - mode_card = prts_create_card(screen, 16, 146, 248, 68); + mode_card = prts_create_card(prts_status_screen, 16, 124, 248, 62); caption = lv_label_create(mode_card); lv_label_set_text(caption, "CURRENT STATE"); prts_style_label(caption, lv_color_hex(0xFFD666)); lv_obj_set_pos(caption, 0, 0); - prts_mode_panel = prts_create_value_panel(mode_card, 0, 25); + prts_mode_panel = prts_create_value_panel(mode_card, 0, 23); prts_mode_accent = prts_create_value_accent(prts_mode_panel, lv_color_hex(0xD9D9D9)); prts_mode_label = lv_label_create(prts_mode_panel); lv_label_set_text(prts_mode_label, "UNKNOWN"); - prts_style_value_label(prts_mode_label, lv_color_hex(0xD9D9D9)); - lv_obj_set_pos(prts_mode_label, PRTS_VALUE_LABEL_X, PRTS_VALUE_LABEL_Y); + prts_style_label(prts_mode_label, lv_color_hex(0xD9D9D9)); + lv_obj_set_pos(prts_mode_label, 12, 7); + lv_obj_set_size(prts_mode_label, 210, 18); - lv_screen_load(screen); + prts_status_bar = lv_obj_create(prts_status_screen); + lv_obj_remove_flag(prts_status_bar, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_set_pos(prts_status_bar, 222, 11); + lv_obj_set_size(prts_status_bar, 46, 8); + lv_obj_set_style_radius(prts_status_bar, 2, 0); + lv_obj_set_style_border_width(prts_status_bar, 0, 0); + lv_obj_set_style_bg_color(prts_status_bar, lv_color_hex(0xD9D9D9), 0); + lv_obj_set_style_bg_opa(prts_status_bar, LV_OPA_COVER, 0); +} + +static lv_obj_t *prts_create_metric_label(lv_obj_t *parent, const char *text, int32_t x, int32_t y) +{ + lv_obj_t *label = lv_label_create(parent); + lv_label_set_text(label, text); + lv_label_set_long_mode(label, LV_LABEL_LONG_MODE_CLIP); + prts_style_label(label, lv_color_hex(0xEBEBF5)); + lv_obj_set_pos(label, x, y); + lv_obj_set_size(label, 112, 18); + return label; +} + +static void prts_create_monitor_screen(void) +{ + lv_obj_t *card; + lv_obj_t *title; + + prts_monitor_screen = lv_obj_create(NULL); + lv_obj_set_style_bg_color(prts_monitor_screen, lv_color_hex(0x1A1A1A), 0); + lv_obj_remove_flag(prts_monitor_screen, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_add_event_cb(prts_monitor_screen, prts_page_key_event_cb, LV_EVENT_KEY, NULL); + + prts_create_status_bar(prts_monitor_screen, "监视器"); + prts_create_bar(prts_monitor_screen, "HOLD LEFT 返回"); + + card = prts_create_card(prts_monitor_screen, 16, 46, 248, 142); + title = lv_label_create(card); + lv_label_set_text(title, "JOYSTICK ADC"); + prts_style_label(title, lv_color_hex(0x6EE7F9)); + lv_obj_set_pos(title, 0, 0); + + prts_adc0_label = prts_create_metric_label(card, "PC4 0", 0, 32); + prts_adc1_label = prts_create_metric_label(card, "PA5 0", 118, 32); + prts_joy12_label = prts_create_metric_label(card, "12b 0", 0, 66); + prts_joy_key_label = prts_create_metric_label(card, "KEY NONE", 118, 66); + prts_joy_voltage_label = prts_create_metric_label(card, "JOY 0.000 V", 0, 100); + lv_obj_set_size(prts_joy_voltage_label, 224, 18); +} + +static void prts_create_assets_screen(void) +{ + lv_obj_t *card; + lv_obj_t *label; + + prts_assets_screen = lv_obj_create(NULL); + lv_obj_set_style_bg_color(prts_assets_screen, lv_color_hex(0x1A1A1A), 0); + lv_obj_remove_flag(prts_assets_screen, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_add_event_cb(prts_assets_screen, prts_page_key_event_cb, LV_EVENT_KEY, NULL); + + prts_create_status_bar(prts_assets_screen, "资源"); + prts_create_bar(prts_assets_screen, "HOLD LEFT 返回"); + + card = prts_create_card(prts_assets_screen, 16, 46, 248, 142); + label = lv_label_create(card); + lv_label_set_text(label, "字体: PRTS 子集字库\n位置: 内部 Flash\n外置: W25Q64 接口准备\nOSPI: CubeMX 未生成"); + prts_style_label(label, lv_color_hex(0xEBEBF5)); + lv_obj_set_pos(label, 0, 0); + lv_obj_set_size(label, 228, 120); + lv_label_set_long_mode(label, LV_LABEL_LONG_WRAP); +} + +static void prts_create_screens(void) +{ + prts_create_main_screen(); + prts_create_status_screen(); + prts_create_monitor_screen(); + prts_create_assets_screen(); + prts_show_page(PRTS_PAGE_MAIN, LV_SCREEN_LOAD_ANIM_NONE); } bool PRTS_Init(void) @@ -256,7 +874,12 @@ bool PRTS_Init(void) return false; } - prts_create_status_screen(); + BSP_ADC_Init(); + prts_init_styles(); + prts_create_keypad(); + prts_create_screens(); + lv_sysmon_show_performance(lv_display_get_default()); + prts_initialized = true; return true; } @@ -277,7 +900,6 @@ void PRTS_UpdateStatus(float temperature_c, RobotMode_t mode) { bool temperature_warning = temperature_tenths >= 550; prts_format_temperature(temperature_text, sizeof(temperature_text), temperature_tenths); - lv_obj_invalidate(prts_temperature_panel); lv_label_set_text(prts_temperature_label, temperature_text); lv_obj_set_style_bg_color(prts_temperature_accent, temperature_warning ? lv_color_hex(0xFF4D4F) : lv_color_hex(0x40C4FF), @@ -285,23 +907,65 @@ void PRTS_UpdateStatus(float temperature_c, RobotMode_t mode) lv_obj_set_style_text_color(prts_temperature_label, temperature_warning ? lv_color_hex(0xFFE2E2) : lv_color_hex(0xFFFFFF), 0); - lv_obj_invalidate(prts_temperature_panel); prts_last_temperature_tenths = temperature_tenths; } if (mode != prts_last_mode) { mode_color = prts_robot_mode_color(mode); - lv_obj_invalidate(prts_mode_panel); - lv_label_set_text(prts_mode_label, prts_robot_mode_text(mode)); + prts_label_set_text_if_changed(prts_mode_label, prts_robot_mode_text(mode)); lv_obj_set_style_text_color(prts_mode_label, prts_robot_mode_text_color(mode), 0); lv_obj_set_style_bg_color(prts_mode_accent, mode_color, 0); lv_obj_set_style_bg_color(prts_status_bar, mode_color, 0); - lv_obj_invalidate(prts_mode_panel); + prts_label_set_text_if_changed(prts_menu_status_value, prts_robot_mode_text(mode)); + lv_obj_set_style_text_color(prts_menu_status_value, mode_color, 0); prts_last_mode = mode; } } +static void prts_update_monitor(uint32_t now_ms) +{ + uint16_t adc0; + uint16_t adc1; + uint16_t raw12; + PRTS_JoyKey_t key; + char text[32]; + + if ((now_ms - prts_last_monitor_update_ms) < PRTS_MONITOR_UPDATE_MS) + { + return; + } + if (prts_current_page != PRTS_PAGE_MAIN && prts_current_page != PRTS_PAGE_MONITOR) + { + prts_last_monitor_update_ms = now_ms; + return; + } + prts_last_monitor_update_ms = now_ms; + + adc0 = BSP_ADC_GetRaw(BSP_ADC_BOARD_VOLTAGE_INDEX); + adc1 = BSP_ADC_GetJoystickRaw(); + raw12 = (uint16_t) (adc1 >> 4U); + key = prts_joy_from_adc12(raw12); + + (void) snprintf(text, sizeof(text), "PC4 %5u", (unsigned int) adc0); + prts_label_set_text_if_changed(prts_adc0_label, text); + (void) snprintf(text, sizeof(text), "PA5 %5u", (unsigned int) adc1); + prts_label_set_text_if_changed(prts_adc1_label, text); + (void) snprintf(text, sizeof(text), "12b %4u", (unsigned int) raw12); + prts_label_set_text_if_changed(prts_joy12_label, text); + (void) snprintf(text, sizeof(text), "KEY %s", prts_joy_key_text(key)); + prts_label_set_text_if_changed(prts_joy_key_label, text); + (void) snprintf(text, + sizeof(text), + "JOY %u.%03u V", + (unsigned int) ((((uint32_t) adc1) * 3300U / 65535U) / 1000U), + (unsigned int) ((((uint32_t) adc1) * 3300U / 65535U) % 1000U)); + prts_label_set_text_if_changed(prts_joy_voltage_label, text); + + (void) snprintf(text, sizeof(text), "PA5 %4u", (unsigned int) raw12); + prts_label_set_text_if_changed(prts_menu_monitor_value, text); +} + uint32_t PRTS_Task(void) { uint32_t next_ms; @@ -311,10 +975,16 @@ uint32_t PRTS_Task(void) return 10U; } + prts_update_monitor(HAL_GetTick()); + next_ms = lv_timer_handler(); - if (next_ms == 0U || next_ms > 10U) + if (next_ms == 0U) { - next_ms = 10U; + next_ms = 1U; + } + if (next_ms > 20U) + { + next_ms = 20U; } return next_ms; }