diff --git a/README.md b/README.md index 020c298f9918cccbffd26d14a9f302ff32923b4c..1de8dcf17e5a39e5279848ff26ba14649b69ee3b 100644 --- a/README.md +++ b/README.md @@ -31,3 +31,4 @@ teedoc build teedoc serve ``` then visit [http://127.0.0.1:2333](http://127.0.0.1:2333) + diff --git a/docs/Advanced_development/zh/QuecPythonSub/Audio.md b/docs/Advanced_development/zh/QuecPythonSub/Audio.md index f0efa245b37991a826078eb1f3173cb61a090111..10523ff9dba0d7b1ba359b4629d59a2e54d3539c 100644 --- a/docs/Advanced_development/zh/QuecPythonSub/Audio.md +++ b/docs/Advanced_development/zh/QuecPythonSub/Audio.md @@ -62,7 +62,9 @@ def example_audio_mp3(): ''' 使能外接喇叭播放 ''' - Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) + # Pin(Pin.GPIO10, Pin.OUT, Pin.PULL_PD, 1) # 自用调试板使用 + Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) # 官方板V1.1使用 + # Pin(Pin.GPIO9, Pin.OUT, Pin.PULL_PD, 1) # 官方板V1.2使用 # U: 表示用户目录, GUI下载工具会将文件下载到 /usr 文件下 aud.play(2, 1, "U:/example_maonv.mp3") pass @@ -98,7 +100,9 @@ def example_audio_wav(): ''' 使能外接喇叭播放 ''' - Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) + # Pin(Pin.GPIO10, Pin.OUT, Pin.PULL_PD, 1) # 自用调试板使用 + Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) # 官方板V1.1使用 + # Pin(Pin.GPIO9, Pin.OUT, Pin.PULL_PD, 1) # 官方板V1.2使用 # U: 表示用户目录, GUI下载工具会将文件下载到 /usr 文件下 aud.play(2, 1, "U:/example_haixiu.wav") pass @@ -143,7 +147,9 @@ def example_audio_mp3(): ''' 使能外接喇叭播放 ''' - Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) + # Pin(Pin.GPIO10, Pin.OUT, Pin.PULL_PD, 1) # 自用调试板使用 + Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) # 官方板V1.1使用 + # Pin(Pin.GPIO9, Pin.OUT, Pin.PULL_PD, 1) # 官方板V1.2使用 aud.setCallback(audio_cb) for i in range(3): # 演示3次 # U: 表示用户目录, GUI下载工具会将文件下载到 /usr 文件下 @@ -163,7 +169,7 @@ if __name__ == "__main__": ## 位深度与采样率 -待补充 +待补充 ## 配套代码 diff --git a/docs/Advanced_development/zh/QuecPythonSub/LCD.md b/docs/Advanced_development/zh/QuecPythonSub/LCD.md deleted file mode 100644 index 64da8d8b4f3e9b1cb1420b1e4c647a352a7a3b08..0000000000000000000000000000000000000000 --- a/docs/Advanced_development/zh/QuecPythonSub/LCD.md +++ /dev/null @@ -1,321 +0,0 @@ -# QuecPython LCD调试流程 - -SPI是串行外设接口(Serial Peripheral Interface)的缩写。SPI,是一种高速的,全双工,同步的通信总线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提供方便,正是出于这种简单易用的特性。 - -TFT液晶屏为每个像素都设有一个半导体开关,其加工工艺类似于大规模集成电路。由于每个像素都可以通过点脉冲直接控制,因而,每个节点都相对独立,并可以进行连续控制,这样的设计不仅提高了显示屏的反应速度,同时可以精确控制显示灰度,所以TFT液晶的色彩更逼真。 - -SPI屏幕结合了SPI和TFT屏幕的双重特点,可以使用最少 5 根线来实现CPU对屏幕的控制,它具备占用端口少,刷屏速度适中等特点,可以灵活显示简单字符、汉子、图片等,适用于各种对速度要求不太高的显示场景下。 - -## QuecPython下SPI屏幕添加 - -SPI屏幕通常包括 1 块TFT显示屏、 1 个控制芯片(本文使用的是ILI9341)和一个AD芯片(触摸用,可不用),CPU通过SPI总线+2根GPIO线来控制屏幕显示。用户选择控制器芯片不同和GPIO不同,通常需要修改SPI设备驱动的lcd操作部分和GPIO选择引脚部分。 - -### 硬件连接 - -EC600S和EC100Y上有专门处理LCD的SPI外设。 - -![](media/图1:标准4线SPI外接 TFT的参考设计.jpg) - -以EC600S_QuecPython_EVB_V1.1开发板为例 - -![](media/图2: EC600S_QuecPython_EVB_V1.1实物图.jpg) - - -SPI屏幕通常需要 3 根电源线和 5 根通信线, 3 根电源线包括 1 根地线GND、 1 根控制器电源线VCC和 1 根背光线LED,通信线包括 1 根REST线(复位SPI屏幕控制器,连接到CPU的GPIO线)、 1 根RS线(有的叫D/C线,辨别传输的时数据还是命令,连接到CPU的GPIO线,)、三根spi线(屏幕CLK线链接CPU SPI的CLK、SDI连接CPU SPI的MOSI线、CS线连接CPU SPI的CS线)。 - -**注意:**CPU对SPI屏幕通常不需要读,因此不需要连接屏幕SDO线。 - -![](media/图 3 : EC600S_QuecPython_EVB_V1.1实物接线图.jpg) - -​ 图 3 : EC600S_QuecPython_EVB_V1.1实物接线图 - -### QuecPython下SPI屏幕的软件设计 - -SPI屏幕设备的片选需要不选中时为高,选中时为低。由于EC600S_QuecPython_EVB_V1.1目前硬件缺陷(CS管脚未引出),用户可用普通gpio口代替。只需上电后将CS拉高后拉低即可。设计时需要了解quecpython lcd的api。详细参考https://python.quectel.com/wiki/api/#lcd。 - -由于quecpython下LCD的相关api已经开发好,用户可以直接依照api格式,编写spi屏幕驱动。 - -### 前期准备工作 - -确定使用的spi屏幕,仔细阅读其datasheet,原理图和驱动IC的技术手册。了解屏幕的特性,确定好屏幕的初始化参数(分辨率,颜色深度,spi时钟等)和必要的控制命令(例如:亮屏,息屏,设置显示区域,背光设置等)。 - -查看移远QuecPython LCD相关资料 :https://python.quectel.com/wiki/api/#lcd(LCD API说明) - -### 开始编写python脚本代码 - -1.创建LCD对象 - -``` -from machine import LCD -lcd = LCD() -``` -2.编写初始化参数 -此部分比较容易出错且比较重要,请重点关注。 -参数格式如下所示: - type + len + value - Type: 0:cmd 1:data 2:delay - Len: 若type为cmd: len表示后面接多少个data - 若type为data: len表示data的长度 - 若type为delay: len无实际意义。为 0 即可 - Value: 对应值 - 若type为delay:表示延时的时长,单位为ms。 - -重要点:由于lcd_init传入的是buff,需要进行bytearray转换 - -举例说明: - -```python -init = ( -0,1,0xXX, #命令,后接一个data, cmd值为0xXX -1,2,0xXX,0xXX, #数据, 数据长度为 2 , data值为0x -2,0,120 , #延时120ms -0,2,0xXX, #命令,后接 2 个data, cmd值为0xXX -1,1,0xXX, #数据,命令的第一个data,data值为0xXX -1,2,0xXX,0xFF #数据,命令的第二个data,数据的长度为 2 ,data值为0xXXFF -... -) -init_data = bytearray(init) #将列表转换 -``` - -3.编写display_on 命令 - 由于每款LCD的亮屏命令不一样,故需要用户提供该配置参数。 - -​ 此参数根据具体的屏幕去驱动而定 - -```python -display_on = ( - 0,1,0xXX #命令,后接一个data, cmd值为0xXX -1,2,0xXX,0xYY #数据, 数据长度为2, data值为0xXXYY -) -display_on_data = bytearray(display_on) -``` - -4.编写display_off 命令 - 由于每款LCD的息屏命令不一样,故需要用户提供该配置参数。 - - 此参数根据具体的屏幕去驱动而定 - -```python -display_off = ( - 0,1,0xXX #命令,后接一个data, cmd值为0xXX - 1,2,0xXX,0xYY #数据, 数据长度为2, data值为0xXXYY -) -display_off_data = bytearray(display_off) -``` - -5.编写设置显示区域的命令 - 不同的lcd屏有不同的设置区域方式。 (以ili9225和st7789v为例) - -​ 一般屏幕设置有两种方式: - -​ 一:分两次写:高八位和低八位此参数根据具体的屏幕去驱动而定(如st7789v) - -​ 二:一次写一个short (如ili9225) - -```python -XSTART_H = 0xf0 #代表X起始坐标 高八位 (以此值写入,底层会识别该位是x坐标的高八位) -XSTART_L = 0xf1 #代表X起始坐标 低八位 (以此值写入,底层会识别该位是x坐标的低八位) -YSTART_H = 0xf2 #代表Y起始坐标的高八位 -YSTART_L = 0xf3 #代表Y起始坐标的低八位 -XEND_H = 0xE0 #代表X结束坐标的高八位 -XEND_L = 0xE1 #代表X结束坐标的低八位 -YEND_H = 0xE2 #代表Y结束坐标的高八位 -YEND_L = 0xE3 #代表Y结束坐标的低八位 - -XSTART = 0xD0 #代表X的起始坐标 -XEND = 0xD1 #代表X的结束坐标 -YSTART = 0xD2 #代表Y的起始坐标 -YEND = 0xD3 #代表Y的结束坐标 - -ili9225_invalid = ( -0,1,0x36, -1,2,XEND, -0,1,0x37, -1,2,XSTART, -0,1,0x38, -1,2,YEND, -0,1,0x39, -1,2,YSTART, -0,1,0x20, -1,2,XSTART, -0,1,0x21, -1,2,YSTART, -0,1,0x22, -) -st7789_invalid = ( -0,4,0x2a, -1,1,XSTART_H, -1,1,XSTART_L, -1,1,XEND_H, -1,1,XEND_L, -0,4,0x2b, -1,1,YSTART_H, -1,1,YSTART_L, -1,1,YEND_H, -1,1,YEND_L, -0,0,0x2c, -) -invalid_data = bytearray(invalid) - -``` - -6.编写屏幕背光命令 - 不同的lcd屏有不同的设置背光方式。有些屏通过控制寄存器调节背光,有些屏通过背光控制管脚控制背光。 - -​ 当由背光控制管脚控制背光时,此处可以不需要,init中该部分填入None即可。 - -```python -LIGHT_VALUE = 0xFE #代表背光设置位置 -light = ( - 0,1,0xXX #命令,后接一个data, cmd值为0xXX - 1,1,LIGHT_VALUE, -) -light_data = bytearray(light) -``` - -7.初始化配置 - 按lcd_init参数依次填入。 - -``` -lcd.lcd_init(init_data,width,hight,clk,data_line,line_num,type,invalid_data,display_on_data,display_off_data,light_data/None) - -init_data:(1)中,配置的初始化参数 -width:屏幕宽度 -hight: 屏幕高度 -data_line: 数据线 -line_num: 线 -type: 0:rgb 1:fstn(黑白屏) -lcd_invalid: 区域写屏,设置范围 -display_on: 亮屏参数 -display_off: 息屏参数 -display_light: 亮屏参数,若为None:表示LCD亮度由IO口控制 -``` - -8.清屏 - lcd.lcd_clear(0xXXXX) - -9.区域写屏 - -```python -test_buf = ( -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f,0x00,0x1f, -) -test_buf1 = bytearray(test_buf) -lcd.lcd_write(test_buf1,10,10,20,20) -``` - - - -``` -#注意:该接口采用低位在前 -``` -### 运行代码 - -1.将创建的py文件拷贝到模块的usr目录下; - 利用工具qpycom将文件导入模块中。具体qpycom工具操作参考 - https://python.quectel.com/wiki/#/zh-cn/QuecPythonPrepare/?id=qpycom%e4%b8%b2%e5%8f%a3%e5%b7%a5%e5%85%b7 - -2.进入模块的命令行模式 - -模组烧录固件后,连接USB会产生如下图的com口。其中USB串行设备就是我们的python终端接口。 - -![](media/图4:串口选择.jpg) - -3.键入如下指令,运行创建的py文件: - -```python -import example -example.exec('usr/XXXX.py') #XXXX.py 创建的文件名 -``` - - - -### 工具使用 - -**工具简介** - -Image2Lcd 软件用于图片取模,可以提取单色和彩色图片。 - -PCtoLCD2002 是一款字符取模软件,可以生成汉字、英文以及标点符号的字模数据。 - -**如何对图片取模** - -1. 打开 Image2Lcd 软件,点击【打开】按钮,选择要显示的图片; - - ![](media/图5:image2LCD.jpg) - -2. 输出数据类型选择【C语言数组(*.c)】,扫描方式选择【水平扫描】,输出灰度一定要选择【 16 位真彩色】; - -3. 设置图片的最大宽度和高度,实际输出大小以上图中最下方的【输出图像:(xx, yy)】部分显示为准 - -4. 点击【保存】按钮,得到图片的取模数据,将其放到元组中保存即可。 - ( 3 ) 如何对字符取模 - - 1. 打开 PCtoLCD2002 软件,依次点击【模式】-【字符模式(W)】; - - 2. 根据需要选择字体,设置字体大小等; - - ![](media/图6:汉字取模1.jpg) - -3. 点击齿轮图标,进入如下所示界面,选择 【阴码】、【逐行式】、【顺向】、【C51格式】,点击确定; - -![](media/图7:汉字取模2.jpg) - - -4. 输入要取模的字符后,点击【生成字模】,即可得到对应的字模数据,按照示例 fonts.py - 文件中的格式,将字模数据保存到字典中。 - - ![](media/图8:汉字取模3.jpg) - -**简单刷图测试** - -按照2.2.4节Image2Lcd使用指导生成图片对应的图片数组。(此处以ili 9225 为例) - -详细代码参考LCD小实验 - - -将py文件导入模块的usr目录下。 - -![](media/图9:导入文件.jpg) - -![](media/图10:图片显示.jpg) - - -## 调试注意 - -1. 初始化前需要一个延时(大概为10ms),使Reset稳定;(此部分在c层已经实现,python关注) -2. 如果出现花屏现象,很大的可能是总线速度问题; -3. 如果调试时发现LCD的亮度有问题,首先检查(考虑)提供给LCD的电流是否一致,再考虑调节电压。 -4. 开机花屏问题,最简单的处理方式就是在INIT结束的地方增加一个刷黑屏的功能。(此部分已经在c层实现,python无需关注) -5. 如果出现花屏现象,很大的可能是总线速度问题 -6. 如果图像分开显示,起始点不在原点,多半是全屏刷新起始点寄存器没有设好; - - -## 调试过程中的常见问题 - -1.背光没点亮-调试屏幕首要工作就是把背光点亮,如果没有点亮背光,屏幕就无法显示,可以按照规格书将背光点亮,或者找技术工程师帮助。 - -![](media/图11:背光.jpg) - -2.LCD的星星点点 - -在调试的时候,我们会发现LCD上有莫名其妙的星星点点。一般这种情况下,我们首先要看看VGH和VGL电压是否处于datasheet所描述的范围之内。如果属于标准范围之内,但星星点点依旧,很有可能就是时序问题。这时候不妨在代码中变更采样的时序(比如上升沿采样改为下降沿采样)。如果无法在代码中更改,也可以在clk信号线加个100R电阻,也可能解决该问题。 \ No newline at end of file diff --git a/docs/Advanced_development/zh/QuecPythonSub/PM.md b/docs/Advanced_development/zh/QuecPythonSub/PM.md index a6f528dd80da0f09f8a519cf94f9de49c2855600..185dd283059c0d0cd4dec80211ff2ec8fa462cb5 100644 --- a/docs/Advanced_development/zh/QuecPythonSub/PM.md +++ b/docs/Advanced_development/zh/QuecPythonSub/PM.md @@ -1,7 +1,3 @@ -# **QuecPython低功耗使用说明** - -本文主要简介QuecPython低功耗库的使用方法。 - ## 修订历史 | 版本 | 日期 | 作者 | 变更表述 | @@ -10,7 +6,7 @@ ## 低功耗简介 -文档主要基于EC600S介绍如何使用QuecPython\_低功耗模式,在嵌入式应用中,产品的功耗越来越受到用户的重视;电池供电设备对产品功耗方面的要求尤为明显。降低产品功耗,延长电池的使用寿命,即可降低产品的运营成本,提高产品的市场竞争力。移远通信模块产品的功耗最小化需要从软件和硬件设计两方面入手,本文档重点介绍如何通过软件设计实现功耗最小化。 +本文主要简介QuecPython低功耗库的使用方法。文档主要基于EC600S介绍如何使用QuecPython\_低功耗模式,在嵌入式应用中,产品的功耗越来越受到用户的重视;电池供电设备对产品功耗方面的要求尤为明显。降低产品功耗,延长电池的使用寿命,即可降低产品的运营成本,提高产品的市场竞争力。移远通信模块产品的功耗最小化需要从软件和硬件设计两方面入手,本文档重点介绍如何通过软件设计实现功耗最小化。 ## 快速开始 @@ -55,11 +51,16 @@ #### 软件 -在模组正常运行的情况下,使用QCOM连接模组的虚拟AT口,发送AT指令(AT+log=80,1),此指令会定时3s从调试串口打印内部休眠相关的Flag 和寄存器值,此时可以通过连接模组的虚拟DEBUG口查看log信息,具体如下: +在模组正常运行的情况下,使用QCOM连接模组的虚拟AT口,发送AT指令(AT+log=80,1),此指令会定时3s从调试串口打印内部休眠相关的Flag 和寄存器值,此时可以通过连接模组的DEBUG口查看log信息,具体如下: ![pm_log](media/pm_log.jpg) -主要查看前四个参数: +**Tips:** + +- 对于DEBUG口,可以使用硬件DEBUG口,也可以使用USB虚拟的DEBUG口,都可以看到log信息 +- 在测试耗流过程中,想要获取log信息,只能通过连接硬件DEBUG口,原因是:USB不拔出无法进入休眠 + +上述log主要查看前四个参数: - PMEnableSleep:休眠总开关 - PMEnableSleep:允许进入休眠开关 @@ -76,22 +77,22 @@ - 外部引脚中断唤醒,对于EC600S,支持中断唤醒的GPIO列表如下: - | GPIO编号 | 模组引脚 | -| -------- | -------- | - | GPIO1 | 引脚号11 | - | GPIO2 | 引脚号11 | - | GPIO3 | 引脚号12 | - | GPIO4 | 引脚号13 | - | GPIO5 | 引脚号14 | - | GPIO6 | 引脚号15 | - | GPIO7 | 引脚号16 | - | GPIO8 | 引脚号39 | - | GPIO9 | 引脚号40 | - | GPIO10 | 引脚号48 | - | GPIO11 | 引脚号58 | - | GPIO12 | 引脚号59 | - | GPIO13 | 引脚号60 | - | GPIO14 | 引脚号61 | + | GPIO编号 | **模组引脚** | +| -------- | ------------ | + | GPIO1 | 引脚号10 | + | GPIO2 | 引脚号11 | + | GPIO3 | 引脚号12 | + | GPIO4 | 引脚号13 | + | GPIO5 | 引脚号14 | + | GPIO6 | 引脚号15 | + | GPIO7 | 引脚号16 | + | GPIO8 | 引脚号39 | + | GPIO9 | 引脚号40 | + | GPIO10 | 引脚号48 | + | GPIO11 | 引脚号58 | + | GPIO12 | 引脚号59 | + | GPIO13 | 引脚号60 | + | GPIO14 | 引脚号61 | - 电话,短信,网络数据唤醒 @@ -103,6 +104,10 @@ ![image-20210326134332982](media/pm_Hardware_connection.png) +**Tips:** + +上图是Quectel LTEEVB-KIT【开发底板】,可淘宝进入”移远旗舰店“购买;或者可以自己飞线给模组单独供电(VBAT_BB、VBAT_RF都需要3.8V供电) + 代码编写: 编写如下代码,保存成.py文件,然后下载到模组运行。 diff --git a/docs/Advanced_development/zh/QuecPythonSub/TTS.md b/docs/Advanced_development/zh/QuecPythonSub/TTS.md index 9d46683d19bc65c8ae8a480eb7350a84a292a2ed..8ffaaa21fbd348eb919030c9cc9a1d2b6e4e2a05 100644 --- a/docs/Advanced_development/zh/QuecPythonSub/TTS.md +++ b/docs/Advanced_development/zh/QuecPythonSub/TTS.md @@ -33,7 +33,9 @@ from machine import Pin # 创建TTS对象 tts = audio.TTS(0) # 使能GPIO引脚 -Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) +# Pin(Pin.GPIO10, Pin.OUT, Pin.PULL_PD, 1) # 自用调试板使用 +Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) # 官方板V1.1使用 +# Pin(Pin.GPIO9, Pin.OUT, Pin.PULL_PD, 1) # 官方板V1.2使用 # TTS语音播放 tts.play(1, 1, 2, '1111111111111111') ``` @@ -47,7 +49,10 @@ from machine import Pin tts=audio.TTS(0) # 设置TTS音量大小 tts.setVolume(5) -Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) +# 使能GPIO引脚 +# Pin(Pin.GPIO10, Pin.OUT, Pin.PULL_PD, 1) # 自用调试板使用 +Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) # 官方板V1.1使用 +# Pin(Pin.GPIO9, Pin.OUT, Pin.PULL_PD, 1) # 官方板V1.2使用 tts.play(1, 1, 2, '12345') ``` @@ -60,7 +65,10 @@ from machine import Pin tts=audio.TTS(0) # 设置TTS播放速度 tts.setSpeed(9) -Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) +# 使能GPIO引脚 +# Pin(Pin.GPIO10, Pin.OUT, Pin.PULL_PD, 1) # 自用调试板使用 +Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) # 官方板V1.1使用 +# Pin(Pin.GPIO9, Pin.OUT, Pin.PULL_PD, 1) # 官方板V1.2使用 tts.play(1, 1, 2, '12345') ``` @@ -92,7 +100,10 @@ def test_tts_base(): ''' 使能外接喇叭 ''' - Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) + # 使能GPIO引脚 + # Pin(Pin.GPIO10, Pin.OUT, Pin.PULL_PD, 1) # 自用调试板使用 + Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) # 官方板V1.1使用 + # Pin(Pin.GPIO9, Pin.OUT, Pin.PULL_PD, 1) # 官方板V1.2使用 for i in range(1, 9): # 循坏播放,增加声音 tts.setVolume(i) diff --git a/docs/Advanced_development/zh/QuecPythonSub/code/Audio.zip b/docs/Advanced_development/zh/QuecPythonSub/code/Audio.zip index 841a0034d95ed81c8eba832e5a7a79a0cd564379..68d0aa6f779cca057e2bf3fad48e9aa33d25bc99 100644 Binary files a/docs/Advanced_development/zh/QuecPythonSub/code/Audio.zip and b/docs/Advanced_development/zh/QuecPythonSub/code/Audio.zip differ diff --git a/docs/Advanced_development/zh/QuecPythonSub/code/example_tts_base.py b/docs/Advanced_development/zh/QuecPythonSub/code/example_tts_base.py index 88221d0459990db113a61716523dec7797c787ff..3c35187b7c0985cf1d18dd8ac364d14bc8402039 100644 --- a/docs/Advanced_development/zh/QuecPythonSub/code/example_tts_base.py +++ b/docs/Advanced_development/zh/QuecPythonSub/code/example_tts_base.py @@ -19,7 +19,10 @@ def test_tts_base(): ''' 使能外接喇叭 ''' - Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) + # 使能GPIO引脚 + # Pin(Pin.GPIO10, Pin.OUT, Pin.PULL_PD, 1) # 自用调试板使用 + Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) # 官方板V1.1使用 + # Pin(Pin.GPIO9, Pin.OUT, Pin.PULL_PD, 1) # 官方板V1.2使用 for i in range(1, 9): # 循坏播放,增加声音 tts.setVolume(i) diff --git a/docs/Advanced_development/zh/QuecPythonSub/code/record.py b/docs/Advanced_development/zh/QuecPythonSub/code/record.py index aac4c1f5cb64553edbaca28597e723cc1691035c..a10632ccbdcc6e4f2de2f43d8b6c202558d934cc 100644 --- a/docs/Advanced_development/zh/QuecPythonSub/code/record.py +++ b/docs/Advanced_development/zh/QuecPythonSub/code/record.py @@ -26,7 +26,9 @@ aud.setVolume(11) ''' 外接喇叭播放录音文件,需要下面这一句来使能 ''' -audio_EN = Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) # 官方板使用 +# audio_EN = Pin(Pin.GPIO10, Pin.OUT, Pin.PULL_PD, 1) # 自用调试板使用 +# audio_EN = Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) # 官方板V1.1使用 +audio_EN = Pin(Pin.GPIO9, Pin.OUT, Pin.PULL_PD, 1) # 官方板V1.2使用 def record_callback(args): print('file_name:{}'.format(args[0])) diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/clip_image001.gif b/docs/Advanced_development/zh/QuecPythonSub/media/clip_image001.gif new file mode 100644 index 0000000000000000000000000000000000000000..f6dcc56861dd163c8cfb99c78a80b341307d43a0 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonSub/media/clip_image001.gif differ diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/clip_image002.gif b/docs/Advanced_development/zh/QuecPythonSub/media/clip_image002.gif new file mode 100644 index 0000000000000000000000000000000000000000..24d4e21acef257d3eb9d1a0b7ee82c4e99ad4062 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonSub/media/clip_image002.gif differ diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/clip_image003.gif b/docs/Advanced_development/zh/QuecPythonSub/media/clip_image003.gif new file mode 100644 index 0000000000000000000000000000000000000000..77933f6b518c0b45b2320efe867b6299dadb8cfa Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonSub/media/clip_image003.gif differ diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/clip_image004.gif b/docs/Advanced_development/zh/QuecPythonSub/media/clip_image004.gif new file mode 100644 index 0000000000000000000000000000000000000000..90f7f94c565e45bc2a100b632f474560d40fa73f Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonSub/media/clip_image004.gif differ diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/clip_image005.gif b/docs/Advanced_development/zh/QuecPythonSub/media/clip_image005.gif new file mode 100644 index 0000000000000000000000000000000000000000..ef61f0f9ce7ddf00fbe997c727d56fff54c67053 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonSub/media/clip_image005.gif differ diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/clip_image006.gif b/docs/Advanced_development/zh/QuecPythonSub/media/clip_image006.gif new file mode 100644 index 0000000000000000000000000000000000000000..beeacb839f6190bb4f356766e3569f20c5bca7b6 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonSub/media/clip_image006.gif differ diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/clip_image007.gif b/docs/Advanced_development/zh/QuecPythonSub/media/clip_image007.gif new file mode 100644 index 0000000000000000000000000000000000000000..bc4a1ff86cf86739cc7c7f073b92b09005a65542 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonSub/media/clip_image007.gif differ diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/clip_image008.gif b/docs/Advanced_development/zh/QuecPythonSub/media/clip_image008.gif new file mode 100644 index 0000000000000000000000000000000000000000..41e89c4c33e83f29d744f2bb72c24e7e5ecb4240 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonSub/media/clip_image008.gif differ diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/clip_image009.gif b/docs/Advanced_development/zh/QuecPythonSub/media/clip_image009.gif new file mode 100644 index 0000000000000000000000000000000000000000..d59265e85ebb1a544856e10ef69df7488d4a5bd4 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonSub/media/clip_image009.gif differ diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/clip_image010.gif b/docs/Advanced_development/zh/QuecPythonSub/media/clip_image010.gif new file mode 100644 index 0000000000000000000000000000000000000000..b1dea77c5b45d67abda80c4e292e8bfe9dbb0b6d Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonSub/media/clip_image010.gif differ diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/clip_image011.gif b/docs/Advanced_development/zh/QuecPythonSub/media/clip_image011.gif new file mode 100644 index 0000000000000000000000000000000000000000..fccdd22197a25fc2072d46cdfa6ae8e9730f6a83 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonSub/media/clip_image011.gif differ diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/clip_image012.gif b/docs/Advanced_development/zh/QuecPythonSub/media/clip_image012.gif new file mode 100644 index 0000000000000000000000000000000000000000..22aea78589e6487ee2338198d3997a8438736be4 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonSub/media/clip_image012.gif differ diff --git a/docs/Advanced_development/zh/QuecPythonSub/media/image-20210406102358570.png b/docs/Advanced_development/zh/QuecPythonSub/media/image-20210406102358570.png new file mode 100644 index 0000000000000000000000000000000000000000..76930a4ff60636877f134d7ae2a2d16250312a23 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonSub/media/image-20210406102358570.png differ diff --git "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\276 3 \357\274\232 EC600S_QuecPython_EVB_V1.1\345\256\236\347\211\251\346\216\245\347\272\277\345\233\276.jpg" "b/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\276 3 \357\274\232 EC600S_QuecPython_EVB_V1.1\345\256\236\347\211\251\346\216\245\347\272\277\345\233\276.jpg" deleted file mode 100644 index 83f06a07c74545e3046ffe988f0921c6b3a795ce..0000000000000000000000000000000000000000 Binary files "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\276 3 \357\274\232 EC600S_QuecPython_EVB_V1.1\345\256\236\347\211\251\346\216\245\347\272\277\345\233\276.jpg" and /dev/null differ diff --git "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\27610\357\274\232\345\233\276\347\211\207\346\230\276\347\244\272.jpg" "b/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\27610\357\274\232\345\233\276\347\211\207\346\230\276\347\244\272.jpg" deleted file mode 100644 index 179be1dc86aeb0f911878dbcf5e4d74a9eb34c4d..0000000000000000000000000000000000000000 Binary files "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\27610\357\274\232\345\233\276\347\211\207\346\230\276\347\244\272.jpg" and /dev/null differ diff --git "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\27611\357\274\232\350\203\214\345\205\211.jpg" "b/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\27611\357\274\232\350\203\214\345\205\211.jpg" deleted file mode 100644 index 0324c4aedd24fa2b99acc7e1475ddd4e9379f261..0000000000000000000000000000000000000000 Binary files "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\27611\357\274\232\350\203\214\345\205\211.jpg" and /dev/null differ diff --git "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2761\357\274\232\346\240\207\345\207\2064\347\272\277SPI\345\244\226\346\216\245 TFT\347\232\204\345\217\202\350\200\203\350\256\276\350\256\241.jpg" "b/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2761\357\274\232\346\240\207\345\207\2064\347\272\277SPI\345\244\226\346\216\245 TFT\347\232\204\345\217\202\350\200\203\350\256\276\350\256\241.jpg" deleted file mode 100644 index d45d8f81ab43090af4167c673f31f60f68dc33a4..0000000000000000000000000000000000000000 Binary files "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2761\357\274\232\346\240\207\345\207\2064\347\272\277SPI\345\244\226\346\216\245 TFT\347\232\204\345\217\202\350\200\203\350\256\276\350\256\241.jpg" and /dev/null differ diff --git "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2762\357\274\232 EC600S_QuecPython_EVB_V1.1\345\256\236\347\211\251\345\233\276.jpg" "b/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2762\357\274\232 EC600S_QuecPython_EVB_V1.1\345\256\236\347\211\251\345\233\276.jpg" deleted file mode 100644 index fce9d81ae9ae67ed2b6e6cd247eadbc3697d819d..0000000000000000000000000000000000000000 Binary files "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2762\357\274\232 EC600S_QuecPython_EVB_V1.1\345\256\236\347\211\251\345\233\276.jpg" and /dev/null differ diff --git "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2764\357\274\232\344\270\262\345\217\243\351\200\211\346\213\251.jpg" "b/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2764\357\274\232\344\270\262\345\217\243\351\200\211\346\213\251.jpg" deleted file mode 100644 index d0d74e0e899576103db2d6f9c95f1f681ba2004d..0000000000000000000000000000000000000000 Binary files "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2764\357\274\232\344\270\262\345\217\243\351\200\211\346\213\251.jpg" and /dev/null differ diff --git "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2765\357\274\232image2LCD.jpg" "b/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2765\357\274\232image2LCD.jpg" deleted file mode 100644 index d569c8ea6a6056e185005af7a848fcb6294e240b..0000000000000000000000000000000000000000 Binary files "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2765\357\274\232image2LCD.jpg" and /dev/null differ diff --git "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2766\357\274\232\346\261\211\345\255\227\345\217\226\346\250\2411.jpg" "b/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2766\357\274\232\346\261\211\345\255\227\345\217\226\346\250\2411.jpg" deleted file mode 100644 index 68cd167605cd6bc331ac9f921c5b3325d649f5fd..0000000000000000000000000000000000000000 Binary files "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2766\357\274\232\346\261\211\345\255\227\345\217\226\346\250\2411.jpg" and /dev/null differ diff --git "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2767\357\274\232\346\261\211\345\255\227\345\217\226\346\250\2412.jpg" "b/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2767\357\274\232\346\261\211\345\255\227\345\217\226\346\250\2412.jpg" deleted file mode 100644 index ccf35bc2c93b6b6e256a9d3e4d5801ab44043500..0000000000000000000000000000000000000000 Binary files "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2767\357\274\232\346\261\211\345\255\227\345\217\226\346\250\2412.jpg" and /dev/null differ diff --git "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2768\357\274\232\346\261\211\345\255\227\345\217\226\346\250\2413.jpg" "b/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2768\357\274\232\346\261\211\345\255\227\345\217\226\346\250\2413.jpg" deleted file mode 100644 index 97d81540415f1baed0db17cea9378f04585a3ed9..0000000000000000000000000000000000000000 Binary files "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2768\357\274\232\346\261\211\345\255\227\345\217\226\346\250\2413.jpg" and /dev/null differ diff --git "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2769\357\274\232\345\257\274\345\205\245\346\226\207\344\273\266.jpg" "b/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2769\357\274\232\345\257\274\345\205\245\346\226\207\344\273\266.jpg" deleted file mode 100644 index 5da22d44e4808cf96be135a27ef9b31425204514..0000000000000000000000000000000000000000 Binary files "a/docs/Advanced_development/zh/QuecPythonSub/media/\345\233\2769\357\274\232\345\257\274\345\205\245\346\226\207\344\273\266.jpg" and /dev/null differ diff --git a/docs/Advanced_development/zh/QuecPythonSub/record.md b/docs/Advanced_development/zh/QuecPythonSub/record.md index 22ddbb560892d842458dbdb528376f1b50f5160c..b71dcd040f8f732ff3a5bafb184263e1655d8796 100644 --- a/docs/Advanced_development/zh/QuecPythonSub/record.md +++ b/docs/Advanced_development/zh/QuecPythonSub/record.md @@ -28,7 +28,7 @@ 图3 咪头正负极说明 -(2) 外接喇叭播放录音文件时,请使用规格型号为 4Ω 3W 或者 8Ω 2W 的喇叭。喇叭参数以及连接方法请参考 [QuecPython-驱动子系统-音频播放](https://python.quectel.com/doc/doc/Advanced_development/zh/QuecPythonSub/Audio.html) +(2) 外接喇叭播放录音文件时,请使用规格型号为 4Ω 3W 或者 8Ω 2W 的喇叭。喇叭参数以及连接方法请参考[QuecPython-驱动子系统-音频播放](./Audio.html) ### 软件设计 @@ -69,8 +69,9 @@ aud.setVolume(11) ''' 外接喇叭播放录音文件,需要下面这一句来使能 ''' -audio_EN = Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) # 官方板使用 - +# audio_EN = Pin(Pin.GPIO10, Pin.OUT, Pin.PULL_PD, 1) # 自用调试板使用 +audio_EN = Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) # 官方板V1.1使用 +# audio_EN = Pin(Pin.GPIO9, Pin.OUT, Pin.PULL_PD, 1) # 官方板V1.2使用 def record_callback(args): print('file_name:{}'.format(args[0])) print('file_size:{}'.format(args[1])) @@ -127,4 +128,4 @@ if __name__ == '__main__': ### 配套代码 * [下载代码](code/record.py) - \ No newline at end of file + \ No newline at end of file diff --git a/docs/Advanced_development/zh/QuecPythonWirelessNetwork/Quectel_sbs_Socket_relation.png b/docs/Advanced_development/zh/QuecPythonWirelessNetwork/Quectel_sbs_Socket_relation.png new file mode 100644 index 0000000000000000000000000000000000000000..83842de47d3fd0894a1c4cb9f3538fc8103f3276 Binary files /dev/null and b/docs/Advanced_development/zh/QuecPythonWirelessNetwork/Quectel_sbs_Socket_relation.png differ diff --git a/docs/Advanced_development/zh/sidebar.yaml b/docs/Advanced_development/zh/sidebar.yaml index 05a65e9211c7a2261dd2ba66e5891317023426c3..15692c63364047ecb1db64f6ba2cd7d2fbb12790 100644 --- a/docs/Advanced_development/zh/sidebar.yaml +++ b/docs/Advanced_development/zh/sidebar.yaml @@ -53,8 +53,8 @@ items: # - label: 录制音频 - label: 外设调试 items: - - label: LCD 调试流程 - file: QuecPythonSub/LCD.md + # - label: LCD 调试流程 + # file: QuecPythonSub/LCD.md # - label: SPI Nor Flash 调试流程 - label: Sensor 调试流程 file: QuecPythonSub/Sensor.md diff --git a/docs/FAQ/zh/Format_String/Format_String.md b/docs/FAQ/zh/Format_String/Format_String.md new file mode 100644 index 0000000000000000000000000000000000000000..656aa4ef2b986cb39f01a20708c057b1542ed57b --- /dev/null +++ b/docs/FAQ/zh/Format_String/Format_String.md @@ -0,0 +1,177 @@ +## 修订历史 + +| 版本 | 日期 | 作者 | 变更表述 | +| ---- | --------- | ----- | ------------------------------------------------------------ | +| 1.0 | 2021-4-07 | David | 首次编写,包括位运算、字符串与十六进制转换、以及Struct的说明 | + +对于字符串与十六进制之间的转换需求,特编写这篇文档,详细介绍相关知识。 + +## 位运算 + +首先介绍位运算,计算机内所有的数都以二进制存储,位运算就是对二进制位的操作。在python中主要包括:按位与运算符、按位或运算符、 按位异或运算符、按位取反运算符、左移动运算符、右移动运算符。具体的介绍可参考:[位运算](https://blog.csdn.net/csdn_edition/article/details/109402978) + +### 按位与运算符 + + 按位与运算符&:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0。举例说明如下: + +```python +>>> a= 60 +>>> b= 13 +>>> a & b +12 +``` + +### 按位或运算符 + +按位或运算符|:只要对应的二个二进位有一个为1时,结果位就为1。 + +```python +>>> a=60 +>>> b= 13 +>>> a | b +61 +``` + +### 按位异或运算符 + +按位异或运算符:当两对应的二进位相异时,结果为1 + +```python +>>> a=60 +>>> b= 13 +>>> a ^ b +49 +``` + +### 按位取反运算符 + + 按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1 。**~x** 类似于 **-x-1** + +```python +>>> a=60 +>>> ~a +-61 +``` + +### 左移动运算符 + +左移动运算符:运算数的各二进位全部左移若干位,由 **<<** 右边的数字指定了移动的位数,高位丢弃,低位补0。 + +```python +>>> a=60 +>>> a << 2 +240 +``` + +### 右移动运算符 + +右移动运算符:把">>"左边的运算数的各二进位全部右移若干位,**>>** 右边的数字指定了移动的位数 + +```python +>>> a=60 +>>> a >> 2 +15 +``` + +还有位运算,struct的用法,所以写个demo还是有必要的哦。这是一项通过将设备置于从高温到低温的快速改变环境中或反之变换来测试机器和焊接部分的可靠性 + +## 字符串与十六进制 + +### 字符串与十六进制转换的封装 + +对于字符串与十六进制之间的相互转换,由于python没有对应的封装,这里封装一个类供大家使用: + +```python +str_test = 'Quectel build a smarter world' +class String: + def to_hex(a, b=""): # 可实现的功能:转成HEX格式,可选择加上需要的分隔符 + Hex = ''.join([hex(ord(c)).replace('0x', b) for c in a]) + return Hex,len(a) + + def from_hex(a,b=''): # 可实现的功能:转成STR,如果有分隔符,可以添加分割符参数转换 + Str = ''.join([chr(int(c.replace(b, ''), 16)) for c in [a[i:i+2+len(b)] for i in range(0, len(a), 2+len(b))]]) + return Str + +hex_test = String.to_hex(str_test) +print(type(hex_test[0])) +print(hex_test[1]) +print(hex_test) + +hex_test = str(hex_test[0]) +str_test = String.from_hex(hex_test) +print(str_test) +``` + +### 字符串与十六进制转换的应用(待完善) + +当然转换后的HEX无法串口直接接收解析,仍需要一定的转换,下面基于EC600SCNLB模组做个简单的实验 + +```python +str_test = 'Quectel build a smarter world' +def str_to_hex(s): + list_hex = ' '.join([hex(ord(c)) for c in s]).split() + list = [int(i,16) for i in list_hex] + bytearr = bytearray(list) + return bytearr +hex_test = str_to_hex(str_test) +``` + +​ 1.编写如下代码并命名为str_hex_test.py。 + +```python +from machine import UART +uart0 = UART(UART.UART0, 115200, 8, 0, 1, 0) +str_test = 'Quectel build a smarter world' +def str_to_hex(s): + list_hex = ' '.join([hex(ord(c)) for c in s]).split() + list = [int(i,16) for i in list_hex] + bytearr = bytearray(list) + return bytearr +hex_test = str_to_hex(str_test) +uart0.write(hex_test) +``` + +​ 2.下载上述文件到模组中运行,并打开串口调试工具(此处使用UartAssist) + +image-20210407143228884 + +image-20210407144219267 + +3.运行程序,在串口工具中查看结果 + +image-20210407144126291 + +**Tips:** + +如果使用ASCII接收的话,就会显示字符串形式 + +​ 4.对于模组的串口接收:无论串口工具发送ASCII或者HEX数据,串口读取都是bytes型数据 + +![image-20210407151559820](media/uart_read.png) + +## 编解码 + +对于编解码,常见的有ASCII、UTF-8、GBK等等,python已经有了对应的封装,这里简单的介绍一下,也可以参考 [encode and decode](https://blog.csdn.net/qq_26442553/article/details/94440502): + +```python +import ubinascii as binascii +import ustruct as struct + +def example(express, result=None): + if result == None: + result = eval(express) + print(express, ' ==> ', result) +if __name__ == '__main__': + print('编解码:') + print("str to utf-8", end=': '); + example("u'小明'.encode('utf-8')") + print("utf-8 to str", end=': '); + s_utf = b'\xe5\xb0\x8f\xe6\x98\x8e' + example("s_utf.decode('utf-8')") + print("类似的还有encode('gbk'),decode('gbk'),encode('gb2312'),decode('gb2312')") + +``` + +## 二进制与ASCII转换、打包与解压 + +对于[二进制与ASCII转换](https://python.quectel.com/wiki/#/zh-cn/api/pythonStdlib?id=ubinascii-二进制与ascii转换)和[ustruct - 打包和解压原始数据类型](https://python.quectel.com/wiki/#/zh-cn/api/pythonStdlib?id=ustruct-打包和解压原始数据类型),在模组的固件中已经有了封装。 \ No newline at end of file diff --git a/docs/FAQ/zh/Format_String/media/UartAssist.png b/docs/FAQ/zh/Format_String/media/UartAssist.png new file mode 100644 index 0000000000000000000000000000000000000000..95d51c3d8dd3f9035688e5ac945519459011680c Binary files /dev/null and b/docs/FAQ/zh/Format_String/media/UartAssist.png differ diff --git a/docs/FAQ/zh/Format_String/media/dirver_setup.png b/docs/FAQ/zh/Format_String/media/dirver_setup.png new file mode 100644 index 0000000000000000000000000000000000000000..5c64e95704bd913477136297efdd237de67afbe6 Binary files /dev/null and b/docs/FAQ/zh/Format_String/media/dirver_setup.png differ diff --git a/docs/FAQ/zh/Format_String/media/file_download.png b/docs/FAQ/zh/Format_String/media/file_download.png new file mode 100644 index 0000000000000000000000000000000000000000..ae3d1ab20339489871623fa38631d5efd5af0a2b Binary files /dev/null and b/docs/FAQ/zh/Format_String/media/file_download.png differ diff --git a/docs/FAQ/zh/Format_String/media/str_hex_result.png b/docs/FAQ/zh/Format_String/media/str_hex_result.png new file mode 100644 index 0000000000000000000000000000000000000000..41442a593cd957cf457af1b69ebc9ccba27e2a2f Binary files /dev/null and b/docs/FAQ/zh/Format_String/media/str_hex_result.png differ diff --git a/docs/FAQ/zh/Format_String/media/uart_read.png b/docs/FAQ/zh/Format_String/media/uart_read.png new file mode 100644 index 0000000000000000000000000000000000000000..f17f3bfd40c75334b617219016d39a22c6fe657c Binary files /dev/null and b/docs/FAQ/zh/Format_String/media/uart_read.png differ diff --git a/docs/FAQ/zh/QP_common_question01/QP_common_question01.md b/docs/FAQ/zh/QP_common_question01/QP_common_question01.md new file mode 100644 index 0000000000000000000000000000000000000000..20ab054647032d0f02b7e3c1dd4a78746a84c707 --- /dev/null +++ b/docs/FAQ/zh/QP_common_question01/QP_common_question01.md @@ -0,0 +1,189 @@ +## 设备管理器只有两个口 + +原因分析:固件下载是需要选择压缩包,这是没错的。但是官网下载的固件包一般都是需要解压的,里面包含固件(压缩包形式)和changelog + +解决方法:对于官网下载的压缩进行解压,烧录时确保固件满足下面几点: + +1. 选择的固件是一个压缩包 +2. 固件的下一级目录全部是.bin等等,也就是说固件里面无额外的压缩包。(可能存在官网下载的固件需要解压再进行下一步) + +## GPS的API接口文档在哪 + +对于GPS,实际上是串口的读写配置等等,是没有对应的API文档的,可以在群文件下载对应的资料 + +![image-20210412165603072](media/GPS_file.png) + +## EC100Y开发板与模组串口对应图 + +EC100Y开发板(小熊派)的串口位置如下图: + +![image-20210312134000186](media/EC100Y_UART.png) + +EC100Y模组的串口位置可参考《Quectel_EC100Y-CN_QuecOpen硬件设计手册V1.0》(可在移远QuecPython开发交流群的群文件自行下载)。 + +## EC600S开发板与模组串口对应图 + +EC600S开发板(EC600S_QuecPython_EVB_V1.x 开发板)的串口位置如下图: + + ![image-20210312134025628](media/EC600SV1.1_UART.png) + +EC600S模组的串口位置可参考《Quectel_EC600S-CN_QuecOpen硬件设计手册V1.0.0_Preliminary_20200927》(可在移远QuecPython开发交流群的群文件自行下载): + +## GPIO对应关系说明 + +### 对照原理图,在开发板找到具体位置 + +第一步,看这个GPIO与PIN脚的对应关系(位置在API库的PIN模块,左侧是QuecPython的GPIO命名,右侧是模组的PIN脚号),例如你想使用QuecPython的GPIO6,那么看了这个图,你知道的是GPIO6对应的是模组的PIN15; + img + +第二步看,EC600SV1.1的原理图,(黑色部分无需关注,只需要关注红色圈的部分),对于刚刚说的QuecPython的GPIO6(PIN15),这里关注的是PIN15对应的GPIO77(实际上GPIO77没有特别的含义,只是表示一个连接关系,也就是此处的GPIO77对应于下图中的GPIO77)。 + img + img + 第三步,上方最后一个图的GPIO77,也就对应开发板引出的GPIO77(开发板的J6处)。 + 总结:配置QuecPython的GPIO6,在开发板的GPIO77处查看配置是否生效。 + +### 对照开发板丝印,找出对应的GPIO口 + +例如我想找开发板上的G81对应QuecPython的哪个GPIO口(如果按照下面方法没有找到对应的GPIO,那说明暂时还未开放)。 + +第一步,看原理图,开发板的G81对应原理图就是GPIO81。如下图所示,GPIO81对应的是PIN16(请忽略蓝色框的GPIO标识,记住PIN16) + +![img](media/GPIO04.jpg)![img](media/GPIO05.jpg) + +第二步,看原理图,开发板的G81对应原理图就是GPIO81。如下图所示,GPIO81对应的是PIN16**(请忽略蓝色框的GPIO标识,记住PIN16)** + +第三步,进入QuecPython的官网,找到PIN的API库(https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=pin) + +如下图所示,**如果你要控制G81,就需要配置GPIO7**。 + +![img](media/GPIO06.jpg) + + + + + +## usocket使用 + +usocket 模块提供对BSD套接字接口的访问,支持对socket的地址绑定、监听、连接、数据接收和发送等通信方法。详细可参见:QuecPython API类库文档usocket模块的使用。 + +代码示例: + +```python +# 导入usocket模块 +import usocket +import log + +# 设置日志输出级别 +log.basicConfig(level=log.INFO) +socket_log = log.getLogger("SOCKET") + +# 创建一个socket实例 +sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) +# 解析域名 +sockaddr = usocket.getaddrinfo('www.tongxinmao.com', 80)[0][-1] +# 建立连接 +sock.connect(sockaddr) +# 向服务端发送消息 +ret = sock.send('GET /News HTTP/1.1\r\nHost: www.tongxinmao.com\r\nAccept-Encoding: deflate\r\nConnection: keep-alive\r\n\r\n') +socket_log.info('send %d bytes' % ret) +# 接收服务端消息 +data = sock.recv(256) +socket_log.info('recv %s bytes:' % len(data)) +socket_log.info(data.decode()) + +# 关闭连接 +sock.close() +``` + +运行结果示例: + + ![image-20210312135703298](media/usocket.png) + +## QuecPython是否支持队列 + +​ 队列是一种先进先出的数据结构,主要操作包括入队,出队。入队的元素加入到对尾,从队头取出出队的元素。在QuecPython中我们可以使用list操作来模拟队列: + +```python +class queue: + def __init__(self): + self.__alist = [] + + def push(self, value): + self.__alist.insert(0, value) + + def pop(self): + return self.__alist.pop() + + def size(self): + return len(self.__alist) + + def clean(self): + self.__alist.clear() + + def isEmpty(self): + return self.__alist == [] + + def showQueue(self): + print(self.__alist) +``` + +运行: + +```python +if __name__ == '__main__': + q = queue() + q.push(1) + q.push("123") + q.push("456") + q.push(2) + q.showQueue() + print(q.pop()) + print(q.pop()) + print(q.pop()) + print(q.pop()) + q.showQueue() +``` + +## socket解析IP失败 + +![image-20210312135803677](media/socket_IP.png) + +使用socket、mqtt等相关网络连接的API时会出现IP解析失败导致出现上图异常。 + +定位问题方向:检查SIM卡是否注网成功以及检查该地址的有效性再次进行尝试。 + +查询驻网是否成功的AT指令,【**AT+cops?** 查询是否驻网】 + +## 执行脚本文件提示语法错误 + + ![image-20210312135817816](media/syntax_error.png) + +导致原因:大概率是因为Python语法缩进错误(4个空格缩进) + +排查方法:检查代码格式缩进是否规范 + +推荐使用:PyCharm或VsCode来进行开发,IDE会提示语法缩进与基本语法上的错误。 + +## SIM卡进行插拔后网络请求失败 + +因为目前EC100Y暂不支持SIM卡热插拔功能,所以如果我们的SIM卡在重新插拔后需要手动重启模块才能重新注网。 + +## QuecPython的源码文件安全吗 + +QPYcom下载工具有代码混淆加密功能,确保用户程序不被直接暴露。 + +## 在QPYcom操作没有任何反应 + +检查选择的串口是否正确并已打开。 + +## 编写python代码用什么工具 + +推荐使用pycharm或VScode,两款比较流行的IDE,自带自动补全功能。 + +## 板子接出的串口无法通信 + +要注意接口是1.8V还是3.3V,电平匹配才能正常通信。 + +## 接上USB线灯不亮 + +检查模块电压,保证模组的3.8V电压稳定,必要时用电池供电。 \ No newline at end of file diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312134000186.png b/docs/FAQ/zh/QP_common_question01/media/EC100Y_UART.png similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/image-20210312134000186.png rename to docs/FAQ/zh/QP_common_question01/media/EC100Y_UART.png diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312134025628.png b/docs/FAQ/zh/QP_common_question01/media/EC600SV1.1_UART.png similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/image-20210312134025628.png rename to docs/FAQ/zh/QP_common_question01/media/EC600SV1.1_UART.png diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image002-1615527701161.jpg b/docs/FAQ/zh/QP_common_question01/media/GPIO01.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image002-1615527701161.jpg rename to docs/FAQ/zh/QP_common_question01/media/GPIO01.jpg diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image004-1615527701161.jpg b/docs/FAQ/zh/QP_common_question01/media/GPIO02.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image004-1615527701161.jpg rename to docs/FAQ/zh/QP_common_question01/media/GPIO02.jpg diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image006-1615527701161.jpg b/docs/FAQ/zh/QP_common_question01/media/GPIO03.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image006-1615527701161.jpg rename to docs/FAQ/zh/QP_common_question01/media/GPIO03.jpg diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image008-1615527701161.jpg b/docs/FAQ/zh/QP_common_question01/media/GPIO04.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image008-1615527701161.jpg rename to docs/FAQ/zh/QP_common_question01/media/GPIO04.jpg diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image010-1615527701161.jpg b/docs/FAQ/zh/QP_common_question01/media/GPIO05.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image010-1615527701161.jpg rename to docs/FAQ/zh/QP_common_question01/media/GPIO05.jpg diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image012-1615527701161.jpg b/docs/FAQ/zh/QP_common_question01/media/GPIO06.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image012-1615527701161.jpg rename to docs/FAQ/zh/QP_common_question01/media/GPIO06.jpg diff --git a/docs/FAQ/zh/QP_common_question01/media/GPS_file.png b/docs/FAQ/zh/QP_common_question01/media/GPS_file.png new file mode 100644 index 0000000000000000000000000000000000000000..95ceb17fb12a393311064e02b4987633d5e3f4a9 Binary files /dev/null and b/docs/FAQ/zh/QP_common_question01/media/GPS_file.png differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312135803677.png b/docs/FAQ/zh/QP_common_question01/media/socket_IP.png similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/image-20210312135803677.png rename to docs/FAQ/zh/QP_common_question01/media/socket_IP.png diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312135817816.png b/docs/FAQ/zh/QP_common_question01/media/syntax_error.png similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/image-20210312135817816.png rename to docs/FAQ/zh/QP_common_question01/media/syntax_error.png diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312135703298.png b/docs/FAQ/zh/QP_common_question01/media/usocket.png similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/image-20210312135703298.png rename to docs/FAQ/zh/QP_common_question01/media/usocket.png diff --git a/docs/FAQ/zh/QP_common_question02/QP_common_question02.md b/docs/FAQ/zh/QP_common_question02/QP_common_question02.md new file mode 100644 index 0000000000000000000000000000000000000000..cdbdb5674095b4b87aa817211ccc15ad75f8f2db --- /dev/null +++ b/docs/FAQ/zh/QP_common_question02/QP_common_question02.md @@ -0,0 +1,123 @@ +## apn_cfg.json里面是什么 + +内置的apn列表,不可删除 + +## 拖动文件到模组出现语法错误 + +请检查“.py”文件的语法问题(多数是缩进问题) + +## 对Socket的[0] [-1]的解释 + +```python +>>> import usocket +>>> client = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) +>>> sockaddr = usocket.getaddrinfo('www.tongxinmao.com',80)[0][-1] + +>>> print(sockaddr) +('120.76.100.197', 80) +>>> sockaddr = usocket.getaddrinfo('www.tongxinmao.com',80) +>>> print(sockaddr) +[(2, 1, 0, 'www.tongxinmao.com', ('120.76.100.197', 80))] +``` + +举例说明: + +```python +a = ((A,B,C),(2),(3)) +a[0] = (A,B,C) +a[0][-1] = C +``` + +## win7运行QPYcom出现“failed to execute script pyi_rth_multiprocessing” + +故障现象:python通过pyinstaller打包后,在别的电脑运行失败“failed to execute script pyi_rth_multiprocessing”:在低版本windows7上运行会出现这个问题,在win10上面移植程序没问题。 + +故障分析:怀疑是windows某些dll文件版本过低,不支持高版本生成的exe,最简单的方法是:在win7机器上单独打个exe,然后在win7运行,移植。 + +建议客户的方法是:升级win7版本到sp1 + +## net.nitzTime()的获取 + +成功附着网络之后,基站下发一次(仅此一次) + +## 对于EC600SV1.1的QuecPython板子,测试TTS功能注意事项 + +外设是接的喇叭,但是在TTS中配置的是“话筒” + +由于V1.1上面加了一个功放,此时需要拉高模组(硬件拉高)socket的pin58(功放的使能脚),或者指令使能“audio_EN = Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1)” + +外接的喇叭是功率是有限制的,建议小于8R 2W + +### 如果需要AT配置的话, + +**at+qaudmod=0 //spk** + +**at+qaudmod=1 //hs** + +**at+qaudmod=2 //loudspeaker** + +下面需要后面加以理解 + +AT+QAUDPATH=0 + +AT+QAUDDCH=0 + +## 对于多.py文件的调用 + +对于usr目录下的两个文件a.py和b.py,如果想再a.py中调用b.py的话:需要在a.py里面加上下面代码 + +```python +#方法1 +from usr import b +#方法2 +import sys +sys.path.append('/usr/') # 进入usr目录下 +import b +``` + +## 线程有个数限制? + +最多16个 + +## 如何对文件系统进行操作 + +根目录/是不可读不可写的,/usr是用户区,/bak是备份区 + +## 串口一次最多可以接受多少字节? + +实测接收2000字节也行;发送最大512,超过自动分包;socket、MQTT收发2000字节也行 + +## Socket、MQTT、串口的数据监听会不会阻塞其他线程 + +Socket、MQTT本身是‘阻塞函数’,不会阻塞其他线程。 + +串口本身是‘非阻塞函数’,不会阻塞其他线程。 + +## 基站定位返回的参数解释 + +```python +>>> cellLocator.getLocation("www.queclocator.com", 80, "1111111122222222", 8, 1) +(117.1138, 31.82279, 550) +``` + +返回的550结果是什么意思 + +定位精度,单位m + +## QuecPython队列的深度有最大值吗?比如一直发生回调,会不会丢失? + +随内存自动增长 + +## 模块的Pin有没有默认电平的说明文档 + +我们开放出来IO目前是 默认输出低电平 + +## EC600S的模块RTC时间怎么样断电续航 + +断电没有办法续航,因为EC600S没有RTC引脚 + + + + + + \ No newline at end of file diff --git a/docs/FAQ/zh/QP_download/QP_download.md b/docs/FAQ/zh/QP_download/QP_download.md new file mode 100644 index 0000000000000000000000000000000000000000..af8897d21042a8ae5aa9ed661da05a9616a15a4e --- /dev/null +++ b/docs/FAQ/zh/QP_download/QP_download.md @@ -0,0 +1,56 @@ +## 驱动下载安装 + +对于驱动下载,注意以下几点说明: + +1. 具体的步骤可参考开发板的使用说明,例如:[EC600X开发板使用说明](http://127.0.0.1:2333/doc/doc/Quecpython_intro/zh/Qp_Hw_EC600X/Hardware_Support_EC600X.html#usb) +2. “QuecPython驱动安装失败问题”见“[QuecPython驱动安装失败问题解决](../QP_driver_failed/QP_driver_failed.html)”章节 + +3. 安装前,请备份您的重要文件,并保存您的工作进度,以免发生意外情况,导致文件丢失 + +4. 安装成功后,无需重启电脑 + +5. 如需修复或者卸载驱动程序,再次运行该驱动安装程序,选择“修复”或“卸载” 即可 + + +## 固件下载烧录 + +对于固件烧录,注意以下几点说明: + +1. 具体的步骤可参考开发板的使用说明,例如:[EC600X开发板使用说明](http://127.0.0.1:2333/doc/doc/Quecpython_intro/zh/Qp_Hw_EC600X/Hardware_Support_EC600X.html#-17) +2. 对于所有模组,出产的固件多数是AT标准固件,如果您需要进行python开发,则需要烧录python固件,具体的烧录参考上一条 +3. QPYcom工具支持烧录pythonn固件,不支持烧C固件或者AT标准固件 +4. “QuecPython固件安装失败问题”见“[QuecPython救砖处理](../QP_recovery/QP_recovery.html)”章节 +5. 安装前,请备份您的重要文件,并保存您的工作进度,以免发生意外情况,导致文件丢失 +6. 安装成功后,无需重启电脑 + +## 脚本下载 + +对于脚本下载,注意以下几点说明: + +1. 为了方便脚本下载,QPYcom已经做了脚本拖拽下载的功能,欢迎大家使用,如您有使用问题,可参考《Quectel QuecPython_QPYcom工具使用说明》(此文件可从QPYcom压缩包中获取,路径:\QPYcom_Vx.x.x\docs) + +2. 如果你想一次性下载您的所有脚本,并清除原来的脚本(具体清除哪些脚本,见下面解释),可以按照下面的脚本下载步骤操作 + +3. 对于使用如下脚本下载的步骤,哪些脚本会被删除的解释:对于根目录除了json都会删除,而对于子文件夹(自己新建一个文件夹),脚本下载不会影响这个文件夹。 + +脚本下载步骤: + +(1)用户选择“USB串行设备”后,“打开串口”,点击“下载”按钮,创建项目(项目名称随意)。 + +jioaben_start + +(2)点击“选择固件”(脚本下载暂时是需要选择固件,但是不会下载固件,这一步后面可以省略)。 + +jioaben_choosefirmware + +(3)选择需要下载的脚本 + +jioaben_choosejiaoben + +(4)下载脚本,等待完成 + +jioaben_downloadstart + +(5)完成界面展示 + +jioaben_downloadsuccess \ No newline at end of file diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/jioaben_choosefirmware.png b/docs/FAQ/zh/QP_download/media/jioaben_choosefirmware.png similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/jioaben_choosefirmware.png rename to docs/FAQ/zh/QP_download/media/jioaben_choosefirmware.png diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/jioaben_choosejiaoben.png b/docs/FAQ/zh/QP_download/media/jioaben_choosejiaoben.png similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/jioaben_choosejiaoben.png rename to docs/FAQ/zh/QP_download/media/jioaben_choosejiaoben.png diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/jioaben_downloadstart.png b/docs/FAQ/zh/QP_download/media/jioaben_downloadstart.png similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/jioaben_downloadstart.png rename to docs/FAQ/zh/QP_download/media/jioaben_downloadstart.png diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/jioaben_downloadsuccess.png b/docs/FAQ/zh/QP_download/media/jioaben_downloadsuccess.png similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/jioaben_downloadsuccess.png rename to docs/FAQ/zh/QP_download/media/jioaben_downloadsuccess.png diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/jioaben_start.png b/docs/FAQ/zh/QP_download/media/jioaben_start.png similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/jioaben_start.png rename to docs/FAQ/zh/QP_download/media/jioaben_start.png diff --git a/docs/FAQ/zh/QP_driver_failed/QP_driver_failed.md b/docs/FAQ/zh/QP_driver_failed/QP_driver_failed.md new file mode 100644 index 0000000000000000000000000000000000000000..1a928c0444cb0aaddcd1701ecc4b5673dd73eb74 --- /dev/null +++ b/docs/FAQ/zh/QP_driver_failed/QP_driver_failed.md @@ -0,0 +1,11 @@ +**如遇安装好了驱动,但是出现USB枚举失败,解决方式是:** + +1. 确保是官网下载最新的对应的驱动(**win7和win10是不同的,不同芯片平台对应的驱动也不同**) + + 可以参考你的电脑系统和模组芯片平台([硬件支持](https://python.quectel.com/doc/doc/Quecpython_intro/zh/Qp_Product_intro/Hardware_Support.html) 查看芯片平台)下载对应的驱动 + +2. 在“控制面板”——“卸载程序”中,查看驱动是否安装成功,截图是显示安装成功的 + + ![dirver](../QP_recovery/media/dirver.png) + +3. 如果仍存在驱动安装问题,请加入我们的QQ 群 445121768,工程师在线为您答疑解惑 \ No newline at end of file diff --git a/docs/FAQ/zh/QP_recovery/QP_recovery.md b/docs/FAQ/zh/QP_recovery/QP_recovery.md new file mode 100644 index 0000000000000000000000000000000000000000..7cf5c74d52ce422d79a5e75ae9dbe4c1049d6730 --- /dev/null +++ b/docs/FAQ/zh/QP_recovery/QP_recovery.md @@ -0,0 +1,163 @@ +当使用QPYcom工具下载固件失败后,不用担心板子成砖,我们来帮你救砖。 + +## 可正常显示串口救砖 + +1.打开电脑任务管理器(可快捷键“Ctrl+Alt+Delete”打开),找到QPYcom.exe,强制结束后台任务。 + +2.对于开发板:按住板子上的reset按键,重启板子;对于裸模块,可直接断电再上电,然后拉低POWKEY开机 + +3.看设备管理器的串口列表中是否显示出正常数目的串口,如果原固件是python固件,会正常显示三个串口(AT、DIAG以及USB串行设备口),如下表格左侧截图,如果原固件是非python固件,会正常显示两个串口(AT和DIAG口),如下表格右侧截图。以下的截图都属于正常显示,对于可正常显示的模组,请进行第4步;对于非正常显示的模组,则参考方法2或者方法3。 + +| python固件模组对应的设备管理器 | 非python固件模组对应的设备管理器 | +| ------------------------------- | -------------------------------- | +| ![img](media/clip_image002.jpg) | ![img](media/clip_image004.jpg) | + +4.如果正常显示出串口则重新打开QPYcom.exe工具,参照《Quectel QuecPython_QPYcom工具使用说明》重新下载固件。 + + + +## QPYcom救砖 + +如果在QPYcom里面升级失败或者升级过程中断开连接,请按照如下步骤执行: + +1.模组断电,短接VDD_EXT 和USB_BOOT,模组对应的PIN脚位置如下图 + +![img](media/clip_image006.jpg) + +或者可以是直接短接EC600S_QuecPython_EVB_V1.x 开发板的BOOT和1V8(如下图);对于其他开发板,自己找到对应的位置 + +img + +img + +2.查看设备管理是否会出现DOWNLOAD口,如下图所示: + +img + +3.如果不是上图所示的下载口,出现ASR下载口,如下图所示: + +img + +​ 有两种解决方案: + +(1)忽略,继续执行下面“步骤4”,但是如果失败,则按照方法3操作 + +(2)调整下载口(具体步骤见章节“下载口调整”) + +4.打开QPYcom,不要打开串口,直接创建项目(**对于非python固件的模块,一定不要打开串口**)。 + +img + +5.点击“选择固件”。 + +**注意事项:** + +(1)选择的固件是一个压缩包 + +(2)固件的下一级目录全部是.bin等等,也就是说固件里面无额外的压缩包。(可能存在官网下载的固件需要解压再进行下一步) + +img + +6.点击“下载固件” + +img + +7.等待20秒左右会出现下载进度条 + +img + +8.等待下载结束出现下方界面表示“下载成功” + +img + + + +9.对于上面下载成功后会自动重启模组(若未重启,手动重启即可),检查设备管理器,正确显示如下: + +img + + + +## Qflash救砖 + + + +1.下载 QFlash 工具压缩包,解压后,双击运行该软件; + +img + +2.点击【Load FW Files】 选择固件升级包。 + +**固件包注意事项:** + +(1)选择的固件是一个压缩包 + +(2)固件的下一级目录全部是.bin文件等等,也就是说固件里面无额外的压缩包。(可能存在官网下载的固件需要解压再进行下一步) + +3.对于EC100Y和EC600S都无需选择COM port 和 Baudrate,所以对于图中的“COM port和Baudrate”可忽略,也就是说,即使没有正常端口,也可以使用Qflash来固件下载 + +4.短接VDD_EXT和USB_BOOT(上电前短接,短接位置见方法2),然后上电,同时点击Qflash的start。 + +![img](media/clip_image030.jpg) + +注意事项: + +​ 由于Qflash检测下载口有时间限制,可以考虑把短接放在第一步,然后对于第4步,直接上电即可;或者对于第4步的短接上电需要快速操作 + +5.下载结束,参考如下截图: + +![img](media/clip_image032.jpg) + +6.QCOM查询如下图 + +![img](media/clip_image034.jpg) + +显示py结尾表示烧录py固件成功 + +对于方法2中可能遇到的问题有以下几点建议: + +(1)如遇Qflash下载任何失败的问题,请关闭Qflash重新启动(如何有效的关闭Qflash进程,可以通过“Ctrl+Alt+Delete”打开“设备管理器”,彻底杀死Qflash,具体如下截图)。然后重新回到第一步进行固件下载操作。 + +img + +(2)短接上电后计算机端口会显示如下图(禁用其他端口,出现下载口),可查看确认。 + +img + + + + + + + +## 下载口调整 + +1.首先确认,下载口是否如下截图,如果是,继续执行“第2步”,否则的话,可群里(移远QuecPython开发交流群:445121768)咨询 + +img + +2.选中上述截图的下载口,右击“更新驱动程序” + +img + +3. 选择“浏览我的电脑以查找驱动程序” + +img + +4.选择“让我从计算机上的可用驱动程序列表中选取” + +img + + + +5.选择“Quectel Download Port”(如果没有,请先下载安装驱动)后,点击“下一步” + +img + +6.选择“关闭” + +img + +7.最后界面如下图,表示“下载口调整”完成。 + +img \ No newline at end of file diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image002.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image002.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image002.jpg rename to docs/FAQ/zh/QP_recovery/media/clip_image002.jpg diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image004.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image004.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image004.jpg rename to docs/FAQ/zh/QP_recovery/media/clip_image004.jpg diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image006.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image006.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image006.jpg rename to docs/FAQ/zh/QP_recovery/media/clip_image006.jpg diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image008.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image008.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image008.jpg rename to docs/FAQ/zh/QP_recovery/media/clip_image008.jpg diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image010.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image010.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image010.jpg rename to docs/FAQ/zh/QP_recovery/media/clip_image010.jpg diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image012.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image012.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image012.jpg rename to docs/FAQ/zh/QP_recovery/media/clip_image012.jpg diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image014.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image014.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image014.jpg rename to docs/FAQ/zh/QP_recovery/media/clip_image014.jpg diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image016.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image016.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image016.jpg rename to docs/FAQ/zh/QP_recovery/media/clip_image016.jpg diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image018.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image018.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image018.jpg rename to docs/FAQ/zh/QP_recovery/media/clip_image018.jpg diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image020.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image020.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image020.jpg rename to docs/FAQ/zh/QP_recovery/media/clip_image020.jpg diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image022.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image022.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image022.jpg rename to docs/FAQ/zh/QP_recovery/media/clip_image022.jpg diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image024.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image024.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image024.jpg rename to docs/FAQ/zh/QP_recovery/media/clip_image024.jpg diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image026.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image026.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image026.jpg rename to docs/FAQ/zh/QP_recovery/media/clip_image026.jpg diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image028.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image028.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image028.jpg rename to docs/FAQ/zh/QP_recovery/media/clip_image028.jpg diff --git a/docs/FAQ/zh/QP_recovery/media/clip_image030.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image030.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a0388365a83427245727e3a8ace96c8dfcb47495 Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/clip_image030.jpg differ diff --git a/docs/FAQ/zh/QP_recovery/media/clip_image032.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image032.jpg new file mode 100644 index 0000000000000000000000000000000000000000..df7c78202aa7e7f958a0317669795f4f71de921a Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/clip_image032.jpg differ diff --git a/docs/FAQ/zh/QP_recovery/media/clip_image034.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image034.jpg new file mode 100644 index 0000000000000000000000000000000000000000..315ef007b4ecced814894a76e832cddc55a63873 Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/clip_image034.jpg differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image036.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image036.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image036.jpg rename to docs/FAQ/zh/QP_recovery/media/clip_image036.jpg diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image038.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image038.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image038.jpg rename to docs/FAQ/zh/QP_recovery/media/clip_image038.jpg diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image040.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image040.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image040.jpg rename to docs/FAQ/zh/QP_recovery/media/clip_image040.jpg diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image042.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image042.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image042.jpg rename to docs/FAQ/zh/QP_recovery/media/clip_image042.jpg diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image044.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image044.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image044.jpg rename to docs/FAQ/zh/QP_recovery/media/clip_image044.jpg diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image046.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image046.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image046.jpg rename to docs/FAQ/zh/QP_recovery/media/clip_image046.jpg diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image048.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image048.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image048.jpg rename to docs/FAQ/zh/QP_recovery/media/clip_image048.jpg diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image050.jpg b/docs/FAQ/zh/QP_recovery/media/clip_image050.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image050.jpg rename to docs/FAQ/zh/QP_recovery/media/clip_image050.jpg diff --git a/docs/FAQ/zh/QP_recovery/media/dirver.png b/docs/FAQ/zh/QP_recovery/media/dirver.png new file mode 100644 index 0000000000000000000000000000000000000000..1e9699c614b5fb9e818dc025b9b5531724f514bc Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/dirver.png differ diff --git a/docs/FAQ/zh/QP_recovery/media/image-20210412165538789.png b/docs/FAQ/zh/QP_recovery/media/image-20210412165538789.png new file mode 100644 index 0000000000000000000000000000000000000000..95ceb17fb12a393311064e02b4987633d5e3f4a9 Binary files /dev/null and b/docs/FAQ/zh/QP_recovery/media/image-20210412165538789.png differ diff --git a/docs/FAQ/zh/QP_test/QP_test.md b/docs/FAQ/zh/QP_test/QP_test.md new file mode 100644 index 0000000000000000000000000000000000000000..e1cebd13ac7ad98cad252457615460b417e45a50 --- /dev/null +++ b/docs/FAQ/zh/QP_test/QP_test.md @@ -0,0 +1,271 @@ +## QuecPython main.py文件使用 + +对于main.py的几点建议: + +(1)对于开始的调试,建议不要将程序命名为:main.py,建议使用其他名字,例如:start.py等等。如果里面存在死循环,那么在程序运行时无法中断,对于此情况,暂时只能通过重刷固件解决。 + +(2)如果真的想使用main.py程序,同时又需要使用死循环,记得在死循环里面加一个可中断的条件,例如(1.如下的例子是在一个线程里面加入了死循环,同时在这个死循环里面加入了中断退出的条件,当一直输出时,可通过GPIO2对应的按键中断输出;2.下面的例子是基于EC600S_QuecPython_EVB_V1.x 开发板的,其他开发板请自行配置按键中断): + +```python +import log +import _thread +from machine import Pin +import utime +log.basicConfig(level=log.NOTSET) +KEY_log = log.getLogger("KEY") +gpio2 = Pin(Pin.GPIO2, Pin.IN, Pin.PULL_DISABLE, 0) +def in_capture(): + KEY_log.debug("in_capture start!") + while True: + KEY_log.info("1111") + utime.sleep(1) + if gpio2.read() == 0: + KEY_log.info("in_capture thread end") + break + else: + pass +if __name__ == "__main__": + _thread.start_new_thread(in_capture, ()) + +``` + +(3)对于自运行没有log输出,可以参考下面现象2的解决方法。 + +**现象1:上传py文件且文件名为main.py到模块后无法任何执行指令(包括上传文件等),类似现象如下截图** + +img + +导致原因:模块在开机后会自动寻找运行文件名为main.py的脚本文件,如果main.py中存在while,for这种循环语句,会导致程序阻塞,串口被占用,无法进行其他操作 + +**解决方案:目前版本只能通过重刷固件解决**。 + + + +**现象2:手动运行main.py程序,可以看到通过QPYcom连接“USB串行设备”看到print输出和LOG打印信息,但是自运行main.py程序后,在QPYcom的交互界面,什么都看不到。** + +**解决方法:可以加入串口打印** + +(1) 软件代码可参考: + +```python +from machine import UART # 导入UART模块 +uart = UART(UART.UART2, 115200, 8, 0, 1, 0) #配置成UART2输出(硬件的连接) +count = 50 +while count: + uart.write('main_py_UART_msg:{}\r\n'.format(count)) + count -= 1 +``` + +说明: + +​ 串口打印是需要导入UART模块,按照UART的API库来书写输出代码 + +(2) 硬件连接可参考: + +对于代码中提到的硬件连接(UART2),是使用type-c给模块供电,UART与TTL转USB模块的连接如下表,TTL转USB模块直接插PC上: + +| 模块UART_pin脚 | TTL转USB模块 | +| -------------- | ------------ | +| RX1 | Tx | +| TX1 | Rx | +| GND | GND | + +使用QCOM连接“TTL转USB模块”对应的串口,如下图: + +img + +鉴于上述的软硬件配置后,在自运行main.py程序时,就会在QCOM看到对应的打印,如下图: + +img + +## 串口的收发数据测试流程 + +环境搭建(这个测试仅测试 API 对串口的封装): + +(1) USB 给EC600S_QuecPython_EVB_V1.x供电,main 串口的TX1和RX1对应接到电平转换芯片的3.3V端(经电平转换成5V,是使用一个电平转换器件),串口工具GND 接地 + +(2) 软件方面:一端使用 QPYcom 连接EC600S_QuecPython_EVB_V1.x的“USB串行设备”口(用于调试时发送QuecPython指令);另一端使用QCOM 连接“电平转换器件”对应的端口(用于接收EC600S_QuecPython_EVB_V1.x发送的数据(测试模块的write 功能),以及发送数据给模块(测试模块的read 功能))。 + +```python +# 发数据(write): +>>> from machine import UART +>>> uart = UART(UART.UART2,115200,8,0,1,0) /////////////////// 定义发数据的端口,必须要严格按照硬件的接线来配置 +>>> uart.write("12345678") //////////// wite数据后,可以通过QCOM 看到数据(如下截图) +8 ////////////“8”表示发送的字节数 +``` + +![image-20210311201822427](media/image-20210311201822427.png) + + + +```python +# 收数据(read): +>>> from machine import UART +>>> uart = UART(UART.UART2,115200,8,0,1,0) /////////////////// 定义接收数据的端口,必须要严格按照硬件的接线来配置 +>>> uart.any() ////////////// 显示缓存的数据(只有在QCOM发送数据,这里才会显示未读的数据) +32 +>>> msglen = uart.any() ////////////////// 将缓存的数据字节长度数赋值给msglen +>>> msg = uart.read(msglen) /////////////////// 读取缓存字节数对应的数据 +>>> utf8_mmmm = msg.decode() ////////////////// 将byte类型的数据转换成unicode类型 +>>> print(utf8_mmmm) //////////// 以unicode类型输出数据 +555555 +555555 +555555 +555555 +``` + + + +## Socket的测试(客户反馈连接失败不报错) + +问题是:使用connect命令,成功和失败都不显示 + +```python +>>> import usocket +>>> client = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) ////每次连接连接前必须定义 +>>> sockaddr = usocket.getaddrinfo('www.tongxinmao.com',80)[0][-1] ////正确端口,socket +>>> client.connect(sockaddr) +>>> client.close() ////////////// 每次连接后想重新连接必须关闭 +>>> client = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) ////每次连接连接前必须定义 +>>> sockaddr = usocket.getaddrinfo('www.tongxinmao.com',82)[0][-1] ////错误端口,socket +>>> client.connect(sockaddr) +Traceback (most recent call last): + File "", line 1, in +OSError: 104 +>>> client.close() //////////////每次连接后想重新连接必须关闭 +>>> client = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) ////每次连接连接前必须定义 +>>> sockaddr = usocket.getaddrinfo('www.tongxinmao.com',80)[0][-1] ////正确端口,socket + +>>> client.connect(sockaddr) +>>> client.close() //////////////每次连接后想重新连接必须关闭 +``` + +## EC600S裸模块开机烧录测试 + +EC600S的硬件连接: + +| 模块端 | USB | +| ----------------- | --------------------- | +| USB_DP(PIN26) | 绿色-USB数据线(正) | +| USB_DM(PIN27) | 白色-USB数据线(负) | +| USB_VBUS(PIN28) | 红色-USB电源 | +| GND(PIN30) | 黑色-地线 | + +| 模块端 | 电源端 | +| ---------------- | ---------- | +| VBAT_BB(PIN29) | 电源的正极 | +| VBAT_RF(PIN36) | 电源的正极 | +| VBAT_RF(PIN37) | 电源的正极 | +| GND(PIN38) | 电源的负极 | + +实物图: + +![image-20210312101407043](media/image-20210312101407043.png) ![image-20210312102149061](media/image-20210312102149061.png) + + POWKEY拉低开机后,未烧录固件的DM + +image-20210312102450245 + +烧录后,重启的DM + +image-20210312102517370 + +前后版本查询 + +image-20210312132017231 + + + +## QuecPython MQTT连接异常处理 + +### umqtt使用 + +umqtt模块提供创建MQTT客户端的发布订阅功能。该模块可以向服务端发布或者订阅消息,向服务器发送ping包,检测保持连通性,与服务器建立或者断开连接,需要注意的是MQTTClient.check_msg()和MQTTClient.wait_msg()方法中推荐使用**wait_msg**的方法。 + +### 使用MQTT连接阿里云、腾讯云等 + +使用MQTT连接阿里云、腾讯云的步骤可以详细参见官网上的wiki社区([https://python.quectel.com/wiki/](https://python.quectel.com/wiki/))的QuecPython云服务。 + +### 云服务运行demo出现,未订阅等信息 + +现象:类似下面截图 + +![image-20210312132446192](media/image-20210312132446192.png) + +原因分析:(1)注网失败;(2)您订阅与发布的主题,在云服务端没有创建 + +(1)对于注网失败,解决步骤如下: + +​ 使用QCOM,连接AT口,查询命令“AT+CSQ; +CREG?; +CEREG? ;+CGREG? ; +CPIN?;+COPS?”,如下截图,类似下面情况说明您的网络状态是正常的。 + +![image-20210312132458172](media/image-20210312132458172.png) + +​ 如有异常的常见解决方案是: + +对于AT+CPIN?的异常处理,检查SIM卡座硬件问题; + +对于CREG,CGREG,CEREG的,建议检查手机卡是否存在欠费等情况,也就是确认手机卡是否正常 + +对于CSQ的话,检查周围环境,是否存在导致信号不好的干扰,建议室外测试,或者室内加天线。 + +(2) 对于“订阅与发布的主题,在云服务端没有创建”,建议检查以下两点: + +检查您订阅的主题,在云服务上对应的主题是不是也是可订阅的状态 + +检查您发布的主题,在云服务上对应的主题是不是也是可发布的状态 + +### MQTT连接一段时间异常断开 + +导致原因: MQTT服务端会有心跳检测机制,一段时间内设备与云端没有通信活动会主动断开连接 + +尝试解决方向:连接断开是依据配置mqtt时的超时值keepalive,在超出活动时间后会主动断开连接,我们可以根据设置keepalive活动时间使用定时器在活动时间超出前主动向云端发送ping包,服务端返回的数据包无需客户处理。 + +![image-20210312132735642](media/image-20210312132735642.png) + +## MQTT测试 + +客户疑问:MQTT断线通过捕获异常获取,但是断线后,异常捕获不到 + +疑问解答:会抛出异常,umqtt已经做了处理,上层的try捕捉不到下面的异常,对于断线后会尝试重连,有log输出,不会直接抛出异常。下面是测试的部分LOG(之前一直收发,后面拔卡后尝试重连) + +具体的测试代码是: + +```python +from umqtt import MQTTClient +import utime +import log +import checkNet + +PROJECT_NAME = "QuecPython_MQTT_example" +PROJECT_VERSION = "1.0.0" + +checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION) + +# 设置日志输出级别 +log.basicConfig(level=log.INFO) +mqtt_log = log.getLogger("MQTT") + +state = 0 +def sub_cb(topic, msg): + global state + mqtt_log.info("Subscribe Recv: Topic={},Msg={}".format(topic.decode(), msg.decode())) + +if __name__ == '__main__': + utime.sleep(5) + checknet.poweron_print_once() + checknet.wait_network_connected() + c = MQTTClient("umqtt_client", "mq.tongxinmao.com", 18830) + c.set_callback(sub_cb) + c.connect() + while True: + c.subscribe(b"/public/TEST/quecpython") + mqtt_log.info("Connected to mq.tongxinmao.com, subscribed to /public/TEST/quecpython topic") + # 发布消息 + c.publish(b"/public/TEST/quecpython", b"my name is Quecpython!") + mqtt_log.info("Publish topic: /public/TEST/quecpython, msg: my name is Quecpython") + c.wait_msg() # 阻塞函数,监听消息 + if state == 1: + break + c.disconnect() +``` + diff --git a/docs/FAQ/zh/QP_test/media/EC600SV1.1_UART.png b/docs/FAQ/zh/QP_test/media/EC600SV1.1_UART.png new file mode 100644 index 0000000000000000000000000000000000000000..7b700cbbda72524f9ad959c6ead9bc4793dc57d8 Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/EC600SV1.1_UART.png differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image004-1615461735615.jpg b/docs/FAQ/zh/QP_test/media/clip_image004-1615461735615.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image004-1615461735615.jpg rename to docs/FAQ/zh/QP_test/media/clip_image004-1615461735615.jpg diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image006-1615461735616.jpg b/docs/FAQ/zh/QP_test/media/clip_image006-1615461735616.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image006-1615461735616.jpg rename to docs/FAQ/zh/QP_test/media/clip_image006-1615461735616.jpg diff --git a/docs/FAQ/zh/QP_test/media/clip_image008-1615527701161.jpg b/docs/FAQ/zh/QP_test/media/clip_image008-1615527701161.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b5a4631fc16244eb6a9edae717daaaed8ced61a4 Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/clip_image008-1615527701161.jpg differ diff --git a/docs/FAQ/zh/QP_test/media/clip_image010-1615527701161.jpg b/docs/FAQ/zh/QP_test/media/clip_image010-1615527701161.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f368c332062aeadbd5f0089a51ed07e75555d5cb Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/clip_image010-1615527701161.jpg differ diff --git a/docs/FAQ/zh/QP_test/media/clip_image012-1615527701161.jpg b/docs/FAQ/zh/QP_test/media/clip_image012-1615527701161.jpg new file mode 100644 index 0000000000000000000000000000000000000000..dcf75a760f986dccbd0ed06a4b057381755586c0 Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/clip_image012-1615527701161.jpg differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/image-20210311201822427.png b/docs/FAQ/zh/QP_test/media/image-20210311201822427.png similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/image-20210311201822427.png rename to docs/FAQ/zh/QP_test/media/image-20210311201822427.png diff --git a/docs/FAQ/zh/QP_test/media/image-20210312101407043.png b/docs/FAQ/zh/QP_test/media/image-20210312101407043.png new file mode 100644 index 0000000000000000000000000000000000000000..07aa3ada32cfd8352b5466c2c4ae595be1e3529e Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/image-20210312101407043.png differ diff --git a/docs/FAQ/zh/QP_test/media/image-20210312102149061.png b/docs/FAQ/zh/QP_test/media/image-20210312102149061.png new file mode 100644 index 0000000000000000000000000000000000000000..61b0c4e5c2104fdcd5fdbfb76ef624b36ad6b8ed Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/image-20210312102149061.png differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312102450245.png b/docs/FAQ/zh/QP_test/media/image-20210312102450245.png similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/image-20210312102450245.png rename to docs/FAQ/zh/QP_test/media/image-20210312102450245.png diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312102517370.png b/docs/FAQ/zh/QP_test/media/image-20210312102517370.png similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/image-20210312102517370.png rename to docs/FAQ/zh/QP_test/media/image-20210312102517370.png diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/image-20210312132017231.png b/docs/FAQ/zh/QP_test/media/image-20210312132017231.png similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/image-20210312132017231.png rename to docs/FAQ/zh/QP_test/media/image-20210312132017231.png diff --git a/docs/FAQ/zh/QP_test/media/image-20210312132446192.png b/docs/FAQ/zh/QP_test/media/image-20210312132446192.png new file mode 100644 index 0000000000000000000000000000000000000000..df0ccc00f3b37e23daf51c0258f9288973efcba1 Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/image-20210312132446192.png differ diff --git a/docs/FAQ/zh/QP_test/media/image-20210312132458172.png b/docs/FAQ/zh/QP_test/media/image-20210312132458172.png new file mode 100644 index 0000000000000000000000000000000000000000..6e666713160348d38305ca0b5299d60f23f69c2a Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/image-20210312132458172.png differ diff --git a/docs/FAQ/zh/QP_test/media/image-20210312132735642.png b/docs/FAQ/zh/QP_test/media/image-20210312132735642.png new file mode 100644 index 0000000000000000000000000000000000000000..6e2a63139ea716f3a8f3b59ccef75a05f38745c5 Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/image-20210312132735642.png differ diff --git a/docs/FAQ/zh/QP_test/media/image-20210312134000186.png b/docs/FAQ/zh/QP_test/media/image-20210312134000186.png new file mode 100644 index 0000000000000000000000000000000000000000..4f5048d5699ba70e60d494609bffea847ba435a9 Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/image-20210312134000186.png differ diff --git a/docs/FAQ/zh/QP_test/media/image-20210312134025628.png b/docs/FAQ/zh/QP_test/media/image-20210312134025628.png new file mode 100644 index 0000000000000000000000000000000000000000..7b700cbbda72524f9ad959c6ead9bc4793dc57d8 Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/image-20210312134025628.png differ diff --git a/docs/FAQ/zh/QP_test/media/image-20210312135703298.png b/docs/FAQ/zh/QP_test/media/image-20210312135703298.png new file mode 100644 index 0000000000000000000000000000000000000000..4a83bc67936d660f08718183998fe308e4d4dcbf Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/image-20210312135703298.png differ diff --git a/docs/FAQ/zh/QP_test/media/image-20210312135803677.png b/docs/FAQ/zh/QP_test/media/image-20210312135803677.png new file mode 100644 index 0000000000000000000000000000000000000000..0f7d4b0b96301b5651f321bfd57d85f2239e454e Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/image-20210312135803677.png differ diff --git a/docs/FAQ/zh/QP_test/media/image-20210312135817816.png b/docs/FAQ/zh/QP_test/media/image-20210312135817816.png new file mode 100644 index 0000000000000000000000000000000000000000..408a19251112775c9b8a4682701b6a4a4079eb0c Binary files /dev/null and b/docs/FAQ/zh/QP_test/media/image-20210312135817816.png differ diff --git a/docs/FAQ/zh/QuecPython_FAQ/media/clip_image002-1615461735616.jpg b/docs/FAQ/zh/QP_test/media/main_problem.jpg similarity index 100% rename from docs/FAQ/zh/QuecPython_FAQ/media/clip_image002-1615461735616.jpg rename to docs/FAQ/zh/QP_test/media/main_problem.jpg diff --git a/docs/FAQ/zh/QuecPython_FAQ/QuecPython_FAQ.md b/docs/FAQ/zh/QuecPython_FAQ/QuecPython_FAQ.md index 4e2de4e75347d9c4c05eb00c85fa9eab66aadab5..4f5e663558d3d307e5656b8aa7961d3f34f979db 100644 --- a/docs/FAQ/zh/QuecPython_FAQ/QuecPython_FAQ.md +++ b/docs/FAQ/zh/QuecPython_FAQ/QuecPython_FAQ.md @@ -1,807 +1,22 @@ -## QuecPython支持群地址 -移远QuecPython开发交流群:445121768 -## QuecPython相关准备 - -### 开发板 - -目前推荐的开发板: - -(1)小熊派 - -![](media/BreaPi.png) - -(2)EC600S_QuecPython_EVB_V1.x 开发板 - -![EC600S_QuecPython_EVB_V1.x](media/EC600S_QuecPython_EVB_V1.x.png) - -### 驱动下载安装 - -1.使用开发板前,需要在电脑上安装USB驱动。正确安装后,电脑可以识别开发板。 - -| 驱动程序名称 | Quectel_ASR_Series_UMTS<E_Windows_USB_Driver_Customer | -| ---------------- | ------------------------------------------------------------ | -| 驱动程序下载地址 | [https://python.quectel.com/download.html](https://python.quectel.com/download.html) | - -2.开发者下载驱动程序的压缩包后,完整解压该压缩包到任意目录,双击运行setup.exe: - -![dirver_setup](media/dirver_setup.png) - -3.按照提示,点击Install即可: - -dirver_installing - -4.安装成功后,点击“Finish”结束: - -dirver_finish - -5.至此,USB 驱动安装结束。 - -6.对于python固件的模块,驱动安装好的设备管理器是: - -dirver_python - -​ 对于非python固件的模块,驱动安装好的设备管理器是: - -dirver_c - - - -**TIPS** - -(1)“QuecPython驱动安装失败问题”见“QuecPython驱动安装失败问题解决”章节 - -(2)安装前,请备份您的重要文件,并保存您的工作进度,以免发生意外情况,导致文件丢失 - -(3)安装成功后,无需重启电脑 - -(4)如需修复或者卸载驱动程序,再次运行该驱动安装程序,选择“修复”或“卸载” 即可 - - - -### 固件下载安装 - -**说明:** -(1)为了对客户python应用程序做交互适配,需要先下载QuecPython固件到开发板中,下载完成后才可以对python应用程序做底层适配处理。固件下载网址:[https://python.quectel.com/download.html](https://python.quectel.com/download.html) -(2)QPYcom工具支持烧py固件,不支持烧C固件 -(3)具体步骤如下 - -1.首先确认自己的模块版本,使用QCOM查看,发送AT指令 ‘AT+GMR ‘,如下所示: - -firmware_ATI - -版本说明:如果是python版的固件(固件号以PY结尾),则直接跳过此步骤;如果不是python版本,根据版本的前半部分,下载对应的固件(如果是下图的固件,请至官网下载对应的EC600SCNAA的python固件) - -firmware_ATI02 - -2.不要打开串口,直接创建项目(**对于非python固件模块,不要打开任何串口,包括AT串口**)。 - -firmware_notopen - -3.点击“选择固件”。 - -firmware_choosefirmware - -**注意事项:** -(1) 选择的固件是一个压缩包 -(2) 固件的下一级目录全部是.bin等等,也就是说固件里面无额外的压缩包。(可能存在官网下载的固件需要解压再进行下一步) - -4.点击“下载固件” - -firmware_downloadfirmware - -5.等待20秒左右会出现下载进度条 - -firmware_downloadwaiting - -6.等待下载结束出现下方界面表示“下载成功” - -firmware_downloadsuccess - - - -TIPS: -(1)“QuecPython固件安装失败问题”见“QuecPython救砖处理”章节 -(2)安装前,请备份您的重要文件,并保存您的工作进度,以免发生意外情况,导致文件丢失 -(3)安装成功后,无需重启电脑 - -### 脚本下载 - -​ 脚本下载的建议: - -(1)为了方便脚本下载,QPYcom已经做了脚本拖拽下载的功能,欢迎大家使用,如您有使用问题,可参考《Quectel QuecPython_QPYcom工具使用说明》 - -(2)如果你想一次性下载您的所有脚本,并清除原来的脚本(具体清除哪些脚本,见下面解释),可以按照下面的脚本下载步骤操作 - -​ 对于使用如下脚本下载的步骤,哪些脚本会被删除的解释:对于根目录除了json都会删除,而对于子文件夹(自己新建一个文件夹),脚本下载不会影响这个文件夹。 - -1.用户选择“USB串行设备”后,“打开串口”,点击“下载”按钮,创建项目(项目名称随意)。 - -jioaben_start - -2.点击“选择固件”(脚本下载暂时是需要选择固件,但是不会下载固件,这一步后面可以省略)。 - -jioaben_choosefirmware - -3.选择需要下载的脚本 - -jioaben_choosejiaoben - -4.下载脚本,等待完成 - -jioaben_downloadstart - -5.完成界面展示 - -jioaben_downloadsuccess - -## QuecPython驱动安装失败问题解决 - -如遇安装好了驱动,但是出现USB枚举失败,解决方式是: - -(1) 确保是官网下载最新的对应的驱动(win7和win10是不同的) - -(2) 在“控制面板”——“卸载程序”中,查看驱动是否安装成功,截图是显示安装成功的 - -![dirver](media/dirver.png) - -(3) 如果仍存在驱动安装问题,请加入我们的QQ 群 445121768,工程师在线为您答疑解惑 - - - -## QuecPython救砖处理 - -当使用QPYcom工具下载固件失败后,不用担心板子成砖,我们来帮你救砖。 - -### 方法1 - -1.打开电脑任务管理器(可快捷键“Ctrl+Alt+Delete”打开),找到QPYcom.exe,强制结束后台任务。 - -2.对于开发板:按住板子上的reset按键,重启板子;对于裸模块,可直接断电再上电,然后拉低POWKEY开机 - -3.看设备管理器的串口列表中是否显示出正常数目的串口,如果原固件是python固件,会正常显示三个串口(AT、DIAG以及USB串行设备口),如下表格左侧截图,如果原固件是非python固件,会正常显示两个串口(AT和DIAG口),如下表格右侧截图。以下的截图都属于正常显示,对于可正常显示的模组,请进行第4步;对于非正常显示的模组,则参考方法2或者方法3。 - -| python固件模组对应的设备管理器 | 非python固件模组对应的设备管理器 | -| ------------------------------- | -------------------------------- | -| ![img](media/clip_image002.jpg) | ![img](media/clip_image004.jpg) | - -4.如果正常显示出串口则重新打开QPYcom.exe工具,参照《Quectel QuecPython_QPYcom工具使用说明》重新下载固件。 - - - -### 方法2 - -如果在QPYcom里面升级失败或者升级过程中断开连接,请按照如下步骤执行: - -1.模组断电,短接VDD_EXT 和USB_BOOT,模组对应的PIN脚位置如下图 - -![img](media/clip_image006.jpg) - -或者可以是直接短接EC600S_QuecPython_EVB_V1.x 开发板的BOOT和1V8(如下图);对于其他开发板,自己找到对应的位置 - -img - -img - -2.查看设备管理是否会出现DOWNLOAD口,如下图所示: - -img - -3.如果不是上图所示的下载口,出现ASR下载口,如下图所示: - -img - -​ 有两种解决方案: - -(1)忽略,继续执行下面“步骤4”,但是如果失败,则按照方法3操作 - -(2)调整下载口(具体步骤见章节“下载口调整”) - -4.打开QPYcom,不要打开串口,直接创建项目(**对于非python固件的模块,一定不要打开串口**)。 - -img - -5.点击“选择固件”。 - -**注意事项:** - -(1)选择的固件是一个压缩包 - -(2)固件的下一级目录全部是.bin等等,也就是说固件里面无额外的压缩包。(可能存在官网下载的固件需要解压再进行下一步) - -img - -6.点击“下载固件” - -img - -7.等待20秒左右会出现下载进度条 - -img - -8.等待下载结束出现下方界面表示“下载成功” - -img - - - -9.对于上面下载成功后会自动重启模组(若未重启,手动重启即可),检查设备管理器,正确显示如下: - -img - - - -### 方法3 - - - -1.下载 QFlash 工具压缩包,解压后,双击运行该软件; - -img - -2.点击【Load FW Files】 选择固件升级包。 - -**固件包注意事项:** - -(1)选择的固件是一个压缩包 - -(2)固件的下一级目录全部是.bin文件等等,也就是说固件里面无额外的压缩包。(可能存在官网下载的固件需要解压再进行下一步) - -3.对于EC100Y和EC600S都无需选择COM port 和 Baudrate,所以对于图中的“COM port和Baudrate”可忽略,也就是说,即使没有正常端口,也可以使用Qflash来固件下载 - -4.短接VDD_EXT和USB_BOOT(上电前短接,短接位置见方法2),然后上电,同时点击Qflash的start。 - -![img](media/clip_image030.jpg) - -注意事项: - -​ 由于Qflash检测下载口有时间限制,可以考虑把短接放在第一步,然后对于第4步,直接上电即可;或者对于第4步的短接上电需要快速操作 - -5.下载结束,参考如下截图: - -![img](media/clip_image032.jpg) - -6.QCOM查询如下图 - -![img](media/clip_image034.jpg) - -显示py结尾表示烧录py固件成功 - -对于方法2中可能遇到的问题有以下几点建议: - -(1)如遇Qflash下载任何失败的问题,请关闭Qflash重新启动(如何有效的关闭Qflash进程,可以通过“Ctrl+Alt+Delete”打开“设备管理器”,彻底杀死Qflash,具体如下截图)。然后重新回到第一步进行固件下载操作。 - -img - -(2)短接上电后计算机端口会显示如下图(禁用其他端口,出现下载口),可查看确认。 - -img - - - - - - - -### 下载口调整 - -1.首先确认,下载口是否如下截图,如果是,继续执行“第2步”,否则的话,可群里(移远QuecPython开发交流群:445121768)咨询 - -img - -2.选中上述截图的下载口,右击“更新驱动程序” - -img - -3. 选择“浏览我的电脑以查找驱动程序” - -img - -4.选择“让我从计算机上的可用驱动程序列表中选取” - -img - - - -5.选择“Quectel Download Port”(如果没有,请先下载安装驱动)后,点击“下一步” - -img - -6.选择“关闭” - -img - -7.最后界面如下图,表示“下载口调整”完成。 - -img - - - - - -## QuecPython测试问题 - -### QuecPython main.py文件使用 - -对于main.py的几点建议: - -(1)对于开始的调试,建议不要将程序命名为:main.py,建议使用其他名字,例如:start.py等等。如果里面存在死循环,那么在程序运行时无法中断,对于此情况,暂时只能通过重刷固件解决。 - -(2)如果真的想使用main.py程序,同时又需要使用死循环,记得在死循环里面加一个可中断的条件,例如(1.如下的例子是在一个线程里面加入了死循环,同时在这个死循环里面加入了中断退出的条件,当一直输出时,可通过GPIO2对应的按键中断输出;2.下面的例子是基于EC600S_QuecPython_EVB_V1.x 开发板的,其他开发板请自行配置按键中断): - -```python -import log -import _thread -from machine import Pin -import utime -log.basicConfig(level=log.NOTSET) -KEY_log = log.getLogger("KEY") -gpio2 = Pin(Pin.GPIO2, Pin.IN, Pin.PULL_DISABLE, 0) -def in_capture(): - KEY_log.debug("in_capture start!") - while True: - KEY_log.info("1111") - utime.sleep(1) - if gpio2.read() == 0: - KEY_log.info("in_capture thread end") - break - else: - pass -if __name__ == "__main__": - _thread.start_new_thread(in_capture, ()) - -``` - -(3)对于自运行没有log输出,可以参考下面现象2的解决方法。 - -**现象1:上传py文件且文件名为main.py到模块后无法任何执行指令(包括上传文件等),类似现象如下截图** - -img - -导致原因:模块在开机后会自动寻找运行文件名为main.py的脚本文件,如果main.py中存在while,for这种循环语句,会导致程序阻塞,串口被占用,无法进行其他操作 - -**解决方案:目前版本只能通过重刷固件解决**。 - - - -**现象2:手动运行main.py程序,可以看到通过QPYcom连接“USB串行设备”看到print输出和LOG打印信息,但是自运行main.py程序后,在QPYcom的交互界面,什么都看不到。** - -**解决方法:可以加入串口打印** - -(1) 软件代码可参考: - -```python -from machine import UART # 导入UART模块 -uart = UART(UART.UART2, 115200, 8, 0, 1, 0) #配置成UART2输出(硬件的连接) -count = 50 -while count: - uart.write('main_py_UART_msg:{}\r\n'.format(count)) - count -= 1 -``` - -说明: - -​ 串口打印是需要导入UART模块,按照UART的API库来书写输出代码 - -(2) 硬件连接可参考: - -对于代码中提到的硬件连接(UART2),是使用type-c给模块供电,UART与TTL转USB模块的连接如下表,TTL转USB模块直接插PC上: - -| 模块UART_pin脚 | TTL转USB模块 | -| -------------- | ------------ | -| RX1 | Tx | -| TX1 | Rx | -| GND | GND | - -使用QCOM连接“TTL转USB模块”对应的串口,如下图: - -img - -鉴于上述的软硬件配置后,在自运行main.py程序时,就会在QCOM看到对应的打印,如下图: - -img - -### 串口的收发数据测试流程 - -环境搭建(这个测试仅测试 API 对串口的封装): - -(1) USB 给EC600S_QuecPython_EVB_V1.x供电,main 串口的TX1和RX1对应接到电平转换芯片的3.3V端(经电平转换成5V,是使用一个电平转换器件),串口工具GND 接地 - -(2) 软件方面:一端使用 QPYcom 连接EC600S_QuecPython_EVB_V1.x的“USB串行设备”口(用于调试时发送QuecPython指令);另一端使用QCOM 连接“电平转换器件”对应的端口(用于接收EC600S_QuecPython_EVB_V1.x发送的数据(测试模块的write 功能),以及发送数据给模块(测试模块的read 功能))。 - -```python -# 发数据(write): ->>> from machine import UART ->>> uart = UART(UART.UART2,115200,8,0,1,0) /////////////////// 定义发数据的端口,必须要严格按照硬件的接线来配置 ->>> uart.write("12345678") //////////// wite数据后,可以通过QCOM 看到数据(如下截图) -8 ////////////“8”表示发送的字节数 -``` - -![image-20210311201822427](media/image-20210311201822427.png) - - - -```python -# 收数据(read): ->>> from machine import UART ->>> uart = UART(UART.UART2,115200,8,0,1,0) /////////////////// 定义接收数据的端口,必须要严格按照硬件的接线来配置 ->>> uart.any() ////////////// 显示缓存的数据(只有在QCOM发送数据,这里才会显示未读的数据) -32 ->>> msglen = uart.any() ////////////////// 将缓存的数据字节长度数赋值给msglen ->>> msg = uart.read(msglen) /////////////////// 读取缓存字节数对应的数据 ->>> utf8_mmmm = msg.decode() ////////////////// 将byte类型的数据转换成unicode类型 ->>> print(utf8_mmmm) //////////// 以unicode类型输出数据 -555555 -555555 -555555 -555555 -``` - - - -### Socket的测试(客户反馈连接失败不报错) - -问题是:使用connect命令,成功和失败都不显示 - -```python ->>> import usocket ->>> client = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) ////每次连接连接前必须定义 ->>> sockaddr = usocket.getaddrinfo('www.tongxinmao.com',80)[0][-1] ////正确端口,socket ->>> client.connect(sockaddr) ->>> client.close() ////////////// 每次连接后想重新连接必须关闭 ->>> client = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) ////每次连接连接前必须定义 ->>> sockaddr = usocket.getaddrinfo('www.tongxinmao.com',82)[0][-1] ////错误端口,socket ->>> client.connect(sockaddr) -Traceback (most recent call last): - File "", line 1, in -OSError: 104 ->>> client.close() //////////////每次连接后想重新连接必须关闭 ->>> client = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) ////每次连接连接前必须定义 ->>> sockaddr = usocket.getaddrinfo('www.tongxinmao.com',80)[0][-1] ////正确端口,socket - ->>> client.connect(sockaddr) ->>> client.close() //////////////每次连接后想重新连接必须关闭 -``` - -### EC600S裸模块开机烧录测试 - -EC600S的硬件连接: - -| 模块端 | USB | -| ----------------- | --------------------- | -| USB_DP(PIN26) | 绿色-USB数据线(正) | -| USB_DM(PIN27) | 白色-USB数据线(负) | -| USB_VBUS(PIN28) | 红色-USB电源 | -| GND(PIN30) | 黑色-地线 | - -| 模块端 | 电源端 | -| ---------------- | ---------- | -| VBAT_BB(PIN29) | 电源的正极 | -| VBAT_RF(PIN36) | 电源的正极 | -| VBAT_RF(PIN37) | 电源的正极 | -| GND(PIN38) | 电源的负极 | - -实物图: - -![image-20210312101407043](media/image-20210312101407043.png) ![image-20210312102149061](media/image-20210312102149061.png) - - POWKEY拉低开机后,未烧录固件的DM - -image-20210312102450245 - -烧录后,重启的DM - -image-20210312102517370 - -前后版本查询 - -image-20210312132017231 - - - -### QuecPython MQTT连接异常处理 - -#### umqtt使用 - -umqtt模块提供创建MQTT客户端的发布订阅功能。该模块可以向服务端发布或者订阅消息,向服务器发送ping包,检测保持连通性,与服务器建立或者断开连接,需要注意的是MQTTClient.check_msg()和MQTTClient.wait_msg()方法中推荐使用**wait_msg**的方法。 - -#### 使用MQTT连接阿里云、腾讯云等 - -使用MQTT连接阿里云、腾讯云的步骤可以详细参见官网上的wiki社区([https://python.quectel.com/wiki/](https://python.quectel.com/wiki/))的QuecPython云服务。 - -#### 云服务运行demo出现,未订阅等信息 - -现象:类似下面截图 - -![image-20210312132446192](media/image-20210312132446192.png) - -原因分析:(1)注网失败;(2)您订阅与发布的主题,在云服务端没有创建 - -(1)对于注网失败,解决步骤如下: - -​ 使用QCOM,连接AT口,查询命令“AT+CSQ; +CREG?; +CEREG? ;+CGREG? ; +CPIN?;+COPS?”,如下截图,类似下面情况说明您的网络状态是正常的。 - -![image-20210312132458172](media/image-20210312132458172.png) - -​ 如有异常的常见解决方案是: - -对于AT+CPIN?的异常处理,检查SIM卡座硬件问题; - -对于CREG,CGREG,CEREG的,建议检查手机卡是否存在欠费等情况,也就是确认手机卡是否正常 - -对于CSQ的话,检查周围环境,是否存在导致信号不好的干扰,建议室外测试,或者室内加天线。 - -(2) 对于“订阅与发布的主题,在云服务端没有创建”,建议检查以下两点: - -检查您订阅的主题,在云服务上对应的主题是不是也是可订阅的状态 - -检查您发布的主题,在云服务上对应的主题是不是也是可发布的状态 - -#### MQTT连接一段时间异常断开 - -导致原因: MQTT服务端会有心跳检测机制,一段时间内设备与云端没有通信活动会主动断开连接 - -尝试解决方向:连接断开是依据配置mqtt时的超时值keepalive,在超出活动时间后会主动断开连接,我们可以根据设置keepalive活动时间使用定时器在活动时间超出前主动向云端发送ping包,服务端返回的数据包无需客户处理。 - -![image-20210312132735642](media/image-20210312132735642.png) - -### MQTT测试 - -客户疑问:MQTT断线通过捕获异常获取,但是断线后,异常捕获不到 - -疑问解答:会抛出异常,umqtt已经做了处理,上层的try捕捉不到下面的异常,对于断线后会尝试重连,有log输出,不会直接抛出异常。下面是测试的部分LOG(之前一直收发,后面拔卡后尝试重连) - -具体的测试代码是: - -```python -from umqtt import MQTTClient -import utime -import log -import checkNet - -PROJECT_NAME = "QuecPython_MQTT_example" -PROJECT_VERSION = "1.0.0" - -checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION) - -# 设置日志输出级别 -log.basicConfig(level=log.INFO) -mqtt_log = log.getLogger("MQTT") - -state = 0 -def sub_cb(topic, msg): - global state - mqtt_log.info("Subscribe Recv: Topic={},Msg={}".format(topic.decode(), msg.decode())) - -if __name__ == '__main__': - utime.sleep(5) - checknet.poweron_print_once() - checknet.wait_network_connected() - c = MQTTClient("umqtt_client", "mq.tongxinmao.com", 18830) - c.set_callback(sub_cb) - c.connect() - while True: - c.subscribe(b"/public/TEST/quecpython") - mqtt_log.info("Connected to mq.tongxinmao.com, subscribed to /public/TEST/quecpython topic") - # 发布消息 - c.publish(b"/public/TEST/quecpython", b"my name is Quecpython!") - mqtt_log.info("Publish topic: /public/TEST/quecpython, msg: my name is Quecpython") - c.wait_msg() # 阻塞函数,监听消息 - if state == 1: - break - c.disconnect() -``` - -## QuecPython其他常见问题第一部分 - -### 拿到开发板后不知道怎么使用 - -参考对应开发板的使用指导文档,下载地址:[https://python.quectel.com/download.html](https://python.quectel.com/download.html)。 - -### EC100Y开发板与EC100Y模组的串口位置 - -EC100Y开发板(小熊派)的串口位置如下图: - -![image-20210312134000186](media/image-20210312134000186.png) - -EC100Y模组的串口位置可参考《Quectel_EC100Y-CN_QuecOpen硬件设计手册V1.0》(可在移远QuecPython开发交流群的群文件自行下载)。 - -### EC600S开发板与EC600S模组的串口位置 - -EC600S开发板(EC600S_QuecPython_EVB_V1.x 开发板)的串口位置如下图: - - ![image-20210312134025628](media/image-20210312134025628.png) - -EC600S模组的串口位置可参考《Quectel_EC600S-CN_QuecOpen硬件设计手册V1.0.0_Preliminary_20200927》(可在移远QuecPython开发交流群的群文件自行下载): - -### Quecpython的GPIO对应关系说明 - -#### 对照原理图,在开发板找到具体位置 - -第一步,看这个GPIO与PIN脚的对应关系(位置在API库的PIN模块,左侧是QuecPython的GPIO命名,右侧是模组的PIN脚号),例如你想使用QuecPython的GPIO6,那么看了这个图,你知道的是GPIO6对应的是模组的PIN15; - img - -第二步看,EC600SV1.1的原理图,(黑色部分无需关注,只需要关注红色圈的部分),对于刚刚说的QuecPython的GPIO6(PIN15),这里关注的是PIN15对应的GPIO77(实际上GPIO77没有特别的含义,只是表示一个连接关系,也就是此处的GPIO77对应于下图中的GPIO77)。 - img - img - 第三步,上方最后一个图的GPIO77,也就对应开发板引出的GPIO77(开发板的J6处)。 - 总结:配置QuecPython的GPIO6,在开发板的GPIO77处查看配置是否生效。 - -#### 对照开发板丝印,找出对应的GPIO口 - -例如我想找开发板上的G81对应QuecPython的哪个GPIO口(如果按照下面方法没有找到对应的GPIO,那说明暂时还未开放)。 - -第一步,看原理图,开发板的G81对应原理图就是GPIO81。如下图所示,GPIO81对应的是PIN16(请忽略蓝色框的GPIO标识,记住PIN16) - -![img](media/clip_image008-1615527701161.jpg)![img](media/clip_image010-1615527701161.jpg) - -第二步,看原理图,开发板的G81对应原理图就是GPIO81。如下图所示,GPIO81对应的是PIN16**(请忽略蓝色框的GPIO标识,记住PIN16)** - -第三步,进入QuecPython的官网,找到PIN的API库(https://python.quectel.com/wiki/#/zh-cn/api/QuecPythonClasslib?id=pin) - -如下图所示,**如果你要控制G81,就需要配置GPIO7**。 - -![img](media/clip_image012-1615527701161.jpg) - - - - - -### usocket使用 - -usocket 模块提供对BSD套接字接口的访问,支持对socket的地址绑定、监听、连接、数据接收和发送等通信方法。详细可参见:QuecPython API类库文档usocket模块的使用。 - -代码示例: - -```python -# 导入usocket模块 -import usocket -import log - -# 设置日志输出级别 -log.basicConfig(level=log.INFO) -socket_log = log.getLogger("SOCKET") - -# 创建一个socket实例 -sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) -# 解析域名 -sockaddr = usocket.getaddrinfo('www.tongxinmao.com', 80)[0][-1] -# 建立连接 -sock.connect(sockaddr) -# 向服务端发送消息 -ret = sock.send('GET /News HTTP/1.1\r\nHost: www.tongxinmao.com\r\nAccept-Encoding: deflate\r\nConnection: keep-alive\r\n\r\n') -socket_log.info('send %d bytes' % ret) -# 接收服务端消息 -data = sock.recv(256) -socket_log.info('recv %s bytes:' % len(data)) -socket_log.info(data.decode()) - -# 关闭连接 -sock.close() -``` - -运行结果示例: - - ![image-20210312135703298](media/image-20210312135703298.png) - -### QuecPython是否支持队列 - -​ 队列是一种先进先出的数据结构,主要操作包括入队,出队。入队的元素加入到对尾,从队头取出出队的元素。在QuecPython中我们可以使用list操作来模拟队列: - -```python -class queue: - def __init__(self): - self.__alist = [] - - def push(self, value): - self.__alist.insert(0, value) - - def pop(self): - return self.__alist.pop() - - def size(self): - return len(self.__alist) - - def clean(self): - self.__alist.clear() - - def isEmpty(self): - return self.__alist == [] - - def showQueue(self): - print(self.__alist) -``` - -运行: - -```python -if __name__ == '__main__': - q = queue() - q.push(1) - q.push("123") - q.push("456") - q.push(2) - q.showQueue() - print(q.pop()) - print(q.pop()) - print(q.pop()) - print(q.pop()) - q.showQueue() -``` - -### socket解析IP失败 - -![image-20210312135803677](media/image-20210312135803677.png) - -使用socket、mqtt等相关网络连接的API时会出现IP解析失败导致出现上图异常。 - -定位问题方向:检查SIM卡是否注网成功以及检查该地址的有效性再次进行尝试。 - -查询驻网是否成功的AT指令,【**AT+cops?** 查询是否驻网】 - -### 执行脚本文件提示语法错误 - - ![image-20210312135817816](media/image-20210312135817816.png) - -导致原因:大概率是因为Python语法缩进错误(4个空格缩进) - -排查方法:检查代码格式缩进是否规范 - -推荐使用:PyCharm或VsCode来进行开发,IDE会提示语法缩进与基本语法上的错误。 - -### SIM卡进行插拔后出现网络请求失败 - -因为目前EC100Y暂不支持SIM卡热插拔功能,所以如果我们的SIM卡在重新插拔后需要手动重启模块才能重新注网。 - -### QuecPython的源码文件安全吗 - -QPYcom下载工具有代码混淆加密功能,确保用户程序不被直接暴露。 - -### 在QPYcom操作没有任何反应 - -检查选择的串口是否正确并已打开。 - -### 开发板送的流量卡可以混用吗 - -机卡绑定,第一次开机注网就绑定。 - -### 编写python代码用什么工具 - -推荐使用pycharm或VScode,两款比较流行的IDE,自带自动补全功能。 - -### 板子接出的串口无法通信 +## 板子接出的串口无法通信 要注意接口是1.8V还是3.3V,电平匹配才能正常通信。 -### 接上USB线灯不亮 +## 接上USB线灯不亮 检查模块电压,保证模组的3.8V电压稳定,必要时用电池供电。 -### 小熊派右上方的LED点亮代码 - -```python ->>> from machine import Pin ->>> gpio = Pin(Pin.GPIO15, Pin.OUT, Pin.PULL_DISABLE, 0) ->>> gpio.write(1) -0 ->>> gpio.read() -1 -``` - -### EC600S CNAA与CNLB的区别 - -CNAA是4G+2G,flash大一点,CNLB是4G,flash小一点 - -### apn_cfg.json里面是什么 +## apn_cfg.json里面是什么 内置的apn列表,不可删除 -### 拖动文件到模组出现语法错误 +## 拖动文件到模组出现语法错误 请检查“.py”文件的语法问题(多数是缩进问题) -### 对Socket的[0] [-1]的解释 +## 对Socket的[0] [-1]的解释 ```python >>> import usocket @@ -823,9 +38,7 @@ a[0] = (A,B,C) a[0][-1] = C ``` -## QuecPython其他常见问题第二部分 - -### win7运行QPYcom出现“failed to execute script pyi_rth_multiprocessing” +## win7运行QPYcom出现“failed to execute script pyi_rth_multiprocessing” 故障现象:python通过pyinstaller打包后,在别的电脑运行失败“failed to execute script pyi_rth_multiprocessing”:在低版本windows7上运行会出现这个问题,在win10上面移植程序没问题。 @@ -833,11 +46,11 @@ a[0][-1] = C 建议客户的方法是:升级win7版本到sp1 -### net.nitzTime()的获取 +## net.nitzTime()的获取 成功附着网络之后,基站下发一次(仅此一次) -### 对于EC600SV1.1的QuecPython板子,测试TTS功能注意事项 +## 对于EC600SV1.1的QuecPython板子,测试TTS功能注意事项 外设是接的喇叭,但是在TTS中配置的是“话筒” @@ -859,7 +72,7 @@ AT+QAUDPATH=0 AT+QAUDDCH=0 -### 对于多.py文件的调用 +## 对于多.py文件的调用 对于usr目录下的两个文件a.py和b.py,如果想再a.py中调用b.py的话:需要在a.py里面加上下面代码 @@ -872,25 +85,25 @@ sys.path.append('/usr/') # 进入usr目录下 import b ``` -### 线程有个数限制? +## 线程有个数限制? 最多16个 -### 如何对文件系统进行操作 +## 如何对文件系统进行操作 根目录/是不可读不可写的,/usr是用户区,/bak是备份区 -### 串口一次最多可以接受多少字节? +## 串口一次最多可以接受多少字节? 实测接收2000字节也行;发送最大512,超过自动分包;socket、MQTT收发2000字节也行 -### Socket、MQTT、串口的数据监听会不会阻塞其他线程 +## Socket、MQTT、串口的数据监听会不会阻塞其他线程 Socket、MQTT本身是‘阻塞函数’,不会阻塞其他线程。 串口本身是‘非阻塞函数’,不会阻塞其他线程。 -### 基站定位返回的参数解释 +## 基站定位返回的参数解释 ```python >>> cellLocator.getLocation("www.queclocator.com", 80, "1111111122222222", 8, 1) @@ -901,17 +114,17 @@ Socket、MQTT本身是‘阻塞函数’,不会阻塞其他线程。 定位精度,单位m -### QuecPython队列的深度有最大值吗?比如一直发生回调,会不会丢失? +## QuecPython队列的深度有最大值吗?比如一直发生回调,会不会丢失? 随内存自动增长 -### 模块的Pin有没有默认电平的说明文档 +## 模块的Pin有没有默认电平的说明文档 我们开放出来IO目前是 默认输出低电平 -### EC600S的模块RTC时间怎么样断电续航 +## EC600S的模块RTC时间怎么样断电续航 -断电没有办法续航,因为引出RTC +断电没有办法续航,因为EC600S没有RTC引脚 diff --git a/docs/FAQ/zh/QuecPython_module_to_normal/jioaben_start.png b/docs/FAQ/zh/QuecPython_module_to_normal/jioaben_start.png new file mode 100644 index 0000000000000000000000000000000000000000..7dca2571afbb1a4165c61e28320924ae5ac0a0af Binary files /dev/null and b/docs/FAQ/zh/QuecPython_module_to_normal/jioaben_start.png differ diff --git a/docs/FAQ/zh/README.md b/docs/FAQ/zh/README.md index 6bd1fc5e6037214d7c4e0707fcd7d0390b62fb66..8d0267e0926b4499b88035df6f47d132d4b4417e 100644 --- a/docs/FAQ/zh/README.md +++ b/docs/FAQ/zh/README.md @@ -1,3 +1,323 @@ -## FAQ&常见问题 +## 前言 -等待补充 \ No newline at end of file +本片文章主要是简介怎样参与到 **Quecpython 文档网站系统的贡献** 以及**QUecpython 文档编写的规范**。 +- 使用git拉取仓库 +- 修改本地md文档 +- 在本地部署预览 +- 提交修改到主仓库,等待合并。 + + +### **推荐资料** + +- [Git - Book (git-scm.com)](https://git-scm.com/book/zh/v2) +- [Learn Git Branching](https://learngitbranching.js.org/?locale=zh_CN) +- [Git提交流程图\_L.超的博客-CSDN博客](https://blog.csdn.net/weixin_45765795/article/details/110730753) + +### 需要安装的东西 + +- git [git-for-windows Mirror(taobao.org)](http://npm.taobao.org/mirrors/git-for-windows/) +- sourcetree [Sourcetree \| Free Git GUI for Mac and Windows(sourcetreeapp.com)](https://www.sourcetreeapp.com/) +- python3 以及需要将python3 添加到 PATH 路径, 具体请参考 [windows10怎么把python添加到路径](https://www.py.cn/faq/python/18228.html) + +sourcetree 安装教程可以参考 [SourceTree安装及卸载 - 爱码网(likecs.com)](http://www.likecs.com/show-118323.html) + +### 视频录屏 + +1. **首先请下载视频查看一些基础的用法。** + +链接:https://pan.baidu.com/s/1-TIYEdloBS1uWs1AZpT8TQ + +提取码:219x + +本次交流使用到的 git 命令。 + +```bash +git clone + +git commit + +git rebase +``` + +## git 提交流程 + +### !!!注意事项: + +尽量本地修改的时候,新建一个分支修改, 名字可以随便取。 + +不要使用 develop release main 三个分支就行。 + +#### gitee 账号注册与 fork 代码。 + +首先请参考 注册gitee账号 + +需要操作的仓库地址。 +[QuecPython/Community-document(gitee.com)](https://gitee.com/quecpython/Community-document) +![](media/2402ce33f46407a306dbbc808a61c9dc.png) + +#### clone 代码 + +你自己仓库的代码, 不需要复制下面的网址, 复制你自己仓库的路径。 + +![](media/07e84b72f40480b3d47215bba25b991d.png) + +![](media/348a8cd3a03f723bbebd7c75d7318a77.png) + +记住: 路径需要修改成为自己的网址 路径。 + +![](media/a0bf255b7e26a6da128a9a6bfef9a98f.png) + +#### 使用命令行添加用户名和账号 + +参考 文章。 + +首先打开命令行,查看是你是否设置了用户名。 + +![](media/346efc8943131e0cb6fb676aa2ae78f7.png) + +如果没有名字,使用下下面的命令配置一下名字 和邮件。 + +```bash +git config --global user.name "你的名字(请使用英文)" + +git config --global user.email "邮箱账号" +``` + +如果出现了下面的错误信息 + +could not lock config file z://config: Permission denied + +请确认你在安装souretree的过程中,是否选择了正确的git 路径。 + +![Souretree 安装过程中指定的GIT路径错误的问题](media/Qp_Faq_join_us_051.png) + +#### 使用souretree添加本地仓库 + +![](media/ac16302f7af83590b20ddbfc851f5489.png) + +如此即可。 + +#### 使用souretree 添加 upstream仓库。 + +![](media/816606baf28959a11f18c6e24458e9e6.png) + +打开souretree 状态看一看。 可以发现 origin 以及 upstream 两个远程仓库的状态。 + +![](media/a5d1460f83ea10904febaaf1b6fa83eb.png) + +## 本地编译预览网站 + +上面我们拉取了远程仓库以后,我们可以测试在本地编译生成网页预览。 + +![](media/7c729ff347d8b0b71ef1e4ddc1fb3ab6.png) + +使用**powershell**进入对应的路径 **E:\\work\\temp\\Community-document**。 + +```bash +PS E:\\work\\temp\\Community-document\> git status + +On branch develop + +Your branch is ahead of 'origin/develop' by 1 commit. + +(use "git push" to publish your local commits) + +nothing to commit, working tree clean +``` + +使用pip3 安装teedoc,如果pip3 没有安装的可以参考 [Win10 +64位系统下安装Python3及pip3_Working. +Playing.-CSDN博客](https://blog.csdn.net/menc15/article/details/65631380) +```bash +# 安装teedoc + +PS E:\\work\\temp\\Community-document\> pip3 install teedoc + +# 安装teedoc插件 + +PS E:\\work\\temp\\Community-document\> teedoc install + +# 编译md, 将md转化成为 html + +**编译** + +# 编译md, 将md转化成为 html + +PS E:\\work\\temp\\Community-document\> teedoc build +``` +如果出现了下面的错误, + +![](media/d28b6c5e33fffd309bde68093f212313.png) + +请持续执行 **teedoc build,这是一个teedoc 的bug 。 直到出现下面的信息为止。** + +**![](media/119d57a4919443d8f3a9e0a5bb5ac64a.png)** + +编译完成以后,我们可以在本地部署网站了。 +```bash +PS E:\\work\\temp\\Community-document\> teedoc serve + +2021-03-18 17:37:34 - [INFO] - [Thread-50]: root dir: +E:/work/temp/Community-document/out + +2021-03-18 17:37:34 - [INFO] - [Thread-50]: Starting server at 0.0.0.0:2333 .... +``` + +出现了上面的信息以后, 就可以访问 , +查看对应的文章了。 + +http://127.0.0.1:2333/doc/doc + +### 新增添加文档 + +#### 新建一个md文件,然后添加内容 + +下面我们演示一下,怎样在FAQ文件夹下面新增一篇文章。 + +##### !!(重要)同步代码 + +每一次修改文档之前,都建议同步一次代码。 + +![](media/d33aa45f8dc99af2409bddef280519fc.png) + +然后新建一个本地分支 + +![](media/9069cf02cdb7489443c5c9719012399f.png) + +新建loacl_write_doc分支 + +![](media/6c6cb269476d4a0b82b0039a59520ae4.png) + +![](media/232112373152af2c0ecdba8f867ad965.png) + +> 假设我们需要在 docs/zh 文件夹下面新建一个文章 + +> 然后新建一个 md文件命名为 others.md + +> ![](media/b2aeef716dd0341ef9af3ab630117d21.png) + +然后我们可以使用Typora — a markdown editor, markdown reader. +软件打开,修改编辑文档。也可以使用vscode。 你也可以使用其他的 markdwon +编辑工具, + +##### 修改侧边栏目录 sidebar.yaml 文件 + +![](media/ec285c9fb0731355ce3b2f99aed57e20.png) + +然后修改sidebar.yaml 文件, 添加下面两句 +```bash +- label: 其他问题 +file: others/others.md +``` +![](media/03bd99c2741d455894dde05a7efa76df.png) + +上面修改完成以后, 可以参考《本地编译预览网站》 在本地预览效果。 + +![](media/2e3623754f881f6509c9bfe83add627d.png) + +## 修改提交本地内容 + +#### 使用 Sourcetree 在本地修改,暂存本地修改 + +###### 暂存区, 未存区, 文件详细修改的区域 + +![](media/28b4959b7c0fcebcc5473a1a92a7f55f.png) + +###### 提交 commit ,讲文件存入缓存区 + +![](media/549111123c867b49d5866a1888a87139.png) + +###### 推送到自己的仓库 + +![](media/20d86071c46c8ac071d40b69c5391538.png) + +###### 在gitee推送到主仓库, 使用pull requst 提交到主仓库。 + +![](media/36649f7f072179c5f66469faa8cb5c90.png) + +![](media/915236af05ccce877ff89c16bc8c6d9e.png) + +###### 填写详细信息,通知主仓库合并。 + +![](media/d6b7b0ca15c429c0deec153a1b8a7f51.png) + +###### 主仓库合并以后,同步主仓库 + +![](media/32ad741bdff696c303ddee76eeb88677.png) + +#### 在本地修改未提交的情况下, 拉取最新分支。然后提交本地分支 + +![](media/3cd17618606dfc34f8b1a2f5966c7e91.png) + +![](media/2737bff4059f30ffbdbddb60c37980a6.png) + +![](media/e20c84d0e318efc0e1bb90c1ec2eb44b.png) + +![](media/3ecb9425d13ffaf2eca140785cb1a2c9.png) + +![](media/748690654f71e0217ec7f8ac9b9f373f.png) + +![](media/2c7b59fe3c8411f610b1c2da72e60416.png) + +### 解决云端提交冲突 + +云端显示提交的pr存在冲突的时候,可以通过**web IDE**进行处理。 +![显示云端冲突的解决方法](media/Qp_Faq_join_us_052.png) + +更多详细信息请参考 +[Gitee在线解决代码冲突功能上线,无需手动修改轻松解决冲突](https://blog.gitee.com/2020/06/17/code-conflict/) +## 文档修改 + +### 格式问题 + +##### 图片名字格式 + +```bash +![温湿度传感器](media/Qp_Advanced_development_QuecPythonSub_i2c_bus_02.png) +``` + +##### 使用 - 表示list。 + +```bash +- A +- B +- C +``` + +不要使用 + +```bash +1.A +2.B +3.C +``` + +![](media/85156b64ef3e6223d65775b6ba68979e.png) + +### 不能使用的关键字 +不能使用的关键词 +![请不到使用关键词](media/Qp_Faq_join_us_050.png) + + + +### 如何引用相对路径 + +如果你想在此文档下中引用同目录下的某一篇文档。例如,想在“参与贡献”这篇文档下引用“QuecPython测试问题”: + +image-20210413133312774 + +先选择md编辑工具中“格式”的“超链接”。 + + + +image-20210413140651563 + + + +然后编辑超链接为:[QuecPython测试问题],后面的地址写(../zh/QP_test/QP_test.html) + +**Tips:** + +(1)teedoc build 命令是将 md文件编译成为 html 文件,所以如果你需要超链接一个文档,实际上是超链接这个md文件编译后的html文件 + +(2)上述的路径是如何计算的:参与贡献QuecPython测试问题的共同路径是都在"..\Community-document\docs\FAQ\zh"路径下,所以如果需要相对路径的话,至少是采用"../zh"路径加上“QuecPython测试问题”本身的路径(../QP_test/QP_test.html),也就是"../zh/QP_test/QP_test.html" \ No newline at end of file diff --git a/docs/FAQ/zh/gitee_issue/gitee_issue.md b/docs/FAQ/zh/gitee_issue/gitee_issue.md new file mode 100644 index 0000000000000000000000000000000000000000..661b2a463dc59efb2d52c4af4e55cd24afe9faa3 --- /dev/null +++ b/docs/FAQ/zh/gitee_issue/gitee_issue.md @@ -0,0 +1,59 @@ +## 文档历史 + +**修订记录** +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | --------- | -------- | ------------ | +| 1.0 | 2021-4-13 | 周成柱 | 初始版本 | + +## gitee issue 文档系统管理 +本篇文章主要是分享 gitee issue 的使用技巧。以及 提交 文档系统 错误的问题。 + +![gitee issue 管理系统](media/Qp_gitee_issue_01.png) + +## 新建issue + +### issue 分类 + - 网站格式需求 + - 文档重复 + - 文档内容错误 + - 文档代码复现错误 + - 文档图片错误 + + +### 添加提醒人 +在 注释中 输入 @ 、 添加提醒人。 +![gitee issue 添加提醒人](media/Qp_gitee_issue_02.png) +### 添加责任人 +略 +### 添加issue 类别 +略 +### 添加优先级 +略 + +## 关闭issue +### 手动关闭 +使用看板、 关闭 +1. 选择自己负责的 +![gitee issue 看板](media/Qp_gitee_issue_03.png) +左右滑动对应的选项卡、即可关闭 + +### 提交pr、关联关闭 +1. 首先确定需要关闭的 issue 号 ,比如我这里需要关闭 **#I3IACO** issue +![gitee issue 详细信息](media/Qp_gitee_issue_04.png) + +2. 在 pr 注释里面 添加 需要关闭的 issue 号 +在提交 Pr 的时候、 输入 **#** 、 会自动的弹出issues。 选择即可。 +当然你也可以手动输入 issue号。 +![gitee 提交pr、关联issue](media/Qp_gitee_issue_05.png) + +## issue - 任务分配 +分为 前后期。 +1. 前期确定不了任务具体归属人的、 统一分配给管理员账号 QuecPython 。 然后由管理员具体分配对应的负责人完成任务。 +2. 在前期实践迭代过程中、完善大概的文档责任划分。 形成每一篇文章、有一个对应的负责人。具体的责任划分、组内沟通进行划分。 + +## 熟悉mailstone 的流程规范 +### 什么是 mailstone ? +里程碑、 达到当前节点。 表示我们需要完成那些任务。 + +### 怎样管理里程碑 +我们设计一个个小的里程碑。 尽量在每个时间节点上面, 完成所有的任务。 \ No newline at end of file diff --git a/docs/FAQ/zh/gitee_issue/media/Qp_gitee_issue_01.png b/docs/FAQ/zh/gitee_issue/media/Qp_gitee_issue_01.png new file mode 100755 index 0000000000000000000000000000000000000000..65420d1c0d2c6a163d71d6bfebeeb9082a4147f1 Binary files /dev/null and b/docs/FAQ/zh/gitee_issue/media/Qp_gitee_issue_01.png differ diff --git a/docs/FAQ/zh/gitee_issue/media/Qp_gitee_issue_02.png b/docs/FAQ/zh/gitee_issue/media/Qp_gitee_issue_02.png new file mode 100755 index 0000000000000000000000000000000000000000..a99a8e216d1a0109015541a451b729b75bc7d041 Binary files /dev/null and b/docs/FAQ/zh/gitee_issue/media/Qp_gitee_issue_02.png differ diff --git a/docs/FAQ/zh/gitee_issue/media/Qp_gitee_issue_03.png b/docs/FAQ/zh/gitee_issue/media/Qp_gitee_issue_03.png new file mode 100755 index 0000000000000000000000000000000000000000..0d7bbbd51fb2a6cd30e0263e8947b98bf14c8faa Binary files /dev/null and b/docs/FAQ/zh/gitee_issue/media/Qp_gitee_issue_03.png differ diff --git a/docs/FAQ/zh/gitee_issue/media/Qp_gitee_issue_04.png b/docs/FAQ/zh/gitee_issue/media/Qp_gitee_issue_04.png new file mode 100755 index 0000000000000000000000000000000000000000..f27f4b22fe57cca37ac46baf61b6a5929b5fa37b Binary files /dev/null and b/docs/FAQ/zh/gitee_issue/media/Qp_gitee_issue_04.png differ diff --git a/docs/FAQ/zh/gitee_issue/media/Qp_gitee_issue_05.png b/docs/FAQ/zh/gitee_issue/media/Qp_gitee_issue_05.png new file mode 100755 index 0000000000000000000000000000000000000000..71ae69208fa42de67af694e99876d7ba699e5df0 Binary files /dev/null and b/docs/FAQ/zh/gitee_issue/media/Qp_gitee_issue_05.png differ diff --git a/docs/FAQ/zh/join_us/README.md b/docs/FAQ/zh/join_us/README.md deleted file mode 100755 index bf6ad5a3362846b60c4d62af13d1748324cdd3ac..0000000000000000000000000000000000000000 --- a/docs/FAQ/zh/join_us/README.md +++ /dev/null @@ -1,298 +0,0 @@ -## 前言 - -本片文章主要是简介怎样参与到 **Quecpython 文档网站系统的贡献** 以及**QUecpython 文档编写的规范**。 -- 使用git拉取仓库 -- 修改本地md文档 -- 在本地部署预览 -- 提交修改到主仓库,等待合并。 - - -### **推荐资料** - -- [Git - Book (git-scm.com)](https://git-scm.com/book/zh/v2) -- [Learn Git Branching](https://learngitbranching.js.org/?locale=zh_CN) -- [Git提交流程图\_L.超的博客-CSDN博客](https://blog.csdn.net/weixin_45765795/article/details/110730753) - -### 需要安装的东西 - -- git [git-for-windows Mirror(taobao.org)](http://npm.taobao.org/mirrors/git-for-windows/) -- sourcetree [Sourcetree \| Free Git GUI for Mac and Windows(sourcetreeapp.com)](https://www.sourcetreeapp.com/) -- python3 以及需要将python3 添加到 PATH 路径, 具体请参考 [windows10怎么把python添加到路径](https://www.py.cn/faq/python/18228.html) - -sourcetree 安装教程可以参考 [SourceTree安装及卸载 - 爱码网(likecs.com)](http://www.likecs.com/show-118323.html) - -### 视频录屏 - -1. **首先请下载视频查看一些基础的用法。** - -链接:https://pan.baidu.com/s/1-TIYEdloBS1uWs1AZpT8TQ - -提取码:219x - -本次交流使用到的 git 命令。 - -```bash -git clone - -git commit - -git rebase -``` - -## git 提交流程 - -### !!!注意事项: - -尽量本地修改的时候,新建一个分支修改, 名字可以随便取。 - -不要使用 develop release main 三个分支就行。 - -#### gitee 账号注册与 fork 代码。 - -首先请参考 注册gitee账号 - -需要操作的仓库地址。 -[QuecPython/Community-document(gitee.com)](https://gitee.com/quecpython/Community-document) -![](media/2402ce33f46407a306dbbc808a61c9dc.png) - -#### clone 代码 - -你自己仓库的代码, 不需要复制下面的网址, 复制你自己仓库的路径。 - -![](media/07e84b72f40480b3d47215bba25b991d.png) - -![](media/348a8cd3a03f723bbebd7c75d7318a77.png) - -记住: 路径需要修改成为自己的网址 路径。 - -![](media/a0bf255b7e26a6da128a9a6bfef9a98f.png) - -#### 使用命令行添加用户名和账号 - -参考 文章。 - -首先打开命令行,查看是你是否设置了用户名。 - -![](media/346efc8943131e0cb6fb676aa2ae78f7.png) - -如果没有名字,使用下下面的命令配置一下名字 和邮件。 - -```bash -git config --global user.name "你的名字(请使用英文)" - -git config --global user.email "邮箱账号" -``` - -如果出现了下面的错误信息 - -could not lock config file z://config: Permission denied - -请确认你在安装souretree的过程中,是否选择了正确的git 路径。 - -![Souretree 安装过程中指定的GIT路径错误的问题](media/Qp_Faq_join_us_051.png) - -#### 使用souretree添加本地仓库 - -![](media/ac16302f7af83590b20ddbfc851f5489.png) - -如此即可。 - -#### 使用souretree 添加 upstream仓库。 - -![](media/816606baf28959a11f18c6e24458e9e6.png) - -打开souretree 状态看一看。 可以发现 origin 以及 upstream 两个远程仓库的状态。 - -![](media/a5d1460f83ea10904febaaf1b6fa83eb.png) - -## 本地编译预览网站 - -上面我们拉取了远程仓库以后,我们可以测试在本地编译生成网页预览。 - -![](media/7c729ff347d8b0b71ef1e4ddc1fb3ab6.png) - -使用**powershell**进入对应的路径 **E:\\work\\temp\\Community-document**。 - -```bash -PS E:\\work\\temp\\Community-document\> git status - -On branch develop - -Your branch is ahead of 'origin/develop' by 1 commit. - -(use "git push" to publish your local commits) - -nothing to commit, working tree clean -``` - -使用pip3 安装teedoc,如果pip3 没有安装的可以参考 [Win10 -64位系统下安装Python3及pip3_Working. -Playing.-CSDN博客](https://blog.csdn.net/menc15/article/details/65631380) -```bash -# 安装teedoc - -PS E:\\work\\temp\\Community-document\> pip3 install teedoc - -# 安装teedoc插件 - -PS E:\\work\\temp\\Community-document\> teedoc install - -# 编译md, 将md转化成为 html - -**编译** - -# 编译md, 将md转化成为 html - -PS E:\\work\\temp\\Community-document\> teedoc build -``` -如果出现了下面的错误, - -![](media/d28b6c5e33fffd309bde68093f212313.png) - -请持续执行 **teedoc build,这是一个teedoc 的bug 。 直到出现下面的信息为止。** - -**![](media/119d57a4919443d8f3a9e0a5bb5ac64a.png)** - -编译完成以后,我们可以在本地部署网站了。 -```bash -PS E:\\work\\temp\\Community-document\> teedoc serve - -2021-03-18 17:37:34 - [INFO] - [Thread-50]: root dir: -E:/work/temp/Community-document/out - -2021-03-18 17:37:34 - [INFO] - [Thread-50]: Starting server at 0.0.0.0:2333 .... -``` - -出现了上面的信息以后, 就可以访问 , -查看对应的文章了。 - -http://127.0.0.1:2333/doc/doc - -### 新增添加文档 - -#### 新建一个md文件,然后添加内容 - -下面我们演示一下,怎样在FAQ文件夹下面新增一篇文章。 - -##### !!(重要)同步代码 - -每一次修改文档之前,都建议同步一次代码。 - -![](media/d33aa45f8dc99af2409bddef280519fc.png) - -然后新建一个本地分支 - -![](media/9069cf02cdb7489443c5c9719012399f.png) - -新建loacl_write_doc分支 - -![](media/6c6cb269476d4a0b82b0039a59520ae4.png) - -![](media/232112373152af2c0ecdba8f867ad965.png) - -> 假设我们需要在 docs/zh 文件夹下面新建一个文章 - -> 然后新建一个 md文件命名为 others.md - -> ![](media/b2aeef716dd0341ef9af3ab630117d21.png) - -然后我们可以使用Typora — a markdown editor, markdown reader. -软件打开,修改编辑文档。也可以使用vscode。 你也可以使用其他的 markdwon -编辑工具, - -##### 修改侧边栏目录 sidebar.yaml 文件 - -![](media/ec285c9fb0731355ce3b2f99aed57e20.png) - -然后修改sidebar.yaml 文件, 添加下面两句 -```bash -- label: 其他问题 -file: others/others.md -``` -![](media/03bd99c2741d455894dde05a7efa76df.png) - -上面修改完成以后, 可以参考《本地编译预览网站》 在本地预览效果。 - -![](media/2e3623754f881f6509c9bfe83add627d.png) - -## 修改提交本地内容 - -#### 使用 Sourcetree 在本地修改,暂存本地修改 - -###### 暂存区, 未存区, 文件详细修改的区域 - -![](media/28b4959b7c0fcebcc5473a1a92a7f55f.png) - -###### 提交 commit ,讲文件存入缓存区 - -![](media/549111123c867b49d5866a1888a87139.png) - -###### 推送到自己的仓库 - -![](media/20d86071c46c8ac071d40b69c5391538.png) - -###### 在gitee推送到主仓库, 使用pull requst 提交到主仓库。 - -![](media/36649f7f072179c5f66469faa8cb5c90.png) - -![](media/915236af05ccce877ff89c16bc8c6d9e.png) - -###### 填写详细信息,通知主仓库合并。 - -![](media/d6b7b0ca15c429c0deec153a1b8a7f51.png) - -###### 主仓库合并以后,同步主仓库 - -![](media/32ad741bdff696c303ddee76eeb88677.png) - -#### 在本地修改未提交的情况下, 拉取最新分支。然后提交本地分支 - -![](media/3cd17618606dfc34f8b1a2f5966c7e91.png) - -![](media/2737bff4059f30ffbdbddb60c37980a6.png) - -![](media/e20c84d0e318efc0e1bb90c1ec2eb44b.png) - -![](media/3ecb9425d13ffaf2eca140785cb1a2c9.png) - -![](media/748690654f71e0217ec7f8ac9b9f373f.png) - -![](media/2c7b59fe3c8411f610b1c2da72e60416.png) - -### 解决云端提交冲突 - -云端显示提交的pr存在冲突的时候,可以通过**web IDE**进行处理。 -![显示云端冲突的解决方法](media/Qp_Faq_join_us_052.png) - -更多详细信息请参考 -[Gitee在线解决代码冲突功能上线,无需手动修改轻松解决冲突](https://blog.gitee.com/2020/06/17/code-conflict/) -## 文档修改 - -##### 图片名字格式 - -```bash -![温湿度传感器](media/Qp_Advanced_development_QuecPythonSub_i2c_bus_02.png) -``` - -##### 使用 - 表示list。 - -```bash -- A -- B -- C -``` - -不要使用 - -```bash -1.A -2.B -3.C -``` - -![](media/85156b64ef3e6223d65775b6ba68979e.png) - -#### 不能使用的关键字 -不能使用的关键词 -![请不到使用关键词](media/Qp_Faq_join_us_050.png) - diff --git a/docs/FAQ/zh/join_us/media/03bd99c2741d455894dde05a7efa76df.png b/docs/FAQ/zh/media/03bd99c2741d455894dde05a7efa76df.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/03bd99c2741d455894dde05a7efa76df.png rename to docs/FAQ/zh/media/03bd99c2741d455894dde05a7efa76df.png diff --git a/docs/FAQ/zh/join_us/media/07e84b72f40480b3d47215bba25b991d.png b/docs/FAQ/zh/media/07e84b72f40480b3d47215bba25b991d.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/07e84b72f40480b3d47215bba25b991d.png rename to docs/FAQ/zh/media/07e84b72f40480b3d47215bba25b991d.png diff --git a/docs/FAQ/zh/join_us/media/119d57a4919443d8f3a9e0a5bb5ac64a.png b/docs/FAQ/zh/media/119d57a4919443d8f3a9e0a5bb5ac64a.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/119d57a4919443d8f3a9e0a5bb5ac64a.png rename to docs/FAQ/zh/media/119d57a4919443d8f3a9e0a5bb5ac64a.png diff --git a/docs/FAQ/zh/join_us/media/20d86071c46c8ac071d40b69c5391538.png b/docs/FAQ/zh/media/20d86071c46c8ac071d40b69c5391538.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/20d86071c46c8ac071d40b69c5391538.png rename to docs/FAQ/zh/media/20d86071c46c8ac071d40b69c5391538.png diff --git a/docs/FAQ/zh/join_us/media/232112373152af2c0ecdba8f867ad965.png b/docs/FAQ/zh/media/232112373152af2c0ecdba8f867ad965.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/232112373152af2c0ecdba8f867ad965.png rename to docs/FAQ/zh/media/232112373152af2c0ecdba8f867ad965.png diff --git a/docs/FAQ/zh/join_us/media/2402ce33f46407a306dbbc808a61c9dc.png b/docs/FAQ/zh/media/2402ce33f46407a306dbbc808a61c9dc.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/2402ce33f46407a306dbbc808a61c9dc.png rename to docs/FAQ/zh/media/2402ce33f46407a306dbbc808a61c9dc.png diff --git a/docs/FAQ/zh/join_us/media/2737bff4059f30ffbdbddb60c37980a6.png b/docs/FAQ/zh/media/2737bff4059f30ffbdbddb60c37980a6.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/2737bff4059f30ffbdbddb60c37980a6.png rename to docs/FAQ/zh/media/2737bff4059f30ffbdbddb60c37980a6.png diff --git a/docs/FAQ/zh/join_us/media/28b4959b7c0fcebcc5473a1a92a7f55f.png b/docs/FAQ/zh/media/28b4959b7c0fcebcc5473a1a92a7f55f.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/28b4959b7c0fcebcc5473a1a92a7f55f.png rename to docs/FAQ/zh/media/28b4959b7c0fcebcc5473a1a92a7f55f.png diff --git a/docs/FAQ/zh/join_us/media/2c7b59fe3c8411f610b1c2da72e60416.png b/docs/FAQ/zh/media/2c7b59fe3c8411f610b1c2da72e60416.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/2c7b59fe3c8411f610b1c2da72e60416.png rename to docs/FAQ/zh/media/2c7b59fe3c8411f610b1c2da72e60416.png diff --git a/docs/FAQ/zh/join_us/media/2e3623754f881f6509c9bfe83add627d.png b/docs/FAQ/zh/media/2e3623754f881f6509c9bfe83add627d.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/2e3623754f881f6509c9bfe83add627d.png rename to docs/FAQ/zh/media/2e3623754f881f6509c9bfe83add627d.png diff --git a/docs/FAQ/zh/join_us/media/32ad741bdff696c303ddee76eeb88677.png b/docs/FAQ/zh/media/32ad741bdff696c303ddee76eeb88677.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/32ad741bdff696c303ddee76eeb88677.png rename to docs/FAQ/zh/media/32ad741bdff696c303ddee76eeb88677.png diff --git a/docs/FAQ/zh/join_us/media/346efc8943131e0cb6fb676aa2ae78f7.png b/docs/FAQ/zh/media/346efc8943131e0cb6fb676aa2ae78f7.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/346efc8943131e0cb6fb676aa2ae78f7.png rename to docs/FAQ/zh/media/346efc8943131e0cb6fb676aa2ae78f7.png diff --git a/docs/FAQ/zh/join_us/media/348a8cd3a03f723bbebd7c75d7318a77.png b/docs/FAQ/zh/media/348a8cd3a03f723bbebd7c75d7318a77.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/348a8cd3a03f723bbebd7c75d7318a77.png rename to docs/FAQ/zh/media/348a8cd3a03f723bbebd7c75d7318a77.png diff --git a/docs/FAQ/zh/join_us/media/36649f7f072179c5f66469faa8cb5c90.png b/docs/FAQ/zh/media/36649f7f072179c5f66469faa8cb5c90.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/36649f7f072179c5f66469faa8cb5c90.png rename to docs/FAQ/zh/media/36649f7f072179c5f66469faa8cb5c90.png diff --git a/docs/FAQ/zh/join_us/media/3cd17618606dfc34f8b1a2f5966c7e91.png b/docs/FAQ/zh/media/3cd17618606dfc34f8b1a2f5966c7e91.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/3cd17618606dfc34f8b1a2f5966c7e91.png rename to docs/FAQ/zh/media/3cd17618606dfc34f8b1a2f5966c7e91.png diff --git a/docs/FAQ/zh/join_us/media/3ecb9425d13ffaf2eca140785cb1a2c9.png b/docs/FAQ/zh/media/3ecb9425d13ffaf2eca140785cb1a2c9.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/3ecb9425d13ffaf2eca140785cb1a2c9.png rename to docs/FAQ/zh/media/3ecb9425d13ffaf2eca140785cb1a2c9.png diff --git a/docs/FAQ/zh/join_us/media/549111123c867b49d5866a1888a87139.png b/docs/FAQ/zh/media/549111123c867b49d5866a1888a87139.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/549111123c867b49d5866a1888a87139.png rename to docs/FAQ/zh/media/549111123c867b49d5866a1888a87139.png diff --git a/docs/FAQ/zh/join_us/media/6c6cb269476d4a0b82b0039a59520ae4.png b/docs/FAQ/zh/media/6c6cb269476d4a0b82b0039a59520ae4.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/6c6cb269476d4a0b82b0039a59520ae4.png rename to docs/FAQ/zh/media/6c6cb269476d4a0b82b0039a59520ae4.png diff --git a/docs/FAQ/zh/join_us/media/748690654f71e0217ec7f8ac9b9f373f.png b/docs/FAQ/zh/media/748690654f71e0217ec7f8ac9b9f373f.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/748690654f71e0217ec7f8ac9b9f373f.png rename to docs/FAQ/zh/media/748690654f71e0217ec7f8ac9b9f373f.png diff --git a/docs/FAQ/zh/join_us/media/7c729ff347d8b0b71ef1e4ddc1fb3ab6.png b/docs/FAQ/zh/media/7c729ff347d8b0b71ef1e4ddc1fb3ab6.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/7c729ff347d8b0b71ef1e4ddc1fb3ab6.png rename to docs/FAQ/zh/media/7c729ff347d8b0b71ef1e4ddc1fb3ab6.png diff --git a/docs/FAQ/zh/join_us/media/816606baf28959a11f18c6e24458e9e6.png b/docs/FAQ/zh/media/816606baf28959a11f18c6e24458e9e6.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/816606baf28959a11f18c6e24458e9e6.png rename to docs/FAQ/zh/media/816606baf28959a11f18c6e24458e9e6.png diff --git a/docs/FAQ/zh/join_us/media/85156b64ef3e6223d65775b6ba68979e.png b/docs/FAQ/zh/media/85156b64ef3e6223d65775b6ba68979e.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/85156b64ef3e6223d65775b6ba68979e.png rename to docs/FAQ/zh/media/85156b64ef3e6223d65775b6ba68979e.png diff --git a/docs/FAQ/zh/join_us/media/9069cf02cdb7489443c5c9719012399f.png b/docs/FAQ/zh/media/9069cf02cdb7489443c5c9719012399f.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/9069cf02cdb7489443c5c9719012399f.png rename to docs/FAQ/zh/media/9069cf02cdb7489443c5c9719012399f.png diff --git a/docs/FAQ/zh/join_us/media/915236af05ccce877ff89c16bc8c6d9e.png b/docs/FAQ/zh/media/915236af05ccce877ff89c16bc8c6d9e.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/915236af05ccce877ff89c16bc8c6d9e.png rename to docs/FAQ/zh/media/915236af05ccce877ff89c16bc8c6d9e.png diff --git a/docs/FAQ/zh/join_us/media/Qp_Faq_join_us_050.png b/docs/FAQ/zh/media/Qp_Faq_join_us_050.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/Qp_Faq_join_us_050.png rename to docs/FAQ/zh/media/Qp_Faq_join_us_050.png diff --git a/docs/FAQ/zh/join_us/media/Qp_Faq_join_us_051.png b/docs/FAQ/zh/media/Qp_Faq_join_us_051.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/Qp_Faq_join_us_051.png rename to docs/FAQ/zh/media/Qp_Faq_join_us_051.png diff --git a/docs/FAQ/zh/join_us/media/Qp_Faq_join_us_052.png b/docs/FAQ/zh/media/Qp_Faq_join_us_052.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/Qp_Faq_join_us_052.png rename to docs/FAQ/zh/media/Qp_Faq_join_us_052.png diff --git a/docs/FAQ/zh/media/Qp_Faq_join_us_053.png b/docs/FAQ/zh/media/Qp_Faq_join_us_053.png new file mode 100644 index 0000000000000000000000000000000000000000..4a4119a49b197cd150df94697bd73dc2912ca413 Binary files /dev/null and b/docs/FAQ/zh/media/Qp_Faq_join_us_053.png differ diff --git a/docs/FAQ/zh/media/Qp_Faq_join_us_054.png b/docs/FAQ/zh/media/Qp_Faq_join_us_054.png new file mode 100644 index 0000000000000000000000000000000000000000..52671136e3502da3c816c947317688cabffaf10d Binary files /dev/null and b/docs/FAQ/zh/media/Qp_Faq_join_us_054.png differ diff --git a/docs/FAQ/zh/join_us/media/a0bf255b7e26a6da128a9a6bfef9a98f.png b/docs/FAQ/zh/media/a0bf255b7e26a6da128a9a6bfef9a98f.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/a0bf255b7e26a6da128a9a6bfef9a98f.png rename to docs/FAQ/zh/media/a0bf255b7e26a6da128a9a6bfef9a98f.png diff --git a/docs/FAQ/zh/join_us/media/a5d1460f83ea10904febaaf1b6fa83eb.png b/docs/FAQ/zh/media/a5d1460f83ea10904febaaf1b6fa83eb.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/a5d1460f83ea10904febaaf1b6fa83eb.png rename to docs/FAQ/zh/media/a5d1460f83ea10904febaaf1b6fa83eb.png diff --git a/docs/FAQ/zh/join_us/media/ac16302f7af83590b20ddbfc851f5489.png b/docs/FAQ/zh/media/ac16302f7af83590b20ddbfc851f5489.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/ac16302f7af83590b20ddbfc851f5489.png rename to docs/FAQ/zh/media/ac16302f7af83590b20ddbfc851f5489.png diff --git a/docs/FAQ/zh/join_us/media/b2aeef716dd0341ef9af3ab630117d21.png b/docs/FAQ/zh/media/b2aeef716dd0341ef9af3ab630117d21.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/b2aeef716dd0341ef9af3ab630117d21.png rename to docs/FAQ/zh/media/b2aeef716dd0341ef9af3ab630117d21.png diff --git a/docs/FAQ/zh/join_us/media/d28b6c5e33fffd309bde68093f212313.png b/docs/FAQ/zh/media/d28b6c5e33fffd309bde68093f212313.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/d28b6c5e33fffd309bde68093f212313.png rename to docs/FAQ/zh/media/d28b6c5e33fffd309bde68093f212313.png diff --git a/docs/FAQ/zh/join_us/media/d33aa45f8dc99af2409bddef280519fc.png b/docs/FAQ/zh/media/d33aa45f8dc99af2409bddef280519fc.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/d33aa45f8dc99af2409bddef280519fc.png rename to docs/FAQ/zh/media/d33aa45f8dc99af2409bddef280519fc.png diff --git a/docs/FAQ/zh/join_us/media/d6b7b0ca15c429c0deec153a1b8a7f51.png b/docs/FAQ/zh/media/d6b7b0ca15c429c0deec153a1b8a7f51.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/d6b7b0ca15c429c0deec153a1b8a7f51.png rename to docs/FAQ/zh/media/d6b7b0ca15c429c0deec153a1b8a7f51.png diff --git a/docs/FAQ/zh/join_us/media/e20c84d0e318efc0e1bb90c1ec2eb44b.png b/docs/FAQ/zh/media/e20c84d0e318efc0e1bb90c1ec2eb44b.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/e20c84d0e318efc0e1bb90c1ec2eb44b.png rename to docs/FAQ/zh/media/e20c84d0e318efc0e1bb90c1ec2eb44b.png diff --git a/docs/FAQ/zh/join_us/media/ec285c9fb0731355ce3b2f99aed57e20.png b/docs/FAQ/zh/media/ec285c9fb0731355ce3b2f99aed57e20.png old mode 100755 new mode 100644 similarity index 100% rename from docs/FAQ/zh/join_us/media/ec285c9fb0731355ce3b2f99aed57e20.png rename to docs/FAQ/zh/media/ec285c9fb0731355ce3b2f99aed57e20.png diff --git a/docs/FAQ/zh/media/image-20210413140504427.png b/docs/FAQ/zh/media/image-20210413140504427.png new file mode 100644 index 0000000000000000000000000000000000000000..aacdde2cf3177fba839098854e1126777262e000 Binary files /dev/null and b/docs/FAQ/zh/media/image-20210413140504427.png differ diff --git a/docs/FAQ/zh/sidebar.yaml b/docs/FAQ/zh/sidebar.yaml index 8d08303be10cc6026aa243188539fda47fc88c7d..1b69933acf70c14f9c4468ff2638b48f195e2945 100644 --- a/docs/FAQ/zh/sidebar.yaml +++ b/docs/FAQ/zh/sidebar.yaml @@ -1,8 +1,24 @@ -# FAQ 常见问题 +# FAQ常见问题 items: - - label: FAQ&常见问题 - file: README.md - label: 参与贡献 - file: join_us/README.md + items: + - label: gitee 提交代码以及文档编辑流程 + file: README.md + - label: gitee issue 使用教程 + file: gitee_issue/gitee_issue.md - label: QuecPython_FAQ - file: QuecPython_FAQ/QuecPython_FAQ.md \ No newline at end of file + items: + - label: QuecPython常见问题第一部分 + file: QP_common_question01/QP_common_question01.md + - label: QuecPython常见问题第二部分 + file: QP_common_question02/QP_common_question02.md + - label: QuecPython驱动固件脚本下载 + file: QP_download/QP_download.md + - label: QuecPython驱动安装失败问题解决 + file: QP_driver_failed/QP_driver_failed.md + - label: QuecPython救砖处理 + file: QP_recovery/QP_recovery.md + - label: QuecPython测试问题 + file: QP_test/QP_test.md + - label: Format_String + file: Format_String/Format_String.md diff --git a/docs/Mass_production/zh/CodeEncryption.md b/docs/Mass_production/zh/CodeEncryption.md index 4a2bc964687f10d02efb26c120ea59b047933215..c75ba35a43ef6907405c3dbd3bb1b9fc47aa7869 100644 --- a/docs/Mass_production/zh/CodeEncryption.md +++ b/docs/Mass_production/zh/CodeEncryption.md @@ -1,14 +1,12 @@ -# QuecPython 加密保护介绍 +## 文档历史 -本文档主要介绍QuecPython 代码加密保护,数据加密保护方案。 +**修订记录** -本文档适用于移远通信如下模块: +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | -------- | ------------ | +| 1.0 | 2021-04-07 | Chic | 初始版本 | -- EC100Y-CN -- EC600S-CN - - ## 加密方式介绍 diff --git a/docs/Mass_production/zh/DataEncryption.md b/docs/Mass_production/zh/DataEncryption.md new file mode 100644 index 0000000000000000000000000000000000000000..ebfa29a484213e29066bd41cea59db8a257bf556 --- /dev/null +++ b/docs/Mass_production/zh/DataEncryption.md @@ -0,0 +1,118 @@ +## 文档历史 + +**修订记录** + +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | -------- | ------------ | +| 1.0 | 2021-04-07 | Chic | 初始版本 | + + + +## 加密方式介绍 + +MD5、SHA1和SHA256是非常常用的两种单向散列函数,现在比较常用的是SHA256算法。 + +三大特性: +1. 将任意长度的数据转换成固定长度的数据 +(无论输入的是一个比特还是一亿个比特,输出的结果长度固定,具体长度根据不同算法决定,比如MD5输出的长度就是128位) +2. 很强的抗碰撞性 +(输出的结果唯一,也就是很难找到H(x1)=H(x2)) +3. 不可逆 +(目前没有任何方法可以通过散列值找到对应的输入值,也就是不能通过H(X)的值找到对应的X) + +QuecPython模组支持的功能: 实现二进制数据散列算法,目前支持MD5 , SHA1, SHA256; + +以一个60M的文件为测试样本,经过1000次的测试平均值,三种算法的表现为: + +- MD5 算法运行1000次的平均时间为:226ms + +- SHA1 算法运行1000次的平均时间为:308ms + +- SHA256 算法运行1000次的平均时间为:473ms + + 安全性方面,SHA256(又称SHA2)的安全性最高,建议使用SHA256。 + + + +## 常见应用场景: + +1、数据库中保存用户密码 +比如前段时间频频爆出一些公司的数据库被爆,用户的账户密码以明文存在,大量资料流出这样的做法是极其不负责和危险的。 +最好的方法就是将用户的密码通过单向散列函数输出到数据库,每次登录时对比散列值即可。由于单向散列函数的不可逆性,就算数据库被盗取,也没有办法得到用户的信息。 +(某些自称破解单向散列函数的网站使用的方法其实是低级的穷举法,保存大量常用明文的散列值,这样做是很愚蠢的。有很多方法可以应对,比如一种叫做“加盐”的常用方法,将用户的信息后面统一加上诸如$%*^&这样的字符,然后计算散列值存入数据库中,或者可以计算散列值的散列值,这样可以保证绝对的安全性。) + +2、防止文件篡改 +目前大部分提供下载服务的网站都有提供文件的SHA256值,这是因为单向散列函数具备防篡改的效果,若是下载的文件的SHA256和网站提供的值不符,则可能此文件已经遭到了修改,可能含有病毒或者是盗版等等。。。接下来的代码中我们也会来实现计算文件的SHA256值。 + +3、 数字签名(阿里云、腾讯云等) +在进行数字签名时也会使用单向散列函数。 +数字签名是现实社会中的签名和盖章这样行为在数字世界中的实现。数字签名的处理过程非常耗时,因此一般不会对整个消息内容直接使用数字签名,而是先通过单向散列函数计算出消息的散列值,然后再对这个散列值使用私钥加密,得到的就是数字签名。 + +4、伪随机数生成器 +使用单向散列函数可以构造伪随机数生成器。 +密码技术中所使用的随机数需要具备“事实上不可能根据过去的随机数列预测未来的随机数列”这样的性质。为了保证不可预测性,可以利用单向散列函数的单向性。 + +5、秒传 +很多诸如某云盘,某网盘这样的公司利用单向散列函数的特性实现秒传的效果。 +单向散列函数就像文件的指纹一样,当用户上传文件时,首先计算一下此文件的单向散列值,将此值在数据库中进行查找,若存在相同值,证明此用户上传的文件已经存在相同的,所以无需上传,共享即可。如此可大幅降低服务器负载,大幅缩减存储空间,实现去重的效果。 + + + +## 二进制数据加密 + +示例代码: + +```python +import uhashlib +import ubinascii +# 目前支持 md5,sha1, sha256 + +data = b"QuecPython" # 待加密数据 + +hash_obj = uhashlib.md5() +hash_obj.update(data) +res = hash_obj.digest() +hex_msg = ubinascii.hexlify(res) +print("md5加密后的数据:", hex_msg) +# b'37b8419ee7cdb3c64d7e66019216117c' + +hash_obj = uhashlib.sha1() +hash_obj.update(data) +res = hash_obj.digest() +hex_msg = ubinascii.hexlify(res) +print("sha1加密后的数据:", hex_msg) +# b'614a4247ef68e9f9793e11353cc86acb932badab' + +hash_obj = uhashlib.sha256() +hash_obj.update(data) +res = hash_obj.digest() +hex_msg = ubinascii.hexlify(res) +print("sha256加密后的数据:", hex_msg) +# b'1ec66771b3a9ac3ea4c44f009e545797d42e9e7d426fff8275895468fe27c6cd' +``` + +执行结果如下图: + +![DataEncryption_210406_01](media\DataEncryption_210406_01.png) + +## 更多内容 + +想要了解其他功能吗?请浏览官方网站: + +https://python.quectel.com/wiki/#/zh-cn/api/?id=pin + +官方网站: + +https://python.quectel.com/ + +相关工具、例程、驱动、文档下载: + +https://python.quectel.com/download + + + +了解更多,请关注QuecPython公众号 + + + + \ No newline at end of file diff --git a/docs/Mass_production/zh/QuecPythonBack.md b/docs/Mass_production/zh/QuecPythonBack.md index 6b0effd4b0d8a48299c5d9ac0d9ad91fc0ca59db..b84351be8948ed29b9627acd9eb10d5b1bef491a 100644 --- a/docs/Mass_production/zh/QuecPythonBack.md +++ b/docs/Mass_production/zh/QuecPythonBack.md @@ -1,4 +1,12 @@ -# QuecPython备份还原机制 +## 文档历史 + +**修订记录** + +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | -------- | ------------ | +| 1.0 | 2021-04-07 | Chic | 初始版本 | + + ## 概述 diff --git a/docs/Mass_production/zh/README.md b/docs/Mass_production/zh/README.md index 0d537a7ab3da527681595203d7978528eb2288dd..a600bfa4229ea33b2d725ec0e47f6e22381db8ec 100755 --- a/docs/Mass_production/zh/README.md +++ b/docs/Mass_production/zh/README.md @@ -1,12 +1,11 @@ -# QuecPython 产品开发及量产方案 +## 文档历史 -本文档主要介绍QuecPython 产品开发及量产方案。 +**修订记录** -本文档适用于移远通信如下模块: +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | -------- | ------------ | +| 1.0 | 2021-04-07 | Chic | 初始版本 | -- EC100Y-CN - -- EC600S-CN ## 代码保护 diff --git a/docs/Mass_production/zh/code/DataEncryption.py b/docs/Mass_production/zh/code/DataEncryption.py new file mode 100644 index 0000000000000000000000000000000000000000..edc9dde5c15d9db5d1f3b9e4d1a15d39ddbea1b2 --- /dev/null +++ b/docs/Mass_production/zh/code/DataEncryption.py @@ -0,0 +1,33 @@ +import uhashlib +import ubinascii +# 目前支持 md5,sha1, sha256 + +data = b"QuecPython" # 待加密数据 + +hash_obj = uhashlib.md5() +hash_obj.update(data) +res = hash_obj.digest() +hex_msg = ubinascii.hexlify(res) +print("md5加密后的数据:", hex_msg) +# b'37b8419ee7cdb3c64d7e66019216117c' + +hash_obj = uhashlib.sha1() +hash_obj.update(data) +res = hash_obj.digest() +hex_msg = ubinascii.hexlify(res) +print("sha1加密后的数据:", hex_msg) +# b'614a4247ef68e9f9793e11353cc86acb932badab' + +hash_obj = uhashlib.sha256() +hash_obj.update(data) +res = hash_obj.digest() +hex_msg = ubinascii.hexlify(res) +print("sha256加密后的数据:", hex_msg) +# b'1ec66771b3a9ac3ea4c44f009e545797d42e9e7d426fff8275895468fe27c6cd' + + +# print("原始数据:", b'\x11\x22\x33123') +# res = ubinascii.b2a_base64('\x11\x22\x33123') +# print("编码base64数据:", res) +# res = ubinascii.a2b_base64(res) +# print("还原base64数据:", res) diff --git a/docs/Mass_production/zh/media/DataEncryption_210406_01.png b/docs/Mass_production/zh/media/DataEncryption_210406_01.png new file mode 100644 index 0000000000000000000000000000000000000000..7b48e23d2fc8242a874d7bc06f412d229da750e8 Binary files /dev/null and b/docs/Mass_production/zh/media/DataEncryption_210406_01.png differ diff --git a/docs/Mass_production/zh/sidebar.yaml b/docs/Mass_production/zh/sidebar.yaml index b9da97cd3a7add8f2db25864ca8f20948de489e5..1731dbfc355aa0d01dc2037af9826556fe071c14 100755 --- a/docs/Mass_production/zh/sidebar.yaml +++ b/docs/Mass_production/zh/sidebar.yaml @@ -2,7 +2,9 @@ items: - label: 量产工具 file: README.md - - label: 加密保护 + - label: 代码加密保护 file: CodeEncryption.md + - label: 数据加密保护 + file: DataEncryption.md - label: 备份还原机制 file: QuecPythonBack.md \ No newline at end of file diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/5e6a7072596c0a603b861ad6a056c8bb.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/5e6a7072596c0a603b861ad6a056c8bb.png deleted file mode 100755 index 76ddf130b8e34ca45cee70dd6deefd1017c5f2bf..0000000000000000000000000000000000000000 Binary files a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/5e6a7072596c0a603b861ad6a056c8bb.png and /dev/null differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/6e5654be296f4a5fc4f620bb2b0f238a.emf b/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/6e5654be296f4a5fc4f620bb2b0f238a.emf deleted file mode 100755 index 69762d967528da3a81b51728b2ef71cf850d2cf3..0000000000000000000000000000000000000000 Binary files a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/6e5654be296f4a5fc4f620bb2b0f238a.emf and /dev/null differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/94c6ef78824b005fedd3362dec5e479a.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/94c6ef78824b005fedd3362dec5e479a.png deleted file mode 100755 index bf5d08b8238fbcfd42abf6332ac8db706744fba5..0000000000000000000000000000000000000000 Binary files a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/94c6ef78824b005fedd3362dec5e479a.png and /dev/null differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/98b20372f9da3d0aa8b80dda206143b0.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/98b20372f9da3d0aa8b80dda206143b0.png deleted file mode 100755 index 254ff533f097c4fa857235185cce967dce9c13ab..0000000000000000000000000000000000000000 Binary files a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/98b20372f9da3d0aa8b80dda206143b0.png and /dev/null differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/9fc2e34407f04f3747b3c1b507499526.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/9fc2e34407f04f3747b3c1b507499526.png deleted file mode 100755 index 78a3adcf9562b09fce3f6713a534d2162781e8bb..0000000000000000000000000000000000000000 Binary files a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/9fc2e34407f04f3747b3c1b507499526.png and /dev/null differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/d36c1ed416c5d9f95816324ad790f385.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/d36c1ed416c5d9f95816324ad790f385.png deleted file mode 100755 index 13a4f7e88057d541117cea383b84394acab5de8b..0000000000000000000000000000000000000000 Binary files a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/d36c1ed416c5d9f95816324ad790f385.png and /dev/null differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/dae403adf4679040f94623b7eb2e0c99.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/dae403adf4679040f94623b7eb2e0c99.png deleted file mode 100755 index 0b085db65969f7b164db105433207c8110b6aab1..0000000000000000000000000000000000000000 Binary files a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/dae403adf4679040f94623b7eb2e0c99.png and /dev/null differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600U/Hardware_Support_EC600U.md b/docs/Quecpython_intro/zh/Qp_Hw_EC600U/Hardware_Support_EC600U.md deleted file mode 100644 index 42e5641f32f71c2ae935568d64d6f0c8bda98765..0000000000000000000000000000000000000000 --- a/docs/Quecpython_intro/zh/Qp_Hw_EC600U/Hardware_Support_EC600U.md +++ /dev/null @@ -1,4 +0,0 @@ - -## EC600U CNLB 开发板资料 - -待补充 \ No newline at end of file diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/Hardware_Support_EC600S.md b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/Hardware_Support_EC600X.md similarity index 47% rename from docs/Quecpython_intro/zh/Qp_Hw_EC600S/Hardware_Support_EC600S.md rename to docs/Quecpython_intro/zh/Qp_Hw_EC600X/Hardware_Support_EC600X.md index a5ede198bafd554d6f401712f42dfc48f0ab0653..535d993ffdcebac42004f0f338c6955017566396 100644 --- a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/Hardware_Support_EC600S.md +++ b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/Hardware_Support_EC600X.md @@ -1,35 +1,27 @@ -## EC600S开发板及其使用场景介绍 - -本片文章简述 **600SCNLA** **CNLB**。 - -**Quectel_QuecPython\_ EC600X开发板使用说明** - -版本:Quectel_QuecPython_EC600X开发板使用说明\_V1.2.1 - ## 文档历史 **修订记录** -| **版本** | **日期** | **作者** | **变更表述** | -| -------- | ---------- | -------- | --------------------------------- | -| 1.0 | 2020-12-14 | 袁帅 | 初始版本 | -| 1.1 | 2020-12-20 | Josh | 硬件1.1版本增加音频功放电路 | -| 1.1.1 | 2020-12-28 | Chic | 文档增加【项目推介】 | -| 1.1.2 | 2021-01-06 | Chic | 修改关于LED的描述 | -| 1.2 | 2021-01-20 | Jorma | 修改部分内容 | -| 1.2.1 | 2021-03-31 | David | 增加V1.2开发板的内容 增加图表标题 | -| 1.2.2 | 2021-04-02 | chengzhu | wrod转换成md,后续更新基于md更新 | +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | -------- | ---------------------------------- | +| 1.0 | 2020-12-14 | 袁帅 | 初始版本 | +| 1.1 | 2020-12-20 | Josh | 硬件1.1版本增加音频功放电路 | +| 1.1.1 | 2020-12-28 | Chic | 文档增加【项目推介】 | +| 1.1.2 | 2021-01-06 | Chic | 修改关于LED的描述 | +| 1.2 | 2021-01-20 | Jorma | 修改部分内容 | +| 1.2.1 | 2021-03-31 | David | 增加V1.2开发板的内容;增加图表标题 | +| 1.2.2 | 2021-04-02 | chengzhu | word转换成md,后续更新基于md更新 | +| 1.2.3 | 2021-04-06 | David | md文档下,图片和目录的格式修改 | -## 1 基本概述 +## 基本概述 -### 1.1 描述 +### 描述 -EC600X_QuecPython_EVB_V1.x -开发板是一款搭载多款传感器的Cat.1通信模块开发板,本文将介绍这款开发板的使用方法和注意事项。 +EC600X_QuecPython_EVB_V1.x开发板是一款搭载多款传感器的Cat.1通信模块开发板,本文将介绍这款开发板的使用方法和注意事项。 EC600X\_QuecPython_EVB_V1.x的命名规则如下: -图1:EC600X_QuecPython_EVB_V1.x 开发板命名规则 +image-20210406102449288 EC600S_QuecPython_EVB_V1.x(x=0,1)开发板(本文简称“V1.1开发板”)是专门针对EC600S制造,是一款小巧便携的“口袋型”开发板。体型虽小,但是功能丰富,拥有温湿度传感器、SIM卡座、板载天线、LCD接口、光敏电阻、MIC、等元件。 @@ -37,85 +29,56 @@ EC600S_QuecPython_EVB_V1.x(x=0,1)开发板(本文简称“V1.1开发板” 开发者仅需一条USB Type-C 数据线即可轻松玩转开发板。 -### 1.2 V1.1开发板资源 - -- Quectel移远 EC600S_CNAA Cat.1 通信模组 - -- PCB天线 - -- NANO SIM自弹卡座 - -- 保留SMA天线座焊盘 - -- USB Type-C数据接口 - -- 一个PWRKEY按键,一个RST按键 - -- 两个自定义功能按键 - -- 音频功放,支持最高4Ω2W喇叭 - -- 温湿度传感器 - -- G-Sensor 三轴加速度传感器 - -- (不支持)LED彩灯 - -- (需焊接)驻极体MIC - -- (需焊接)Speaker 音频输出 - -- (需焊接)光敏电阻 - -- (需焊接)GPIO排针 - -- (需焊接)LCD排针 - -### 1.3 V1.2开发板资源 - -- Quectel移远 EC600X Cat.1 通信模组 - -- NANO SIM自弹卡座 - -- GPS、LTE、WIFI/BT天线接口 - -- USB Type-C数据接口 - -- PWRKEY按键,RST按键,强制下载按键 - -- 两个自定义功能按键 - -- 音频功放,支持最高4Ω2W喇叭 - -- 温湿度传感器 - -- G-Sensor 三轴加速度传感器 - -- 单色灯 - -- 驻极体MIC - -- Speaker 音频输出 - -- 光敏电阻 - -- GPIO排针 - -- LCD排针 - -### 1.4 开发板能做的事情 - -#### 1.4.1小实验 +### V1.1开发板资源 + +- Quectel移远 EC600S_CNAA Cat.1 通信模组 +- PCB天线 +- NANO SIM自弹卡座 +- 保留SMA天线座焊盘 +- USB Type-C数据接口 +- 一个PWRKEY按键,一个RST按键 +- 两个自定义功能按键 +- 音频功放,支持最高4Ω2W喇叭 +- 温湿度传感器 +- G-Sensor 三轴加速度传感器 +- (不支持)LED彩灯 +- (需焊接)驻极体MIC +- (需焊接)Speaker 音频输出 +- (需焊接)光敏电阻 +- (需焊接)GPIO排针 +- (需焊接)LCD排针 + +### V1.2开发板资源 + +- Quectel移远 EC600X Cat.1 通信模组 +- NANO SIM自弹卡座 +- GPS、LTE、WIFI/BT天线接口 +- USB Type-C数据接口 +- PWRKEY按键,RST按键,强制下载按键 +- 两个自定义功能按键 +- 音频功放,支持最高4Ω2W喇叭 +- 温湿度传感器 +- G-Sensor 三轴加速度传感器 +- 单色灯 +- 驻极体MIC +- Speaker 音频输出 +- 光敏电阻 +- GPIO排针 +- LCD排针 + +### 开发板能做的事情 + +#### 小实验 开发板包含诸多接口、外设,方便开发者开发调试。在QuecPython官网的文档中心提供了众多小实验。 具体地址见:[QuecPython小实验](https://python.quectel.com/doc/doc/little_demo/zh/index.html) -#### 1.4.2 实现产品原型 +#### 实现产品原型 基于开发板自带的众多传感器、按键、液晶屏等外设,开发者甚至可以直接以开发板为基础,快速做出产品原型。接下来试举几例以开发板板载的传感器为基础,可以做的某些产品原型: -1. **防盗损装置** +- **防盗损装置** **背景**:无人值守的设备如快递柜、充电站、充电桩等,存在被盗或破坏的风险。需要实现远程控制、防盗、异常状态上报等 @@ -123,7 +86,7 @@ EC600S_QuecPython_EVB_V1.x(x=0,1)开发板(本文简称“V1.1开发板” **方法**:Quectel通信模组连接云端,保存云端下发的参数。读取传感器上报的参数,判断当前姿态、震动状态是否超过阈值,LED闪烁、报警,并通过网络上报到云端 -1. **微型天气服务站** +- **微型天气服务站** **背景**:在野外假设无人值守的微型天气服务站,通过网络定时上报温湿度、风力等数据,以供记录、分析、预报 @@ -132,7 +95,7 @@ EC600S_QuecPython_EVB_V1.x(x=0,1)开发板(本文简称“V1.1开发板” **方法**:Quectel通信模组连接云端,保存云端下发的参数。通过NTP同步内部时钟;读取温湿度传感器、ADC器上报的参数,并按照云端的要求,将数据序列化通过网络上报到云端。网络不佳情况下,离线存储数据,待网络通畅再上报数据到云端 -1. **微型自动售货机** +- **微型自动售货机** **背景**:很多酒店的miniBar不能满足客户的需求,而客房内的微型自动售货机则可以很好地弥补这个缺陷。售卖如零食、口香糖、充电线等小件商品,同时提供手机充电等服务 @@ -141,7 +104,7 @@ LCD+GSensor+喇叭 **方法**:Quectel通信模组连接到云端,注册并鉴权,收到云端下发的数据,LCD屏幕显示对应的二维码;用户使用微信或者支付宝扫描LCD显示的二维码,进入小程序选购。选购完成并支付后,云端下发控制指令,通信模组接到指令,解析指令内容,控制GPIO实现步进电机旋转出货,并通过光照传感器确认出货完毕;或控制继电器/MOS管,实现手机充电功能;出货完毕后,可使用TTS语音朗读相应的信息如“*出货完毕,欢迎再次选购*”。当G-Sensor检测到倾倒或者暴力破坏时,可自动上报信息到云端,以便运维处理 -1. **扫码把枪** +- **扫码把枪** **背景**:日常场景,可以使用把枪实现批量录入条形码、二维码。但是传统把枪无法脱离电脑使用,而使用手机扫码颇为繁琐,且稳定性差、耗电量高。使用无线扫码把枪,可以实现远程扫码、无线扫码、连续扫码等 @@ -151,7 +114,7 @@ LCD+GSensor+喇叭 Camera 扫描条形码或二维码(可选单次扫描、连扫等操作),模块识别条形码或二维码的信息,并上报到云端 -1. **智能控制** +- **智能控制** **背景**:云端下发运行参数,模块实现自动化监测设备、控制,节省人工成本。 @@ -159,7 +122,7 @@ Camera **方法**:Quectel通信模组开机后连接云端,获取运行参数并保存。在LCD显示相应的控制内容和运行状态;当检测到传感器的数值超过阈值,则根据保存的参数执行对应动作,并上报云端(如湿度超过80%则打开继电器,控制除湿机开启),实现自动化控制。 -1. **设备定位** +- **设备定位** **背景:**共享单车快速发展,部分单车由于停车位置的偏僻性,消费者在寻找时无法有效准确的找到单车的位置,影响客户的消费体验,同时耗费大量的资源,而且实时性无法保证。 @@ -167,34 +130,30 @@ Camera **方法:**使用L76K获取定位信息,输出NEMA语句,然后通过模组的串口读取NEMA,输出定位信息,最后在连接网络的情况下,将数据发送到云端(例如:阿里云)实现实时共享。 -## 2 开发板介绍 +## 开发板介绍 开发板是为方便开发者使用QuecPython,而设计的一款基于EC600X Cat.1通信模块的开发板,其上集成了等开发常用的配置,可以满足开发者的开发需求。 -### 2.1 V1.1开发板 +### V1.1开发板 -#### 2.1.1 V1.1开发板正面接口 +#### V1.1开发板正面接口 -![](media/5e6a7072596c0a603b861ad6a056c8bb.png) +image-20210406102743063 -图2:EC600S_QuecPython_EVB_V1.x(x=0,1)开发板正面图 -#### 2.1.2 V1.1开发板背面接口 -![](media/d36c1ed416c5d9f95816324ad790f385.png) +#### V1.1开发板背面接口 -图3:EC600S_QuecPython_EVB_V1.x(x=0,1)开发板背面图 +EC600XV1.1_otherside -| 小提示 | -| --------------------------------------------------------------------------------------------------- | -| 开发板的丝印请参考 本手册的 附录内容 开发板的更多资料,请访问 | +**TIPS:** -#### 2.1.3 V1.1开发板配置 +开发板的丝印请参考本手册的附录内容开发板的更多资料,请访问 -开发板配备了多种传感器,以及其他外设。明细如下: +#### V1.1开发板配置 -表**1**:V1.1开发板配置 +开发板配备了多种传感器,以及其他外设。明细如下: | 序号 | 名称 | 型号 | 是否支持 | 接口类型 | | ---- | ---------------------------- | ------------- | -------- | -------- | @@ -207,32 +166,24 @@ Cat.1通信模块的开发板,其上集成了等开发常用的配置,可以 | 7 | LED彩灯 | WS2812B-MINI | 否 | PWM | | 8 | LCD 显示屏(需选择含屏套餐) | ST7789 | 是 | SPI | -### 2.1 V1.2开发板 - -#### 2.2.1 V1.2开发板正面接口 - -![](media/98b20372f9da3d0aa8b80dda206143b0.png) - -![](media/d36c1ed416c5d9f95816324ad790f385.png) +### V1.2开发板 -![](media/d36c1ed416c5d9f95816324ad790f385.png) +#### V1.2开发板正面接口 -图4:EC600X\_QuecPython_EVB_V1.2开发板正面图 +image-20210406104035040 -#### 2.2.2 V1.2开发板背面接口 +#### V1.2开发板背面接口 -图5:EC600X_QuecPython_EVB_V1.2开发板背面图 +image-20210406104055313 | 小提示 | | ------------------------------------------------------------------------------------------------- | | 开发板的丝印请参考本手册的附录内容 开发板的更多资料,请访问 | -#### 2.2.3 V1.2开发板配置 +#### V1.2开发板配置 开发板配备了多种传感器,以及其他外设。明细如下: -表**2**:V1.2开发板配置 - | 序号 | 名称 | 型号 | 是否支持 | 接口类型 | | ---- | ---------------------------- | ------------- | -------- | -------- | | 1 | 三轴加速度传感器 | LIS2DH12TR | 是 | SPI | @@ -245,9 +196,9 @@ Cat.1通信模块的开发板,其上集成了等开发常用的配置,可以 | 8 | LCD 显示屏(需选择含屏套餐) | ST7789 | 是 | SPI | | 9 | GNSS模组 | L76K | 是 | UART | -## 3 功能详解 +## 功能详解 -### 3.1 LCD接口 +### LCD接口 开发板集成了LCD接口,开发者可以通过该接口点亮LCD屏幕,显示图片文字等内容。搭配LVGL还能显示更多有趣内容哦(点此了解“LCD”的小实验)。 @@ -263,137 +214,115 @@ Cat.1通信模块的开发板,其上集成了等开发常用的配置,可以 - 更多屏幕,正在适配中… -![](media/d0bf3711e729c131dd83c8ad98bec972.png) - -图6:EC600X_QuecPython_EVB LCD相关原理图 +![](media/EC600X_LCD.png) -| 请注意 | -| -------------------------------------------------------------------------------------------------- | -| 对于LCD Slot,V1.0和V1.1的开发板没有CS,请选择没有CS的屏,或者将屏的CS接地,具体可参考V1.1的原理图 | +| 请注意 | +| ------------------------------------------------------------ | +| 对于LCD Slot, V1.0和V1.1的开发板没有CS, 请选择没有CS的屏, 或者将屏的CS接地, 具体可参考V1.1的原理图 | -### 3.2加速度传感器 +### 加速度传感器 V1.2开发板集成了LIS2DH12TR三轴加速度传感器。该三轴加速度传感器是具有体积小巧、耗电低、灵敏度高的特点。开发者通过该加速度传感器,可以采集开发板的运动状态,姿态等数据。 点此了解:[“加速度传感器”小实验](https://python.quectel.com/doc/doc/little_demo/zh/QuecPythonTest/i2c_lis2dh.html) -![](media/ff7500e1461f058f2ef101d2134c0886.png) - -图7:EC600X_QuecPython_EVB 加速度传感器相关原理图 +![](media/EC600X_LIS2DH12TR.png) -### 3.3光敏电阻 +### 光敏电阻 开发板集成了GL5528高灵敏度光敏电阻。光敏电阻对光线十分敏感,其在无光照时,呈高阻状态,暗电阻一般可达1.5MΩ;而在光照时,阻值可小至1KΩ以下。使用该光敏电阻,开发者可以采集环境光照度信息。 点此了解:[光敏传感器实验](https://python.quectel.com/doc/doc/little_demo/zh/QuecPythonTest/Photoresistor.html) -![](media/58de0f5e0c57461b126e5c8665a99e28.png) +![](media/EC600X_GL5528.png) -图8:EC600X_QuecPython_EVB 光敏电阻相关原理图 - -### 3.4温湿度传感器 +### 温湿度传感器 开发板集成了AHT10温湿度传感器。该传感器具有低功耗、体积小、计量准确的特点。开发者可以使用该传感器采集环境温度、湿度等信息。点此了解:[温湿度传感器实验](https://python.quectel.com/wiki/study/zh-cn/study/QuecPythonTest/i2c_aht/) -![](media/5e037836c1559c13881ebe2639cf8771.png) +![](media/EC600X_AHT10.png) -图9:EC600X_QuecPython_EVB 温湿度传感器相关原理图 +### 音响功率放大器(功放芯片) -### 3.5音响功率放大器(功放芯片) +开发板集成了音响功率放大器。V1.1集成的是AW8733ATQR,该功放芯片是K类音响功率放大器,具有超强 TDD 抑制、超大音量、防破音、超低 EMI、输出功率2.0W的特点。V1.2集成的是NS4160,一款带AB类/D类工作模式切换功能、超低EMI、无需滤波器、5W单声道音频功放的一种科技产品。点此了解:[Audio模块开发](https://python.quectel.com/doc/doc/Advanced_development/zh/QuecPythonSub/Audio.html) -开发板集成了音响功率放大器。V1.1集成的是AW8733ATQR,该功放芯片是K -类音响功率放大器,具有超强 TDD 抑制、超大音量、防破音、超低 EMI、输出功率 -2.0W的特点。V1.2集成的是NS4160,一款带AB类/D类工作模式切换功能、超低EMI、无需滤波器、5W单声道音频功放的一种科技产品。点此了解:[Audio模块开发](https://python.quectel.com/doc/doc/Advanced_development/zh/QuecPythonSub/Audio.html) +![](media/EC600X_PA.png) -![](media/e6b049c2f882bb39a0278122df21cb27.png) -图10:EC600X_QuecPython_EVB 音频功放芯片相关原理图 -| 请注意 | -| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| V1.0版开发板没有功放芯片,放音可能失败 V1.1版开发板有功放芯片,需要拉高PIN58使能 audio_EN = Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1) V1.1版开发板录音存在问题,需要拿掉R28 | +| 请注意 | +| ------------------------------------------------------------ | +| V1.0版开发板没有功放芯片,放音可能失败
V1.1版开发板有功放芯片,需要拉高PIN58使能:
audio_EN = Pin(Pin.GPIO11, Pin.OUT, Pin.PULL_PD, 1)
V1.1版开发板录音存在问题,需要拿掉R28 | -### 3.6自定义按键 +### 自定义按键 开发板集成了2个自定义微动按键,开发者可以自行定义其功能。 点此了解:[按键输入实验](https://python.quectel.com/doc/doc/little_demo/zh/QuecPythonTest/button.html) -![KEY](media/7f09d42b45d5f1169505590a63a9e115.png) - -图11:EC600X_QuecPython_EVB 自定义按键相关原理图 +![KEY](media/EC600X_kEY.png) | 请注意 | | ---------------------------------------------------- | | V1.1开发板丝印错误,微动开关实际连接的是GPIO1、GPIO2 | -### 3.7 GNSS模组:L76K +### GNSS模组:L76K V1.2开发板集成了一个GNSS模组L76K,客户无需联网即可获取定位信息。 -![](media/6507a12ac61656f6736377ac4241bc4c.png) - -图12:EC600X_QuecPython_EVB L76K相关原理图 +![](media/EC600X_L76K.png) | 请注意 | | ------------------------------------------ | | 对于V1.1之前开发板是没有配置此GNSS模组的。 | -## 4准备工作 +## 准备工作 -### 4.1安装USB驱动 +### 安装USB驱动 使用开发板前,需要在电脑上安装USB驱动。正确安装后,电脑可以识别开发板。 驱动程序下载地址: -1. 请选择对应的驱动 +- 请选择对应的驱动 -![](media/de6fa3f9fe8c997499c2ffd5db02aad3.png) + 图13:驱动安装\_驱动位置 -1. 开发者下载驱动程序的压缩包后,完整解压该压缩包到任意目录,双击运行setup.exe: +- 开发者下载驱动程序的压缩包后,完整解压该压缩包到任意目录,双击运行setup.exe: -![](media/1b8e9ded164723439e9d8e4625f95443.png) +![](media/setup.png) -图14:驱动安装\_驱动图标 +- 按照提示,点击Install即可: -1. 按照提示,点击Install即可: +![](media/install.png) -![](media/3b29237824a8cbc88b23fb7560646b7c.png) +- 安装成功后,点击“Finish”结束: -图15:驱动安装\_开始 +![](media/finish.png) -1. 安装成功后,点击“Finish”结束: +- 至此,USB 驱动安装结束。 -![](media/346d5221e194f6f5df9ac4b4ed2cdc4d.png) +| 小提示 | +| ------------------------------------------------------------ | +| (1)安装前,请备份您的重要文件,并保存您的工作进度,以免发生意外情况,导致文件丢失
(2)安装成功后,无需重启电脑
(3)如需修复或者卸载驱动程序,再次运行该 驱动安装程序,选择“修复”或“卸载” 即可
(4)如若安装失败,请联系我们的在线支持:QQ群 445121768 | -图16: 驱动安装\_结束 +### 验证驱动安装 -1. 至此,USB 驱动安装结束。 +驱动安装成功后,使用USB TypeA-TypeC数据线,将开发板连接到电脑上,并长按POWKY开机。 -| 小提示 | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 安装前,请备份您的重要文件,并保存您的工作进度,以免发生意外情况,导致文件丢失 安装成功后,无需重启电脑 如需修复或者卸载驱动程序,再次运行该 驱动安装程序,选择“修复”或“卸载” 即可 如若安装失败,请联系我们的在线支持:QQ群 445121768 | +| 请注意 | +| ------------------------------------------------------------ | +| (1)V1.0开发板,上电自动开机,无需长按 POWKY
(2)V1.1开发板,需要长按POWKY开机
(3)V1.2开发板,是否需要长按POWKY开机,由跳帽决定。
(4)开发板的USB Type-U为母口,仅可当作从设备,接口类型为USB2.0 | -### 4.2 验证驱动安装 +在电脑上打开“设备管理器”,进入电脑的设备管理器,展开**“端口(COM 和LPT)”**,应出现三个串口设备: -驱动安装成功后,使用USB -TypeA-TypeC数据线,将开发板连接到电脑上,并长按POWKY开机。 +- **Quectel USB AT Port (COMx)** -| 请注意 | -| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| V1.0版开发板,上电自动开机,无需长按 POWKY V1.1版开发板,需要长按POWKY开机 V1.2开发板,是否需要长按POWKY开机,由跳帽决定。 开发板的USB Type-U为母口,仅可当作从设备,接口类型为USB2.0 | +- **Quectel USB DIAG Port (COMx)** -在电脑上打开“设备管理器”,进入电脑的设备管理器,展开**“端口(COM 和 -LPT)”**,应出现三个串口设备: - -1. **Quectel USB AT Port (COMx)** - -2. **Quectel USB DIAG Port (COMx)** - -3. **USB 串行设备 (COMx)** +- **USB 串行设备 (COMx)** | 小提示 | | ---------------------------------------------------------------------------- | @@ -401,37 +330,29 @@ LPT)”**,应出现三个串口设备: 如果您的电脑没有识别到任何串口设备,请检查: -1. 开发板是否正确连接到电脑(数据线损坏,或者插口损坏、供电不足等) +- 开发板是否正确连接到电脑(数据线损坏,或者插口损坏、供电不足等) -2. 开发板是否正确开机 +- 开发板是否正确开机 -3. USB驱动是否正确安装 +- USB驱动是否正确安装 -4. 电脑是否正确安装主板驱动。 +- 电脑是否正确安装主板驱动。 如果无法排除,请联系我们的在线支持:QQ群 445121768 如果您的电脑只识别了两个串口设备(没有“USB串行设备”),那么可能是因为没有刷入QuecPython固件的缘故。别着急,请阅读下一章节,刷入QuecPython固件就可以啦。 -![](media/2d85c835125e0bab4d1ad4e01a61024b.png) - -图17:非QuecPython固件设备管理器说明图 +![](media/DM_not_Quecpython.png) 如果您的电脑正确识别了三个串口设备,那么恭喜您,一切准备就绪,可以开始QuecPython之旅啦\~! -![1604807389(1)](media/6056bd2376931da284e04f0940c7892b.png) - -图18:QuecPython固件设备管理器说明图 +1604807389(1) -### 4.3验证固件版本 +### 验证固件版本 -使用串口工具,打开“Quectel USB AT Port”对应的串口(波特率选择 115200,停止位 1 -位,无奇偶校验,8 位数据位,无硬件控制流)。勾选“发送新行”(Send With -Enter),发送指令“AT+GMR”,查看模块返回的信息,即当前固件版本: +使用串口工具,打开“Quectel USB AT Port”对应的串口(波特率选择 115200,停止位 1位,无奇偶校验,8 位数据位,无硬件控制流)。勾选“发送新行”(Send With Enter),发送指令“AT+GMR”,查看模块返回的信息,即当前固件版本: -![](media/ce452b73df89cad975b5ceedb8fd2b13.png) - -图19:固件AT查询命令 + 如果是QuecPython的固件,通常以PY或者Python结尾。 @@ -441,40 +362,33 @@ QPYcom下载地址: 具体位置如下截图: -![](media/d1eeca970e44d660248f9f6f25a1e812.png) - -图20:QPYcom 工具位置 +QPYcom_position 使用QPYcom工具查看固件版本的步骤如下: -1. 下载QPYcom工具后,完整解压到任意目录,双击QPYcom.exe运行 - -2. 将开发板连接到电脑并开机; +1. 下载QPYcom工具后,完整解压到任意目录,双击QPYcom.exe运行 -3. 选择“USB串行设备”串口,默认波特率,打开串口 +2. 将开发板连接到电脑并开机; -4. 点击“**交互**”标签,进入交互页 +3. 选择“USB串行设备”串口,默认波特率,打开串口 -5. 键入如下命令,然后查看模块返回的内容: +4. 点击“**交互**”标签,进入交互页 - *import uos* +5. 键入如下命令,然后查看模块返回的内容: - *uos.uname()* + *import uos* -![](media/2355e094f7fd88fb21ff48df186e5fcc.png) + *uos.uname()* -图21:固件QuecPython查询命令 + 如图所示,如果可以正常返回内容,则证明当前运行的是QuecPython固件。 -如果没有“USB串行设备” -串口,或者无法输入,输入无返回等情况,则模组内运行的都不是QuecPython固件,需要下载QuecPython固件。 +如果没有“USB串行设备”串口,或者无法输入,输入无返回等情况,则模组内运行的都不是QuecPython固件,需要下载QuecPython固件。 -### 4.4下载固件 +### 下载固件 -| 小提示 | -| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 什么是QuecPython 固件(下简称“固件”)?为什么要下载它呢? 固件是包含驱动、BL、FS、VM等资源的一个二进制程序,没有固件的模块,就像没有辣椒的火鸡面,寡淡无味。下载固件后,模块就可以“跑起来”啦。 通俗来讲,“固件相对于Quectel通信模组”,类似于“操作系统相对于电脑”;”用户脚本相对于QuecPython固件”,类似于”应用程序相对于操作系统”。 只有把操作系统安装到电脑上(下载固件),再把应用程序安装好(下载用户脚本),才能让电脑发挥相应的功能,执行相应的操作和指令。 | +什么是QuecPython 固件(下简称“固件”)?为什么要下载它呢? 固件是包含驱动、BL、FS、VM等资源的一个二进制程序,没有固件的模块,就像没有辣椒的火鸡面,寡淡无味。下载固件后,模块就可以“跑起来”啦。 通俗来讲,“固件相对于Quectel通信模组”,类似于“操作系统相对于电脑”;”用户脚本相对于QuecPython固件”,类似于”应用程序相对于操作系统”。 只有把操作系统安装到电脑上(下载固件),再把应用程序安装好(下载用户脚本),才能让电脑发挥相应的功能,执行相应的操作和指令。 | 请注意 | | ----------------------------------------------------------------------------------------------------- | @@ -482,15 +396,15 @@ QPYcom下载地址: 使用QPYcom工具下载固件的步骤如下: -1. 下载QPYcom工具后,完整解压到任意目录,双击QPYcom.exe运行 +1. 下载QPYcom工具后,完整解压到任意目录,双击QPYcom.exe运行 -2. 将开发板连接到电脑并开机; +2. 将开发板连接到电脑并开机; -3. 点击“**下载**”标签,进入下载页 +3. 点击“**下载**”标签,进入下载页 -4. 在下载页面左侧导航栏创建项目,然后点击“**选择固件**”选择固件包 +4. 在下载页面左侧导航栏创建项目,然后点击“**选择固件**”选择固件包 -5. 左键点击页面右下角倒三角形,在弹出的菜单中选择“**下载固件**”菜单,点击“**下载固件**”按钮,工具自动开始固件下载 +5. 左键点击页面右下角倒三角形,在弹出的菜单中选择“**下载固件**”菜单,点击“**下载固件**”按钮,工具自动开始固件下载 | 小提示 | | --------------------------------------------------------------------------------------------------------------------- | @@ -500,160 +414,135 @@ QPYcom下载地址: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | 下载固件过程中,请勿退出工具,或者拔掉串口,可能致使模块变砖。 如果模块确已变砖,则只有关机,拉高BOOT开机,强制进入下载模式(出现donwload下载口),并使用QPYcom重新下载固件成功,才能救砖。 | -![](media/9da4a0317f1de07c6c249016fa65bafd.png) + -图22:固件烧录\_创建项目、选择固件文件 -> ![](media/115afb04f6ee332c2399f1e76abc509f.png) -图23:固件烧录\_ 选择” 下载固件”菜单 +choose_download -![](media/95fee6c0b9fe96cc7480037c259175d2.png) -图24:固件烧录\_开始 -![](media/d86237842936e1049c098269a49602ab.png) + -图25:固件烧录\_结束 -下载完成后,可以使用上一章的方法,发送AT指令,或者使用“交互”页测试,固件是否正确下载。 -| 小提示 | -| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 哪里可以获取到QuecPython 固件? 请到QuecPython官方网站下载: 下载失败如何处理?模块变砖怎么办? 请加入我们的QQ 群 445121768,工程师在线为您答疑解惑 | + -### 4.5 下载helloworld.py程序到开发板 -使用QPYcom工具,我们可以将自己的 Python 脚本文件下载到模块中。 -hello world.py 文件内容: - -*import utime* +下载完成后,可以使用上一章的方法,发送AT指令,或者使用“交互”页测试,固件是否正确下载。 -*while True:* +| 小提示 | +| ------------------------------------------------------------ | +| 哪里可以获取到QuecPython 固件? 请到QuecPython官方网站下载:
下载失败如何处理?模块变砖怎么办? 请加入我们的QQ 群 445121768,工程师在线为您答疑解惑 | -*print(“hello world”)* +### 下载helloworld.py程序到开发板 -*utime.sleep(1)* +使用QPYcom工具,我们可以将自己的 Python 脚本文件下载到模块中。 -![](media/94c6ef78824b005fedd3362dec5e479a.png) +hello world.py 文件内容: -图26:helloworld 程序代码 +```python +import utime +while True: +print(“hello world”) +utime.sleep(1) +``` 具体的操作步骤如下: -1. 下载QPYcom工具后,完整解压到任意目录,双击QPYcom.exe运行 - -2. 将开发板连接到电脑并开机 +1. 下载QPYcom工具后,完整解压到任意目录,双击QPYcom.exe运行 +2. 将开发板连接到电脑并开机 +3. 选择“USB串行设备”串口,默认波特率,打开串口 +4. 点击“**文件**”标签,进入文件页(左侧为电脑本地的文件;右侧为模块端的文件) +5. 左侧浏览电脑的文件,并选择对应的.py文件,拖动该文件到右侧的“Root”根节点,松开鼠标左键,即可自动下载文件到模块(也可以点击右侧栏的“**+**”按钮,浏览并选择文件,将文件下载到模块内) +6. 文件下载过程中,页面底部状态栏有下载进度,进度到100%表示文件下载成功。 -3. 选择“USB串行设备”串口,默认波特率,打开串口 + -4. 点击“**文件**”标签,进入文件页(左侧为电脑本地的文件;右侧为模块端的文件) +如图所示,此时 hello world.py文件已经下载到模块主目录下,可以通过QPYcom工具的“交互”查看,操作如下: -5. 左侧浏览电脑的文件,并选择对应的.py文件,拖动该文件到右侧的“Root”根节点,松开鼠标左键,即可自动下载文件到模块(也可以点击右侧栏的“**+**”按钮,浏览并选择文件,将文件下载到模块内) + -6. 文件下载过程中,页面底部状态栏有下载进度,进度到100%表示文件下载成功。 +| 小提示 | +| ------------------------------------------------------------ | +| 新版固件使用双文件系统,根目录 / 可读不可写;
备份分区 /bak 不可读不可写;
用户分区 /usr 可读可写。
用户的所有file io 操作,都应在 /usr 进行。 | -![](media/111ab2ca4e13b3455e142be855c1a9f8.png) - -图27:helloworld 程序下载 - -> 如图所示,此时 hello world.py -> 文件已经下载到模块主目录下,可以通过QPYcom工具的“交互”查看,操作如下: - -**![](media/1696795cef049793803ccd2c1e7a255d.png)** - -图28:helloworld 程序是否存在检查 - -| 小提示 | -| -------------------------------------------------------------------------------------------------------------------------------------------- | -| 新版固件使用双文件系统,根目录 / 可读不可写;备份分区 /bak 不可读不可写;用户分区 /usr 可读可写。 用户的所有file io 操作,都应在 /usr 进行。 | - -### 4.6 运行hello world.py程序 +### 运行hello world.py程序 运行模块内的python脚本,有两个方式: -1. 手动运行 +- 手动运行 - 1.下载QPYcom工具后,完整解压到任意目录,双击QPYcom.exe运行 - 2.将开发板连接到电脑并开机 +1. 下载QPYcom工具后,完整解压到任意目录,双击QPYcom.exe运行 - 3.选择“USB串行设备”串口,默认波特率,打开串口 +2. 将开发板连接到电脑并开机 - 4.点击“文件”标签,进入文件页(左侧为电脑本地的文件;右侧为模块端的文件) +3. 选择“USB串行设备”串口,默认波特率,打开串口 - 5.右侧浏览模块内的文件,选中需要运行的py文件,点击“三角”按钮![](media/5e080b6cfa2d93ba24e52ee203e6f427.png),QPYcom将自动跳转到“**交互**”页,并运行该脚本文件 +4. 点击“文件”标签,进入文件页(左侧为电脑本地的文件;右侧为模块端的文件) - 6.也可以导入 example 模块,并使用exec方法运行 python 脚本程序: +5. 右侧浏览模块内的文件,选中需要运行的py文件,点击“三角”按钮![](media/start.png),QPYcom将自动跳转到“**交互**”页,并运行该脚本文件 - *import example* +6. 也可以导入 example 模块,并使用exec方法运行 python 脚本程序: - *example.exec(‘hello world.py’)* +```python +import example +example.exec(‘hello world.py’) +``` -| 小提示 | -| ------------------------------------------------------------------------------------------ | -| 如果是双文件系统,则应执行如下命令: *import example* *example.exec(‘usr/hello world.py’)* | +| 小提示 | +| ------------------------------------------------------------ | +| 如果是双文件系统,则应执行如下命令: import example example.exec(‘usr/hello world.py’) | -> 运行结果如下图所示: +运行结果如下图所示: -![](media/4da4515f7097e7f4337154a0e52226e7.png) + -图29:helloworld 程序代码手动运行结果 -1. 开机后自动运行 - QuecPython支持上电自动执行用户代码。 +- 开机后自动运行 - Quectel 通信模组上电运行后,QuecPython会查找用户分区下名成为 main.py - 的程序文件并自动执行该文件。所以如果用户希望能上电后自动运行自己的代码,需要将自己的程序命名为 - main.py,连同它的依赖等文件,一起下载到模块内。 + +QuecPython支持上电自动执行用户代码。Quectel 通信模组上电运行后,QuecPython会查找用户分区下名成为 main.py的程序文件并自动执行该文件。所以如果用户希望能上电后自动运行自己的代码,需要将自己的程序命名为main.py,连同它的依赖等文件,一起下载到模块内。 | 小提示 | | -------------------------------------------------------------------------------------------------------------------------------------- | | 文件名必须是main.py(大小写完全一致),必须放在用户区内,才能实现开机后自动运行。 如果main.py调用其他py、mpy文件,需要一同下载到用户。 | -> 以helloworld.py 为例说明:将helloworld.py 文件提供方法 2s 周期性打印“hello -> world!”字符串; main.py 文件中调用 hello world.py 中的方法。 - -helloworld.py: - -*import utime* - -*def prtHelloworld():* - -*while True:* +以helloworld.py 为例说明:将helloworld.py 文件提供方法 2s 周期性打印“hello world!”字符串; main.py 文件中调用 hello world.py 中的方法。 -*print("hello world")* +```python +#helloworld.py代码 +import utime +def prtHelloworld(): +while True: +print("hello world") +utime.sleep(1) +``` -*utime.sleep(1)* +```python +# main.py: +# 调用helloworld.py文件 +import helloworld +# 调用helloworld.py 文件的 prtHelloworld() 函数 +helloworld.prtHelloworld() +``` -main.py: +| 小提示 | +| ------------------------------------------------------------ | +| (1)需要import的文件名,不建议包含空格等特殊字符,建议以纯英文命名。
(2)如果是双文件系统,用户的py文件,则需要使用如下方法import:
方法1:from usr import helloworld #helloworld表示py文件名
helloworld.prtHelloworld()
方法2:import usr.helloworld #意为usr目录下的helloworld.py 文件
usr.helloworld. .prtHelloworld() #注意,此方式一定要带上usr的前缀
(3)上边两种方法结合,可以引申为:
from usr.helloworld import *
prtHelloworld() #因为已经import *,所以此处直接调用函数名即可 | -*\# 调用helloworld.py文件* +将上面两个文件都下载到模块中。 -*import helloworld* +![file_position](media/file_position.png) -*\# 调用helloworld.py 文件的 prtHelloworld() 函数* +按一下开发板上的 RESET 按键,系统启动后,重新连接主串口,电脑键盘按下 Enter键,进入交互界面即可看到自动运行结果: -*helloworld.prtHelloworld()* +file_running -| 小提示 | -| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 需要import的文件名,不建议包含空格等特殊字符,建议以纯英文命名。 如果是双文件系统,用户的py文件,则需要使用如下方法import: *from usr import helloworld \#helloworld表示py文件名* *helloworld.prtHelloworld()* *import usr.helloworld \#意为usr目录下的helloworld.py 文件* *usr.helloworld. .prtHelloworld() \#注意,此方式一定要带上usr的前缀* 上边两种方法结合,可以引申为: *from usr.helloworld import \** *prtHelloworld() \#因为已经import \*,所以此处直接调用函数名即可* | -> 将上面两个文件都下载到模块中。 - -> ![](media/5ca93d1adc7c182b9020bd23e0c6b270.png) - -图30:helloworld 程序代码查询 - -> 按一下开发板上的 RESET 按键,系统启动后,重新连接主串口,电脑键盘按下 Enter -> 键,进入交互界面即可看到自动运行结果: - -> ![](media/bd7e9480d134ff8790c4e9cb13e5a721.png) - -图31:helloworld 程序代码自动运行结果 | 小提示 | | ---------------------------------------------------------- | @@ -663,7 +552,7 @@ main.py: | ---------------------------------------------------------------------------------------------------------------------------- | | 自动运行的脚本,或者循环输出的脚本,将无法使用Ctrl+C停止运行; 锁死交互的模块,也无法终止脚本运行; 唯一的方法是:重刷固件。 | -### 4.7 常见问题解决 +### 常见问题解决 **Q:模块的固件在哪?** @@ -677,12 +566,17 @@ P.S. 如果您遇到任何问题,请联系我们的在线支持:QQ群 445121 ## 附录1 V1.1开发板丝印图 -![EC600S_QuecPython_EVB_V1.1_TOP_00](media/29cbc2c9656b29355a1c6f59015d006e.png) +V1.1_silk_print01 + +V1.1_silk_print02 + + + -![EC600S_QuecPython_EVB_V1.1_BOT_00](media/f13cc3afb6932cfd1c5f78d953723873.png) ## 附录2 V1.2开发板丝印图 -![](media/9fc2e34407f04f3747b3c1b507499526.png) +V1.2_silk_print01 + +V1.2_silk_print02 -![](media/dae403adf4679040f94623b7eb2e0c99.png) diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/9da4a0317f1de07c6c249016fa65bafd.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/Create_project.png similarity index 100% rename from docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/9da4a0317f1de07c6c249016fa65bafd.png rename to docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/Create_project.png diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/6056bd2376931da284e04f0940c7892b.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/DM_Quecpython.png similarity index 100% rename from docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/6056bd2376931da284e04f0940c7892b.png rename to docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/DM_Quecpython.png diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/2d85c835125e0bab4d1ad4e01a61024b.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/DM_not_Quecpython.png similarity index 100% rename from docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/2d85c835125e0bab4d1ad4e01a61024b.png rename to docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/DM_not_Quecpython.png diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/de6fa3f9fe8c997499c2ffd5db02aad3.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/Divers.png similarity index 100% rename from docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/de6fa3f9fe8c997499c2ffd5db02aad3.png rename to docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/Divers.png diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600XV1.1_otherside.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600XV1.1_otherside.png new file mode 100644 index 0000000000000000000000000000000000000000..b39c9112296fa245473b4c0fa7cadb8655075fc2 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600XV1.1_otherside.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600XV1.1_positive.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600XV1.1_positive.png new file mode 100644 index 0000000000000000000000000000000000000000..cc6f696da8d6e99f2ee7c1e201bb6c07c6bb33d1 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600XV1.1_positive.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600XV1.2_otherside.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600XV1.2_otherside.png new file mode 100644 index 0000000000000000000000000000000000000000..ab77bcd2d0e5ffd8e5c3d2c571c45516724e292a Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600XV1.2_otherside.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600XV1.2_positive.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600XV1.2_positive.png new file mode 100644 index 0000000000000000000000000000000000000000..935d7bad97fa21f016282c52c5330922d6111c2d Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600XV1.2_positive.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/5e037836c1559c13881ebe2639cf8771.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_AHT10.png similarity index 100% rename from docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/5e037836c1559c13881ebe2639cf8771.png rename to docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_AHT10.png diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/58de0f5e0c57461b126e5c8665a99e28.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_GL5528.png similarity index 100% rename from docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/58de0f5e0c57461b126e5c8665a99e28.png rename to docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_GL5528.png diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/7f09d42b45d5f1169505590a63a9e115.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_KEY.png similarity index 100% rename from docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/7f09d42b45d5f1169505590a63a9e115.png rename to docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_KEY.png diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/6507a12ac61656f6736377ac4241bc4c.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_L76K.png similarity index 100% rename from docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/6507a12ac61656f6736377ac4241bc4c.png rename to docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_L76K.png diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/d0bf3711e729c131dd83c8ad98bec972.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_LCD.png similarity index 100% rename from docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/d0bf3711e729c131dd83c8ad98bec972.png rename to docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_LCD.png diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/ff7500e1461f058f2ef101d2134c0886.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_LIS2DH12TR.png similarity index 100% rename from docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/ff7500e1461f058f2ef101d2134c0886.png rename to docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_LIS2DH12TR.png diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/e6b049c2f882bb39a0278122df21cb27.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_PA.png similarity index 100% rename from docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/e6b049c2f882bb39a0278122df21cb27.png rename to docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_PA.png diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_name_rules.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_name_rules.png new file mode 100644 index 0000000000000000000000000000000000000000..76930a4ff60636877f134d7ae2a2d16250312a23 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/EC600X_name_rules.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/d1eeca970e44d660248f9f6f25a1e812.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/QPYcom_position.png similarity index 100% rename from docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/d1eeca970e44d660248f9f6f25a1e812.png rename to docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/QPYcom_position.png diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/4da4515f7097e7f4337154a0e52226e7.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/Running_results.png similarity index 100% rename from docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/4da4515f7097e7f4337154a0e52226e7.png rename to docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/Running_results.png diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/29cbc2c9656b29355a1c6f59015d006e.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.1_silk_print01.png similarity index 100% rename from docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/29cbc2c9656b29355a1c6f59015d006e.png rename to docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.1_silk_print01.png diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/f13cc3afb6932cfd1c5f78d953723873.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.1_silk_print02.png similarity index 100% rename from docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/f13cc3afb6932cfd1c5f78d953723873.png rename to docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.1_silk_print02.png diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.2_silk_print01.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.2_silk_print01.png new file mode 100644 index 0000000000000000000000000000000000000000..34b518961f2ada38a6e8891975d524f9016b3ae4 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.2_silk_print01.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.2_silk_print02.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.2_silk_print02.png new file mode 100644 index 0000000000000000000000000000000000000000..0feae7fd3437641324286c39ac8a4d7106167263 Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/V1.2_silk_print02.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/115afb04f6ee332c2399f1e76abc509f.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/choose_download.png similarity index 100% rename from docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/115afb04f6ee332c2399f1e76abc509f.png rename to docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/choose_download.png diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/d86237842936e1049c098269a49602ab.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/download_finish.png similarity index 100% rename from docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/d86237842936e1049c098269a49602ab.png rename to docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/download_finish.png diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/95fee6c0b9fe96cc7480037c259175d2.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/downloading.png similarity index 100% rename from docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/95fee6c0b9fe96cc7480037c259175d2.png rename to docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/downloading.png diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/1696795cef049793803ccd2c1e7a255d.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/file_check.png similarity index 100% rename from docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/1696795cef049793803ccd2c1e7a255d.png rename to docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/file_check.png diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/5ca93d1adc7c182b9020bd23e0c6b270.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/file_position.png similarity index 100% rename from docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/5ca93d1adc7c182b9020bd23e0c6b270.png rename to docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/file_position.png diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/bd7e9480d134ff8790c4e9cb13e5a721.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/file_running.png similarity index 100% rename from docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/bd7e9480d134ff8790c4e9cb13e5a721.png rename to docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/file_running.png diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/111ab2ca4e13b3455e142be855c1a9f8.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/file_upload.png similarity index 100% rename from docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/111ab2ca4e13b3455e142be855c1a9f8.png rename to docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/file_upload.png diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/346d5221e194f6f5df9ac4b4ed2cdc4d.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/finish.png similarity index 100% rename from docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/346d5221e194f6f5df9ac4b4ed2cdc4d.png rename to docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/finish.png diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/ce452b73df89cad975b5ceedb8fd2b13.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/firmware_check01.png similarity index 100% rename from docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/ce452b73df89cad975b5ceedb8fd2b13.png rename to docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/firmware_check01.png diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/2355e094f7fd88fb21ff48df186e5fcc.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/firmware_check02.png similarity index 100% rename from docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/2355e094f7fd88fb21ff48df186e5fcc.png rename to docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/firmware_check02.png diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/image-20210407143154984.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/image-20210407143154984.png new file mode 100644 index 0000000000000000000000000000000000000000..ae3d1ab20339489871623fa38631d5efd5af0a2b Binary files /dev/null and b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/image-20210407143154984.png differ diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/3b29237824a8cbc88b23fb7560646b7c.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/install.png similarity index 100% rename from docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/3b29237824a8cbc88b23fb7560646b7c.png rename to docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/install.png diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/1b8e9ded164723439e9d8e4625f95443.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/setup.png similarity index 100% rename from docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/1b8e9ded164723439e9d8e4625f95443.png rename to docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/setup.png diff --git a/docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/5e080b6cfa2d93ba24e52ee203e6f427.png b/docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/start.png similarity index 100% rename from docs/Quecpython_intro/zh/Qp_Hw_EC600S/media/5e080b6cfa2d93ba24e52ee203e6f427.png rename to docs/Quecpython_intro/zh/Qp_Hw_EC600X/media/start.png diff --git a/docs/Quecpython_intro/zh/sidebar.yaml b/docs/Quecpython_intro/zh/sidebar.yaml index 459071adef09fc410dd61854fcef9401a382e9d6..27da0f1bd980dc015a964d69fc57b363c4fae4b5 100644 --- a/docs/Quecpython_intro/zh/sidebar.yaml +++ b/docs/Quecpython_intro/zh/sidebar.yaml @@ -8,10 +8,8 @@ items: items: - label: 硬件支持 file: Qp_Product_intro/Hardware_Support.md - - label: EC600S开发板 - file: Qp_Hw_EC600S/Hardware_Support_EC600S.md - - label: EC600U开发板 - file: Qp_Hw_EC600U/Hardware_Support_EC600U.md + - label: EC600X开发板 + file: Qp_Hw_EC600X/Hardware_Support_EC600X.md - label: 资料获取 file: Qp_Product_intro/Data_Acquisition.md - label: 适用场景 diff --git a/docs/Quick_start/zh/README.md b/docs/Quick_start/zh/README.md index 0c020cd5c661026492e4d55ea4de67f4b8d9c8d6..75f164304d5bc405e8d0bbb61f4793d1fea2a516 100755 --- a/docs/Quick_start/zh/README.md +++ b/docs/Quick_start/zh/README.md @@ -1,6 +1,4 @@ -# QuecPython 开发准备 - -## QuecPython官网介绍及开发资源获取 +## QuecPython 开发准备 ### 官网介绍 @@ -252,7 +250,7 @@ Hello World! QuecPython 通过上一节的学习,已经掌握了电脑和模组的通信工作,那么我们平时是如何开发产品的呢,如何写代码、管理文件呢,这个时候就要安装工具了。 -- 安装代码编辑Pycharm; +- 安装代码编辑Vscode; - 通过QPYcom工具下载.py脚本文件到模块中运行、调试。 @@ -262,9 +260,7 @@ Hello World! QuecPython -### 安装编辑工具 - -接下来介绍如何安装PC端的Python开发环境和pycharm工具 +### 安装编辑工具 VsCode ### 安装Python3.9 @@ -278,48 +274,10 @@ Python安装包下载地址:https://www.python.org/downloads/ 看到返回 Python 3.9.1,说明已经正确安装Python的开发环境 -### 安装Pycharm - -pycharm安装包在百度网盘下载 - -链接:https://pan.baidu.com/s/15p1c16UvVOYzhXUzyp7mYg -提取码:1111 - -![](media/C52.png) - -安装完成后双击打开桌面图片,在菜单栏进入“文件”---“默认设置”---设置开发环境 - -在【Python interpreter】栏目选择python.exe解释器 - -![](media/C53.png) - - - -### 设置字体大小 - -在菜单栏进入“文件”---“设置”---“编辑器”---“颜色和字体”---【Font】和【Console Font】中设置 - -![](media/C54.png) +### Vscode - - -### 使用方法 - -在菜单栏进入“文件”---“新项目”,然后选中一个文件夹,可以自行在文件夹里新建文件。 - -![](media/C55.png) - -文件或文件内容发生变化之后,pycharm左侧栏目的文件列表随即更新。 - -![](media/C56.png) - -之后就可以在这个文件夹中管理自己的.py文件了。 - -![](media/C57.png) - -点击项目中的“三角形”,程序便运行起来,在下方有个输出窗口,可以看到print()函数的打印结果。 - -![](media/C58.png) +推荐参考 +[VSCode搭建Python开发环境(含Python环境搭建)](https://zhuanlan.zhihu.com/p/165379391) ### 在模组中运行代码文件 @@ -349,8 +307,6 @@ pycharm安装包在百度网盘下载 ![](media/C63.png) - - ### 巧用demo快速开发 demo下载地址:https://python.quectel.com/download diff --git a/docs/Quick_start/zh/media/C50.png b/docs/Quick_start/zh/media/C50.png deleted file mode 100755 index 3dc8818faeee75b4f6b75a77f9b62d93a2b98e12..0000000000000000000000000000000000000000 Binary files a/docs/Quick_start/zh/media/C50.png and /dev/null differ diff --git a/docs/Quick_start/zh/media/C51.png b/docs/Quick_start/zh/media/C51.png deleted file mode 100755 index 40def7aa5b32b5f024114b89e758c5b5457098a0..0000000000000000000000000000000000000000 Binary files a/docs/Quick_start/zh/media/C51.png and /dev/null differ diff --git a/docs/Quick_start/zh/media/C52.png b/docs/Quick_start/zh/media/C52.png deleted file mode 100755 index 5848cea9c92a0e964d7febccf2290795cb3d14c3..0000000000000000000000000000000000000000 Binary files a/docs/Quick_start/zh/media/C52.png and /dev/null differ diff --git a/docs/Quick_start/zh/media/C53.png b/docs/Quick_start/zh/media/C53.png deleted file mode 100755 index 3bb14ab0713e9ccbba37ec7fd838d74a41218e5e..0000000000000000000000000000000000000000 Binary files a/docs/Quick_start/zh/media/C53.png and /dev/null differ diff --git a/docs/Quick_start/zh/media/C54.png b/docs/Quick_start/zh/media/C54.png deleted file mode 100755 index a593ef82bdbbdddd35638d0906c6b32783163819..0000000000000000000000000000000000000000 Binary files a/docs/Quick_start/zh/media/C54.png and /dev/null differ diff --git a/docs/Quick_start/zh/media/C55.png b/docs/Quick_start/zh/media/C55.png deleted file mode 100755 index 2c8411f7a9eb444b339ebd202b7bd0863a0db778..0000000000000000000000000000000000000000 Binary files a/docs/Quick_start/zh/media/C55.png and /dev/null differ diff --git a/docs/Quick_start/zh/media/C56.png b/docs/Quick_start/zh/media/C56.png deleted file mode 100755 index 2c144bc04e03d8f8fdf4e23ebf8c6b69427f72e7..0000000000000000000000000000000000000000 Binary files a/docs/Quick_start/zh/media/C56.png and /dev/null differ diff --git a/docs/Quick_start/zh/media/C57.png b/docs/Quick_start/zh/media/C57.png deleted file mode 100755 index 3986711edd9d5e510e1c0b84a50458ccea262b93..0000000000000000000000000000000000000000 Binary files a/docs/Quick_start/zh/media/C57.png and /dev/null differ diff --git a/docs/Quick_start/zh/media/C58.png b/docs/Quick_start/zh/media/C58.png deleted file mode 100755 index 25705606aa2e2edd60df2cb5b0fdf0371c6ddaa3..0000000000000000000000000000000000000000 Binary files a/docs/Quick_start/zh/media/C58.png and /dev/null differ diff --git a/docs/Quick_start/zh/media/c59.png b/docs/Quick_start/zh/media/c59.png deleted file mode 100755 index cd7546518a5eed93a62c504b936467997283b2c9..0000000000000000000000000000000000000000 Binary files a/docs/Quick_start/zh/media/c59.png and /dev/null differ diff --git a/docs/Quick_start/zh/sidebar.yaml b/docs/Quick_start/zh/sidebar.yaml index 48b0cbbb882a0f0416ddf11d6fe8a4de612a386c..678b00e34e14a104c72928c8c9d1985ff1af9107 100755 --- a/docs/Quick_start/zh/sidebar.yaml +++ b/docs/Quick_start/zh/sidebar.yaml @@ -2,5 +2,5 @@ items: - label: QuecPython 开发环境搭建 file: README.md - - label: QPYcom GUI工具使用 + - label: QuecPython快速入门 file: QuecPythonHelloWord/README.md diff --git a/docs/little_demo/zh/QuecPythonTest/QuecPythonLED.md b/docs/little_demo/zh/QuecPythonTest/QuecPythonLED.md index b9b45f88ae95a4826dcc624260e59efa1427b559..5c1d648614add7453ca246b551df490cd8917d5a 100644 --- a/docs/little_demo/zh/QuecPythonTest/QuecPythonLED.md +++ b/docs/little_demo/zh/QuecPythonTest/QuecPythonLED.md @@ -1,12 +1,14 @@ -# 平台说明 +## 文档历史 -​ 本实验例程基于 EC600S_QuecPython_EVB_V1.1 开发板完成。 +**修订记录** +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | ---------- | -------- | ------------ | +| 1.0 | 2021-04-07 | Chic | 初始版本 | -# QuecPython流水灯 -1、 概述 +## 概述 流水灯:顾名思义,就是像水一样会流动的LED灯。 @@ -30,7 +32,7 @@ LED是发光二极管,导通就发光,截止就熄灭。 -2、 硬件接线 +## 硬件接线 ​ 官方开发板上的EC600S_EVB引出3个GPIO,可以直连流水灯上的3个LED,然后流水灯上的VCC接1.8V电源 @@ -38,7 +40,7 @@ LED是发光二极管,导通就发光,截止就熄灭。 -3、 代码分析 +## 代码分析 ```python IOlist = [] @@ -61,15 +63,13 @@ for x in [1, 2, 3]: print(x, end=" ,") ``` -输入结果:1,2,3 +输出结果:1,2,3 像这样把IOlist列表迭代,我们可以很方便的控制每一个LED灯的输出状态。 - - -4、 实战操作 +## 实战操作 @@ -101,7 +101,9 @@ while True: 运行代码后,成功看到会流动的LED灯! -5、 更多内容 + + +## 更多内容 想要了解其他功能吗?请浏览官方网站: diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/st7789v\350\265\204\346\226\231/ST7789VW_datasheet.pdf" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/st7789v\350\265\204\346\226\231/ST7789VW_datasheet.pdf" deleted file mode 100644 index ea8ef0f90e527d8e6df905336988371a3aa4f929..0000000000000000000000000000000000000000 Binary files "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/st7789v\350\265\204\346\226\231/ST7789VW_datasheet.pdf" and /dev/null differ diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\345\233\276\347\211\207\345\255\227\347\254\246\345\217\226\346\250\241\345\267\245\345\205\267/Image2Lcd.zip" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\345\233\276\347\211\207\345\255\227\347\254\246\345\217\226\346\250\241\345\267\245\345\205\267/Image2Lcd.zip" deleted file mode 100644 index 852a7b0a6ebc0fefade2d44ffe98c4ef325fe964..0000000000000000000000000000000000000000 Binary files "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\345\233\276\347\211\207\345\255\227\347\254\246\345\217\226\346\250\241\345\267\245\345\205\267/Image2Lcd.zip" and /dev/null differ diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\345\233\276\347\211\207\345\255\227\347\254\246\345\217\226\346\250\241\345\267\245\345\205\267/PCtoLCD2002.zip" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\345\233\276\347\211\207\345\255\227\347\254\246\345\217\226\346\250\241\345\267\245\345\205\267/PCtoLCD2002.zip" deleted file mode 100644 index ecaa2b87d263dfb7d6fb05f1e668b190fa1bde79..0000000000000000000000000000000000000000 Binary files "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\345\233\276\347\211\207\345\255\227\347\254\246\345\217\226\346\250\241\345\267\245\345\205\267/PCtoLCD2002.zip" and /dev/null differ diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/Quecpython.py" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/Quecpython.py" deleted file mode 100644 index 5cac2c4d6811ee777edc9d3bfecf56b11ab879d0..0000000000000000000000000000000000000000 --- "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/Quecpython.py" +++ /dev/null @@ -1,391 +0,0 @@ -import sys -import time -import os - - -try: - stdout = sys.stdout.buffer -except AttributeError: - # Python2 doesn't have buffer attr - stdout = sys.stdout - - -def stdout_write_bytes(b): - b = b.replace(b"\x04", b"") - stdout.write(b) - stdout.flush() - -class QuecpythonError(Exception): - pass - - -class Quecpython: - def __init__(self, device, baudrate=115200, wait=0): - import serial - delayed = False - for attempt in range(wait + 1): - try: - self.serial = serial.Serial(device, baudrate=baudrate, interCharTimeout=1) - break - except (OSError, IOError): # Py2 and Py3 have different errors - if wait == 0: - continue - if attempt == 0: - sys.stdout.write("Waiting {} seconds for Quecpython ".format(wait)) - delayed = True - time.sleep(1) - sys.stdout.write(".") - sys.stdout.flush() - else: - if delayed: - print("") - raise QuecpythonError("failed to access " + device) - if delayed: - print("") - - def close(self): - self.serial.close() - - def read_until(self, min_num_bytes, ending, timeout=10, data_consumer=None): - # if data_consumer is used then data is not accumulated and the ending must be 1 byte long - assert data_consumer is None or len(ending) == 1 - - data = self.serial.read(min_num_bytes) - if data_consumer: - data_consumer(data) - timeout_count = 0 - while True: - if data.endswith(ending): - break - elif self.serial.inWaiting() > 0: - new_data = self.serial.read(1) - if data_consumer: - data_consumer(new_data) - data = new_data - else: - data = data + new_data - timeout_count = 0 - else: - timeout_count += 1 - if timeout is not None and timeout_count >= 100 * timeout: - break - time.sleep(0.01) - return data - - def enter_raw_repl(self): - self.serial.write(b"\r\x03\x03") # ctrl-C twice: interrupt any running program - - # flush input (without relying on serial.flushInput()) - n = self.serial.inWaiting() - while n > 0: - self.serial.read(n) - n = self.serial.inWaiting() - - self.serial.write(b"\r\x01") # ctrl-A: enter raw REPL - data = self.read_until(1, b"raw REPL; CTRL-B to exit\r\n>") - if not data.endswith(b"raw REPL; CTRL-B to exit\r\n>"): - print(data) - raise QuecpythonError("could not enter raw repl") - - self.serial.write(b"\x04") # ctrl-D: soft reset - data = self.read_until(1, b"soft reboot\r\n") - if not data.endswith(b"soft reboot\r\n"): - print(data) - raise QuecpythonError("could not enter raw repl") - # By splitting this into 2 reads, it allows boot.py to print stuff, - # which will show up after the soft reboot and before the raw REPL. - data = self.read_until(1, b"raw REPL; CTRL-B to exit\r\n") - if not data.endswith(b"raw REPL; CTRL-B to exit\r\n"): - print(data) - raise QuecpythonError("could not enter raw repl") - def exit_raw_repl(self): - self.serial.write(b"\r\x02") # ctrl-B: enter friendly REPL - - def follow(self, timeout, data_consumer=None): - # wait for normal output - data = self.read_until(1, b"\x04", timeout=timeout, data_consumer=data_consumer) - if not data.endswith(b"\x04"): - raise QuecpythonError("timeout waiting for first EOF reception") - data = data[:-1] - - # wait for error output - data_err = self.read_until(1, b"\x04", timeout=timeout) - if not data_err.endswith(b"\x04"): - raise QuecpythonError("timeout waiting for second EOF reception") - data_err = data_err[:-1] - - # return normal and error output - return data, data_err - - def exec_raw_no_follow(self, command): - if isinstance(command, bytes): - command_bytes = command - else: - command_bytes = bytes(command, encoding="utf8") - - # check we have a prompt - data = self.read_until(1, b">") - if not data.endswith(b">"): - raise QuecpythonError("could not enter raw repl") - - # write command - for i in range(0, len(command_bytes), 256): - self.serial.write(command_bytes[i : min(i + 256, len(command_bytes))]) - time.sleep(0.1) - self.serial.write(b"\x04") - - # check if we could exec command - data = self.serial.read(2) - if data != b"OK": - raise QuecpythonError("could not exec command (response: %r)" % data) - - def exec_raw(self, command, timeout=10, data_consumer=None): - self.exec_raw_no_follow(command) - return self.follow(timeout, data_consumer) - - def eval(self, expression): - ret = self.exec_("print({})".format(expression)) - ret = ret.strip() - return ret - - def exec_(self, command, data_consumer=None): - ret, ret_err = self.exec_raw(command, data_consumer=data_consumer) - if ret_err: - raise QuecpythonError("exception", ret, ret_err) - return ret - - def execfile(self, filename): - with open(filename, "rb") as f: - pyfile = f.read() - print(pyfile) - return self.exec_(pyfile) - def fs_ls(self, src): - cmd = ( - "import uos\nfor f in uos.ilistdir(%s):\n" - " print('{:12} {}{}'.format(f[3]if len(f)>3 else 0,f[0],'/'if f[1]&0x4000 else ''))" - % (("'%s'" % src) if src else "") - ) - self.exec_(cmd, data_consumer=stdout_write_bytes) - - def fs_cat(self, src, chunk_size=256): - cmd = ( - "with open('%s') as f:\n while 1:\n" - " b=f.read(%u)\n if not b:break\n print(b,end='')" % (src, chunk_size) - ) - self.exec_(cmd, data_consumer=stdout_write_bytes) - - def fs_get(self, src, dest, chunk_size=256): - self.exec_("f=open('%s','rb')\nr=f.read" % src) - with open(dest, "wb") as f: - while True: - data = bytearray() - self.exec_("print(r(%u))" % chunk_size, data_consumer=lambda d: data.extend(d)) - assert data.endswith(b"\r\n\x04") - data = eval(str(data[:-3], "ascii")) - if not data: - break - f.write(data) - self.exec_("f.close()") - - def fs_put(self, src, dest, chunk_size=256): - self.exec_("f=open('%s','wb')\nw=f.write" % dest) - with open(src, "rb") as f: - while True: - data = f.read(chunk_size) - if not data: - break - if sys.version_info < (3,): - self.exec_("w(b" + repr(data) + ")") - else: - self.exec_("w(" + repr(data) + ")") - self.exec_("f.close()") - - def fs_mkdir(self, dir): - self.exec_("import uos\nuos.mkdir('%s')" % dir) - - def fs_rmdir(self, dir): - self.exec_("import uos\nuos.rmdir('%s')" % dir) - - def fs_rm(self, src): - self.exec_("import uos\nuos.remove('%s')" % src) - -setattr(Quecpython, "exec", Quecpython.exec_) - -def execfile(filename, device="COM24", baudrate=115200): - qpy = Quecpython(device, baudrate) - qpy.enter_raw_repl() - output = qpy.execfile(filename) - stdout_write_bytes(output) - qpy.exit_raw_repl() - qpy.close() - -def filesystem_command(qpy, args): - def fname_remote(src): - if src.startswith(":"): - src = src[1:] - return src - - def fname_cp_dest(src, dest): - src = src.rsplit("/", 1)[-1] - if dest is None or dest == "": - dest = src - elif dest == ".": - dest = "./" + src - elif dest.endswith("/"): - dest += src - return dest - - cmd = args[0] - args = args[1:] - try: - if cmd == "cp": - srcs = args[:-1] - dest = args[-1] - if srcs[0].startswith("./") or dest.startswith(":"): - op = qpy.fs_put - fmt = "cp %s :%s" - dest = fname_remote(dest) - else: - op = qpy.fs_get - fmt = "cp :%s %s" - for src in srcs: - src = fname_remote(src) - dest2 = fname_cp_dest(src, dest) - print(fmt % (src, dest2)) - op(src, dest2) - else: - op = { - "ls": qpy.fs_ls, - "cat": qpy.fs_cat, - "mkdir": qpy.fs_mkdir, - "rmdir": qpy.fs_rmdir, - "rm": qpy.fs_rm, - }[cmd] - if cmd == "ls" and not args: - args = [""] - for src in args: - src = fname_remote(src) - print("%s :%s" % (cmd, src)) - op(src) - except QuecpythonError as er: - print(str(er.args[2], "ascii")) - qpy.exit_raw_repl() - qpy.close() - sys.exit(1) - -def main(): - import argparse - cmd_parser = argparse.ArgumentParser(description="Run scripts on the EC100Y.") - cmd_parser.add_argument( - "-d", - "--device", - default=os.environ.get("EC100Y_DEVICE", "COM24"), - help="the serial device of the EC100Y", - ) - cmd_parser.add_argument( - "-b", - "--baudrate", - default=os.environ.get("EC100Y_BAUDRATE", "115200"), - help="the baud rate of the serial device", - ) - cmd_parser.add_argument("-c", "--command", help="program passed in as string") - cmd_parser.add_argument( - "-w", - "--wait", - default=0, - type=int, - help="seconds to wait for USB connected board to become available", - ) - group = cmd_parser.add_mutually_exclusive_group() - group.add_argument( - "--follow", - action="store_true", - help="follow the output after running the scripts [default if no scripts given]", - ) - group.add_argument( - "--no-follow", - action="store_true", - help="Do not follow the output after running the scripts.", - ) - cmd_parser.add_argument( - "-f", "--filesystem", action="store_true", help="perform a filesystem action" - ) - cmd_parser.add_argument("files", nargs="*", help="input files") - args = cmd_parser.parse_args() - # open the connection to the qpyoard - try: - qpy = Quecpython(args.device, args.baudrate, args.wait) - except QuecpythonError as er: - print(er) - sys.exit(1) - - # run any command or file(s) - if args.command is not None or args.filesystem or len(args.files): - # we must enter raw-REPL mode to execute commands - # this will do a soft-reset of the board - try: - qpy.enter_raw_repl() - except QuecpythonError as er: - print(er) - qpy.close() - sys.exit(1) - - def execbuffer(buf): - try: - if args.no_follow: - qpy.exec_raw_no_follow(buf) - ret_err = None - else: - ret, ret_err = qpy.exec_raw( - buf, timeout=None, data_consumer=stdout_write_bytes - ) - except QuecpythonError as er: - print(er) - qpy.close() - sys.exit(1) - except KeyboardInterrupt: - sys.exit(1) - if ret_err: - qpy.exit_raw_repl() - qpy.close() - stdout_write_bytes(ret_err) - sys.exit(1) - - # do filesystem commands, if given - if args.filesystem: - filesystem_command(qpy, args.files) - del args.files[:] - - # run the command, if given - if args.command is not None: - execbuffer(args.command.encode("utf-8")) - - # run any files - for filename in args.files: - with open(filename, "rb") as f: - pyfile = f.read() - execbuffer(pyfile) - - # exiting raw-REPL just drops to friendly-REPL mode - qpy.exit_raw_repl() - - # if asked explicitly, or no files given, then follow the output - if args.follow or (args.command is None and not args.filesystem and len(args.files) == 0): - try: - ret, ret_err = qpy.follow(timeout=None, data_consumer=stdout_write_bytes) - except QuecpythonError as er: - print(er) - sys.exit(1) - except KeyboardInterrupt: - sys.exit(1) - if ret_err: - qpy.close() - stdout_write_bytes(ret_err) - sys.exit(1) - - # close the connection to the EC100Y - qpy.close() - - -if __name__ == "__main__": - main() \ No newline at end of file diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/example_display_image.py" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/example_display_image.py" deleted file mode 100644 index 77020b5c7ea7ff9d1de8e6341dc136677f8c7480..0000000000000000000000000000000000000000 --- "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/example_display_image.py" +++ /dev/null @@ -1,49 +0,0 @@ -# -*- coding: UTF-8 -*- - - -import utime - -''' -如果用户使用的固件版本中没有checkNet库,请将checkNet.mpy文件上传到模块的usr目录, -并将 import checkNet 改为 from usr import checkNet -''' -import checkNet -from usr import st7789v -from usr import image - - -''' -下面两个全局变量是必须有的,用户可以根据自己的实际项目修改下面两个全局变量的值, -在执行用户代码前,会先打印这两个变量的值。 -''' -PROJECT_NAME = "QuecPython_ST7789V_LCD_Example" -PROJECT_VERSION = "1.0.0" - -checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION) -lcd_st7789v = st7789v.ST7789V(240, 240) - - -if __name__ == '__main__': - ''' - 手动运行本例程时,可以去掉该延时,如果将例程文件名改为main.py,希望开机自动运行时,需要加上该延时, - 否则无法从CDC口看到下面的 poweron_print_once() 中打印的信息 - ''' - # utime.sleep(5) - checknet.poweron_print_once() - - ''' - 如果用户程序包含网络相关代码,必须执行 wait_network_connected() 等待网络就绪(拨号成功); - 如果是网络无关代码,可以屏蔽 wait_network_connected() - ''' - # checknet.wait_network_connected() - - # 用户代码 - '''######################【User code star】###################################################''' - - ''' - 要显示的图片像素为 99*100,下面设置显示图片的起始坐标位置为(70,70) - 要注意:显示图片时,最后两个参数传入的是图片大小,即宽高,不是终点坐标 - ''' - lcd_st7789v.lcd_show_image(image.image_buf, 70, 70, 99, 100) - - '''######################【User code end 】###################################################''' diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/fonts.py" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/fonts.py" deleted file mode 100644 index 70c0fdcd45b884d64b680e39a194939da36162c2..0000000000000000000000000000000000000000 --- "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/fonts.py" +++ /dev/null @@ -1,462 +0,0 @@ - - -''' -16 x 16 汉字字库 -宋体、阴码,逐行式,顺向(高位在前) -''' -hanzi_16x16_dict = { - '移' : (0x08, 0x20, 0x1C, 0x20, 0xF0, 0x7C, 0x10, 0x84, 0x11, 0x48, 0xFC, 0x30, 0x10, 0x20, 0x30, 0x48, - 0x39, 0x90, 0x54, 0x3E, 0x54, 0x42, 0x91, 0xA4, 0x10, 0x18, 0x10, 0x10, 0x10, 0x60, 0x11, 0x80), - '远' : (0x00, 0x00, 0x23, 0xF8, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x07, 0xFC, 0xF1, 0x20, 0x11, 0x20, - 0x11, 0x20, 0x11, 0x20, 0x11, 0x24, 0x12, 0x24, 0x12, 0x24, 0x14, 0x1C, 0x28, 0x00, 0x47, 0xFE), - '通' : (0x00, 0x00, 0x47, 0xF8, 0x20, 0x10, 0x21, 0xA0, 0x00, 0x40, 0x07, 0xFC, 0xE4, 0x44, 0x24, 0x44, - 0x27, 0xFC, 0x24, 0x44, 0x24, 0x44, 0x27, 0xFC, 0x24, 0x44, 0x24, 0x54, 0x54, 0x08, 0x8F, 0xFE), - '信' : (0x08, 0x40, 0x08, 0x20, 0x0B, 0xFE, 0x10, 0x00, 0x10, 0x00, 0x31, 0xFC, 0x30, 0x00, 0x50, 0x00, - 0x91, 0xFC, 0x10, 0x00, 0x10, 0x00, 0x11, 0xFC, 0x11, 0x04, 0x11, 0x04, 0x11, 0xFC, 0x11, 0x04), -} - -''' -16 x 24 汉字字库 -宋体、阴码,逐行式,顺向(高位在前) -''' -hanzi_16x24_dict = { - '移' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x0E, 0x60, 0x38, 0x44, 0x08, 0x7C, 0x08, 0xCC, 0x09, 0x68, - 0x0A, 0x30, 0x7C, 0x10, 0x08, 0x20, 0x18, 0x50, 0x1C, 0xB0, 0x1B, 0x22, 0x2A, 0x5E, 0x28, 0x44, - 0x28, 0xC4, 0x49, 0x28, 0x08, 0x28, 0x08, 0x10, 0x08, 0x20, 0x08, 0xC0, 0x0F, 0x00, 0x00, 0x00,), - '远' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x13, 0xF8, 0x10, 0x00, 0x10, 0x00, 0x00, 0x04, - 0x03, 0x5C, 0x00, 0xA0, 0x70, 0xA0, 0x11, 0x20, 0x11, 0x20, 0x11, 0x20, 0x11, 0x20, 0x11, 0x24, - 0x12, 0x24, 0x12, 0x36, 0x14, 0x1C, 0x68, 0x00, 0x46, 0x00, 0x43, 0xFC, 0x00, 0x00, 0x00, 0x00,), - '通' : (0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x20, 0x08, 0x10, 0x90, 0x10, 0x60, 0x00, 0x44, 0x03, 0xFC, - 0x02, 0x44, 0x12, 0x44, 0x73, 0xFC, 0x12, 0x44, 0x12, 0x44, 0x12, 0x44, 0x13, 0xFC, 0x12, 0x44, - 0x12, 0x44, 0x12, 0x44, 0x12, 0x4C, 0x28, 0x00, 0x46, 0x00, 0x43, 0xFE, 0x00, 0x00, 0x00, 0x00,), - '信' : (0x00, 0x00, 0x08, 0x00, 0x0C, 0x40, 0x08, 0x40, 0x08, 0x20, 0x17, 0xFE, 0x10, 0x00, 0x10, 0x00, - 0x10, 0x08, 0x31, 0xF0, 0x30, 0x00, 0x50, 0x00, 0x53, 0xFC, 0x10, 0x00, 0x10, 0x00, 0x10, 0xFC, - 0x11, 0x04, 0x11, 0x04, 0x11, 0x04, 0x11, 0x04, 0x11, 0xF8, 0x11, 0x04, 0x10, 0x00, 0x00, 0x00,), -} - -''' -24 x 24 汉字字库 -宋体、阴码,逐行式,顺向(高位在前) -''' -hanzi_24x24_dict = { - '移' : (0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0xC3,0x00,0x1F,0x02,0x00,0x02, - 0x07,0xF8,0x02,0x04,0x18,0x02,0x0A,0x30,0x02,0x53,0x60,0x7F,0xE1,0xC0,0x06,0x01, - 0x80,0x06,0x03,0xC0,0x07,0x0D,0x80,0x0E,0xF3,0xFC,0x0A,0x46,0x0C,0x12,0x4C,0x08, - 0x12,0x12,0x10,0x22,0x21,0x30,0x42,0x01,0x60,0x02,0x00,0x80,0x02,0x03,0x00,0x02, - 0x1C,0x00,0x02,0xE0,0x00,0x00,0x00,0x00,), - '远' : (0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x20,0x08,0x7F,0xF0,0x0C,0x00,0x00,0x04, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x01,0xFF,0xFC,0x00,0x18,0x80,0x7E,0x18, - 0x80,0x04,0x18,0x80,0x04,0x10,0x80,0x04,0x10,0x80,0x04,0x10,0x88,0x04,0x20,0x88, - 0x04,0x60,0x8C,0x04,0xC0,0xFC,0x1B,0x00,0x00,0x31,0x00,0x00,0x60,0xFF,0xFE,0x00, - 0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,), - '通' : (0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xE0,0x10,0x00,0x30,0x08,0x08,0xC0,0x0C, - 0x07,0x00,0x0C,0x03,0x00,0x00,0x7F,0xF8,0x00,0x42,0x08,0x00,0x42,0x08,0x7C,0x7F, - 0xF8,0x04,0x42,0x08,0x04,0x42,0x08,0x04,0x42,0x08,0x04,0x7F,0xF8,0x04,0x42,0x08, - 0x04,0x42,0x08,0x04,0x42,0x08,0x04,0x42,0x18,0x1A,0x42,0x38,0x31,0x80,0x10,0x60, - 0xFF,0xFC,0x00,0x1F,0xF8,0x00,0x00,0x00,), - '信' : (0x00,0x00,0x00,0x00,0x04,0x00,0x03,0x02,0x00,0x02,0x03,0x00,0x02,0x03,0x08,0x04, - 0xFF,0xFC,0x04,0x00,0x00,0x08,0x00,0x10,0x0C,0x7F,0xF8,0x14,0x00,0x00,0x14,0x00, - 0x10,0x24,0x7F,0xF8,0x44,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x3F,0xF8, - 0x04,0x20,0x10,0x04,0x20,0x10,0x04,0x20,0x10,0x04,0x20,0x10,0x04,0x3F,0xF0,0x04, - 0x20,0x10,0x04,0x20,0x10,0x00,0x00,0x00,), -} - - -''' -常用ASCII字符集 -字宽:8 【实际取模时,字宽设置为16,对应英文字宽则为8】 -字高:16 -宋体、阴码,逐行式,顺向(高位在前) -''' -ascii_8x16_dict = { - ' ' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), - '!' : (0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,), - '"' : (0x00, 0x12, 0x24, 0x24, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), - "#" : (0x00, 0x00, 0x00, 0x12, 0x12, 0x12, 0x7E, 0x24, 0x24, 0x24, 0x7E, 0x24, 0x24, 0x24, 0x00, 0x00,), - '$' : (0x00, 0x00, 0x08, 0x3C, 0x4A, 0x4A, 0x48, 0x38, 0x0C, 0x0A, 0x0A, 0x4A, 0x4A, 0x3C, 0x08, 0x08,), - '%' : (0x00, 0x00, 0x00, 0x44, 0xA4, 0xA8, 0xA8, 0xB0, 0x54, 0x1A, 0x2A, 0x2A, 0x4A, 0x44, 0x00, 0x00,), - '&' : (0x00, 0x00, 0x00, 0x30, 0x48, 0x48, 0x48, 0x50, 0x6E, 0xA4, 0x94, 0x98, 0x89, 0x76, 0x00, 0x00,), - "'" : (0x00, 0x60, 0x20, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), - '(' : (0x00, 0x02, 0x04, 0x08, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x04, 0x02, 0x00,), - ')' : (0x00, 0x40, 0x20, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x10, 0x10, 0x20, 0x40, 0x00,), - '*' : (0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0xD6, 0x38, 0x38, 0xD6, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,), - '+' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x7F, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00,), - ',' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x20, 0x20, 0x40,), - '-' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), - '.' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00,), - '/' : (0x00, 0x00, 0x02, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x00,), - '0' : (0x00, 0x00, 0x00, 0x18, 0x24, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x24, 0x18, 0x00, 0x00,), - '1' : (0x00, 0x00, 0x00, 0x08, 0x38, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x3E, 0x00, 0x00,), - '2' : (0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x02, 0x04, 0x08, 0x10, 0x20, 0x42, 0x7E, 0x00, 0x00,), - '3' : (0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x02, 0x04, 0x18, 0x04, 0x02, 0x42, 0x42, 0x3C, 0x00, 0x00,), - '4' : (0x00, 0x00, 0x00, 0x04, 0x0C, 0x0C, 0x14, 0x24, 0x24, 0x44, 0x7F, 0x04, 0x04, 0x1F, 0x00, 0x00,), - '5' : (0x00, 0x00, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x78, 0x44, 0x02, 0x02, 0x42, 0x44, 0x38, 0x00, 0x00,), - '6' : (0x00, 0x00, 0x00, 0x18, 0x24, 0x40, 0x40, 0x5C, 0x62, 0x42, 0x42, 0x42, 0x22, 0x1C, 0x00, 0x00,), - '7' : (0x00, 0x00, 0x00, 0x7E, 0x42, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00,), - '8' : (0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x24, 0x18, 0x24, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00,), - '9' : (0x00, 0x00, 0x00, 0x38, 0x44, 0x42, 0x42, 0x42, 0x46, 0x3A, 0x02, 0x02, 0x24, 0x18, 0x00, 0x00,), - ':' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,), - ';' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10,), - '<' : (0x00, 0x00, 0x00, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0x00,), - '=' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), - '>' : (0x00, 0x00, 0x00, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x00, 0x00,), - '?' : (0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x62, 0x04, 0x08, 0x08, 0x08, 0x00, 0x18, 0x18, 0x00, 0x00,), - '@' : (0x00, 0x00, 0x00, 0x38, 0x44, 0x5A, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x5C, 0x42, 0x3C, 0x00, 0x00,), - 'A' : (0x00, 0x00, 0x00, 0x10, 0x10, 0x18, 0x28, 0x28, 0x24, 0x3C, 0x44, 0x42, 0x42, 0xE7, 0x00, 0x00,), - 'B' : (0x00, 0x00, 0x00, 0xF8, 0x44, 0x44, 0x44, 0x78, 0x44, 0x42, 0x42, 0x42, 0x44, 0xF8, 0x00, 0x00,), - 'C' : (0x00, 0x00, 0x00, 0x3E, 0x42, 0x42, 0x80, 0x80, 0x80, 0x80, 0x80, 0x42, 0x44, 0x38, 0x00, 0x00,), - 'D' : (0x00, 0x00, 0x00, 0xF8, 0x44, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x44, 0xF8, 0x00, 0x00,), - 'E' : (0x00, 0x00, 0x00, 0xFC, 0x42, 0x48, 0x48, 0x78, 0x48, 0x48, 0x40, 0x42, 0x42, 0xFC, 0x00, 0x00,), - 'F' : (0x00, 0x00, 0x00, 0xFC, 0x42, 0x48, 0x48, 0x78, 0x48, 0x48, 0x40, 0x40, 0x40, 0xE0, 0x00, 0x00,), - 'G' : (0x00, 0x00, 0x00, 0x3C, 0x44, 0x44, 0x80, 0x80, 0x80, 0x8E, 0x84, 0x44, 0x44, 0x38, 0x00, 0x00,), - 'H' : (0x00, 0x00, 0x00, 0xE7, 0x42, 0x42, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x42, 0x42, 0xE7, 0x00, 0x00,), - 'I' : (0x00, 0x00, 0x00, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00,), - 'J' : (0x00, 0x00, 0x00, 0x3E, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x88, 0xF0,), - 'K' : (0x00, 0x00, 0x00, 0xEE, 0x44, 0x48, 0x50, 0x70, 0x50, 0x48, 0x48, 0x44, 0x44, 0xEE, 0x00, 0x00,), - 'L' : (0x00, 0x00, 0x00, 0xE0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x42, 0xFE, 0x00, 0x00,), - 'M' : (0x00, 0x00, 0x00, 0xEE, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x54, 0x54, 0x54, 0x54, 0xD6, 0x00, 0x00,), - 'N' : (0x00, 0x00, 0x00, 0xC7, 0x62, 0x62, 0x52, 0x52, 0x4A, 0x4A, 0x4A, 0x46, 0x46, 0xE2, 0x00, 0x00,), - 'O' : (0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, 0x38, 0x00, 0x00,), - 'P' : (0x00, 0x00, 0x00, 0xFC, 0x42, 0x42, 0x42, 0x42, 0x7C, 0x40, 0x40, 0x40, 0x40, 0xE0, 0x00, 0x00,), - 'Q' : (0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0xB2, 0x4C, 0x38, 0x06, 0x00,), - 'R' : (0x00, 0x00, 0x00, 0xFC, 0x42, 0x42, 0x42, 0x7C, 0x48, 0x48, 0x44, 0x44, 0x42, 0xE3, 0x00, 0x00,), - 'S' : (0x00, 0x00, 0x00, 0x3E, 0x42, 0x42, 0x40, 0x20, 0x18, 0x04, 0x02, 0x42, 0x42, 0x7C, 0x00, 0x00,), - 'T' : (0x00, 0x00, 0x00, 0xFE, 0x92, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00,), - 'U' : (0x00, 0x00, 0x00, 0xE7, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00,), - 'V' : (0x00, 0x00, 0x00, 0xE7, 0x42, 0x42, 0x44, 0x24, 0x24, 0x28, 0x28, 0x18, 0x10, 0x10, 0x00, 0x00,), - 'W' : (0x00, 0x00, 0x00, 0xD6, 0x54, 0x54, 0x54, 0x54, 0x54, 0x6C, 0x28, 0x28, 0x28, 0x28, 0x00, 0x00,), - 'X' : (0x00, 0x00, 0x00, 0xE7, 0x42, 0x24, 0x24, 0x18, 0x18, 0x18, 0x24, 0x24, 0x42, 0xE7, 0x00, 0x00,), - 'Y' : (0x00, 0x00, 0x00, 0xEE, 0x44, 0x44, 0x28, 0x28, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00,), - 'Z' : (0x00, 0x00, 0x00, 0x7E, 0x84, 0x04, 0x08, 0x08, 0x10, 0x20, 0x20, 0x42, 0x42, 0xFC, 0x00, 0x00,), - '[' : (0x00, 0x1E, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1E, 0x00,), - '\\' : (0x00, 0x00, 0x40, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x08, 0x08, 0x04, 0x04, 0x04, 0x02, 0x02,), - ']' : (0x00, 0x78, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x78, 0x00,), - '^' : (0x00, 0x18, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), - '_' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,), - '`' : (0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), - 'a' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x0C, 0x34, 0x44, 0x4C, 0x36, 0x00, 0x00,), - 'b' : (0x00, 0x00, 0x00, 0x00, 0xC0, 0x40, 0x40, 0x58, 0x64, 0x42, 0x42, 0x42, 0x64, 0x58, 0x00, 0x00,), - 'c' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x22, 0x40, 0x40, 0x40, 0x22, 0x1C, 0x00, 0x00,), - 'd' : (0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x02, 0x3E, 0x42, 0x42, 0x42, 0x42, 0x46, 0x3B, 0x00, 0x00,), - 'e' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x7E, 0x40, 0x42, 0x3C, 0x00, 0x00,), - 'f' : (0x00, 0x00, 0x00, 0x00, 0x0C, 0x12, 0x10, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00,), - 'g' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x44, 0x44, 0x38, 0x40, 0x3C, 0x42, 0x42, 0x3C,), - 'h' : (0x00, 0x00, 0x00, 0x00, 0xC0, 0x40, 0x40, 0x5C, 0x62, 0x42, 0x42, 0x42, 0x42, 0xE7, 0x00, 0x00,), - 'i' : (0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x70, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00,), - 'j' : (0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x1C, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x44, 0x78,), - 'k' : (0x00, 0x00, 0x00, 0x00, 0xC0, 0x40, 0x40, 0x4E, 0x48, 0x50, 0x70, 0x48, 0x44, 0xEE, 0x00, 0x00,), - 'l' : (0x00, 0x00, 0x00, 0x10, 0x70, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00,), - 'm' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x49, 0x49, 0x49, 0x49, 0x49, 0xED, 0x00, 0x00,), - 'n' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x62, 0x42, 0x42, 0x42, 0x42, 0xE7, 0x00, 0x00,), - 'o' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00,), - 'p' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x64, 0x42, 0x42, 0x42, 0x64, 0x58, 0x40, 0xE0,), - 'q' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x26, 0x42, 0x42, 0x42, 0x26, 0x1A, 0x02, 0x07,), - 'r' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0x32, 0x20, 0x20, 0x20, 0x20, 0xF8, 0x00, 0x00,), - 's' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x42, 0x40, 0x3C, 0x02, 0x42, 0x7C, 0x00, 0x00,), - 't' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x12, 0x0C, 0x00, 0x00,), - 'u' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x42, 0x42, 0x42, 0x42, 0x46, 0x3B, 0x00, 0x00,), - 'v' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0x44, 0x44, 0x28, 0x28, 0x10, 0x10, 0x00, 0x00,), - 'w' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0x89, 0x4A, 0x5A, 0x54, 0x24, 0x24, 0x00, 0x00,), - 'x' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x24, 0x18, 0x18, 0x18, 0x24, 0x6E, 0x00, 0x00,), - 'y' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x42, 0x24, 0x24, 0x18, 0x18, 0x10, 0x10, 0x60,), - 'z' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x44, 0x08, 0x10, 0x10, 0x22, 0x7E, 0x00, 0x00,), - '{' : (0x00, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x00,), - '|' : (0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,), - '}' : (0x00, 0xC0, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0xC0, 0x00,), - '~' : (0x20, 0x5A, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), -} - - -''' -常用ASCII字符集 -字宽:16 【实际取模时,字宽设置为32,对应英文字宽则为16】 -字高:24 -宋体、阴码,逐行式,顺向(高位在前) -''' -ascii_16x24_dict = { - ' ' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '!' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x03, 0xC0, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '"' : (0x00, 0x00, 0x00, 0x00, 0x03, 0x18, 0x07, 0x38, 0x0E, 0x70, 0x18, 0xC0, 0x10, 0x80, 0x21, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '#' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x04, 0x08, 0x04, 0x18, 0x0C, 0x10, - 0x7F, 0xFE, 0x7F, 0xFE, 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, 0x7F, 0xFE, - 0x7F, 0xFE, 0x18, 0x20, 0x10, 0x20, 0x10, 0x20, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '$' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0xC0, 0x07, 0xB0, 0x19, 0x98, 0x19, 0x98, - 0x19, 0xB8, 0x1D, 0x80, 0x0F, 0x80, 0x07, 0x80, 0x01, 0xC0, 0x01, 0xF0, 0x01, 0xB8, 0x01, 0x98, - 0x39, 0x98, 0x39, 0x98, 0x31, 0x98, 0x19, 0xB0, 0x07, 0xC0, 0x01, 0x80, 0x01, 0x80, 0x00, 0x00), - '%' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x64, 0x10, 0x46, 0x10, 0xC6, 0x20, - 0xC6, 0x40, 0xC6, 0x40, 0x46, 0x80, 0x44, 0x80, 0x3D, 0x18, 0x01, 0x64, 0x02, 0x46, 0x02, 0x42, - 0x04, 0x42, 0x04, 0x42, 0x08, 0x46, 0x10, 0x64, 0x10, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '&' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x08, 0x80, 0x10, 0xC0, 0x10, 0xC0, - 0x10, 0xC0, 0x19, 0x80, 0x19, 0x00, 0x1E, 0x20, 0x1C, 0x18, 0x2E, 0x10, 0x46, 0x10, 0x43, 0x10, - 0xC3, 0xA0, 0xC1, 0xE0, 0x60, 0xE1, 0x31, 0xF2, 0x1E, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - "'" : (0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '(' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x30, 0x00, 0x20, 0x00, 0x40, 0x00, 0xC0, - 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00), - ')' : (0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x06, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x60, 0x00, 0x00, 0x00), - '*' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x71, 0x8E, 0x79, 0xBC, 0x0F, 0x60, 0x01, 0x80, 0x0F, 0x70, 0x79, 0x9E, 0x61, 0x8E, - 0x01, 0x80, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '+' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, - 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x7F, 0xFE, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, - 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - ',' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x20, 0x00), - '-' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '.' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x3C, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '/' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, - 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x80, 0x01, 0x80, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00), - '0' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x06, 0x60, 0x1C, 0x18, 0x18, 0x18, - 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, - 0x30, 0x0C, 0x18, 0x18, 0x18, 0x18, 0x0C, 0x30, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '1' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x07, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0xC0, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '2' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x0C, 0x30, 0x10, 0x18, 0x30, 0x0C, - 0x38, 0x0C, 0x38, 0x1C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x02, 0x00, - 0x04, 0x00, 0x18, 0x04, 0x30, 0x0C, 0x3F, 0xF8, 0x3F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '3' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x08, 0x70, 0x10, 0x38, 0x38, 0x18, - 0x18, 0x18, 0x00, 0x18, 0x00, 0x30, 0x00, 0xE0, 0x01, 0xE0, 0x00, 0x18, 0x00, 0x18, 0x00, 0x0C, - 0x10, 0x0C, 0x38, 0x0C, 0x30, 0x18, 0x18, 0x30, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '4' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x70, 0x00, 0xF0, 0x00, 0xF0, - 0x01, 0x70, 0x02, 0x70, 0x04, 0x70, 0x08, 0x70, 0x18, 0x70, 0x10, 0x70, 0x20, 0x70, 0x7F, 0xFE, - 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '5' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x10, 0x00, 0x10, 0x00, - 0x10, 0x00, 0x10, 0x00, 0x13, 0xC0, 0x1C, 0x30, 0x10, 0x18, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, - 0x38, 0x0C, 0x38, 0x0C, 0x30, 0x18, 0x18, 0x30, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '6' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x06, 0x18, 0x08, 0x18, 0x18, 0x18, - 0x30, 0x00, 0x30, 0x00, 0x30, 0xC0, 0x37, 0x38, 0x38, 0x1C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, - 0x30, 0x0C, 0x30, 0x0C, 0x18, 0x08, 0x0C, 0x10, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '7' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x30, 0x08, 0x20, 0x10, - 0x20, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x80, 0x03, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '8' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x0C, 0x30, 0x30, 0x08, 0x30, 0x0C, - 0x30, 0x0C, 0x30, 0x0C, 0x1C, 0x18, 0x0F, 0x20, 0x07, 0xE0, 0x18, 0x70, 0x30, 0x18, 0x20, 0x0C, - 0x60, 0x0C, 0x60, 0x0C, 0x30, 0x0C, 0x18, 0x18, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '9' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x0C, 0x70, 0x30, 0x18, 0x30, 0x18, - 0x70, 0x0C, 0x70, 0x0C, 0x70, 0x0C, 0x30, 0x1C, 0x30, 0x3C, 0x1C, 0x6C, 0x07, 0x8C, 0x00, 0x1C, - 0x00, 0x18, 0x00, 0x18, 0x18, 0x30, 0x18, 0x60, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - ':' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x03, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x03, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - ';' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x03, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00, 0x00), - '<' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x20, 0x00, 0xC0, - 0x01, 0x80, 0x02, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x18, 0x00, 0x04, 0x00, 0x03, 0x00, - 0x01, 0x80, 0x00, 0x40, 0x00, 0x30, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '=' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '>' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x18, 0x00, 0x04, 0x00, 0x03, 0x00, - 0x01, 0x80, 0x00, 0x40, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x20, 0x00, 0xC0, - 0x01, 0x80, 0x02, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '?' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x18, 0x18, 0x30, 0x0C, 0x20, 0x0C, - 0x30, 0x0C, 0x38, 0x0C, 0x00, 0x1C, 0x00, 0x38, 0x00, 0xE0, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x80, 0x03, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '@' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x06, 0x18, 0x08, 0x04, 0x10, 0x7E, - 0x31, 0x92, 0x23, 0x12, 0x62, 0x32, 0x66, 0x32, 0x66, 0x32, 0x64, 0x22, 0x64, 0x62, 0x24, 0x64, - 0x33, 0xB8, 0x30, 0x02, 0x18, 0x04, 0x0C, 0x18, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'A' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x02, 0x80, 0x02, 0xC0, - 0x02, 0xC0, 0x04, 0x40, 0x04, 0x60, 0x04, 0x60, 0x08, 0x60, 0x08, 0x30, 0x0F, 0xF0, 0x10, 0x30, - 0x10, 0x18, 0x10, 0x18, 0x20, 0x18, 0x20, 0x1C, 0xF8, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'B' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xF0, 0x18, 0x18, 0x18, 0x0C, - 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x18, 0x18, 0x60, 0x1F, 0xB0, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0E, - 0x18, 0x0E, 0x18, 0x0E, 0x18, 0x0C, 0x18, 0x18, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'C' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x06, 0x1C, 0x18, 0x04, 0x18, 0x06, - 0x30, 0x02, 0x30, 0x00, 0x70, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x70, 0x00, - 0x30, 0x02, 0x30, 0x04, 0x18, 0x04, 0x0C, 0x18, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'D' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xE0, 0x18, 0x18, 0x18, 0x1C, - 0x18, 0x0C, 0x18, 0x0E, 0x18, 0x0E, 0x18, 0x0E, 0x18, 0x0E, 0x18, 0x0E, 0x18, 0x0E, 0x18, 0x0C, - 0x18, 0x0C, 0x18, 0x1C, 0x18, 0x18, 0x18, 0x60, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'E' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x18, 0x04, 0x18, 0x02, - 0x18, 0x00, 0x18, 0x10, 0x18, 0x10, 0x18, 0x30, 0x1F, 0xF0, 0x18, 0x10, 0x18, 0x10, 0x18, 0x00, - 0x18, 0x00, 0x18, 0x02, 0x18, 0x04, 0x18, 0x0C, 0x7F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'F' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x18, 0x06, 0x18, 0x02, - 0x18, 0x00, 0x18, 0x00, 0x18, 0x10, 0x18, 0x10, 0x1F, 0xF0, 0x18, 0x10, 0x18, 0x10, 0x18, 0x00, - 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'G' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC8, 0x0E, 0x38, 0x18, 0x18, 0x30, 0x08, - 0x30, 0x04, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x20, 0x60, 0x1C, 0x60, 0x18, - 0x30, 0x18, 0x30, 0x18, 0x18, 0x18, 0x0C, 0x18, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'H' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1C, 0x30, 0x0C, 0x30, 0x0C, - 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x3F, 0xFC, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, - 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0xFC, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'I' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x1F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'J' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x70, 0x40, 0x71, 0x80, 0x1E, 0x00), - 'K' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x3C, 0x18, 0x30, 0x18, 0x20, - 0x18, 0x40, 0x18, 0x80, 0x19, 0x00, 0x1B, 0x80, 0x1D, 0x80, 0x18, 0xC0, 0x18, 0xC0, 0x18, 0x60, - 0x18, 0x30, 0x18, 0x30, 0x18, 0x18, 0x18, 0x1C, 0x7E, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'L' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x18, 0x00, 0x18, 0x00, - 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, - 0x18, 0x00, 0x18, 0x02, 0x18, 0x06, 0x18, 0x0C, 0x7F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'M' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x1E, 0x30, 0x1C, 0x38, 0x1C, - 0x38, 0x2C, 0x28, 0x2C, 0x2C, 0x2C, 0x2C, 0x4C, 0x2C, 0x4C, 0x24, 0x4C, 0x26, 0x8C, 0x26, 0x8C, - 0x22, 0x8C, 0x23, 0x0C, 0x23, 0x0C, 0x23, 0x0C, 0xF1, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'N' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0E, 0x38, 0x04, 0x2C, 0x04, - 0x26, 0x04, 0x27, 0x04, 0x23, 0x04, 0x21, 0x84, 0x21, 0xC4, 0x20, 0xC4, 0x20, 0x64, 0x20, 0x74, - 0x20, 0x34, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x0C, 0xF8, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'O' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x0C, 0x30, 0x18, 0x18, 0x30, 0x0C, - 0x30, 0x0C, 0x30, 0x0E, 0x70, 0x06, 0x70, 0x06, 0x70, 0x06, 0x70, 0x06, 0x70, 0x06, 0x30, 0x06, - 0x30, 0x0C, 0x30, 0x0C, 0x18, 0x08, 0x0C, 0x30, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'P' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xF8, 0x18, 0x0C, 0x18, 0x0E, - 0x18, 0x06, 0x18, 0x06, 0x18, 0x0C, 0x18, 0x0C, 0x1F, 0xF0, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, - 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'Q' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x0C, 0x30, 0x18, 0x18, 0x30, 0x0C, - 0x30, 0x0C, 0x70, 0x0E, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x70, 0x0E, - 0x37, 0x8C, 0x38, 0xCC, 0x18, 0x78, 0x0C, 0x70, 0x03, 0xF0, 0x00, 0x3C, 0x00, 0x18, 0x00, 0x00), - 'R' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xF8, 0x18, 0x1C, 0x18, 0x0C, - 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x18, 0x18, 0x30, 0x1F, 0xC0, 0x18, 0xC0, 0x18, 0x60, 0x18, 0x60, - 0x18, 0x30, 0x18, 0x30, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'S' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x18, 0x38, 0x30, 0x18, 0x20, 0x08, - 0x20, 0x00, 0x30, 0x00, 0x38, 0x00, 0x0F, 0x00, 0x03, 0xE0, 0x00, 0x78, 0x00, 0x18, 0x00, 0x0C, - 0x40, 0x0C, 0x20, 0x0C, 0x30, 0x08, 0x38, 0x18, 0x27, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'T' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x61, 0x84, 0x41, 0x82, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'U' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x30, 0x08, 0x30, 0x08, - 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, - 0x30, 0x08, 0x30, 0x08, 0x18, 0x08, 0x18, 0x30, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'V' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x18, 0x08, 0x18, 0x08, - 0x18, 0x10, 0x1C, 0x10, 0x0C, 0x10, 0x0C, 0x20, 0x0E, 0x20, 0x06, 0x40, 0x06, 0x40, 0x06, 0x40, - 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'W' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x86, 0x21, 0x84, 0x31, 0x84, - 0x30, 0x84, 0x31, 0xC4, 0x31, 0xC8, 0x11, 0xC8, 0x1A, 0xC8, 0x1A, 0x48, 0x1A, 0x70, 0x1A, 0x70, - 0x0C, 0x70, 0x0C, 0x70, 0x0C, 0x20, 0x0C, 0x20, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'X' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1C, 0x18, 0x10, 0x0C, 0x10, - 0x06, 0x20, 0x06, 0x40, 0x03, 0x40, 0x03, 0x80, 0x01, 0x80, 0x01, 0xC0, 0x02, 0xC0, 0x02, 0x60, - 0x04, 0x70, 0x08, 0x30, 0x08, 0x18, 0x10, 0x1C, 0x7C, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'Y' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1C, 0x18, 0x08, 0x18, 0x10, - 0x0C, 0x10, 0x0C, 0x20, 0x06, 0x20, 0x06, 0x40, 0x03, 0x40, 0x03, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'Z' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x30, 0x18, 0x20, 0x38, - 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x07, 0x00, 0x06, 0x00, - 0x0C, 0x00, 0x18, 0x04, 0x18, 0x04, 0x30, 0x1C, 0x7F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '[' : (0x00, 0x00, 0x00, 0x00, 0x03, 0xFC, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00), - '\\' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x18, 0x00, 0x08, 0x00, 0x0C, 0x00, - 0x06, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, 0x80, 0x00, 0x80, 0x00, 0xC0, 0x00, 0x40, - 0x00, 0x60, 0x00, 0x20, 0x00, 0x30, 0x00, 0x10, 0x00, 0x18, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x04), - ']' : (0x00, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, - 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, - 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x3F, 0xC0, 0x00, 0x00), - '^' : (0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x0C, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '_' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF), - '`' : (0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'a' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x30, 0x10, 0x30, 0x18, 0x00, 0x18, 0x03, 0xF8, 0x1C, 0x18, - 0x30, 0x18, 0x70, 0x18, 0x70, 0x18, 0x30, 0x7A, 0x0F, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'b' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x00, 0x10, 0x00, 0x10, 0x00, - 0x10, 0x00, 0x10, 0x00, 0x13, 0xF0, 0x14, 0x18, 0x18, 0x0C, 0x18, 0x0C, 0x10, 0x0C, 0x10, 0x0C, - 0x10, 0x0C, 0x10, 0x0C, 0x18, 0x08, 0x1C, 0x10, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'c' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x0C, 0x18, 0x18, 0x18, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, - 0x30, 0x00, 0x30, 0x04, 0x18, 0x08, 0x0C, 0x18, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'd' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, - 0x00, 0x18, 0x00, 0x18, 0x07, 0xD8, 0x0C, 0x38, 0x18, 0x18, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, - 0x30, 0x18, 0x30, 0x18, 0x18, 0x18, 0x0C, 0x7E, 0x03, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'e' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x08, 0x18, 0x18, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x3F, 0xF0, - 0x30, 0x00, 0x30, 0x00, 0x18, 0x08, 0x0C, 0x10, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'f' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFE, 0x03, 0x06, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x3F, 0xF8, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'g' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x08, 0x36, 0x18, 0x10, 0x10, 0x18, 0x18, 0x10, 0x08, 0x30, - 0x0F, 0xC0, 0x10, 0x00, 0x1F, 0x80, 0x0B, 0xF8, 0x30, 0x0C, 0x20, 0x0C, 0x30, 0x0C, 0x0F, 0xF0), - 'h' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, - 0x18, 0x00, 0x18, 0x00, 0x1B, 0xF0, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7C, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'i' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0xC0, 0x01, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x1F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'j' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x38, 0x00, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, - 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x30, 0x38, 0x20, 0x1F, 0xC0), - 'k' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, - 0x18, 0x00, 0x18, 0x00, 0x18, 0x7C, 0x18, 0x20, 0x18, 0x40, 0x19, 0x80, 0x1B, 0x80, 0x1C, 0xC0, - 0x18, 0x60, 0x18, 0x60, 0x18, 0x30, 0x18, 0x18, 0x7C, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'l' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x1F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'm' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xEF, 0x3C, 0x31, 0xC6, 0x21, 0x86, 0x21, 0x86, 0x21, 0x86, 0x21, 0x86, - 0x21, 0x86, 0x21, 0x86, 0x21, 0x86, 0x21, 0x86, 0xFB, 0xCF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'n' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7B, 0xF0, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7C, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'o' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x18, 0x18, 0x10, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, - 0x30, 0x0C, 0x30, 0x0C, 0x10, 0x08, 0x08, 0x10, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'p' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7B, 0xE0, 0x1C, 0x18, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0C, - 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0C, 0x1C, 0x38, 0x1B, 0xC0, 0x18, 0x00, 0x18, 0x00, 0x3C, 0x00), - 'q' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0xC8, 0x18, 0x38, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, - 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, 0x18, 0x38, 0x07, 0xD8, 0x00, 0x18, 0x00, 0x18, 0x00, 0x3C), - 'r' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7C, 0x04, 0x8E, 0x05, 0x00, 0x06, 0x00, 0x04, 0x00, 0x04, 0x00, - 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x7F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 's' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x08, 0x18, 0x18, 0x08, 0x18, 0x00, 0x0F, 0x00, 0x01, 0xF0, - 0x00, 0x38, 0x00, 0x0C, 0x10, 0x0C, 0x18, 0x18, 0x17, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 't' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x03, 0x00, 0x07, 0x00, 0x3F, 0xF8, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x04, 0x03, 0x18, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'u' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x70, 0x78, 0x10, 0x18, 0x10, 0x18, 0x10, 0x18, 0x10, 0x18, 0x10, 0x18, - 0x10, 0x18, 0x10, 0x18, 0x18, 0x18, 0x1C, 0x7E, 0x07, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'v' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7E, 0x3E, 0x18, 0x08, 0x08, 0x10, 0x0C, 0x10, 0x0C, 0x20, 0x06, 0x20, - 0x06, 0x40, 0x03, 0x40, 0x03, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'w' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xFB, 0xCF, 0x21, 0x84, 0x31, 0x84, 0x31, 0x88, 0x11, 0xC8, 0x1A, 0xC8, - 0x1A, 0x50, 0x0A, 0x70, 0x0C, 0x70, 0x0C, 0x20, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'x' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x0C, 0x10, 0x06, 0x20, 0x03, 0x40, 0x01, 0x80, 0x01, 0x80, - 0x02, 0xC0, 0x04, 0x60, 0x0C, 0x30, 0x18, 0x18, 0x7C, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'y' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7E, 0x3E, 0x18, 0x18, 0x0C, 0x10, 0x0C, 0x30, 0x06, 0x20, 0x06, 0x20, - 0x03, 0x40, 0x03, 0x40, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, 0x12, 0x00, 0x3C, 0x00), - 'z' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x10, 0x30, 0x20, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, - 0x06, 0x00, 0x06, 0x04, 0x0C, 0x08, 0x18, 0x18, 0x3F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '{' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x20, 0x00, 0x20, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x00, 0x40, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x1C, 0x00, 0x00), - '|' : (0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00), - '}' : (0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x04, 0x00, 0x04, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, - 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x02, 0x00, 0x06, 0x00, 0x06, 0x00, - 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x38, 0x00, 0x00, 0x00), - '~' : (0x00, 0x00, 0x1E, 0x00, 0x21, 0x82, 0x40, 0xC4, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), -} \ No newline at end of file diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/image.py" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/image.py" deleted file mode 100644 index b82855a5a7e09519744f68df77c95e9d419b1b08..0000000000000000000000000000000000000000 --- "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/image.py" +++ /dev/null @@ -1,1244 +0,0 @@ -''' -通过工具将图片转换为数组的形式保存在一个元组中, -下面是像素为 99x100 的四叶草图片 -''' -image_buf = ( - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBF,0XFF,0XDD,0XF7,0XBF,0XF7,0XBE,0XFF,0XFC,0XF7,0XFC,0XE7,0XD9,0XDF, - 0XFC,0XF7,0X9F,0XF7,0XBF,0XFF,0X7E,0XFF,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XBF,0XF7,0XBF,0XF7, - 0XBF,0XFF,0XBE,0XF7,0XDE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XD0,0XB6,0X23,0X55, - 0X20,0X45,0X80,0X45,0X61,0X3D,0X80,0X45,0X80,0X4D,0XC4,0X54,0XFA,0XE7,0XBE,0XFF, - 0XBE,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBD,0XF7,0XBD,0XF7,0XBE,0XFF, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XFF,0XBE,0XF7,0XBF,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBC,0XEF, - 0XE1,0X4C,0X40,0X3D,0X21,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X4D,0X40,0X4D, - 0X60,0X45,0X40,0X4D,0XAC,0X85,0XDE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0X9F,0XF7,0XFE,0XEF,0XFD,0XE7,0XB7,0XCF,0X77,0XCF,0XD9,0XD7,0XFD,0XF7,0XDF,0XFF, - 0XBE,0XFF,0XDE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7, - 0XDF,0XF7,0XDC,0XF7,0X22,0X4D,0X60,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X65,0X65,0X9F,0XFF, - 0XDF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XDE,0XF7,0XBE,0XF7, - 0X9F,0XFF,0XDD,0XEF,0XCB,0X7D,0X21,0X4D,0X20,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X02,0X4D,0XB7,0XD7,0XBF,0XFF,0XDF,0XFF,0XBF,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBF,0XF7,0XBD,0XFF,0X9F,0XEF,0XE3,0X54,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X22,0X4D,0X2C,0X8E,0X9E,0XFF,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XF4,0XB6,0X20,0X4D,0X80,0X55,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X41,0X45,0X60,0X3D,0X40,0X45,0X05,0X5D, - 0XBE,0XEF,0X9E,0XFF,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XBD,0XFF,0XD9,0XDF,0X60,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X60,0X3D,0XFB,0XEF,0XBD,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBD,0XFF,0XDF,0XFF,0X4F,0X9E,0X40,0X45,0X61,0X3D, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X20,0X4D, - 0X40,0X45,0X40,0X45,0X40,0X45,0X6A,0X75,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XFF, - 0XBF,0XF7,0X0A,0X86,0X21,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X20,0X4D,0X22,0X4D,0XBF,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XFF,0XDC,0XE7, - 0X20,0X45,0X40,0X45,0X40,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X60,0X45,0X40,0X45,0X40,0X45,0X60,0X45,0X40,0X45,0X9B,0XD7, - 0X9D,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XFF,0XBE,0XF7,0X26,0X65,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0XFB,0XE7,0X9E,0XFF,0XDE,0XF7, - 0XBE,0XF7,0X9F,0XF7,0XE4,0X54,0X60,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X60,0X3D,0XC5,0X54,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XDE,0XF7,0X0D,0X8E, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X60,0X45,0X20,0X4D,0X60,0X3D, - 0X66,0X6D,0X9E,0XFF,0XBE,0XF7,0XBE,0XF7,0XFB,0XE7,0X40,0X4D,0X60,0X3D,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0XFD,0XEF,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBF,0XF7,0XBD,0XFF,0XF9,0XDF,0X20,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X60,0X3D,0X20,0X4D,0X40,0X45,0X21,0X4D,0XFD,0XEF,0XBE,0XF7,0XBF,0XF7,0XEB,0X85, - 0X41,0X45,0X41,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X20,0X4D, - 0X80,0X3D,0XB4,0XB6,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XBE,0XFF,0XBF,0XFF,0XBE,0XEF,0XD9,0XDF,0XCA,0X7D, - 0X23,0X55,0X02,0X4D,0XE1,0X4C,0X04,0X55,0X68,0X7D,0X54,0XBF,0X62,0X55,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0XB8,0XDF, - 0XBF,0XF7,0XBE,0XF7,0XC3,0X54,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X86,0X5D,0XBF,0XF7,0XBE,0XF7,0XBF,0XF7, - 0XBE,0XF7,0XBF,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XDF,0XFF,0X32,0XB7, - 0X40,0X45,0X40,0X45,0X40,0X45,0X20,0X4D,0X20,0X4D,0X20,0X4D,0X20,0X4D,0X60,0X45, - 0X60,0X3D,0X20,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X0B,0X86,0XBF,0XFF,0XDE,0XF7,0XE1,0X4C,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X21,0X4D, - 0XDE,0XF7,0XBE,0XFF,0XBE,0XF7,0XDF,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XDF,0XFF,0XAA,0X7D,0X40,0X3D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X20,0X45,0X21,0X4D,0X9F,0XFF,0XDE,0XF7, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X22,0X4D,0XFE,0XEF,0XBF,0XFF,0XDF,0XF7,0XFC,0XE7,0XFD,0XF7, - 0X9E,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XFA,0XE7,0X60,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0XBF,0XFF,0XDE,0XEF,0X41,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X21,0X4D,0XFB,0XEF,0XC7,0X64, - 0X60,0X45,0X40,0X45,0X60,0X4D,0XC2,0X4C,0X34,0XBF,0XDF,0XFF,0XFF,0XFF,0XBF,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0X46,0X5D,0X80,0X45, - 0X20,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X4D,0X40,0X45,0XFE,0XF7,0X39,0XD7,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X42,0X55,0X60,0X3D,0X40,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X20,0X3D, - 0XC3,0X4C,0XDC,0XEF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XDF,0XFF,0X20,0X45,0X60,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X4D,0X40,0X3D,0XFC,0XE7, - 0XD5,0XBE,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X41,0X45,0X40,0X45,0X40,0X45, - 0X20,0X4D,0X40,0X45,0X21,0X45,0X80,0X3D,0XC3,0X4C,0XDE,0XF7,0XBE,0XF7,0XBF,0XF7, - 0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XFD,0XFF,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0XB6,0XD7,0X90,0XA6,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X03,0X45,0X7E,0XFF,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XDE,0XFF,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0XF2,0XBE,0X2E,0X96,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X3D,0X37,0XC7,0XBD,0XF7,0XBF,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0X41,0X45,0X60,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X70,0XA6,0XEC,0X85,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X00,0X3D,0X22,0X4D, - 0X9E,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0X22,0X55,0X60,0X45,0X22,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X6E,0X96,0XEA,0X7D,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X21,0X45,0X40,0X45,0XFF,0XEF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0X69,0X75,0X60,0X45,0X21,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X2D,0X8E,0XA9,0X6D, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X37,0XC7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XFC,0XEF,0X20,0X3D,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X0C,0X8E,0X68,0X6D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X60,0X45,0X30,0X9E,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XDF,0XFF,0X20,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X2C,0X8E,0X47,0X65,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X50,0X96,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0X9D,0XF7,0X56,0XC7,0X80,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X6E,0X96, - 0X05,0X55,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0XD9,0XD7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XFF,0X9F,0XF7,0XE4,0X5C,0X20,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X90,0X9E,0X03,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X4D,0X20,0X45,0XFE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7, - 0XDD,0XF7,0XBE,0XF7,0X82,0X4D,0X20,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X12,0XB7,0XE2,0X44,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X20,0X45,0X63,0X5D,0X9F,0XFF,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0X88,0X75,0X60,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X60,0X45, - 0X96,0XD7,0X22,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X81,0X4D,0XDB,0XE7, - 0XBF,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0X9F,0XFF,0X97,0XD7,0X22,0X4D,0X20,0X45,0X60,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0XD9,0XDF,0X42,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X60,0X4D,0X0C,0X96,0X9F,0XF7,0XBC,0XFF,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XBE,0XF7,0XDE,0XF7,0X9D,0XEF,0X35,0XC7, - 0X02,0X4D,0X60,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X60,0X45,0X40,0X45,0XFC,0XE7,0X41,0X3D, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X07,0X65,0XBF,0XFF,0XFE,0XFF,0XBF,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XFF,0XBF,0XF7,0XBD,0XEF,0XFB,0XEF,0X8A,0X75,0X21,0X4D,0X20,0X45, - 0X40,0X45,0X60,0X45,0X60,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X4D, - 0X60,0X3D,0XDD,0XF7,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X60,0X45,0X20,0X4D,0X20,0X3D,0X6A,0X75,0X9D,0XEF,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XBF,0XF7,0XBE,0XF7, - 0X9E,0XFF,0XBE,0XF7,0XFA,0XEF,0XCB,0X85,0XE3,0X54,0X40,0X45,0X60,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0XDA,0XE7,0X40,0X4D,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X60,0X45,0X40,0X45,0X21,0X45,0X14,0XBF, - 0XBF,0XFF,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XFF,0XBF,0XF7,0XBF,0XF7,0XBE,0XF7,0XBD,0XF7,0XBE,0XFF,0XBE,0XEF, - 0XDC,0XEF,0X2D,0X9E,0X03,0X55,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X20,0X4D,0XB2,0XB6, - 0X20,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X20,0X45, - 0X05,0X65,0XFD,0XF7,0XDF,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XDF,0XEF,0XBF,0XFF,0XBF,0XFF,0XDE,0XFF,0XDE,0XF7,0XDC,0XEF, - 0XB9,0XDF,0X14,0XBF,0X90,0XA6,0X6F,0X9E,0X70,0XA6,0XD1,0XAE,0X56,0XCF,0X99,0XDF, - 0XDD,0XF7,0XBD,0XF7,0XBF,0XF7,0X9F,0XFF,0XBE,0XF7,0XDF,0XF7,0XDD,0XF7,0X6F,0X9E, - 0X21,0X45,0X60,0X45,0X60,0X3D,0X20,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X02,0X55,0X26,0X65,0X40,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X4D,0X46,0X55,0XFD,0XEF,0XDE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XFF,0X9E,0XFF,0XDD,0XEF,0X99,0XD7, - 0X47,0X65,0X41,0X45,0X60,0X45,0X40,0X3D,0X60,0X3D,0X40,0X45,0X20,0X4D,0X20,0X4D, - 0X40,0X45,0X60,0X3D,0X60,0X45,0X60,0X45,0X60,0X45,0X01,0X4D,0X04,0X5D,0X8E,0XA6, - 0XFA,0XE7,0XDE,0XF7,0XBF,0XFF,0X9E,0XFF,0XFC,0XEF,0X44,0X65,0X40,0X4D,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0XC8,0X75,0X03,0X55,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X60,0X45, - 0X40,0X45,0X03,0X4D,0X2D,0X86,0XDF,0XEF,0X9E,0XFF,0XBE,0XF7,0XBF,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XDE,0XF7, - 0XB8,0XD7,0XE3,0X54,0X60,0X45,0X60,0X45,0X40,0X45,0X40,0X4D,0X20,0X4D,0X20,0X4D, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X4D,0X40,0X4D,0X40,0X4D,0X40,0X4D, - 0X60,0X45,0X60,0X45,0X60,0X3D,0X60,0X45,0X60,0X4D,0X01,0X4D,0XCC,0X85,0XBB,0XE7, - 0XBE,0XF7,0XFC,0XEF,0X67,0X6D,0X41,0X45,0X20,0X45,0X40,0X45,0X40,0X45,0X12,0XB7, - 0X40,0X45,0X60,0X3D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X60,0X45,0X60,0X45, - 0X01,0X4D,0XC3,0X4C,0X2D,0X8E,0XFA,0XEF,0XDE,0XFF,0X7F,0XF7,0XBF,0XF7,0XDC,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7, - 0XDF,0XFF,0X7E,0XF7,0X0D,0X86,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X20,0X4D,0X65,0X65,0X97,0XCF,0XFA,0XEF,0XE4,0X5C, - 0X40,0X45,0X21,0X4D,0X6A,0X7E,0X40,0X45,0X60,0X3D,0X60,0X45,0X60,0X45,0X60,0X3D, - 0X40,0X45,0X40,0X45,0X40,0X45,0X41,0X45,0X40,0X3D,0X40,0X3D,0X60,0X45,0X01,0X4D, - 0XE4,0X54,0XEF,0X95,0XBA,0XDF,0XDE,0XEF,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XDE,0XF7,0XDE,0XF7,0XDF,0XF7,0XBF,0XF7,0XBE,0XFF,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBD,0XFF,0X9F,0XF7,0X6E,0X9E,0X40,0X45,0X60,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X41,0X45,0X60,0X3D, - 0X60,0X45,0X21,0X4D,0X06,0X5D,0XCB,0X86,0X60,0X45,0X61,0X4D,0X40,0X45,0X21,0X45, - 0X40,0X3D,0X41,0X45,0X21,0X4D,0X02,0X4D,0X24,0X55,0X87,0X6D,0X0D,0X8E,0X56,0XC7, - 0XDC,0XEF,0XBE,0XF7,0XBE,0XF7,0XBE,0XFF,0XBE,0XFF,0X9E,0XF7,0XBE,0XF7,0XBF,0XF7, - 0X9F,0XF7,0XBF,0XF7,0XBE,0XF7,0XDE,0XF7,0XBF,0XF7,0XBF,0XFF,0X9F,0XFF,0XBF,0XF7, - 0XDE,0XF7,0XBF,0XFF,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XFF,0XFA,0XE7,0X80,0X45, - 0X40,0X45,0X41,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X20,0X4D,0X40,0X45,0X40,0X45,0X60,0X3D,0X40,0X45,0X40,0X45,0X40,0X45, - 0X41,0X45,0X20,0X45,0X86,0X5D,0XAE,0X9E,0X75,0XC7,0XFA,0XE7,0XFB,0XE7,0XDC,0XEF, - 0XDD,0XEF,0XBD,0XF7,0XFC,0XEF,0XB9,0XD7,0X15,0XBF,0XD1,0XA6,0X0B,0X8E,0X86,0X6D, - 0X22,0X5D,0X01,0X55,0X21,0X4D,0X21,0X45,0X40,0X45,0X20,0X45,0X21,0X4D,0X21,0X55, - 0X01,0X55,0X67,0X6D,0X35,0XCF,0XBE,0XF7,0XDD,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0X9F,0XFF,0X44,0X5D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X20,0X4D, - 0X40,0X45,0X40,0X45,0X20,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X60,0X45,0X60,0X45,0X60,0X3D,0X60,0X3D,0X40,0X45,0X40,0X45,0X40,0X45, - 0X60,0X45,0X60,0X45,0X60,0X45,0X60,0X45,0X60,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X80,0X45,0X60,0X45,0X40,0X45,0XEC,0X85, - 0XFD,0XEF,0X9F,0XFF,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0X40,0X45,0X20,0X4D,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X21,0X45,0X94,0XC7,0X60,0X4D,0X41,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X20,0X45,0XE4,0X5C,0XFB,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XFB,0XE7,0X40,0X45, - 0X40,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X42,0X45,0XEF,0XAE,0X88,0X85, - 0XCA,0X75,0X02,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X60,0X3D,0XC6,0X5C, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBF,0XF7,0XFA,0XDF,0X60,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X23,0X4D,0X9F,0XFF,0X41,0X45,0X99,0XDF,0X45,0X5D,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X58,0XDF,0X9E,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XFB,0XE7,0X60,0X3D,0X20,0X4D,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X20,0X4D,0XFB,0XE7,0XBD,0XF7,0X40,0X3D,0XDE,0XF7,0X8F,0X96, - 0X40,0X45,0X60,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0XE3,0X4C,0XBF,0XFF, - 0XDF,0XEF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XFD,0XF7, - 0X40,0X45,0X20,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X20,0X4D,0X60,0X3D,0X68,0X75,0XBF,0XF7,0XD9,0XDF, - 0X21,0X45,0XBF,0XFF,0XD9,0XDF,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X81,0X4D,0XBB,0XE7,0XBF,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0X41,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X41,0X45,0X20,0X4D, - 0XFC,0XEF,0X9E,0XFF,0XB1,0XA6,0X65,0X5D,0XBE,0XFF,0XDE,0XEF,0X40,0X45,0X20,0X4D, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X60,0X3D,0XD9,0XD7,0XBE,0XFF,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0X9F,0XFF,0XAF,0XA6,0XA1,0X4D, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X20,0X45,0XC9,0X75,0X9D,0XF7,0XBE,0XFF,0X45,0X5D,0X72,0X9E,0XBE,0XFF, - 0XBE,0XF7,0X41,0X4D,0X20,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X61,0X45, - 0XCC,0X85,0XBE,0XFF,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBD,0XFF,0XBD,0XEF,0X01,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0XDD,0XEF,0X9F,0XFF,0XBD,0XFF, - 0X02,0X4D,0XFA,0XDF,0X9E,0XF7,0XBE,0XFF,0X47,0X65,0X41,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0XE8,0X64,0XBE,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XFF,0XDE,0XF7,0XBF,0XFF,0XDB,0XE7,0XE2,0X4C,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0XA3,0X54, - 0XBE,0XFF,0XDE,0XF7,0XBE,0XFF,0X40,0X45,0XDD,0XEF,0XDF,0XF7,0X9E,0XFF,0X35,0XBF, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X60,0X45,0X08,0X6D,0XBE,0XFF, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XFB,0XEF,0X02,0X4D,0X20,0X3D,0X60,0X45,0X60,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X42,0X45,0XBD,0XF7,0XBD,0XF7,0XBF,0XF7,0XBD,0XF7,0X60,0X45,0XDE,0XF7, - 0XBD,0XFF,0X9F,0XF7,0XDC,0XEF,0X60,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X60,0X4D,0X34,0XBF,0X9E,0XFF,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBD,0XF7,0X9F,0XF7,0XDB,0XE7,0X76,0XC7, - 0X99,0XE7,0X0D,0X86,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X02,0X55,0XBE,0XF7,0XDF,0XFF,0XBF,0XF7, - 0XBA,0XE7,0X42,0X4D,0XBD,0XF7,0XBD,0XF7,0XBF,0XF7,0XDE,0XF7,0X02,0X4D,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0XDB,0XDF,0XBE,0XFF,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7, - 0XDD,0XF7,0XDD,0XF7,0XBF,0XF7,0XDD,0XF7,0X01,0X4D,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X60,0X45,0XD8,0XDF, - 0XBF,0XF7,0XBF,0XF7,0XBF,0XF7,0X54,0XC7,0X23,0X4D,0XBE,0XFF,0XBE,0XF7,0XBF,0XF7, - 0X9F,0XFF,0XEC,0X8D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X27,0X65,0X9E,0XFF, - 0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XFF,0XFC,0XE7,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X20,0X4D,0XBF,0XF7,0XBE,0XF7,0XBF,0XF7,0XBE,0XF7,0X8E,0X96,0X46,0X65, - 0XBF,0XF7,0XBE,0XFF,0XBE,0XF7,0XBE,0XF7,0XDC,0XF7,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X20,0X4D,0X80,0X3D, - 0XE3,0X54,0XDE,0XF7,0XBE,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XDE,0XFF,0XD2,0XAE,0X60,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X3D,0X4F,0X96,0XDE,0XFF,0XBE,0XF7,0XBF,0XF7, - 0XBE,0XF7,0XA8,0X75,0XEA,0X85,0XBF,0XF7,0XBE,0XFF,0XBE,0XF7,0XBE,0XF7,0XDE,0XF7, - 0X03,0X55,0X60,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X3D,0X04,0X5D,0XDD,0XEF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XDF,0XFF,0XE5,0X5C,0X60,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X82,0X55,0XFD,0XF7, - 0XBE,0XFF,0XBE,0XF7,0XBF,0XF7,0XDE,0XFF,0X04,0X55,0X90,0X9E,0XBF,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0X0D,0X8E,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X60,0X3D,0X40,0X4D,0X02,0X4D,0X33,0XB7,0XBF,0XEF,0XBD,0XFF,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0X9F,0XF7,0XE3,0X54, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X27,0X65,0X9F,0XF7,0XBF,0XF7,0XBF,0XF7,0XBF,0XF7,0XBD,0XF7,0X03,0X4D, - 0X55,0XC7,0XBE,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XFB,0XEF,0X41,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X01,0X55,0X24,0X5D,0X4F,0X9E,0XFA,0XE7,0XBF,0XF7,0X9F,0XFF, - 0XBD,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBF,0XF7,0XC3,0X54,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X60,0X45,0X41,0X45,0XDB,0XE7,0X9F,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBD,0XF7,0X23,0X4D,0X97,0XCF,0XBE,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XFF,0X24,0X55,0X61,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X03,0X55,0XFE,0XEF,0XBD,0XFF,0XBE,0XF7, - 0XBE,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0X06,0X65,0X40,0X3D,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X60,0X45,0X08,0X65,0X9F,0XFF, - 0XBE,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBD,0XF7,0X03,0X4D,0XB7,0XD7,0XBE,0XFF, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0X9F,0XFF,0XD9,0XDF,0X20,0X3D,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X60,0X3D, - 0X04,0X55,0X9F,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7, - 0XB4,0XCF,0X41,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X20,0X45,0XFB,0XEF,0XBE,0XF7,0XBF,0XF7,0XBF,0XF7,0XBE,0XFF,0XBE,0XF7,0XBD,0XF7, - 0X03,0X4D,0XD8,0XD7,0XBE,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7, - 0XBE,0XF7,0X01,0X4D,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X21,0X45,0X40,0X45,0XDB,0XE7,0XBE,0XF7,0XBF,0XF7,0XBF,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XFC,0XF7,0X42,0X55,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X60,0X45,0XD1,0XA6,0XBE,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XFF,0XBE,0XF7,0XBD,0XF7,0X03,0X4D,0XD8,0XD7,0XBE,0XFF,0XDE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0X9F,0XF7,0XB7,0XDF,0X61,0X4D,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X20,0X4D,0X60,0X3D,0X56,0XCF, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XDE,0XF7,0X9E,0XFF,0X13,0XAF, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X05,0X55,0XBF,0XF7,0XBE,0XFF, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XFF,0XBE,0XF7,0XBD,0XF7,0X23,0X4D,0X97,0XCF, - 0XBE,0XFF,0XDE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XFF,0XBF,0XFF, - 0XE5,0X5C,0X60,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X20,0X4D,0X60,0X3D,0X57,0XCF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBF,0XF7,0XDE,0XF7,0X2B,0X86,0X20,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X20,0X45,0X41,0X45, - 0X9C,0XEF,0XBF,0XF7,0XDE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XFF,0XBE,0XF7, - 0XDE,0XFF,0X03,0X4D,0X56,0XC7,0XBE,0XFF,0XDE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBF,0XF7,0XDE,0XF7,0XDE,0XF7,0XFC,0XEF,0X41,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0XDD,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0X9E,0XF7,0X96,0XCF, - 0XE3,0X4C,0X80,0X4D,0X60,0X45,0X41,0X45,0X22,0X45,0X20,0X4D,0X20,0X4D,0X20,0X4D, - 0X40,0X3D,0XE4,0X54,0XDC,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0X02,0X55,0XF1,0XA6,0XBF,0XF7,0XBF,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0X9F,0XF7,0X54,0XC7, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X23,0X55, - 0X9E,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0X7F,0XFF,0XDD,0XF7,0XF9,0XDF,0XAA,0X7D,0X00,0X4D,0X20,0X45, - 0X60,0X45,0X61,0X45,0X02,0X4D,0X75,0XCF,0XBE,0XF7,0XBF,0XFF,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0X87,0X6D, - 0XEB,0X85,0XBF,0XF7,0XBE,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XFF,0X9F,0XFF,0XEA,0X85,0X40,0X45,0X60,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X60,0X45,0XDA,0XEF,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XFF,0XDE,0XF7,0XBF,0XF7,0X9F,0XF7, - 0XBF,0XF7,0XBF,0XF7,0X9E,0XF7,0XBE,0XF7,0XBE,0XFF,0X9F,0XF7,0XBF,0XFF,0XBF,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7, - 0XBE,0XF7,0XBE,0XF7,0X6D,0X96,0X67,0X6D,0XBF,0XF7,0XBE,0XFF,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0X69,0X75, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X40,0X45,0X90,0XA6,0XBF,0XFF,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0X35,0XC7,0X43,0X55,0XBF,0XFF, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBF,0XFF,0X4E,0X96,0X41,0X4D,0X40,0X4D,0X40,0X45,0X40,0X45, - 0X40,0X45,0X40,0X45,0X40,0X45,0X20,0X45,0X40,0X45,0X20,0X45,0XF0,0XA6,0X9E,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBA,0XE7,0X21,0X4D,0XDE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XFF,0XFA,0XE7, - 0X05,0X4D,0X20,0X45,0X60,0X45,0X60,0X45,0X60,0X45,0X60,0X45,0X40,0X45,0XE4,0X4C, - 0XDA,0XE7,0XBE,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XDD,0XF7,0X61,0X4D,0XFC,0XEF,0X9F,0XFF,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBF,0XF7,0XBE,0XFF,0XBF,0XFF,0XBE,0XF7,0XFB,0XEF,0X55,0XC7,0X2C,0X8E,0X2C,0X8E, - 0X54,0XBF,0XFB,0XE7,0XBD,0XF7,0XBF,0XF7,0XDF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0X40,0X45, - 0XDD,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XE2,0X4C,0X77,0XD7,0XDF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XAA,0X7D,0XC9,0X85,0XDF,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0X9F,0XF7, - 0X75,0XCF,0X21,0X4D,0XBF,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XDE,0XF7,0XFD,0XF7,0X60,0X4D,0XDF,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XDD,0XF7,0XBF,0XF7,0X01,0X55, - 0XF9,0XD7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBF,0XF7,0XBE,0XF7,0XA9,0X7D,0XC9,0X75,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XD9,0XDF,0X20,0X4D,0XBF,0XF7, - 0XBF,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XF7, - 0XFE,0XF7,0X01,0X4D,0XF9,0XE7,0XBF,0XF7,0XBE,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBF,0XF7,0XDD,0XF7,0X7F,0XF7,0XCB,0X75,0X69,0X7D,0XDD,0XF7,0XBF,0XFF, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XFB,0XE7, - 0X21,0X4D,0XDD,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBF,0XFF,0X21,0X45,0X14,0XC7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XF5,0XBE,0X21,0X45, - 0X9E,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBF,0XF7,0XDD,0XFF,0X41,0X4D,0XBA,0XD7,0XBE,0XFF,0XDF,0XF7,0XBE,0XFF,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBF,0XFF,0X70,0X9E,0X41,0X4D,0XBD,0XF7, - 0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XDE,0XF7,0XBF,0XFF, - 0XDD,0XEF,0X21,0X4D,0XB7,0XD7,0XBE,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0XBE,0XF7,0X53,0XB6,0X03,0X55,0XDE,0XF7,0XBC,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XDD,0XF7, - 0X43,0X55,0XD2,0XB6,0XBF,0XFF,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBF,0XF7,0X97,0XD7,0X21,0X45,0XFD,0XEF,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0X9F,0XFF,0X66,0X65, - 0X44,0X5D,0XBF,0XFF,0XBD,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBF,0XFF,0XFC,0XF7,0X22,0X4D,0X95,0XCF,0X9F,0XFF,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBD,0XFF,0X9F,0XF7,0XB7,0XD7,0X02,0X4D, - 0XDB,0XE7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XDD,0XF7,0X9F,0XFF,0XC9,0X75,0XE3,0X4C,0XBE,0XF7,0XBF,0XF7,0XBE,0XF7,0XBF,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBD,0XEF,0X24,0X55,0X48,0X6D, - 0X7E,0XEF,0XDD,0XFF,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0X9F,0XFF,0XDC,0XEF,0X21,0X45,0X4D,0X96,0XBF,0XF7,0XDE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XDE,0XEF,0X7F,0XFF,0XFB,0XEF,0X61,0X45,0X90,0XAE, - 0X9F,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XFC,0XE7,0X20,0X45,0XF1,0XAE,0X9E,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XFF,0XFD,0XEF,0X42,0X55,0X7C,0XEF, - 0X9E,0XF7,0XBF,0XF7,0XBF,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBD,0XFF,0X9E,0XEF,0X9E,0XF7,0X9E,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, - 0XBE,0XF7,0XBE,0XF7,0XBE,0XF7,0XBE,0XF7, -) \ No newline at end of file diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/readme.md" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/readme.md" deleted file mode 100644 index d2d55943fc69ef861f0bf0f5787623c16e92d5f4..0000000000000000000000000000000000000000 --- "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/readme.md" +++ /dev/null @@ -1,6 +0,0 @@ -使用方法步骤: -1、将240*240的显示屏正确接到模块上; -2、将本目录的3个py文件(st7789v.py、image.py、example_display_image.py)拷贝到模块的usr目录下; -3、进入模块的命令行,执行如下指令即可看到显示屏显示图片: ->>> import example ->>> example.exec('usr/example_display_image.py') diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/st7789v.py" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/st7789v.py" deleted file mode 100644 index 73ba2b363c32709d258fce3195384f699b9dfdbb..0000000000000000000000000000000000000000 --- "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/st7789v.py" +++ /dev/null @@ -1,317 +0,0 @@ -# -*- coding: UTF-8 -*- - -import log -from machine import LCD -from usr import fonts - -XSTART_H = 0xf0 -XSTART_L = 0xf1 -YSTART_H = 0xf2 -YSTART_L = 0xf3 -XEND_H = 0xE0 -XEND_L = 0xE1 -YEND_H = 0xE2 -YEND_L = 0xE3 - - -XSTART = 0xD0 -XEND = 0xD1 -YSTART = 0xD2 -YEND = 0xD3 - - -class ST7789V(): - def __init__(self, width, hight): - self.lcdlog = log.basicConfig() - self.lcdlog = log.getLogger("LCD") - self.lcdlog.setLevel(log.DEBUG) - self.lcd = LCD() - self.lcd_w = width - self.lcd_h = hight - - self.st7789v_init_data = ( - 2, 1, 120, - 0, 0, 0x11, - 2, 1, 120, - 0, 1, 0x36, - 1, 1, 0x00, - 0, 1, 0x3A, - 1, 1, 0x05, - 0, 0, 0x21, - 0, 5, 0xB2, - 1, 1, 0x05, - 1, 1, 0x05, - 1, 1, 0x00, - 1, 1, 0x33, - 1, 1, 0x33, - 0, 1, 0xB7, - 1, 1, 0x23, - 0, 1, 0xBB, - 1, 1, 0x22, - 0, 1, 0xC0, - 1, 1, 0x2C, - 0, 1, 0xC2, - 1, 1, 0x01, - 0, 1, 0xC3, - 1, 1, 0x13, - 0, 1, 0xC4, - 1, 1, 0x20, - 0, 1, 0xC6, - 1, 1, 0x0F, - 0, 2, 0xD0, - 1, 1, 0xA4, - 1, 1, 0xA1, - 0, 1, 0xD6, - 1, 1, 0xA1, - 0, 14, 0xE0, - 1, 1, 0x70, - 1, 1, 0x06, - 1, 1, 0x0C, - 1, 1, 0x08, - 1, 1, 0x09, - 1, 1, 0x27, - 1, 1, 0x2E, - 1, 1, 0x34, - 1, 1, 0x46, - 1, 1, 0x37, - 1, 1, 0x13, - 1, 1, 0x13, - 1, 1, 0x25, - 1, 1, 0x2A, - 0, 14, 0xE1, - 1, 1, 0x70, - 1, 1, 0x04, - 1, 1, 0x08, - 1, 1, 0x09, - 1, 1, 0x07, - 1, 1, 0x03, - 1, 1, 0x2C, - 1, 1, 0x42, - 1, 1, 0x42, - 1, 1, 0x38, - 1, 1, 0x14, - 1, 1, 0x14, - 1, 1, 0x27, - 1, 1, 0x2C, - 0, 0, 0x29, - - 0, 1, 0x36, - 1, 1, 0x00, - - 0, 4, 0x2a, - 1, 1, 0x00, - 1, 1, 0x00, - 1, 1, 0x00, - 1, 1, 0xef, - - 0, 4, 0x2b, - 1, 1, 0x00, - 1, 1, 0x00, - 1, 1, 0x00, - 1, 1, 0xef, - - 0, 0, 0x2c, - ) - - self.st7789v_invalid_data = ( - 0,4,0x2a, - 1,1,XSTART_H, - 1,1,XSTART_L, - 1,1,XEND_H, - 1,1,XEND_L, - 0,4,0x2b, - 1,1,YSTART_H, - 1,1,YSTART_L, - 1,1,YEND_H, - 1,1,YEND_L, - 0,0,0x2c, - ) - ret = self.lcd.lcd_init(bytearray(self.st7789v_init_data), self.lcd_w, self.lcd_h, 13000, 1, 4, 0, bytearray(self.st7789v_invalid_data), None, None, None) - self.lcdlog.info('lcd.lcd_init ret = {}'.format(ret)) - '''清屏,设置白色''' - self.lcd.lcd_clear(0xFFFF) - - ''' - 单个字符显示,包括汉字和ASCII - x - x轴坐标 - y - y轴坐标 - xsize - 字体宽度 - ysize - 字体高度 - ch_buf - 存放汉字字模的元组或者列表 - fc - 字体颜色,RGB565 - bc - 背景颜色,RGB565 - ''' - def lcd_show_char(self, x, y, xsize, ysize, ch_buf, fc, bc): - rgb_buf = [] - t1 = xsize // 8 - t2 = xsize % 8 - if t2 != 0: - xsize = (t1 + 1) * 8 - for i in range(0, len(ch_buf)): - for j in range(0, 8): - if (ch_buf[i] << j) & 0x80 == 0x00: - rgb_buf.append(bc & 0xff) - rgb_buf.append(bc >> 8) - else: - rgb_buf.append(fc & 0xff) - rgb_buf.append(fc >> 8) - self.lcd.lcd_write(bytearray(rgb_buf), x, y, x + xsize - 1, y + ysize - 1) - - ''' - ASCII字符显示,目前支持8x16、16x24的字体大小, - 如果需要其他字体大小需要自己增加对应大小的字库数据,并 - 在下面函数中增加这个对应字库的字典。 - x - x轴显示起点 - y - y轴显示起点 - xsize - 字体宽度 - ysize - 字体高度 - ch - 待显示的ASCII字符 - fc - 字体颜色,RGB565 - bc - 背景颜色,RGB565 - ''' - def lcd_show_ascii(self, x, y, xsize, ysize, ch, fc, bc): - ascii_dict = {} - if xsize == 8 and ysize == 16: - ascii_dict = fonts.ascii_8x16_dict - elif xsize == 16 and ysize == 24: - ascii_dict = fonts.ascii_16x24_dict - - for key in ascii_dict: - if ch == key: - self.lcd_show_char(x, y, xsize, ysize, ascii_dict[key], fc, bc) - - ''' - 显示字符串,目前支持8x16的字体大小, - 如果需要其他字体大小需要自己增加对应大小的字库数据,并 - 在lcd_show_ascii函数中增加这个对应字库的字典。 - x - x轴坐标 - y - y轴坐标 - xsize - 字体宽度 - ysize - 字体高度 - str - 待显示的 ASCII 字符串 - fc - 字体颜色,RGB565 - bc - 背景颜色,RGB565 - ''' - def lcd_show_ascii_str(self, x, y, xsize, ysize, str, fc, bc): - xs = x - ys = y - if (len(str) * xsize + x) > self.lcd_w: - raise Exception('Display out of range') - for ch in str: - self.lcd_show_ascii(xs, ys, xsize, ysize, ch, fc, bc) - xs += xsize - - ''' - 汉字显示,目前支持16x16、16x24、24x24的字体大小, - 如果需要其他字体大小需要自己增加对应大小的字库数据,并 - 在下面函数中增加这个对应字库的字典。 - x - x轴显示起点 - y - y轴显示起点 - xsize - 字体宽度 - ysize - 字体高度 - ch - 待显示的ASCII字符 - fc - 字体颜色,RGB565 - bc - 背景颜色,RGB565 - ''' - def lcd_show_chinese(self, x, y, xsize, ysize, ch, fc, bc): - hanzi_dict = {} - if xsize == 16 and ysize == 16: - hanzi_dict = fonts.hanzi_16x16_dict - elif xsize == 16 and ysize == 24: - hanzi_dict = fonts.hanzi_16x24_dict - elif xsize == 24 and ysize == 24: - hanzi_dict = fonts.hanzi_24x24_dict - - for key in hanzi_dict: - if ch == key: - self.lcd_show_char(x, y, xsize, ysize, hanzi_dict[key], fc, bc) - - ''' - 汉字字符串显示,目前支持16x16的字体大小, - 如果需要其他字体大小需要自己增加对应大小的字库数据,并 - 在lcd_show_chinese函数中增加这个对应字库的字典。 - x - x轴坐标 - y - y轴坐标 - xsize - 字体宽度 - ysize - 字体高度 - str - 待显示的多个汉字 - fc - 字体颜色,RGB565 - bc - 背景颜色,RGB565 - ''' - def lcd_show_chinese_str(self, x, y, xsize, ysize, str, fc, bc): - xs = x - ys = y - # print('chstrlen={}, w={}'.format(len(str), self.lcd_w)) - if (len(str) / 3 * xsize + x) > self.lcd_w: - raise Exception('Display out of range') - for i in range(0, len(str), 3): - index = i + 3 - ch = str[i:index] - self.lcd_show_chinese(xs, ys, xsize, ysize, ch, fc, bc) - xs += xsize - - ''' - 图片显示 - 如果图片宽高小于80x80,可直接该函数一次性写入并显示 - image_data - 存放待显示图片的RGB数据 - x - x轴显示起点 - y - y轴显示起点 - width - 图片宽度 - heigth - 图片高度 - ''' - def lcd_show_image(self, image_data, x, y, width, heigth): - self.lcd.lcd_write(bytearray(image_data), x, y, x + width - 1, y + heigth - 1) - - ''' - 图片显示 - 如果图片宽高大于80x80,用该函数来分段写入显示,分段写入原理如下: - 以要显示图片的宽度为固定值,将待显示的图片分成若干宽高为 width * h 大小的图片,最后一块高度不足h的按实际高度计算, - h为分割后每个图片的高度,可由用户通过参数 h 指定,h的值应该满足关系: width * h * 2 < 4096 - path - 存放图片数据的txt文件路径,包含文件名,如 '/usr/image.txt' - x - x轴显示起点 - y - y轴显示起点 - width - 图片宽度 - heigth - 图片高度 - h - 分割后每个图片的高度 - ''' - def lcd_show_image_file(self, path, x, y, width, heigth, h): - image_data = [] - read_n = 0 # 已经读取的字节数 - byte_n = 0 # 字节数 - xs = x - ys = y - h_step = h # 按高度h_step个像素点作为步长 - h1 = heigth // h_step # 当前图片按h_step大小分割,可以得到几个 width * h_step 大小的图片 - h2 = heigth % h_step # 最后剩下的一块 大小不足 width * h_step 的图片的实际高度 - # print('h1 = {}, h2 = {}'.format(h1, h2)) - with open(path, "r", encoding='utf-8') as fd: - # for line in fd.readlines(): - end = '' - while not end: - line = fd.readline() - if line == '': - end = 1 - else: - curline = line.strip('\r\n').strip(',').split(',') - for i in curline: - byte_n += 1 - read_n += 1 - image_data.append(int(i)) - if h1 > 0 and byte_n == width * h_step * 2: - self.lcd_show_image(image_data, xs, ys, width, h_step) - image_data = [] - ys = ys + h_step - h1 -= 1 - byte_n = 0 - # print('image_data len = {}'.format(len(image_data))) - elif h1 == 0 and read_n == width * heigth * 2: - if h2 != 0: - self.lcd_show_image(image_data, xs, ys, width, h2) - - ''' - 将24位色转换位16位色 - 如红色的24位色为0xFF0000,则r=0xFF,g=0x00,b=0x00, - 将r、g、b的值传入下面函数即可得到16位相同颜色数据 - ''' - def get_rgb565_color(self, r, g, b): - return ((r << 8) & 0xF800) | ((g << 3) & 0x07E0) | ((b >> 3) & 0x001F) diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/\345\233\276\347\211\207\346\230\276\347\244\272\347\273\223\346\236\234.jpg" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/\345\233\276\347\211\207\346\230\276\347\244\272\347\273\223\346\236\234.jpg" deleted file mode 100644 index 171eb2f084200bb29421e564d21fa3fc85dfae65..0000000000000000000000000000000000000000 Binary files "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\233\276\347\211\207/\345\233\276\347\211\207\346\230\276\347\244\272\347\273\223\346\236\234.jpg" and /dev/null differ diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/Quecpython.py" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/Quecpython.py" deleted file mode 100644 index 5cac2c4d6811ee777edc9d3bfecf56b11ab879d0..0000000000000000000000000000000000000000 --- "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/Quecpython.py" +++ /dev/null @@ -1,391 +0,0 @@ -import sys -import time -import os - - -try: - stdout = sys.stdout.buffer -except AttributeError: - # Python2 doesn't have buffer attr - stdout = sys.stdout - - -def stdout_write_bytes(b): - b = b.replace(b"\x04", b"") - stdout.write(b) - stdout.flush() - -class QuecpythonError(Exception): - pass - - -class Quecpython: - def __init__(self, device, baudrate=115200, wait=0): - import serial - delayed = False - for attempt in range(wait + 1): - try: - self.serial = serial.Serial(device, baudrate=baudrate, interCharTimeout=1) - break - except (OSError, IOError): # Py2 and Py3 have different errors - if wait == 0: - continue - if attempt == 0: - sys.stdout.write("Waiting {} seconds for Quecpython ".format(wait)) - delayed = True - time.sleep(1) - sys.stdout.write(".") - sys.stdout.flush() - else: - if delayed: - print("") - raise QuecpythonError("failed to access " + device) - if delayed: - print("") - - def close(self): - self.serial.close() - - def read_until(self, min_num_bytes, ending, timeout=10, data_consumer=None): - # if data_consumer is used then data is not accumulated and the ending must be 1 byte long - assert data_consumer is None or len(ending) == 1 - - data = self.serial.read(min_num_bytes) - if data_consumer: - data_consumer(data) - timeout_count = 0 - while True: - if data.endswith(ending): - break - elif self.serial.inWaiting() > 0: - new_data = self.serial.read(1) - if data_consumer: - data_consumer(new_data) - data = new_data - else: - data = data + new_data - timeout_count = 0 - else: - timeout_count += 1 - if timeout is not None and timeout_count >= 100 * timeout: - break - time.sleep(0.01) - return data - - def enter_raw_repl(self): - self.serial.write(b"\r\x03\x03") # ctrl-C twice: interrupt any running program - - # flush input (without relying on serial.flushInput()) - n = self.serial.inWaiting() - while n > 0: - self.serial.read(n) - n = self.serial.inWaiting() - - self.serial.write(b"\r\x01") # ctrl-A: enter raw REPL - data = self.read_until(1, b"raw REPL; CTRL-B to exit\r\n>") - if not data.endswith(b"raw REPL; CTRL-B to exit\r\n>"): - print(data) - raise QuecpythonError("could not enter raw repl") - - self.serial.write(b"\x04") # ctrl-D: soft reset - data = self.read_until(1, b"soft reboot\r\n") - if not data.endswith(b"soft reboot\r\n"): - print(data) - raise QuecpythonError("could not enter raw repl") - # By splitting this into 2 reads, it allows boot.py to print stuff, - # which will show up after the soft reboot and before the raw REPL. - data = self.read_until(1, b"raw REPL; CTRL-B to exit\r\n") - if not data.endswith(b"raw REPL; CTRL-B to exit\r\n"): - print(data) - raise QuecpythonError("could not enter raw repl") - def exit_raw_repl(self): - self.serial.write(b"\r\x02") # ctrl-B: enter friendly REPL - - def follow(self, timeout, data_consumer=None): - # wait for normal output - data = self.read_until(1, b"\x04", timeout=timeout, data_consumer=data_consumer) - if not data.endswith(b"\x04"): - raise QuecpythonError("timeout waiting for first EOF reception") - data = data[:-1] - - # wait for error output - data_err = self.read_until(1, b"\x04", timeout=timeout) - if not data_err.endswith(b"\x04"): - raise QuecpythonError("timeout waiting for second EOF reception") - data_err = data_err[:-1] - - # return normal and error output - return data, data_err - - def exec_raw_no_follow(self, command): - if isinstance(command, bytes): - command_bytes = command - else: - command_bytes = bytes(command, encoding="utf8") - - # check we have a prompt - data = self.read_until(1, b">") - if not data.endswith(b">"): - raise QuecpythonError("could not enter raw repl") - - # write command - for i in range(0, len(command_bytes), 256): - self.serial.write(command_bytes[i : min(i + 256, len(command_bytes))]) - time.sleep(0.1) - self.serial.write(b"\x04") - - # check if we could exec command - data = self.serial.read(2) - if data != b"OK": - raise QuecpythonError("could not exec command (response: %r)" % data) - - def exec_raw(self, command, timeout=10, data_consumer=None): - self.exec_raw_no_follow(command) - return self.follow(timeout, data_consumer) - - def eval(self, expression): - ret = self.exec_("print({})".format(expression)) - ret = ret.strip() - return ret - - def exec_(self, command, data_consumer=None): - ret, ret_err = self.exec_raw(command, data_consumer=data_consumer) - if ret_err: - raise QuecpythonError("exception", ret, ret_err) - return ret - - def execfile(self, filename): - with open(filename, "rb") as f: - pyfile = f.read() - print(pyfile) - return self.exec_(pyfile) - def fs_ls(self, src): - cmd = ( - "import uos\nfor f in uos.ilistdir(%s):\n" - " print('{:12} {}{}'.format(f[3]if len(f)>3 else 0,f[0],'/'if f[1]&0x4000 else ''))" - % (("'%s'" % src) if src else "") - ) - self.exec_(cmd, data_consumer=stdout_write_bytes) - - def fs_cat(self, src, chunk_size=256): - cmd = ( - "with open('%s') as f:\n while 1:\n" - " b=f.read(%u)\n if not b:break\n print(b,end='')" % (src, chunk_size) - ) - self.exec_(cmd, data_consumer=stdout_write_bytes) - - def fs_get(self, src, dest, chunk_size=256): - self.exec_("f=open('%s','rb')\nr=f.read" % src) - with open(dest, "wb") as f: - while True: - data = bytearray() - self.exec_("print(r(%u))" % chunk_size, data_consumer=lambda d: data.extend(d)) - assert data.endswith(b"\r\n\x04") - data = eval(str(data[:-3], "ascii")) - if not data: - break - f.write(data) - self.exec_("f.close()") - - def fs_put(self, src, dest, chunk_size=256): - self.exec_("f=open('%s','wb')\nw=f.write" % dest) - with open(src, "rb") as f: - while True: - data = f.read(chunk_size) - if not data: - break - if sys.version_info < (3,): - self.exec_("w(b" + repr(data) + ")") - else: - self.exec_("w(" + repr(data) + ")") - self.exec_("f.close()") - - def fs_mkdir(self, dir): - self.exec_("import uos\nuos.mkdir('%s')" % dir) - - def fs_rmdir(self, dir): - self.exec_("import uos\nuos.rmdir('%s')" % dir) - - def fs_rm(self, src): - self.exec_("import uos\nuos.remove('%s')" % src) - -setattr(Quecpython, "exec", Quecpython.exec_) - -def execfile(filename, device="COM24", baudrate=115200): - qpy = Quecpython(device, baudrate) - qpy.enter_raw_repl() - output = qpy.execfile(filename) - stdout_write_bytes(output) - qpy.exit_raw_repl() - qpy.close() - -def filesystem_command(qpy, args): - def fname_remote(src): - if src.startswith(":"): - src = src[1:] - return src - - def fname_cp_dest(src, dest): - src = src.rsplit("/", 1)[-1] - if dest is None or dest == "": - dest = src - elif dest == ".": - dest = "./" + src - elif dest.endswith("/"): - dest += src - return dest - - cmd = args[0] - args = args[1:] - try: - if cmd == "cp": - srcs = args[:-1] - dest = args[-1] - if srcs[0].startswith("./") or dest.startswith(":"): - op = qpy.fs_put - fmt = "cp %s :%s" - dest = fname_remote(dest) - else: - op = qpy.fs_get - fmt = "cp :%s %s" - for src in srcs: - src = fname_remote(src) - dest2 = fname_cp_dest(src, dest) - print(fmt % (src, dest2)) - op(src, dest2) - else: - op = { - "ls": qpy.fs_ls, - "cat": qpy.fs_cat, - "mkdir": qpy.fs_mkdir, - "rmdir": qpy.fs_rmdir, - "rm": qpy.fs_rm, - }[cmd] - if cmd == "ls" and not args: - args = [""] - for src in args: - src = fname_remote(src) - print("%s :%s" % (cmd, src)) - op(src) - except QuecpythonError as er: - print(str(er.args[2], "ascii")) - qpy.exit_raw_repl() - qpy.close() - sys.exit(1) - -def main(): - import argparse - cmd_parser = argparse.ArgumentParser(description="Run scripts on the EC100Y.") - cmd_parser.add_argument( - "-d", - "--device", - default=os.environ.get("EC100Y_DEVICE", "COM24"), - help="the serial device of the EC100Y", - ) - cmd_parser.add_argument( - "-b", - "--baudrate", - default=os.environ.get("EC100Y_BAUDRATE", "115200"), - help="the baud rate of the serial device", - ) - cmd_parser.add_argument("-c", "--command", help="program passed in as string") - cmd_parser.add_argument( - "-w", - "--wait", - default=0, - type=int, - help="seconds to wait for USB connected board to become available", - ) - group = cmd_parser.add_mutually_exclusive_group() - group.add_argument( - "--follow", - action="store_true", - help="follow the output after running the scripts [default if no scripts given]", - ) - group.add_argument( - "--no-follow", - action="store_true", - help="Do not follow the output after running the scripts.", - ) - cmd_parser.add_argument( - "-f", "--filesystem", action="store_true", help="perform a filesystem action" - ) - cmd_parser.add_argument("files", nargs="*", help="input files") - args = cmd_parser.parse_args() - # open the connection to the qpyoard - try: - qpy = Quecpython(args.device, args.baudrate, args.wait) - except QuecpythonError as er: - print(er) - sys.exit(1) - - # run any command or file(s) - if args.command is not None or args.filesystem or len(args.files): - # we must enter raw-REPL mode to execute commands - # this will do a soft-reset of the board - try: - qpy.enter_raw_repl() - except QuecpythonError as er: - print(er) - qpy.close() - sys.exit(1) - - def execbuffer(buf): - try: - if args.no_follow: - qpy.exec_raw_no_follow(buf) - ret_err = None - else: - ret, ret_err = qpy.exec_raw( - buf, timeout=None, data_consumer=stdout_write_bytes - ) - except QuecpythonError as er: - print(er) - qpy.close() - sys.exit(1) - except KeyboardInterrupt: - sys.exit(1) - if ret_err: - qpy.exit_raw_repl() - qpy.close() - stdout_write_bytes(ret_err) - sys.exit(1) - - # do filesystem commands, if given - if args.filesystem: - filesystem_command(qpy, args.files) - del args.files[:] - - # run the command, if given - if args.command is not None: - execbuffer(args.command.encode("utf-8")) - - # run any files - for filename in args.files: - with open(filename, "rb") as f: - pyfile = f.read() - execbuffer(pyfile) - - # exiting raw-REPL just drops to friendly-REPL mode - qpy.exit_raw_repl() - - # if asked explicitly, or no files given, then follow the output - if args.follow or (args.command is None and not args.filesystem and len(args.files) == 0): - try: - ret, ret_err = qpy.follow(timeout=None, data_consumer=stdout_write_bytes) - except QuecpythonError as er: - print(er) - sys.exit(1) - except KeyboardInterrupt: - sys.exit(1) - if ret_err: - qpy.close() - stdout_write_bytes(ret_err) - sys.exit(1) - - # close the connection to the EC100Y - qpy.close() - - -if __name__ == "__main__": - main() \ No newline at end of file diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/example_display_char.py" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/example_display_char.py" deleted file mode 100644 index 96740663831ca30b8618bd789ecc5864453378b1..0000000000000000000000000000000000000000 --- "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/example_display_char.py" +++ /dev/null @@ -1,67 +0,0 @@ -# -*- coding: UTF-8 -*- - - -import utime - -''' -如果用户使用的固件版本中没有checkNet库,请将checkNet.mpy文件上传到模块的usr目录, -并将 import checkNet 改为 from usr import checkNet -''' -import checkNet -from usr import st7789v - -''' -下面两个全局变量是必须有的,用户可以根据自己的实际项目修改下面两个全局变量的值, -在执行用户代码前,会先打印这两个变量的值。 -''' -PROJECT_NAME = "QuecPython_ST7789V_LCD_Example" -PROJECT_VERSION = "1.0.0" - -checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION) -lcd_st7789v = st7789v.ST7789V(240, 240) - - -if __name__ == '__main__': - ''' - 手动运行本例程时,可以去掉该延时,如果将例程文件名改为main.py,希望开机自动运行时,需要加上该延时, - 否则无法从CDC口看到下面的 poweron_print_once() 中打印的信息 - ''' - # utime.sleep(5) - checknet.poweron_print_once() - - ''' - 如果用户程序包含网络相关代码,必须执行 wait_network_connected() 等待网络就绪(拨号成功); - 如果是网络无关代码,可以屏蔽 wait_network_connected() - ''' - # checknet.wait_network_connected() - - # 用户代码 - '''######################【User code star】###################################################''' - fc = 0x0000 # 字体颜色 黑色 可根据需要修改 - bc = 0xffff # 背景颜色 白色 可根据需要修改 - - # 8x16 ASCII字符显示 - lcd_st7789v.lcd_show_ascii(0, 0, 8, 16, 'A', fc, bc) - lcd_st7789v.lcd_show_ascii(8, 0, 8, 16, 'b', fc, bc) - lcd_st7789v.lcd_show_ascii(16, 0, 8, 16, '$', fc, bc) - lcd_st7789v.lcd_show_ascii(24, 0, 8, 16, '8', fc, bc) - - # 16x24 ASCII字符显示 - lcd_st7789v.lcd_show_ascii(0, 20, 16, 24, 'A', fc, bc) - lcd_st7789v.lcd_show_ascii(16, 20, 16, 24, 'b', fc, bc) - lcd_st7789v.lcd_show_ascii(32, 20, 16, 24, '$', fc, bc) - lcd_st7789v.lcd_show_ascii(48, 20, 16, 24, '8', fc, bc) - - # 16x16 汉字显示 - lcd_st7789v.lcd_show_chinese(0, 50, 16, 16, '移', fc, bc) - lcd_st7789v.lcd_show_chinese(16, 50, 16, 16, '远', fc, bc) - lcd_st7789v.lcd_show_chinese(32, 50, 16, 16, '通', fc, bc) - lcd_st7789v.lcd_show_chinese(48, 50, 16, 16, '信', fc, bc) - - # # 16x24 汉字显示 - lcd_st7789v.lcd_show_chinese(0, 70, 16, 24, '移', fc, bc) - lcd_st7789v.lcd_show_chinese(16, 70, 16, 24, '远', fc, bc) - lcd_st7789v.lcd_show_chinese(32, 70, 16, 24, '通', fc, bc) - lcd_st7789v.lcd_show_chinese(48, 70, 16, 24, '信', fc, bc) - - '''######################【User code end 】###################################################''' diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/fonts.py" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/fonts.py" deleted file mode 100644 index 70c0fdcd45b884d64b680e39a194939da36162c2..0000000000000000000000000000000000000000 --- "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/fonts.py" +++ /dev/null @@ -1,462 +0,0 @@ - - -''' -16 x 16 汉字字库 -宋体、阴码,逐行式,顺向(高位在前) -''' -hanzi_16x16_dict = { - '移' : (0x08, 0x20, 0x1C, 0x20, 0xF0, 0x7C, 0x10, 0x84, 0x11, 0x48, 0xFC, 0x30, 0x10, 0x20, 0x30, 0x48, - 0x39, 0x90, 0x54, 0x3E, 0x54, 0x42, 0x91, 0xA4, 0x10, 0x18, 0x10, 0x10, 0x10, 0x60, 0x11, 0x80), - '远' : (0x00, 0x00, 0x23, 0xF8, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x07, 0xFC, 0xF1, 0x20, 0x11, 0x20, - 0x11, 0x20, 0x11, 0x20, 0x11, 0x24, 0x12, 0x24, 0x12, 0x24, 0x14, 0x1C, 0x28, 0x00, 0x47, 0xFE), - '通' : (0x00, 0x00, 0x47, 0xF8, 0x20, 0x10, 0x21, 0xA0, 0x00, 0x40, 0x07, 0xFC, 0xE4, 0x44, 0x24, 0x44, - 0x27, 0xFC, 0x24, 0x44, 0x24, 0x44, 0x27, 0xFC, 0x24, 0x44, 0x24, 0x54, 0x54, 0x08, 0x8F, 0xFE), - '信' : (0x08, 0x40, 0x08, 0x20, 0x0B, 0xFE, 0x10, 0x00, 0x10, 0x00, 0x31, 0xFC, 0x30, 0x00, 0x50, 0x00, - 0x91, 0xFC, 0x10, 0x00, 0x10, 0x00, 0x11, 0xFC, 0x11, 0x04, 0x11, 0x04, 0x11, 0xFC, 0x11, 0x04), -} - -''' -16 x 24 汉字字库 -宋体、阴码,逐行式,顺向(高位在前) -''' -hanzi_16x24_dict = { - '移' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x0E, 0x60, 0x38, 0x44, 0x08, 0x7C, 0x08, 0xCC, 0x09, 0x68, - 0x0A, 0x30, 0x7C, 0x10, 0x08, 0x20, 0x18, 0x50, 0x1C, 0xB0, 0x1B, 0x22, 0x2A, 0x5E, 0x28, 0x44, - 0x28, 0xC4, 0x49, 0x28, 0x08, 0x28, 0x08, 0x10, 0x08, 0x20, 0x08, 0xC0, 0x0F, 0x00, 0x00, 0x00,), - '远' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x13, 0xF8, 0x10, 0x00, 0x10, 0x00, 0x00, 0x04, - 0x03, 0x5C, 0x00, 0xA0, 0x70, 0xA0, 0x11, 0x20, 0x11, 0x20, 0x11, 0x20, 0x11, 0x20, 0x11, 0x24, - 0x12, 0x24, 0x12, 0x36, 0x14, 0x1C, 0x68, 0x00, 0x46, 0x00, 0x43, 0xFC, 0x00, 0x00, 0x00, 0x00,), - '通' : (0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0x20, 0x08, 0x10, 0x90, 0x10, 0x60, 0x00, 0x44, 0x03, 0xFC, - 0x02, 0x44, 0x12, 0x44, 0x73, 0xFC, 0x12, 0x44, 0x12, 0x44, 0x12, 0x44, 0x13, 0xFC, 0x12, 0x44, - 0x12, 0x44, 0x12, 0x44, 0x12, 0x4C, 0x28, 0x00, 0x46, 0x00, 0x43, 0xFE, 0x00, 0x00, 0x00, 0x00,), - '信' : (0x00, 0x00, 0x08, 0x00, 0x0C, 0x40, 0x08, 0x40, 0x08, 0x20, 0x17, 0xFE, 0x10, 0x00, 0x10, 0x00, - 0x10, 0x08, 0x31, 0xF0, 0x30, 0x00, 0x50, 0x00, 0x53, 0xFC, 0x10, 0x00, 0x10, 0x00, 0x10, 0xFC, - 0x11, 0x04, 0x11, 0x04, 0x11, 0x04, 0x11, 0x04, 0x11, 0xF8, 0x11, 0x04, 0x10, 0x00, 0x00, 0x00,), -} - -''' -24 x 24 汉字字库 -宋体、阴码,逐行式,顺向(高位在前) -''' -hanzi_24x24_dict = { - '移' : (0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x01,0xC3,0x00,0x1F,0x02,0x00,0x02, - 0x07,0xF8,0x02,0x04,0x18,0x02,0x0A,0x30,0x02,0x53,0x60,0x7F,0xE1,0xC0,0x06,0x01, - 0x80,0x06,0x03,0xC0,0x07,0x0D,0x80,0x0E,0xF3,0xFC,0x0A,0x46,0x0C,0x12,0x4C,0x08, - 0x12,0x12,0x10,0x22,0x21,0x30,0x42,0x01,0x60,0x02,0x00,0x80,0x02,0x03,0x00,0x02, - 0x1C,0x00,0x02,0xE0,0x00,0x00,0x00,0x00,), - '远' : (0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x20,0x08,0x7F,0xF0,0x0C,0x00,0x00,0x04, - 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x01,0xFF,0xFC,0x00,0x18,0x80,0x7E,0x18, - 0x80,0x04,0x18,0x80,0x04,0x10,0x80,0x04,0x10,0x80,0x04,0x10,0x88,0x04,0x20,0x88, - 0x04,0x60,0x8C,0x04,0xC0,0xFC,0x1B,0x00,0x00,0x31,0x00,0x00,0x60,0xFF,0xFE,0x00, - 0x1F,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,), - '通' : (0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0xE0,0x10,0x00,0x30,0x08,0x08,0xC0,0x0C, - 0x07,0x00,0x0C,0x03,0x00,0x00,0x7F,0xF8,0x00,0x42,0x08,0x00,0x42,0x08,0x7C,0x7F, - 0xF8,0x04,0x42,0x08,0x04,0x42,0x08,0x04,0x42,0x08,0x04,0x7F,0xF8,0x04,0x42,0x08, - 0x04,0x42,0x08,0x04,0x42,0x08,0x04,0x42,0x18,0x1A,0x42,0x38,0x31,0x80,0x10,0x60, - 0xFF,0xFC,0x00,0x1F,0xF8,0x00,0x00,0x00,), - '信' : (0x00,0x00,0x00,0x00,0x04,0x00,0x03,0x02,0x00,0x02,0x03,0x00,0x02,0x03,0x08,0x04, - 0xFF,0xFC,0x04,0x00,0x00,0x08,0x00,0x10,0x0C,0x7F,0xF8,0x14,0x00,0x00,0x14,0x00, - 0x10,0x24,0x7F,0xF8,0x44,0x00,0x00,0x04,0x00,0x00,0x04,0x00,0x00,0x04,0x3F,0xF8, - 0x04,0x20,0x10,0x04,0x20,0x10,0x04,0x20,0x10,0x04,0x20,0x10,0x04,0x3F,0xF0,0x04, - 0x20,0x10,0x04,0x20,0x10,0x00,0x00,0x00,), -} - - -''' -常用ASCII字符集 -字宽:8 【实际取模时,字宽设置为16,对应英文字宽则为8】 -字高:16 -宋体、阴码,逐行式,顺向(高位在前) -''' -ascii_8x16_dict = { - ' ' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), - '!' : (0x00, 0x00, 0x00, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00, 0x10, 0x10, 0x00, 0x00,), - '"' : (0x00, 0x12, 0x24, 0x24, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), - "#" : (0x00, 0x00, 0x00, 0x12, 0x12, 0x12, 0x7E, 0x24, 0x24, 0x24, 0x7E, 0x24, 0x24, 0x24, 0x00, 0x00,), - '$' : (0x00, 0x00, 0x08, 0x3C, 0x4A, 0x4A, 0x48, 0x38, 0x0C, 0x0A, 0x0A, 0x4A, 0x4A, 0x3C, 0x08, 0x08,), - '%' : (0x00, 0x00, 0x00, 0x44, 0xA4, 0xA8, 0xA8, 0xB0, 0x54, 0x1A, 0x2A, 0x2A, 0x4A, 0x44, 0x00, 0x00,), - '&' : (0x00, 0x00, 0x00, 0x30, 0x48, 0x48, 0x48, 0x50, 0x6E, 0xA4, 0x94, 0x98, 0x89, 0x76, 0x00, 0x00,), - "'" : (0x00, 0x60, 0x20, 0x20, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), - '(' : (0x00, 0x02, 0x04, 0x08, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x08, 0x08, 0x04, 0x02, 0x00,), - ')' : (0x00, 0x40, 0x20, 0x10, 0x10, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x10, 0x10, 0x20, 0x40, 0x00,), - '*' : (0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0xD6, 0x38, 0x38, 0xD6, 0x10, 0x10, 0x00, 0x00, 0x00, 0x00,), - '+' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x08, 0x08, 0x7F, 0x08, 0x08, 0x08, 0x00, 0x00, 0x00, 0x00,), - ',' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x20, 0x20, 0x40,), - '-' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), - '.' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x60, 0x00, 0x00,), - '/' : (0x00, 0x00, 0x02, 0x04, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x10, 0x20, 0x20, 0x40, 0x40, 0x00,), - '0' : (0x00, 0x00, 0x00, 0x18, 0x24, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x24, 0x18, 0x00, 0x00,), - '1' : (0x00, 0x00, 0x00, 0x08, 0x38, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x3E, 0x00, 0x00,), - '2' : (0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x02, 0x04, 0x08, 0x10, 0x20, 0x42, 0x7E, 0x00, 0x00,), - '3' : (0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x02, 0x04, 0x18, 0x04, 0x02, 0x42, 0x42, 0x3C, 0x00, 0x00,), - '4' : (0x00, 0x00, 0x00, 0x04, 0x0C, 0x0C, 0x14, 0x24, 0x24, 0x44, 0x7F, 0x04, 0x04, 0x1F, 0x00, 0x00,), - '5' : (0x00, 0x00, 0x00, 0x7E, 0x40, 0x40, 0x40, 0x78, 0x44, 0x02, 0x02, 0x42, 0x44, 0x38, 0x00, 0x00,), - '6' : (0x00, 0x00, 0x00, 0x18, 0x24, 0x40, 0x40, 0x5C, 0x62, 0x42, 0x42, 0x42, 0x22, 0x1C, 0x00, 0x00,), - '7' : (0x00, 0x00, 0x00, 0x7E, 0x42, 0x04, 0x04, 0x08, 0x08, 0x10, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00,), - '8' : (0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x24, 0x18, 0x24, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00,), - '9' : (0x00, 0x00, 0x00, 0x38, 0x44, 0x42, 0x42, 0x42, 0x46, 0x3A, 0x02, 0x02, 0x24, 0x18, 0x00, 0x00,), - ':' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,), - ';' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x10,), - '<' : (0x00, 0x00, 0x00, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x00, 0x00,), - '=' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), - '>' : (0x00, 0x00, 0x00, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x00, 0x00,), - '?' : (0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x62, 0x04, 0x08, 0x08, 0x08, 0x00, 0x18, 0x18, 0x00, 0x00,), - '@' : (0x00, 0x00, 0x00, 0x38, 0x44, 0x5A, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0x5C, 0x42, 0x3C, 0x00, 0x00,), - 'A' : (0x00, 0x00, 0x00, 0x10, 0x10, 0x18, 0x28, 0x28, 0x24, 0x3C, 0x44, 0x42, 0x42, 0xE7, 0x00, 0x00,), - 'B' : (0x00, 0x00, 0x00, 0xF8, 0x44, 0x44, 0x44, 0x78, 0x44, 0x42, 0x42, 0x42, 0x44, 0xF8, 0x00, 0x00,), - 'C' : (0x00, 0x00, 0x00, 0x3E, 0x42, 0x42, 0x80, 0x80, 0x80, 0x80, 0x80, 0x42, 0x44, 0x38, 0x00, 0x00,), - 'D' : (0x00, 0x00, 0x00, 0xF8, 0x44, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x44, 0xF8, 0x00, 0x00,), - 'E' : (0x00, 0x00, 0x00, 0xFC, 0x42, 0x48, 0x48, 0x78, 0x48, 0x48, 0x40, 0x42, 0x42, 0xFC, 0x00, 0x00,), - 'F' : (0x00, 0x00, 0x00, 0xFC, 0x42, 0x48, 0x48, 0x78, 0x48, 0x48, 0x40, 0x40, 0x40, 0xE0, 0x00, 0x00,), - 'G' : (0x00, 0x00, 0x00, 0x3C, 0x44, 0x44, 0x80, 0x80, 0x80, 0x8E, 0x84, 0x44, 0x44, 0x38, 0x00, 0x00,), - 'H' : (0x00, 0x00, 0x00, 0xE7, 0x42, 0x42, 0x42, 0x42, 0x7E, 0x42, 0x42, 0x42, 0x42, 0xE7, 0x00, 0x00,), - 'I' : (0x00, 0x00, 0x00, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00,), - 'J' : (0x00, 0x00, 0x00, 0x3E, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x88, 0xF0,), - 'K' : (0x00, 0x00, 0x00, 0xEE, 0x44, 0x48, 0x50, 0x70, 0x50, 0x48, 0x48, 0x44, 0x44, 0xEE, 0x00, 0x00,), - 'L' : (0x00, 0x00, 0x00, 0xE0, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x42, 0xFE, 0x00, 0x00,), - 'M' : (0x00, 0x00, 0x00, 0xEE, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x54, 0x54, 0x54, 0x54, 0xD6, 0x00, 0x00,), - 'N' : (0x00, 0x00, 0x00, 0xC7, 0x62, 0x62, 0x52, 0x52, 0x4A, 0x4A, 0x4A, 0x46, 0x46, 0xE2, 0x00, 0x00,), - 'O' : (0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0x44, 0x38, 0x00, 0x00,), - 'P' : (0x00, 0x00, 0x00, 0xFC, 0x42, 0x42, 0x42, 0x42, 0x7C, 0x40, 0x40, 0x40, 0x40, 0xE0, 0x00, 0x00,), - 'Q' : (0x00, 0x00, 0x00, 0x38, 0x44, 0x82, 0x82, 0x82, 0x82, 0x82, 0x82, 0xB2, 0x4C, 0x38, 0x06, 0x00,), - 'R' : (0x00, 0x00, 0x00, 0xFC, 0x42, 0x42, 0x42, 0x7C, 0x48, 0x48, 0x44, 0x44, 0x42, 0xE3, 0x00, 0x00,), - 'S' : (0x00, 0x00, 0x00, 0x3E, 0x42, 0x42, 0x40, 0x20, 0x18, 0x04, 0x02, 0x42, 0x42, 0x7C, 0x00, 0x00,), - 'T' : (0x00, 0x00, 0x00, 0xFE, 0x92, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00,), - 'U' : (0x00, 0x00, 0x00, 0xE7, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00,), - 'V' : (0x00, 0x00, 0x00, 0xE7, 0x42, 0x42, 0x44, 0x24, 0x24, 0x28, 0x28, 0x18, 0x10, 0x10, 0x00, 0x00,), - 'W' : (0x00, 0x00, 0x00, 0xD6, 0x54, 0x54, 0x54, 0x54, 0x54, 0x6C, 0x28, 0x28, 0x28, 0x28, 0x00, 0x00,), - 'X' : (0x00, 0x00, 0x00, 0xE7, 0x42, 0x24, 0x24, 0x18, 0x18, 0x18, 0x24, 0x24, 0x42, 0xE7, 0x00, 0x00,), - 'Y' : (0x00, 0x00, 0x00, 0xEE, 0x44, 0x44, 0x28, 0x28, 0x10, 0x10, 0x10, 0x10, 0x10, 0x38, 0x00, 0x00,), - 'Z' : (0x00, 0x00, 0x00, 0x7E, 0x84, 0x04, 0x08, 0x08, 0x10, 0x20, 0x20, 0x42, 0x42, 0xFC, 0x00, 0x00,), - '[' : (0x00, 0x1E, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x1E, 0x00,), - '\\' : (0x00, 0x00, 0x40, 0x20, 0x20, 0x20, 0x10, 0x10, 0x10, 0x08, 0x08, 0x04, 0x04, 0x04, 0x02, 0x02,), - ']' : (0x00, 0x78, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x78, 0x00,), - '^' : (0x00, 0x18, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), - '_' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF,), - '`' : (0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), - 'a' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x44, 0x0C, 0x34, 0x44, 0x4C, 0x36, 0x00, 0x00,), - 'b' : (0x00, 0x00, 0x00, 0x00, 0xC0, 0x40, 0x40, 0x58, 0x64, 0x42, 0x42, 0x42, 0x64, 0x58, 0x00, 0x00,), - 'c' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x22, 0x40, 0x40, 0x40, 0x22, 0x1C, 0x00, 0x00,), - 'd' : (0x00, 0x00, 0x00, 0x00, 0x06, 0x02, 0x02, 0x3E, 0x42, 0x42, 0x42, 0x42, 0x46, 0x3B, 0x00, 0x00,), - 'e' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x7E, 0x40, 0x42, 0x3C, 0x00, 0x00,), - 'f' : (0x00, 0x00, 0x00, 0x00, 0x0C, 0x12, 0x10, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00,), - 'g' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x44, 0x44, 0x38, 0x40, 0x3C, 0x42, 0x42, 0x3C,), - 'h' : (0x00, 0x00, 0x00, 0x00, 0xC0, 0x40, 0x40, 0x5C, 0x62, 0x42, 0x42, 0x42, 0x42, 0xE7, 0x00, 0x00,), - 'i' : (0x00, 0x00, 0x00, 0x30, 0x30, 0x00, 0x00, 0x70, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00,), - 'j' : (0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x1C, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x44, 0x78,), - 'k' : (0x00, 0x00, 0x00, 0x00, 0xC0, 0x40, 0x40, 0x4E, 0x48, 0x50, 0x70, 0x48, 0x44, 0xEE, 0x00, 0x00,), - 'l' : (0x00, 0x00, 0x00, 0x10, 0x70, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x7C, 0x00, 0x00,), - 'm' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x49, 0x49, 0x49, 0x49, 0x49, 0xED, 0x00, 0x00,), - 'n' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDC, 0x62, 0x42, 0x42, 0x42, 0x42, 0xE7, 0x00, 0x00,), - 'o' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x42, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x00, 0x00,), - 'p' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x64, 0x42, 0x42, 0x42, 0x64, 0x58, 0x40, 0xE0,), - 'q' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x26, 0x42, 0x42, 0x42, 0x26, 0x1A, 0x02, 0x07,), - 'r' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0x32, 0x20, 0x20, 0x20, 0x20, 0xF8, 0x00, 0x00,), - 's' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x42, 0x40, 0x3C, 0x02, 0x42, 0x7C, 0x00, 0x00,), - 't' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x7C, 0x10, 0x10, 0x10, 0x10, 0x12, 0x0C, 0x00, 0x00,), - 'u' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x42, 0x42, 0x42, 0x42, 0x46, 0x3B, 0x00, 0x00,), - 'v' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEE, 0x44, 0x44, 0x28, 0x28, 0x10, 0x10, 0x00, 0x00,), - 'w' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0x89, 0x4A, 0x5A, 0x54, 0x24, 0x24, 0x00, 0x00,), - 'x' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x24, 0x18, 0x18, 0x18, 0x24, 0x6E, 0x00, 0x00,), - 'y' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x42, 0x24, 0x24, 0x18, 0x18, 0x10, 0x10, 0x60,), - 'z' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x44, 0x08, 0x10, 0x10, 0x22, 0x7E, 0x00, 0x00,), - '{' : (0x00, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x08, 0x04, 0x04, 0x04, 0x04, 0x04, 0x03, 0x00,), - '|' : (0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,), - '}' : (0x00, 0xC0, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x10, 0x20, 0x20, 0x20, 0x20, 0x20, 0xC0, 0x00,), - '~' : (0x20, 0x5A, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,), -} - - -''' -常用ASCII字符集 -字宽:16 【实际取模时,字宽设置为32,对应英文字宽则为16】 -字高:24 -宋体、阴码,逐行式,顺向(高位在前) -''' -ascii_16x24_dict = { - ' ' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '!' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x03, 0xC0, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '"' : (0x00, 0x00, 0x00, 0x00, 0x03, 0x18, 0x07, 0x38, 0x0E, 0x70, 0x18, 0xC0, 0x10, 0x80, 0x21, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '#' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x04, 0x08, 0x04, 0x18, 0x0C, 0x10, - 0x7F, 0xFE, 0x7F, 0xFE, 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, 0x08, 0x10, 0x7F, 0xFE, - 0x7F, 0xFE, 0x18, 0x20, 0x10, 0x20, 0x10, 0x20, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '$' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0xC0, 0x07, 0xB0, 0x19, 0x98, 0x19, 0x98, - 0x19, 0xB8, 0x1D, 0x80, 0x0F, 0x80, 0x07, 0x80, 0x01, 0xC0, 0x01, 0xF0, 0x01, 0xB8, 0x01, 0x98, - 0x39, 0x98, 0x39, 0x98, 0x31, 0x98, 0x19, 0xB0, 0x07, 0xC0, 0x01, 0x80, 0x01, 0x80, 0x00, 0x00), - '%' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x64, 0x10, 0x46, 0x10, 0xC6, 0x20, - 0xC6, 0x40, 0xC6, 0x40, 0x46, 0x80, 0x44, 0x80, 0x3D, 0x18, 0x01, 0x64, 0x02, 0x46, 0x02, 0x42, - 0x04, 0x42, 0x04, 0x42, 0x08, 0x46, 0x10, 0x64, 0x10, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '&' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x08, 0x80, 0x10, 0xC0, 0x10, 0xC0, - 0x10, 0xC0, 0x19, 0x80, 0x19, 0x00, 0x1E, 0x20, 0x1C, 0x18, 0x2E, 0x10, 0x46, 0x10, 0x43, 0x10, - 0xC3, 0xA0, 0xC1, 0xE0, 0x60, 0xE1, 0x31, 0xF2, 0x1E, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - "'" : (0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x20, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '(' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x08, 0x00, 0x30, 0x00, 0x20, 0x00, 0x40, 0x00, 0xC0, - 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x00, 0xC0, 0x00, 0xC0, 0x00, 0x60, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x00), - ')' : (0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x06, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x06, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x60, 0x00, 0x00, 0x00), - '*' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x71, 0x8E, 0x79, 0xBC, 0x0F, 0x60, 0x01, 0x80, 0x0F, 0x70, 0x79, 0x9E, 0x61, 0x8E, - 0x01, 0x80, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '+' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, - 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, 0x7F, 0xFE, 0x00, 0x80, 0x00, 0x80, 0x00, 0x80, - 0x00, 0x80, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - ',' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x20, 0x00), - '-' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '.' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x3C, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '/' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, - 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x80, 0x01, 0x80, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x20, 0x00, 0x40, 0x00, 0x00, 0x00), - '0' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x06, 0x60, 0x1C, 0x18, 0x18, 0x18, - 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, - 0x30, 0x0C, 0x18, 0x18, 0x18, 0x18, 0x0C, 0x30, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '1' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x07, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0xC0, 0x0F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '2' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x0C, 0x30, 0x10, 0x18, 0x30, 0x0C, - 0x38, 0x0C, 0x38, 0x1C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x02, 0x00, - 0x04, 0x00, 0x18, 0x04, 0x30, 0x0C, 0x3F, 0xF8, 0x3F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '3' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0x08, 0x70, 0x10, 0x38, 0x38, 0x18, - 0x18, 0x18, 0x00, 0x18, 0x00, 0x30, 0x00, 0xE0, 0x01, 0xE0, 0x00, 0x18, 0x00, 0x18, 0x00, 0x0C, - 0x10, 0x0C, 0x38, 0x0C, 0x30, 0x18, 0x18, 0x30, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '4' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x70, 0x00, 0xF0, 0x00, 0xF0, - 0x01, 0x70, 0x02, 0x70, 0x04, 0x70, 0x08, 0x70, 0x18, 0x70, 0x10, 0x70, 0x20, 0x70, 0x7F, 0xFE, - 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x00, 0x70, 0x03, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '5' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x10, 0x00, 0x10, 0x00, - 0x10, 0x00, 0x10, 0x00, 0x13, 0xC0, 0x1C, 0x30, 0x10, 0x18, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x0C, - 0x38, 0x0C, 0x38, 0x0C, 0x30, 0x18, 0x18, 0x30, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '6' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x06, 0x18, 0x08, 0x18, 0x18, 0x18, - 0x30, 0x00, 0x30, 0x00, 0x30, 0xC0, 0x37, 0x38, 0x38, 0x1C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, - 0x30, 0x0C, 0x30, 0x0C, 0x18, 0x08, 0x0C, 0x10, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '7' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x30, 0x08, 0x20, 0x10, - 0x20, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x40, 0x00, 0x80, 0x01, 0x80, 0x01, 0x80, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x80, 0x03, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '8' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x0C, 0x30, 0x30, 0x08, 0x30, 0x0C, - 0x30, 0x0C, 0x30, 0x0C, 0x1C, 0x18, 0x0F, 0x20, 0x07, 0xE0, 0x18, 0x70, 0x30, 0x18, 0x20, 0x0C, - 0x60, 0x0C, 0x60, 0x0C, 0x30, 0x0C, 0x18, 0x18, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '9' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x0C, 0x70, 0x30, 0x18, 0x30, 0x18, - 0x70, 0x0C, 0x70, 0x0C, 0x70, 0x0C, 0x30, 0x1C, 0x30, 0x3C, 0x1C, 0x6C, 0x07, 0x8C, 0x00, 0x1C, - 0x00, 0x18, 0x00, 0x18, 0x18, 0x30, 0x18, 0x60, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - ':' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x03, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x03, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - ';' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x03, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00, 0x00), - '<' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x20, 0x00, 0xC0, - 0x01, 0x80, 0x02, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x30, 0x00, 0x18, 0x00, 0x04, 0x00, 0x03, 0x00, - 0x01, 0x80, 0x00, 0x40, 0x00, 0x30, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '=' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0xFE, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '>' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x18, 0x00, 0x04, 0x00, 0x03, 0x00, - 0x01, 0x80, 0x00, 0x40, 0x00, 0x30, 0x00, 0x18, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x20, 0x00, 0xC0, - 0x01, 0x80, 0x02, 0x00, 0x0C, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '?' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x18, 0x18, 0x30, 0x0C, 0x20, 0x0C, - 0x30, 0x0C, 0x38, 0x0C, 0x00, 0x1C, 0x00, 0x38, 0x00, 0xE0, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x00, 0x00, 0x01, 0x80, 0x03, 0x80, 0x03, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '@' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x06, 0x18, 0x08, 0x04, 0x10, 0x7E, - 0x31, 0x92, 0x23, 0x12, 0x62, 0x32, 0x66, 0x32, 0x66, 0x32, 0x64, 0x22, 0x64, 0x62, 0x24, 0x64, - 0x33, 0xB8, 0x30, 0x02, 0x18, 0x04, 0x0C, 0x18, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'A' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x80, 0x02, 0x80, 0x02, 0xC0, - 0x02, 0xC0, 0x04, 0x40, 0x04, 0x60, 0x04, 0x60, 0x08, 0x60, 0x08, 0x30, 0x0F, 0xF0, 0x10, 0x30, - 0x10, 0x18, 0x10, 0x18, 0x20, 0x18, 0x20, 0x1C, 0xF8, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'B' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xF0, 0x18, 0x18, 0x18, 0x0C, - 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x18, 0x18, 0x60, 0x1F, 0xB0, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0E, - 0x18, 0x0E, 0x18, 0x0E, 0x18, 0x0C, 0x18, 0x18, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'C' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x06, 0x1C, 0x18, 0x04, 0x18, 0x06, - 0x30, 0x02, 0x30, 0x00, 0x70, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x70, 0x00, - 0x30, 0x02, 0x30, 0x04, 0x18, 0x04, 0x0C, 0x18, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'D' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xE0, 0x18, 0x18, 0x18, 0x1C, - 0x18, 0x0C, 0x18, 0x0E, 0x18, 0x0E, 0x18, 0x0E, 0x18, 0x0E, 0x18, 0x0E, 0x18, 0x0E, 0x18, 0x0C, - 0x18, 0x0C, 0x18, 0x1C, 0x18, 0x18, 0x18, 0x60, 0x7F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'E' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x18, 0x04, 0x18, 0x02, - 0x18, 0x00, 0x18, 0x10, 0x18, 0x10, 0x18, 0x30, 0x1F, 0xF0, 0x18, 0x10, 0x18, 0x10, 0x18, 0x00, - 0x18, 0x00, 0x18, 0x02, 0x18, 0x04, 0x18, 0x0C, 0x7F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'F' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x18, 0x06, 0x18, 0x02, - 0x18, 0x00, 0x18, 0x00, 0x18, 0x10, 0x18, 0x10, 0x1F, 0xF0, 0x18, 0x10, 0x18, 0x10, 0x18, 0x00, - 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'G' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xC8, 0x0E, 0x38, 0x18, 0x18, 0x30, 0x08, - 0x30, 0x04, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x20, 0x60, 0x1C, 0x60, 0x18, - 0x30, 0x18, 0x30, 0x18, 0x18, 0x18, 0x0C, 0x18, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'H' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1C, 0x30, 0x0C, 0x30, 0x0C, - 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x3F, 0xFC, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, - 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0xFC, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'I' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xF0, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x1F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'J' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xFC, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x70, 0x40, 0x71, 0x80, 0x1E, 0x00), - 'K' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x3C, 0x18, 0x30, 0x18, 0x20, - 0x18, 0x40, 0x18, 0x80, 0x19, 0x00, 0x1B, 0x80, 0x1D, 0x80, 0x18, 0xC0, 0x18, 0xC0, 0x18, 0x60, - 0x18, 0x30, 0x18, 0x30, 0x18, 0x18, 0x18, 0x1C, 0x7E, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'L' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x18, 0x00, 0x18, 0x00, - 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, - 0x18, 0x00, 0x18, 0x02, 0x18, 0x06, 0x18, 0x0C, 0x7F, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'M' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x1E, 0x30, 0x1C, 0x38, 0x1C, - 0x38, 0x2C, 0x28, 0x2C, 0x2C, 0x2C, 0x2C, 0x4C, 0x2C, 0x4C, 0x24, 0x4C, 0x26, 0x8C, 0x26, 0x8C, - 0x22, 0x8C, 0x23, 0x0C, 0x23, 0x0C, 0x23, 0x0C, 0xF1, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'N' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0E, 0x38, 0x04, 0x2C, 0x04, - 0x26, 0x04, 0x27, 0x04, 0x23, 0x04, 0x21, 0x84, 0x21, 0xC4, 0x20, 0xC4, 0x20, 0x64, 0x20, 0x74, - 0x20, 0x34, 0x20, 0x1C, 0x20, 0x1C, 0x20, 0x0C, 0xF8, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'O' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x0C, 0x30, 0x18, 0x18, 0x30, 0x0C, - 0x30, 0x0C, 0x30, 0x0E, 0x70, 0x06, 0x70, 0x06, 0x70, 0x06, 0x70, 0x06, 0x70, 0x06, 0x30, 0x06, - 0x30, 0x0C, 0x30, 0x0C, 0x18, 0x08, 0x0C, 0x30, 0x03, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'P' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xF8, 0x18, 0x0C, 0x18, 0x0E, - 0x18, 0x06, 0x18, 0x06, 0x18, 0x0C, 0x18, 0x0C, 0x1F, 0xF0, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, - 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'Q' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x0C, 0x30, 0x18, 0x18, 0x30, 0x0C, - 0x30, 0x0C, 0x70, 0x0E, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x60, 0x06, 0x70, 0x0E, - 0x37, 0x8C, 0x38, 0xCC, 0x18, 0x78, 0x0C, 0x70, 0x03, 0xF0, 0x00, 0x3C, 0x00, 0x18, 0x00, 0x00), - 'R' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xF8, 0x18, 0x1C, 0x18, 0x0C, - 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x18, 0x18, 0x30, 0x1F, 0xC0, 0x18, 0xC0, 0x18, 0x60, 0x18, 0x60, - 0x18, 0x30, 0x18, 0x30, 0x18, 0x18, 0x18, 0x18, 0x7E, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'S' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x18, 0x38, 0x30, 0x18, 0x20, 0x08, - 0x20, 0x00, 0x30, 0x00, 0x38, 0x00, 0x0F, 0x00, 0x03, 0xE0, 0x00, 0x78, 0x00, 0x18, 0x00, 0x0C, - 0x40, 0x0C, 0x20, 0x0C, 0x30, 0x08, 0x38, 0x18, 0x27, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'T' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFC, 0x61, 0x84, 0x41, 0x82, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'U' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x30, 0x08, 0x30, 0x08, - 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, 0x30, 0x08, - 0x30, 0x08, 0x30, 0x08, 0x18, 0x08, 0x18, 0x30, 0x07, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'V' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x0C, 0x18, 0x08, 0x18, 0x08, - 0x18, 0x10, 0x1C, 0x10, 0x0C, 0x10, 0x0C, 0x20, 0x0E, 0x20, 0x06, 0x40, 0x06, 0x40, 0x06, 0x40, - 0x03, 0x80, 0x03, 0x80, 0x03, 0x80, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'W' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x86, 0x21, 0x84, 0x31, 0x84, - 0x30, 0x84, 0x31, 0xC4, 0x31, 0xC8, 0x11, 0xC8, 0x1A, 0xC8, 0x1A, 0x48, 0x1A, 0x70, 0x1A, 0x70, - 0x0C, 0x70, 0x0C, 0x70, 0x0C, 0x20, 0x0C, 0x20, 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'X' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1C, 0x18, 0x10, 0x0C, 0x10, - 0x06, 0x20, 0x06, 0x40, 0x03, 0x40, 0x03, 0x80, 0x01, 0x80, 0x01, 0xC0, 0x02, 0xC0, 0x02, 0x60, - 0x04, 0x70, 0x08, 0x30, 0x08, 0x18, 0x10, 0x1C, 0x7C, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'Y' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1C, 0x18, 0x08, 0x18, 0x10, - 0x0C, 0x10, 0x0C, 0x20, 0x06, 0x20, 0x06, 0x40, 0x03, 0x40, 0x03, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'Z' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0xFC, 0x30, 0x18, 0x20, 0x38, - 0x00, 0x30, 0x00, 0x60, 0x00, 0xC0, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, 0x07, 0x00, 0x06, 0x00, - 0x0C, 0x00, 0x18, 0x04, 0x18, 0x04, 0x30, 0x1C, 0x7F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '[' : (0x00, 0x00, 0x00, 0x00, 0x03, 0xFC, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0xFC, 0x00, 0x00), - '\\' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x18, 0x00, 0x08, 0x00, 0x0C, 0x00, - 0x06, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, 0x80, 0x00, 0x80, 0x00, 0xC0, 0x00, 0x40, - 0x00, 0x60, 0x00, 0x20, 0x00, 0x30, 0x00, 0x10, 0x00, 0x18, 0x00, 0x08, 0x00, 0x0C, 0x00, 0x04), - ']' : (0x00, 0x00, 0x00, 0x00, 0x3F, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, - 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, - 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x00, 0xC0, 0x3F, 0xC0, 0x00, 0x00), - '^' : (0x00, 0x00, 0x00, 0x00, 0x03, 0xC0, 0x0C, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '_' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF), - '`' : (0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x01, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'a' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x30, 0x10, 0x30, 0x18, 0x00, 0x18, 0x03, 0xF8, 0x1C, 0x18, - 0x30, 0x18, 0x70, 0x18, 0x70, 0x18, 0x30, 0x7A, 0x0F, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'b' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x30, 0x00, 0x10, 0x00, 0x10, 0x00, - 0x10, 0x00, 0x10, 0x00, 0x13, 0xF0, 0x14, 0x18, 0x18, 0x0C, 0x18, 0x0C, 0x10, 0x0C, 0x10, 0x0C, - 0x10, 0x0C, 0x10, 0x0C, 0x18, 0x08, 0x1C, 0x10, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'c' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x0C, 0x18, 0x18, 0x18, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, - 0x30, 0x00, 0x30, 0x04, 0x18, 0x08, 0x0C, 0x18, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'd' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, - 0x00, 0x18, 0x00, 0x18, 0x07, 0xD8, 0x0C, 0x38, 0x18, 0x18, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, - 0x30, 0x18, 0x30, 0x18, 0x18, 0x18, 0x0C, 0x7E, 0x03, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'e' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x08, 0x18, 0x18, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x3F, 0xF0, - 0x30, 0x00, 0x30, 0x00, 0x18, 0x08, 0x0C, 0x10, 0x03, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'f' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFE, 0x03, 0x06, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x3F, 0xF8, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'g' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0xCE, 0x08, 0x36, 0x18, 0x10, 0x10, 0x18, 0x18, 0x10, 0x08, 0x30, - 0x0F, 0xC0, 0x10, 0x00, 0x1F, 0x80, 0x0B, 0xF8, 0x30, 0x0C, 0x20, 0x0C, 0x30, 0x0C, 0x0F, 0xF0), - 'h' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, - 0x18, 0x00, 0x18, 0x00, 0x1B, 0xF0, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7C, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'i' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0xC0, 0x01, 0x80, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1F, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x1F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'j' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x38, 0x00, 0x30, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x01, 0xF0, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, - 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x30, 0x38, 0x20, 0x1F, 0xC0), - 'k' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, - 0x18, 0x00, 0x18, 0x00, 0x18, 0x7C, 0x18, 0x20, 0x18, 0x40, 0x19, 0x80, 0x1B, 0x80, 0x1C, 0xC0, - 0x18, 0x60, 0x18, 0x60, 0x18, 0x30, 0x18, 0x18, 0x7C, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'l' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, - 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x01, 0x80, 0x1F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'm' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xEF, 0x3C, 0x31, 0xC6, 0x21, 0x86, 0x21, 0x86, 0x21, 0x86, 0x21, 0x86, - 0x21, 0x86, 0x21, 0x86, 0x21, 0x86, 0x21, 0x86, 0xFB, 0xCF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'n' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7B, 0xF0, 0x1C, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, - 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x7C, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'o' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0xE0, 0x18, 0x18, 0x10, 0x0C, 0x30, 0x0C, 0x30, 0x0C, 0x30, 0x0C, - 0x30, 0x0C, 0x30, 0x0C, 0x10, 0x08, 0x08, 0x10, 0x07, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'p' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7B, 0xE0, 0x1C, 0x18, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0C, - 0x18, 0x0C, 0x18, 0x0C, 0x18, 0x0C, 0x1C, 0x38, 0x1B, 0xC0, 0x18, 0x00, 0x18, 0x00, 0x3C, 0x00), - 'q' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0xC8, 0x18, 0x38, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, - 0x30, 0x18, 0x30, 0x18, 0x30, 0x18, 0x18, 0x38, 0x07, 0xD8, 0x00, 0x18, 0x00, 0x18, 0x00, 0x3C), - 'r' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7C, 0x7C, 0x04, 0x8E, 0x05, 0x00, 0x06, 0x00, 0x04, 0x00, 0x04, 0x00, - 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x7F, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 's' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x07, 0xF8, 0x08, 0x18, 0x18, 0x08, 0x18, 0x00, 0x0F, 0x00, 0x01, 0xF0, - 0x00, 0x38, 0x00, 0x0C, 0x10, 0x0C, 0x18, 0x18, 0x17, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 't' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x03, 0x00, 0x07, 0x00, 0x3F, 0xF8, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x04, 0x03, 0x18, 0x00, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'u' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x70, 0x78, 0x10, 0x18, 0x10, 0x18, 0x10, 0x18, 0x10, 0x18, 0x10, 0x18, - 0x10, 0x18, 0x10, 0x18, 0x18, 0x18, 0x1C, 0x7E, 0x07, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'v' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7E, 0x3E, 0x18, 0x08, 0x08, 0x10, 0x0C, 0x10, 0x0C, 0x20, 0x06, 0x20, - 0x06, 0x40, 0x03, 0x40, 0x03, 0x80, 0x01, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'w' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xFB, 0xCF, 0x21, 0x84, 0x31, 0x84, 0x31, 0x88, 0x11, 0xC8, 0x1A, 0xC8, - 0x1A, 0x50, 0x0A, 0x70, 0x0C, 0x70, 0x0C, 0x20, 0x04, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'x' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x3E, 0x7C, 0x0C, 0x10, 0x06, 0x20, 0x03, 0x40, 0x01, 0x80, 0x01, 0x80, - 0x02, 0xC0, 0x04, 0x60, 0x0C, 0x30, 0x18, 0x18, 0x7C, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - 'y' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x7E, 0x3E, 0x18, 0x18, 0x0C, 0x10, 0x0C, 0x30, 0x06, 0x20, 0x06, 0x20, - 0x03, 0x40, 0x03, 0x40, 0x01, 0x80, 0x01, 0x80, 0x01, 0x00, 0x01, 0x00, 0x12, 0x00, 0x3C, 0x00), - 'z' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x1F, 0xF8, 0x10, 0x30, 0x20, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x03, 0x00, - 0x06, 0x00, 0x06, 0x04, 0x0C, 0x08, 0x18, 0x18, 0x3F, 0xF8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), - '{' : (0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x20, 0x00, 0x20, 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0xC0, 0x01, 0x80, 0x00, 0x40, 0x00, 0x60, 0x00, 0x60, - 0x00, 0x60, 0x00, 0x60, 0x00, 0x60, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x1C, 0x00, 0x00), - '|' : (0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00), - '}' : (0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x04, 0x00, 0x04, 0x00, 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, - 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0x80, 0x02, 0x00, 0x06, 0x00, 0x06, 0x00, - 0x06, 0x00, 0x06, 0x00, 0x06, 0x00, 0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x38, 0x00, 0x00, 0x00), - '~' : (0x00, 0x00, 0x1E, 0x00, 0x21, 0x82, 0x40, 0xC4, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00), -} \ No newline at end of file diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/readme.md" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/readme.md" deleted file mode 100644 index 9da12fe7041d364cfe643eabc8ec7380df6998fc..0000000000000000000000000000000000000000 --- "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/readme.md" +++ /dev/null @@ -1,17 +0,0 @@ -显示字符实验例程说明 - -1. 例程说明 - - 本例程基于 ST7789V LCD显示屏,型号240x240。 - -2. 文件说明 - -| 文件名 | 描述 | -| ----------------------- | ------------------------------------------------------------ | -| st7789v.py | 包含 ST7789V lcd 驱动初始化、写ASCII字符、写汉字以及显示图片的方法接口。 | -| fonts.py | 字库,提供常见ASCII字符的两种大小的字库,分别是8x16和16x24,同时包含了实验中用到汉字的几种不同大小的字库。用户可根据自己的需要制作字库,使用PCtoLCD2002软件,参照fonts.py中说明来制作。 | -| example_display_char.py | 主程序,调用st7789v.py和fonts.py中接口及信息来实现ASCII字符的显示与汉字的显示。 | - -3. 显示效果 - -显示结果 \ No newline at end of file diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/st7789v.py" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/st7789v.py" deleted file mode 100644 index 73ba2b363c32709d258fce3195384f699b9dfdbb..0000000000000000000000000000000000000000 --- "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/st7789v.py" +++ /dev/null @@ -1,317 +0,0 @@ -# -*- coding: UTF-8 -*- - -import log -from machine import LCD -from usr import fonts - -XSTART_H = 0xf0 -XSTART_L = 0xf1 -YSTART_H = 0xf2 -YSTART_L = 0xf3 -XEND_H = 0xE0 -XEND_L = 0xE1 -YEND_H = 0xE2 -YEND_L = 0xE3 - - -XSTART = 0xD0 -XEND = 0xD1 -YSTART = 0xD2 -YEND = 0xD3 - - -class ST7789V(): - def __init__(self, width, hight): - self.lcdlog = log.basicConfig() - self.lcdlog = log.getLogger("LCD") - self.lcdlog.setLevel(log.DEBUG) - self.lcd = LCD() - self.lcd_w = width - self.lcd_h = hight - - self.st7789v_init_data = ( - 2, 1, 120, - 0, 0, 0x11, - 2, 1, 120, - 0, 1, 0x36, - 1, 1, 0x00, - 0, 1, 0x3A, - 1, 1, 0x05, - 0, 0, 0x21, - 0, 5, 0xB2, - 1, 1, 0x05, - 1, 1, 0x05, - 1, 1, 0x00, - 1, 1, 0x33, - 1, 1, 0x33, - 0, 1, 0xB7, - 1, 1, 0x23, - 0, 1, 0xBB, - 1, 1, 0x22, - 0, 1, 0xC0, - 1, 1, 0x2C, - 0, 1, 0xC2, - 1, 1, 0x01, - 0, 1, 0xC3, - 1, 1, 0x13, - 0, 1, 0xC4, - 1, 1, 0x20, - 0, 1, 0xC6, - 1, 1, 0x0F, - 0, 2, 0xD0, - 1, 1, 0xA4, - 1, 1, 0xA1, - 0, 1, 0xD6, - 1, 1, 0xA1, - 0, 14, 0xE0, - 1, 1, 0x70, - 1, 1, 0x06, - 1, 1, 0x0C, - 1, 1, 0x08, - 1, 1, 0x09, - 1, 1, 0x27, - 1, 1, 0x2E, - 1, 1, 0x34, - 1, 1, 0x46, - 1, 1, 0x37, - 1, 1, 0x13, - 1, 1, 0x13, - 1, 1, 0x25, - 1, 1, 0x2A, - 0, 14, 0xE1, - 1, 1, 0x70, - 1, 1, 0x04, - 1, 1, 0x08, - 1, 1, 0x09, - 1, 1, 0x07, - 1, 1, 0x03, - 1, 1, 0x2C, - 1, 1, 0x42, - 1, 1, 0x42, - 1, 1, 0x38, - 1, 1, 0x14, - 1, 1, 0x14, - 1, 1, 0x27, - 1, 1, 0x2C, - 0, 0, 0x29, - - 0, 1, 0x36, - 1, 1, 0x00, - - 0, 4, 0x2a, - 1, 1, 0x00, - 1, 1, 0x00, - 1, 1, 0x00, - 1, 1, 0xef, - - 0, 4, 0x2b, - 1, 1, 0x00, - 1, 1, 0x00, - 1, 1, 0x00, - 1, 1, 0xef, - - 0, 0, 0x2c, - ) - - self.st7789v_invalid_data = ( - 0,4,0x2a, - 1,1,XSTART_H, - 1,1,XSTART_L, - 1,1,XEND_H, - 1,1,XEND_L, - 0,4,0x2b, - 1,1,YSTART_H, - 1,1,YSTART_L, - 1,1,YEND_H, - 1,1,YEND_L, - 0,0,0x2c, - ) - ret = self.lcd.lcd_init(bytearray(self.st7789v_init_data), self.lcd_w, self.lcd_h, 13000, 1, 4, 0, bytearray(self.st7789v_invalid_data), None, None, None) - self.lcdlog.info('lcd.lcd_init ret = {}'.format(ret)) - '''清屏,设置白色''' - self.lcd.lcd_clear(0xFFFF) - - ''' - 单个字符显示,包括汉字和ASCII - x - x轴坐标 - y - y轴坐标 - xsize - 字体宽度 - ysize - 字体高度 - ch_buf - 存放汉字字模的元组或者列表 - fc - 字体颜色,RGB565 - bc - 背景颜色,RGB565 - ''' - def lcd_show_char(self, x, y, xsize, ysize, ch_buf, fc, bc): - rgb_buf = [] - t1 = xsize // 8 - t2 = xsize % 8 - if t2 != 0: - xsize = (t1 + 1) * 8 - for i in range(0, len(ch_buf)): - for j in range(0, 8): - if (ch_buf[i] << j) & 0x80 == 0x00: - rgb_buf.append(bc & 0xff) - rgb_buf.append(bc >> 8) - else: - rgb_buf.append(fc & 0xff) - rgb_buf.append(fc >> 8) - self.lcd.lcd_write(bytearray(rgb_buf), x, y, x + xsize - 1, y + ysize - 1) - - ''' - ASCII字符显示,目前支持8x16、16x24的字体大小, - 如果需要其他字体大小需要自己增加对应大小的字库数据,并 - 在下面函数中增加这个对应字库的字典。 - x - x轴显示起点 - y - y轴显示起点 - xsize - 字体宽度 - ysize - 字体高度 - ch - 待显示的ASCII字符 - fc - 字体颜色,RGB565 - bc - 背景颜色,RGB565 - ''' - def lcd_show_ascii(self, x, y, xsize, ysize, ch, fc, bc): - ascii_dict = {} - if xsize == 8 and ysize == 16: - ascii_dict = fonts.ascii_8x16_dict - elif xsize == 16 and ysize == 24: - ascii_dict = fonts.ascii_16x24_dict - - for key in ascii_dict: - if ch == key: - self.lcd_show_char(x, y, xsize, ysize, ascii_dict[key], fc, bc) - - ''' - 显示字符串,目前支持8x16的字体大小, - 如果需要其他字体大小需要自己增加对应大小的字库数据,并 - 在lcd_show_ascii函数中增加这个对应字库的字典。 - x - x轴坐标 - y - y轴坐标 - xsize - 字体宽度 - ysize - 字体高度 - str - 待显示的 ASCII 字符串 - fc - 字体颜色,RGB565 - bc - 背景颜色,RGB565 - ''' - def lcd_show_ascii_str(self, x, y, xsize, ysize, str, fc, bc): - xs = x - ys = y - if (len(str) * xsize + x) > self.lcd_w: - raise Exception('Display out of range') - for ch in str: - self.lcd_show_ascii(xs, ys, xsize, ysize, ch, fc, bc) - xs += xsize - - ''' - 汉字显示,目前支持16x16、16x24、24x24的字体大小, - 如果需要其他字体大小需要自己增加对应大小的字库数据,并 - 在下面函数中增加这个对应字库的字典。 - x - x轴显示起点 - y - y轴显示起点 - xsize - 字体宽度 - ysize - 字体高度 - ch - 待显示的ASCII字符 - fc - 字体颜色,RGB565 - bc - 背景颜色,RGB565 - ''' - def lcd_show_chinese(self, x, y, xsize, ysize, ch, fc, bc): - hanzi_dict = {} - if xsize == 16 and ysize == 16: - hanzi_dict = fonts.hanzi_16x16_dict - elif xsize == 16 and ysize == 24: - hanzi_dict = fonts.hanzi_16x24_dict - elif xsize == 24 and ysize == 24: - hanzi_dict = fonts.hanzi_24x24_dict - - for key in hanzi_dict: - if ch == key: - self.lcd_show_char(x, y, xsize, ysize, hanzi_dict[key], fc, bc) - - ''' - 汉字字符串显示,目前支持16x16的字体大小, - 如果需要其他字体大小需要自己增加对应大小的字库数据,并 - 在lcd_show_chinese函数中增加这个对应字库的字典。 - x - x轴坐标 - y - y轴坐标 - xsize - 字体宽度 - ysize - 字体高度 - str - 待显示的多个汉字 - fc - 字体颜色,RGB565 - bc - 背景颜色,RGB565 - ''' - def lcd_show_chinese_str(self, x, y, xsize, ysize, str, fc, bc): - xs = x - ys = y - # print('chstrlen={}, w={}'.format(len(str), self.lcd_w)) - if (len(str) / 3 * xsize + x) > self.lcd_w: - raise Exception('Display out of range') - for i in range(0, len(str), 3): - index = i + 3 - ch = str[i:index] - self.lcd_show_chinese(xs, ys, xsize, ysize, ch, fc, bc) - xs += xsize - - ''' - 图片显示 - 如果图片宽高小于80x80,可直接该函数一次性写入并显示 - image_data - 存放待显示图片的RGB数据 - x - x轴显示起点 - y - y轴显示起点 - width - 图片宽度 - heigth - 图片高度 - ''' - def lcd_show_image(self, image_data, x, y, width, heigth): - self.lcd.lcd_write(bytearray(image_data), x, y, x + width - 1, y + heigth - 1) - - ''' - 图片显示 - 如果图片宽高大于80x80,用该函数来分段写入显示,分段写入原理如下: - 以要显示图片的宽度为固定值,将待显示的图片分成若干宽高为 width * h 大小的图片,最后一块高度不足h的按实际高度计算, - h为分割后每个图片的高度,可由用户通过参数 h 指定,h的值应该满足关系: width * h * 2 < 4096 - path - 存放图片数据的txt文件路径,包含文件名,如 '/usr/image.txt' - x - x轴显示起点 - y - y轴显示起点 - width - 图片宽度 - heigth - 图片高度 - h - 分割后每个图片的高度 - ''' - def lcd_show_image_file(self, path, x, y, width, heigth, h): - image_data = [] - read_n = 0 # 已经读取的字节数 - byte_n = 0 # 字节数 - xs = x - ys = y - h_step = h # 按高度h_step个像素点作为步长 - h1 = heigth // h_step # 当前图片按h_step大小分割,可以得到几个 width * h_step 大小的图片 - h2 = heigth % h_step # 最后剩下的一块 大小不足 width * h_step 的图片的实际高度 - # print('h1 = {}, h2 = {}'.format(h1, h2)) - with open(path, "r", encoding='utf-8') as fd: - # for line in fd.readlines(): - end = '' - while not end: - line = fd.readline() - if line == '': - end = 1 - else: - curline = line.strip('\r\n').strip(',').split(',') - for i in curline: - byte_n += 1 - read_n += 1 - image_data.append(int(i)) - if h1 > 0 and byte_n == width * h_step * 2: - self.lcd_show_image(image_data, xs, ys, width, h_step) - image_data = [] - ys = ys + h_step - h1 -= 1 - byte_n = 0 - # print('image_data len = {}'.format(len(image_data))) - elif h1 == 0 and read_n == width * heigth * 2: - if h2 != 0: - self.lcd_show_image(image_data, xs, ys, width, h2) - - ''' - 将24位色转换位16位色 - 如红色的24位色为0xFF0000,则r=0xFF,g=0x00,b=0x00, - 将r、g、b的值传入下面函数即可得到16位相同颜色数据 - ''' - def get_rgb565_color(self, r, g, b): - return ((r << 8) & 0xF800) | ((g << 3) & 0x07E0) | ((b >> 3) & 0x001F) diff --git "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/\346\230\276\347\244\272\347\273\223\346\236\234.jpg" "b/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/\346\230\276\347\244\272\347\273\223\346\236\234.jpg" deleted file mode 100644 index 644bc4b1d833ad8e66ab509378b08817d9b8e6fc..0000000000000000000000000000000000000000 Binary files "a/docs/little_demo/zh/QuecPythonTest/code/LCD_file/\346\230\276\347\244\272\345\255\227\347\254\246/\346\230\276\347\244\272\347\273\223\346\236\234.jpg" and /dev/null differ diff --git a/docs/little_demo/zh/QuecPythonTest/code/LCD_file.zip b/docs/sbs/zh/lcd/code/LCD_file.zip similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/code/LCD_file.zip rename to docs/sbs/zh/lcd/code/LCD_file.zip diff --git a/docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_01.png b/docs/sbs/zh/lcd/media/Quectel_Qp_little_demo_lcd_01.png similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_01.png rename to docs/sbs/zh/lcd/media/Quectel_Qp_little_demo_lcd_01.png diff --git a/docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_02.jpg b/docs/sbs/zh/lcd/media/Quectel_Qp_little_demo_lcd_02.jpg similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_02.jpg rename to docs/sbs/zh/lcd/media/Quectel_Qp_little_demo_lcd_02.jpg diff --git a/docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_03.png b/docs/sbs/zh/lcd/media/Quectel_Qp_little_demo_lcd_03.png similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_03.png rename to docs/sbs/zh/lcd/media/Quectel_Qp_little_demo_lcd_03.png diff --git a/docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_04.png b/docs/sbs/zh/lcd/media/Quectel_Qp_little_demo_lcd_04.png similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_04.png rename to docs/sbs/zh/lcd/media/Quectel_Qp_little_demo_lcd_04.png diff --git a/docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_05.png b/docs/sbs/zh/lcd/media/Quectel_Qp_little_demo_lcd_05.png similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_05.png rename to docs/sbs/zh/lcd/media/Quectel_Qp_little_demo_lcd_05.png diff --git a/docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_06.jpg b/docs/sbs/zh/lcd/media/Quectel_Qp_little_demo_lcd_06.jpg similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_06.jpg rename to docs/sbs/zh/lcd/media/Quectel_Qp_little_demo_lcd_06.jpg diff --git a/docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_07.png b/docs/sbs/zh/lcd/media/Quectel_Qp_little_demo_lcd_07.png similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_07.png rename to docs/sbs/zh/lcd/media/Quectel_Qp_little_demo_lcd_07.png diff --git a/docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_08.jpg b/docs/sbs/zh/lcd/media/Quectel_Qp_little_demo_lcd_08.jpg similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_08.jpg rename to docs/sbs/zh/lcd/media/Quectel_Qp_little_demo_lcd_08.jpg diff --git a/docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_09.png b/docs/sbs/zh/lcd/media/Quectel_Qp_little_demo_lcd_09.png similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_09.png rename to docs/sbs/zh/lcd/media/Quectel_Qp_little_demo_lcd_09.png diff --git a/docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_10.png b/docs/sbs/zh/lcd/media/Quectel_Qp_little_demo_lcd_10.png similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_10.png rename to docs/sbs/zh/lcd/media/Quectel_Qp_little_demo_lcd_10.png diff --git a/docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_11.png b/docs/sbs/zh/lcd/media/Quectel_Qp_little_demo_lcd_11.png similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_11.png rename to docs/sbs/zh/lcd/media/Quectel_Qp_little_demo_lcd_11.png diff --git a/docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_12.png b/docs/sbs/zh/lcd/media/Quectel_Qp_little_demo_lcd_12.png similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/Quectel_Qp_little_demo_lcd_12.png rename to docs/sbs/zh/lcd/media/Quectel_Qp_little_demo_lcd_12.png diff --git a/docs/little_demo/zh/QuecPythonTest/media/st7789v.png b/docs/sbs/zh/lcd/media/Quectel_Qp_little_demo_lcd_st7789v.png similarity index 100% rename from docs/little_demo/zh/QuecPythonTest/media/st7789v.png rename to docs/sbs/zh/lcd/media/Quectel_Qp_little_demo_lcd_st7789v.png diff --git a/docs/little_demo/zh/QuecPythonTest/LCD.md b/docs/sbs/zh/lcd/st7789_lcd.md similarity index 92% rename from docs/little_demo/zh/QuecPythonTest/LCD.md rename to docs/sbs/zh/lcd/st7789_lcd.md index b0d49129da9e7e1283056773bad2c793f4e6c6c7..9f935e9cc0f36500a760ace337179093fde406ab 100644 --- a/docs/little_demo/zh/QuecPythonTest/LCD.md +++ b/docs/sbs/zh/lcd/st7789_lcd.md @@ -1,4 +1,4 @@ -# 平台说明 +## 平台说明 ​ 本实验例程基于 EC600S_QuecPython_EVB_V1.1 开发板完成。 @@ -8,7 +8,7 @@ ​ 本实验所使用的ST7789V lcd引脚定义与开发板的LCD接口是完全匹配的,可以直接插到开发板的LCD接口使用。开发板LCD接口如下: -![Quectel_Qp_little_demo_lcd_01](media\Quectel_Qp_little_demo_lcd_01.png) +![Quectel_Qp_little_demo_lcd_01](media/Quectel_Qp_little_demo_lcd_01.png) | 开发板lcd引脚 | 引脚定义 | | ------------- | ------------------------------ | @@ -24,7 +24,7 @@ ## ST7789V lcd 接口说明 -st7789v +![st7789v](media/Quectel_Qp_little_demo_lcd_st7789v.png) @@ -38,7 +38,7 @@ | DC | 写寄存器/写数据控制信号 | | BLK | 液晶屏背光控制信号 | -# 接线方式 +## 接线方式 ​ 以下为1.14inch ST7789V液晶屏模块与 EC600S_QuecPython_EVB_V1.1 模块的接线对应关系。EC600S_QuecPython_EVB_V1.1 模块 LCD 接口定义请参考该开发板的模块原理图。 @@ -54,7 +54,7 @@ -# 软件说明 +## 软件说明 ​ 本示例中的接口是基于QuecPython 的machine.LCD库实现,具体可阅读示例程序的源码。 @@ -289,17 +289,17 @@ lcd_st7789v = st7789v.ST7789V(240, 240) 假如要显示一张240x240的图片,图片如下: -![Quectel_Qp_little_demo_lcd_02](media\Quectel_Qp_little_demo_lcd_02.jpg) +![Quectel_Qp_little_demo_lcd_02](media/Quectel_Qp_little_demo_lcd_02.jpg) (1)使用Image2Lcd 软件获取图片色彩数据 -![Quectel_Qp_little_demo_lcd_03](media\Quectel_Qp_little_demo_lcd_03.png) +![Quectel_Qp_little_demo_lcd_03](media/Quectel_Qp_little_demo_lcd_03.png) (2)得到数据如下图1、2,将该 .c 文件中头部和尾部多余部分都删除,只保留中间的数据部分,确保处理后的数据第一行就是数据,且最后没有多余行,每一行前面没有空格等多余字符 -![Quectel_Qp_little_demo_lcd_04](media\Quectel_Qp_little_demo_lcd_04.png) +![Quectel_Qp_little_demo_lcd_04](media/Quectel_Qp_little_demo_lcd_04.png) -![Quectel_Qp_little_demo_lcd_05](media\Quectel_Qp_little_demo_lcd_05.png) +![Quectel_Qp_little_demo_lcd_05](media/Quectel_Qp_little_demo_lcd_05.png) (3)将处理后的图片数据文件保存为txt格式文件,假设命名为image.txt @@ -358,11 +358,11 @@ if __name__ == '__main__': 显示结果: -![Quectel_Qp_little_demo_lcd_06](media\Quectel_Qp_little_demo_lcd_06.jpg) +![Quectel_Qp_little_demo_lcd_06](media/Quectel_Qp_little_demo_lcd_06.jpg) -# 实验操作 +## 实验操作 @@ -394,7 +394,7 @@ example.exec('usr/example_display_image.py') ### 实验结果 -![Quectel_Qp_little_demo_lcd_07](media\Quectel_Qp_little_demo_lcd_07.png) +![Quectel_Qp_little_demo_lcd_07](media/Quectel_Qp_little_demo_lcd_07.png) @@ -425,13 +425,13 @@ example.exec('usr/example_display_char.py') ### 实验结果 -![Quectel_Qp_little_demo_lcd_08](media\Quectel_Qp_little_demo_lcd_08.jpg) +![Quectel_Qp_little_demo_lcd_08](media/Quectel_Qp_little_demo_lcd_08.jpg) -# 字符和图片取模工具使用 +## 字符和图片取模工具使用 -## 工具简介 +### 工具简介 (1)Image2Lcd @@ -443,11 +443,11 @@ PCtoLCD2002 是一款字符取模软件,可以生成汉字、英文以及标 -## 如何对图片取模 +### 如何对图片取模 (1)打开 Image2Lcd 软件,点击【打开】按钮,选择要显示的图片; -![Quectel_Qp_little_demo_lcd_09](media\Quectel_Qp_little_demo_lcd_09.png) +![Quectel_Qp_little_demo_lcd_09](media/Quectel_Qp_little_demo_lcd_09.png) (2)输出数据类型选择【C语言数组(*.c)】,扫描方式选择【水平扫描】,输出灰度一定要选择【16位真彩色】; @@ -457,20 +457,20 @@ PCtoLCD2002 是一款字符取模软件,可以生成汉字、英文以及标 -## 如何对字符取模 +### 如何对字符取模 (1)打开 PCtoLCD2002 软件,依次点击【模式】-【字符模式(W)】; (2)根据需要选择字体,设置字体大小等; -![字符取模1](media\Quectel_Qp_little_demo_lcd_10.png) +![字符取模1](media/Quectel_Qp_little_demo_lcd_10.png) (3)点击齿轮图标,进入如下所示界面,选择 【阴码】、【逐行式】、【顺向】、【C51格式】,点击确定; -![字符取模2](media\Quectel_Qp_little_demo_lcd_11.png) +![字符取模2](media/Quectel_Qp_little_demo_lcd_11.png) (4)输入要取模的字符后,点击【生成字模】,即可得到对应的字模数据,按照示例 fonts.py 文件中的格式,将字模数据保存到字典中。 -# 配套代码 +## 配套代码 下载实验材料 \ No newline at end of file diff --git a/docs/sbs/zh/mqtt/code/mqtt_test_log.py b/docs/sbs/zh/mqtt/code/mqtt_test_log.py new file mode 100644 index 0000000000000000000000000000000000000000..8ab3206b03fcaeadf9800e03a6c86089b9eb33c4 --- /dev/null +++ b/docs/sbs/zh/mqtt/code/mqtt_test_log.py @@ -0,0 +1,44 @@ +from umqtt import MQTTClient +import utime +import log +import checkNet + +PROJECT_NAME = "QuecPython_MQTT_example" +PROJECT_VERSION = "1.0.0" + +checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION) + +# 设置日志输出级别 +log.basicConfig(level=log.INFO) +mqtt_log = log.getLogger("MQTT") + +state = 0 + + +def sub_cb(topic, msg): + global state + mqtt_log.info("Subscribe Recv: Topic={},Msg={}".format( + topic.decode(), msg.decode())) + + +if __name__ == '__main__': + utime.sleep(5) + checknet.poweron_print_once() + checknet.wait_network_connected() + c = MQTTClient("umqtt_client", "mq.tongxinmao.com", 18830) + c.set_callback(sub_cb) + c.connect() + while True: + c.subscribe(b"/public/TEST/quecpython") + mqtt_log.info( + "Connected to mq.tongxinmao.com, subscribed to /public/TEST/quecpython topic" + ) + # 发布消息 + c.publish(b"/public/TEST/quecpython", b"my name is Quecpython!") + mqtt_log.info( + "Publish topic: /public/TEST/quecpython, msg: my name is Quecpython" + ) + c.wait_msg() # 阻塞函数,监听消息 + if state == 1: + break + c.disconnect() diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_01.jpg b/docs/sbs/zh/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_01.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_01.jpg rename to docs/sbs/zh/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_01.jpg diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_02.jpg b/docs/sbs/zh/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_02.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_02.jpg rename to docs/sbs/zh/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_02.jpg diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_03.jpg b/docs/sbs/zh/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_03.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_03.jpg rename to docs/sbs/zh/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_03.jpg diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_04.jpg b/docs/sbs/zh/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_04.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_04.jpg rename to docs/sbs/zh/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_04.jpg diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_05.jpg b/docs/sbs/zh/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_05.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_05.jpg rename to docs/sbs/zh/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_05.jpg diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_06.jpg b/docs/sbs/zh/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_06.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_06.jpg rename to docs/sbs/zh/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_06.jpg diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_07.jpg b/docs/sbs/zh/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_07.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_07.jpg rename to docs/sbs/zh/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_07.jpg diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_08.jpg b/docs/sbs/zh/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_08.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_08.jpg rename to docs/sbs/zh/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_08.jpg diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_09.jpg b/docs/sbs/zh/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_09.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_09.jpg rename to docs/sbs/zh/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_09.jpg diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_10.jpg b/docs/sbs/zh/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_10.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_10.jpg rename to docs/sbs/zh/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_10.jpg diff --git a/docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_11.jpg b/docs/sbs/zh/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_11.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/Quectel_Qp_mqtt_app_how_to_use_11.jpg rename to docs/sbs/zh/mqtt/media/Quectel_Qp_mqtt_app_how_to_use_11.jpg diff --git a/docs/sbs/zh/mqtt/media/mqtt_Faq_use_001.png b/docs/sbs/zh/mqtt/media/mqtt_Faq_use_001.png new file mode 100755 index 0000000000000000000000000000000000000000..0f8f1f35ea76c93c29eafb7968f0a38cb8f902f5 Binary files /dev/null and b/docs/sbs/zh/mqtt/media/mqtt_Faq_use_001.png differ diff --git a/docs/sbs/zh/mqtt/mqtt_Faq_use.md b/docs/sbs/zh/mqtt/mqtt_Faq_use.md new file mode 100644 index 0000000000000000000000000000000000000000..2756f8dace515fa107a097f8b13c8f492c7556f0 --- /dev/null +++ b/docs/sbs/zh/mqtt/mqtt_Faq_use.md @@ -0,0 +1,31 @@ +## Mqtt 进阶使用技巧 + +## 文档历史 + +**修订记录** + +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | -------- | -------- | -------------------------------- | +| 1.0.0 | 2021-4-6 | 唐大卫 | 初始版本 | +| 1.0.1 | 2021-4-6 | 周成柱 | 汇总到文件系统中、处理对应的参数 | + + +## MQTT连接状态 +### MQTT连接状态的查询 + + + + + + +## MQTT短线捕获异常处理 + +### MQTT断线通过捕获异常获取,但是断线后,异常捕获不到 +**解答:** +会抛出异常,umqtt已经做了处理,上层的try捕捉不到下面的异常,对于断线后会尝试重连, +有log输出,不会直接抛出异常。下面是测试的部分LOG(之前一直收发,后面拔卡后尝试重连)。 +![mqtt 断线测试log截图](media/mqtt_Faq_use_001.png) + + + [mqtt 断线测试-测试代码](code/mqtt_test_log.py) + diff --git a/docs/sbs/zh/sbs/mqtt.md b/docs/sbs/zh/mqtt/mqtt_base_how_to_use.md similarity index 99% rename from docs/sbs/zh/sbs/mqtt.md rename to docs/sbs/zh/mqtt/mqtt_base_how_to_use.md index b51e6045254e59b2d025aba967ea19f584dafecd..4e3fdd06e68f6ea794519982755e63df85f443ea 100644 --- a/docs/sbs/zh/sbs/mqtt.md +++ b/docs/sbs/zh/mqtt/mqtt_base_how_to_use.md @@ -1,6 +1,6 @@ -### MQTT应用 开发指导 +## MQTT应用 开发指导 -#### MQTT概述 +### MQTT概述 **MQTT简介** @@ -102,7 +102,7 @@ MQTT支持三种不同级别的服务质量,为不同场景保证消息传输 -#### MQTT API +## MQTT API **MQTTClient** @@ -351,7 +351,7 @@ qos: -#### MQTT开发说明 +## MQTT开发说明 **MQTT服务器搭建和测试** @@ -440,7 +440,7 @@ Address”(代理地址)和“Broker Port”(代理端口)两项。亦 ​ MQTT允许用户动态创建主题,也可动态修改主题。将待订阅和发布的消息主题配置一致,如此可实现回显功能。客户端向服务器发布的消息可立即分发至到客户端。 -#### 使用MQTT进行数据发布订阅 +## 使用MQTT进行数据发布订阅 本测试采用echo功能作为测试示例。 @@ -509,7 +509,7 @@ http://www.tongxinmao.com/txm/webmqtt.php。 ![](media/Quectel_Qp_mqtt_app_how_to_use_11.jpg) -#### 附录 +## 附录 表 1 :术语缩写 diff --git a/docs/sbs/zh/sbs/lcd.md b/docs/sbs/zh/sbs/lcd.md index f052958c1444b6eb69bc5511c7a5a09687b26f6f..a671b367c07bad424373357126500f6e97bc1153 100644 --- a/docs/sbs/zh/sbs/lcd.md +++ b/docs/sbs/zh/sbs/lcd.md @@ -1,6 +1,6 @@ -### LCD 使用指导 +## LCD 使用指导 -#### LCD相关接口 +### LCD相关接口 **创建LCD对象** @@ -239,7 +239,7 @@ data_value_len: 其他值 失败 -#### LCD配置流程 +### LCD配置流程 **LCD硬件接线** @@ -497,7 +497,7 @@ lcd.lcd_write(test_buf1,10,10,20,20) 因设计原因,该示例目标显示为0x001f(蓝色),当前为0x1f00。 -#### LCD执行示例 +### LCD执行示例 本章节以ili9225为例,汇总LCD流程脚本命令以及执行结果。 @@ -702,7 +702,7 @@ LCD流程脚本执行结果分别如图所示: -#### 附录术语缩写 +### 附录术语缩写 表 2 :术语缩写 diff --git a/docs/sbs/zh/sbs/led.md b/docs/sbs/zh/sbs/led.md index 22ea4a162cd0c355727bddc1c82f5c64befdff7d..f3af2e9dab195b77d32073fc5cf96897e0440f61 100644 --- a/docs/sbs/zh/sbs/led.md +++ b/docs/sbs/zh/sbs/led.md @@ -1,6 +1,6 @@ -### LED 使用指导 +## LED 使用指导 -#### 基本概述 +### 基本概述 在使用LED功能之前,需要先了解开发板的GPIO串口,GPIO即通用I/O端口。GPIO即开发板的引脚输出输入功能。输出功能,即控制引脚变高和变低;输入功能,即检测引脚上的电平是高电平还是低电平。当需要控制引脚为高电平或低电平时,即使用GPIO的输出功能使用。例如,控制LED灯的亮灭时,需要通过控制输出的高低电平来实现LED灯的亮灭。 @@ -11,7 +11,7 @@ ​ 图 1 :GPIO串口 -#### LED功能实现 +### LED功能实现 ​ 在开发板中实现LED功能需要用到QuecPython中的Pin类功能,以EC100Y-CN模块为例,将模块 的LED控制线与开发板的GPIO1串口相连,再将模块V3.3串口与开发板的V3.3串口相连,为模块供电。连接完成后给开发板上电。 @@ -92,16 +92,16 @@ while i<100: 以上部分代码可见于移远通信提供的SDK工具包中,路径为modules/gpio/example_pin.py。 ``` -#### 附录 +### 附录 表 1 :术语缩写 -| 缩写 | 英文全称 | 中文全称 | -| ----- | --------------------------------- | ---------------- | -| GPIO | General-Purpose Input/Output | 通用型输入/输出 | -| LED | Light Emitting Diode | 发光二极管 | -| SDK | Software Development Kit | 软件开发工具包 | +| 缩写 | 英文全称 | 中文全称 | +| ---- | ---------------------------- | --------------- | +| GPIO | General-Purpose Input/Output | 通用型输入/输出 | +| LED | Light Emitting Diode | 发光二极管 | +| SDK | Software Development Kit | 软件开发工具包 | diff --git a/docs/sbs/zh/sbs/media/Quectel_sbs_Socket_course.png b/docs/sbs/zh/sbs/media/Quectel_sbs_Socket_course.png new file mode 100644 index 0000000000000000000000000000000000000000..45647602d435c7f31e6f6431ee862bad7f76fea9 Binary files /dev/null and b/docs/sbs/zh/sbs/media/Quectel_sbs_Socket_course.png differ diff --git a/docs/sbs/zh/sbs/media/Quectel_sbs_Socket_relation_1.png b/docs/sbs/zh/sbs/media/Quectel_sbs_Socket_relation_1.png new file mode 100644 index 0000000000000000000000000000000000000000..83842de47d3fd0894a1c4cb9f3538fc8103f3276 Binary files /dev/null and b/docs/sbs/zh/sbs/media/Quectel_sbs_Socket_relation_1.png differ diff --git a/docs/sbs/zh/sbs/media/Quectel_sbs_Socket_relation_2.png b/docs/sbs/zh/sbs/media/Quectel_sbs_Socket_relation_2.png new file mode 100644 index 0000000000000000000000000000000000000000..9ffe2a127ce0932449577fccf47b65099faeefdf Binary files /dev/null and b/docs/sbs/zh/sbs/media/Quectel_sbs_Socket_relation_2.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture1.jpg b/docs/sbs/zh/sbs/media/sbs_socket_picture1.jpg deleted file mode 100644 index 2c84dabc7cc228121eaf4311675b0259a240795f..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/sbs_socket_picture1.jpg and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture2.jpg b/docs/sbs/zh/sbs/media/sbs_socket_picture2.jpg deleted file mode 100644 index 7ec6f65fe66cfe302bb5acfcedaf904ad07a9e6a..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/sbs_socket_picture2.jpg and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture3.jpg b/docs/sbs/zh/sbs/media/sbs_socket_picture3.jpg deleted file mode 100644 index 940272b8ef2f5ccc18d26e022f8b02f6a90d3774..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/sbs_socket_picture3.jpg and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture4.jpg b/docs/sbs/zh/sbs/media/sbs_socket_picture4.jpg deleted file mode 100644 index 7442f2cc0d0463103b1c30ccbfba4a4b119b4af1..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/sbs_socket_picture4.jpg and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture5.jpg b/docs/sbs/zh/sbs/media/sbs_socket_picture5.jpg deleted file mode 100644 index bbbcfdd07f513ac3313f5e2e0a82086702ad9748..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/sbs_socket_picture5.jpg and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture6.jpg b/docs/sbs/zh/sbs/media/sbs_socket_picture6.jpg deleted file mode 100644 index e6a6be3adc45e2e85806d93aceb319b218fbeb58..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/sbs_socket_picture6.jpg and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture7.jpg b/docs/sbs/zh/sbs/media/sbs_socket_picture7.jpg deleted file mode 100644 index 01d78635e6af1079fc35f1dea97b7b7c18b2eb6b..0000000000000000000000000000000000000000 Binary files a/docs/sbs/zh/sbs/media/sbs_socket_picture7.jpg and /dev/null differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture_1.png b/docs/sbs/zh/sbs/media/sbs_socket_picture_1.png new file mode 100644 index 0000000000000000000000000000000000000000..513d870ad8946658bcedc2cdcb4bf096a42ef399 Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_socket_picture_1.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture_10.png b/docs/sbs/zh/sbs/media/sbs_socket_picture_10.png new file mode 100644 index 0000000000000000000000000000000000000000..f44eabdd18c9a9d3e52a4fe0b59c14669fdd6352 Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_socket_picture_10.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture_2.png b/docs/sbs/zh/sbs/media/sbs_socket_picture_2.png new file mode 100644 index 0000000000000000000000000000000000000000..0d93c15e64706c3f1fd6842c946253f9093d0d0c Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_socket_picture_2.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture_3.png b/docs/sbs/zh/sbs/media/sbs_socket_picture_3.png new file mode 100644 index 0000000000000000000000000000000000000000..da9914445e775ab6aae8a3b2b38fcc3477ed393c Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_socket_picture_3.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture_4.png b/docs/sbs/zh/sbs/media/sbs_socket_picture_4.png new file mode 100644 index 0000000000000000000000000000000000000000..20eacf5ea3837b5daafb5755eef6a459ad376be6 Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_socket_picture_4.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture_5.png b/docs/sbs/zh/sbs/media/sbs_socket_picture_5.png new file mode 100644 index 0000000000000000000000000000000000000000..01b43cc768f6703d3b1e54f44b7cc3a1aa9cda33 Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_socket_picture_5.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture_6.png b/docs/sbs/zh/sbs/media/sbs_socket_picture_6.png new file mode 100644 index 0000000000000000000000000000000000000000..ec4646739464a740ae9bf90c8fb7187cbec65db6 Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_socket_picture_6.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture_7.png b/docs/sbs/zh/sbs/media/sbs_socket_picture_7.png new file mode 100644 index 0000000000000000000000000000000000000000..c524185af736bb2138c5ee76236883f91e93709b Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_socket_picture_7.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture_8.png b/docs/sbs/zh/sbs/media/sbs_socket_picture_8.png new file mode 100644 index 0000000000000000000000000000000000000000..b3d41386fccd82b6641eb4c34bd99b01d4c8a564 Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_socket_picture_8.png differ diff --git a/docs/sbs/zh/sbs/media/sbs_socket_picture_9.png b/docs/sbs/zh/sbs/media/sbs_socket_picture_9.png new file mode 100644 index 0000000000000000000000000000000000000000..884981ae1fb0ac2efb7ead8ebce1db6979001c3a Binary files /dev/null and b/docs/sbs/zh/sbs/media/sbs_socket_picture_9.png differ diff --git a/docs/sbs/zh/sbs/socket.md b/docs/sbs/zh/sbs/socket.md index e5b153cf0da6e8edae610b4cd7a7edf456b7a09a..9a05e1411a446d643a2cf2555b32975e396dacde 100644 --- a/docs/sbs/zh/sbs/socket.md +++ b/docs/sbs/zh/sbs/socket.md @@ -1,544 +1,124 @@ -### Socket应用 开发指导 +## 修订历史 -#### Socket概述 +| 版本 | 日期 | 作者 | 变更表述 | +| ---- | -------- | ------- | ---------------- | +| 1.0 | 2021-4-7 | Grey.Tu | 初版,Socket使用 | -​ 所谓Socket(套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个Socket就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,Socket上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。 - -​ Socket可以看成是两个网络应用程序进行通信时,各自通信连接中的端点,这是一个逻辑上的概念。它是网络环境中进程间通信的API(应用程序编程接口),也是可以被命名和寻址的通信端点,使用中的每一个Socket都有其类型和一个与之相连进程。通信时其中一个网络应用程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过与网络接口卡(NIC)相连的传输介质将这段信息送到另外一台主机的Socket中,使对方能够接收到这段信息。Socket是由IP地址和端口结合的,提供向应用层进程传送数据包的机制。 - -**Socket的应用** - -​ Socket可以使一个应用从网络中读取和写入数据,不同计算机上的两个应用可以通过连接发送和接受字节流,注意,当发送消息时,需要知道对方的IP和端口。在日常生活中有很多应用场景,当你浏览网页时,浏览器进程怎么与web服务器进程通信;当你用QQ聊天时,QQ进程怎么与服务器或好友所在的QQ进程通信,这些都是通过socket来实现的。 - -#### QuecPython Socket API详解 - -​ Socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开(open)→ -读写(write/read)→关闭(close)”模式来操作。在实现过程中服务端可以看作是web服务器,客户端可以看作是要访问web服务器的浏览器,访问过程就可以和打开→读写→关闭一一对应。 - -​ QuecPython类库中通过usocket实现Socket功能,usocket 模块提供对BSD套接字接口的访问。该模块实现相应CPython模块的子集,更多信息请参阅CPython文档:socket。其中usocket对Socket功能的具体流程及实现的相关API介绍如下。 - -**usocket.socket** - -​ 该函数用于服务端或客户端创建一个Socket对象。 - -函数原型 - -``` -sock=usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) -``` - -参数 - -usocket.AF_INET: -网络协议,IPv - -usocket.SOCK_STREAM: -对应TCP的流式Socket。更多常量定义详见Quectel QuecPython 类库API说明。 - -返回值 - -无。 - -**usock.getaddrinfo** - -​ 该函数用于将主机域名(host)和端口(port)转换为用于创建套接字的 5 元组序列,元组结构如下: -(family, type, proto, canonname, sockaddr) - -函数原型 - -``` -usocket.getaddrinfo(host, port) -``` - -参数 - -host: -主机域名。 - -port: -端口。 -返回值 -无。 +## Socket开发指导 +本文主要介绍Socket套接字,读者通过对本文的了解,可以学习Socket套接字接口的基本操作。 -**sock.bind** -​ 该函数用于将Socket对象和服务端IP:端口绑定。由于TCP口是动态的,客户端无需进行绑定。使用该函数之前,Socket必须未进行绑定。 +## Socket概述 -函数原型 +### Socket介绍 -``` -sock.bind(address) -``` - -参数 - -address: -由地址端口号组成的列表或者元组。 - -返回值 +​ 所谓Socket(套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个Socket就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,Socket上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。 -无。 +​ Socket可以看成是两个网络应用程序进行通信时,各自通信连接中的端点,这是一个逻辑上的概念。它是网络环境中进程间通信的API(应用程序编程接口),也是可以被命名和寻址的通信端点,使用中的每一个Socket都有其类型和一个与之相连进程。通信时其中一个网络应用程序将要传输的一段信息写入它所在主机的Socket中,该Socket通过与网络接口卡(NIC)相连的传输介质将这段信息送到另外一台主机的Socket中,使对方能够接收到这段信息。Socket是由IP地址和端口结合的,提供向应用层进程传送数据包的机制。 +​ Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。 +![Quectel_sbs_Socket_relation_2](media/Quectel_sbs_Socket_relation_2.png) -**sock.listen** +### Socket过程 -​ 该函数允许服务端接受Socket连接,可指定最大连接数。 +​ Socket起源于Unix,而Unix/Linux基本哲学之一就是“一切皆文件”,都可以用“打开(open)→ +读写(write/read)→关闭(close)”模式来操作。在实现过程中服务端可以看作是web服务器,客户端可以看作是要访问web服务器的浏览器,访问过程就可以和打开→读写→关闭一一对应。 -函数原型 +![Quectel_sbs_Socket_course](media/Quectel_sbs_Socket_course.png) -``` -sock.listen(backlog) -``` +### **Socket的应用** -参数 +​ Socket可以使一个应用从网络中读取和写入数据,不同计算机上的两个应用可以通过连接发送和接受字节流,注意,当发送消息时,需要知道对方的IP和端口。在日常生活中有很多应用场景,当你浏览网页时,浏览器进程怎么与web服务器进程通信;当你用QQ聊天时,QQ进程怎么与服务器或好友所在的QQ进程通信,这些都是通过socket来实现的。 -backlog: -接受的最大Socket连接数,至少为 0 。 +## QuecPython Socket API介绍 -返回值 +具体的API详解请参考[usocket - socket模块](https://python.quectel.com/wiki/#/zh-cn/api/pythonStdlib?id=usocket-socket模块) -无。 +## Socket功能实现 +​ 在进行此功能测试之前需了解QuecPython基本操作,有关基本操作方法详见[《Quectel_QuecPython_基础操作说明》](https://python.quectel.com/doc/doc/sbs/zh/index.html)。本章节将通过介绍在QuecPython上创建一个TCP客户端连接服务器为例给大家介绍Socket功能。 +​ 由于模块是作为TCP客户端去连接服务器,便需要在连接前有提供连接服务器。在此我们主要介绍模块的Socket功能,有关服务器部分内容大家另外了解。这边我们介绍较为简单的一种测试方式,使用网络资源:[安信可透传云 V1.0](http://tt.ai-thinker.com:8000/ttcloud)进行测试。[安信可透传云 V1.0](http://tt.ai-thinker.com:8000/ttcloud)提供了连接服务器;数据发送;数据接收;断开连接等功能。 -**sock.accept** +### 交互实验 -​ 该函数用于服务端接受客户端连接请求。 +按照[《Quectel_QuecPython_基础操作说明》](https://python.quectel.com/doc/doc/sbs/zh/index.html)进入命令交互状态,进行以下操作。 -函数原型 +#### 导入usocket模块,创建一个Socket实例: -``` -(conn, addres) = sock.accept() +```python +import usocket +sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) ``` -参数 +![sbs_socket_picture_1](media/sbs_socket_picture_1.png) -无。 +#### 打开[安信可透传云 V1.0](http://tt.ai-thinker.com:8000/ttcloud)查看需要连接的IP地址及端口号: -返回值 +![sbs_socket_picture_2](media/sbs_socket_picture_2.png)注:由于此服务器为网络共享资源,提供的IP地址与端口若三分钟没有设备建立连接会自动回收,固建立连接的过程需要在此时间内进行,不然将出现错误。 -返回元组,包含新的Socket和客户端地址,形式为:(conn, address)。 +#### 建立与服务端的连接: -conn: -新的Socket对象,用来发送和接收数据。 - -address: -连接到服务器的客户端地址。 - - - -**sock.connect** - -​ 客户端使用该函数连接到指定地址的服务器。 - -函数原型 - -``` -sock.connect(address) +```python +sock.connect(('122.114.122.174', 34187)) ``` -参数 - -address: -连接到客户端的服务端地址。 - -返回值 - -无。 +![sbs_socket_picture_3](media/sbs_socket_picture_3.png) +注: 1. API参数的IP地址与端口必须为服务器的IP地址与端口。 +​ 2. 建立连接的API参数必须用“()”括起来,这是由于底层会将IP地址与端口号当一个参数传入。 -**2.3.7. sock.recv** +![sbs_socket_picture_4](media/sbs_socket_picture_4.png)发送指令后可以在网址上看到模块已经上线,下面便可以进行数据交互了。 -​ 该函数用于接受客户端或服务端发送的数据。 +#### 模块上传数据: -函数原型 - -``` -recv_data = sock.recv(bufsize) +```python +>>> ret=sock.send('1234567890\r\n') +>>> print('send %d bytes' % ret) +send 12 bytes ``` -参数 +![sbs_socket_picture_5](media/sbs_socket_picture_5.png) -bufsize: -一次接收的最大数据量。 +![sbs_socket_picture_6](media/sbs_socket_picture_6.png)模块上传数据后可以在服务器上看到模块上传的数据。 -返回值 +#### 服务器下发数据: -返回值是一个字节对象,表示接收到的数据。 +![sbs_socket_picture_7](media/sbs_socket_picture_7.png) +服务器下发数据后模块端便可以读取数据,读取指令与读取效果如下: - -**sock.send** - -​ 该函数用于发送数据到服务端或客户端。 - -函数原型 - -``` -sock.send(send_data.encode("utf8")) +```python +>>> data=sock.recv(1024) +>>> print('recv %s bytes:' % len(data)) +recv 10 bytes: +>>> print(data.decode()) +0123456789 ``` -参数 - -send_data: -表示要发送的数据。 - -返回值 +![sbs_socket_picture_8](media/sbs_socket_picture_8.png) -返回实际发送的字节数。 +#### 断开连接: -备注 - -​ TCP协议的Socket是基于字节流的,通过Socket发送数据之前,需先使用encode("utf8")对数据进行编码,其中"utf8"为编码方式。 - - - -**sock.close** - -​ 该函数用于关闭Socket通信。 - -函数原型 - -``` +```python sock.close() ``` -参数 - -无。 - -返回值 - -无。 - - - -**sock.read** - -​ 该函数用于从Socket中读取size字节数据,如果没有指定size,则会从套接字读取所有可读数据,直到读取到数据结束。 - -函数原型 - -``` -socket.read([ size ]) -``` - -参数 - -[ size ]: -要读取的字节数。 - -返回值 - -字节对象。 - - - -**sock.readinto** - -​ 该函数用于将字节读取到缓冲区中。 - -函数原型 - -``` -sock.readinto(buf [ , nbytes ]) -``` - -参数 - -buf: -存放读取字节的缓冲区。 - -nbytes: -读取的字节数。 - -返回值 - -实际读取的字节数。 - - - -**sock.readline** - -​ 该函数用于按行读取数据,遇到换行符结束。 - -函数原型 - -``` -sock.readline() -``` - -参数 - -无。 - -返回值 - -返回读取的数据行。 - - - -**sock.write** - -​ 该函数用于向缓存区写入数据。 - -函数原型 - -``` -sock.write(buf) -``` - -参数 - -buf: -写入缓冲区的数据。 - -返回值 - -返回实际写入的字节数。 - - - -**sock.sendall** - -​ 该函数用于将所有数据都发送到Socket。 - -函数原型 - -``` -sock.sendall(bytes) -``` - -参数 - -bytes: -缓存buffer,存放bytes型数据。 - -返回值 - -无。 - - - -**sock.sendto** - -​ 该函数用于将数据发送到Socket。该Socket不应连接到远程Socket,因为目标Socket是由address指定的。 - -函数原型 - -``` -sock.sendto(bytes, address) -``` - -参数 - -bytes: -缓存buffer,存放bytes型数据。 - -address: - -包含地址和端口号的元组或列表。 - -返回值 - -无。 - - - -**sock.recvfrom** - -​ 该函数用于从Socket接收数据。返回一个元组,包含字节对象和地址。 - -函数原型 - -``` -socket.recvfrom(bufsize) -``` - -参数 - -bufsize: -接收的缓存数据。 - -返回值 - -返回一个元组,包含字节对象和地址,形式为:(bytes, address)。 - -bytes: -接收数据的字节对象。 - -address: - -发送数据的Socket的地址。 - - - -**sock.setsockopt** - -​ 该函数用于设置socket选项的值。 - -函数原型 - -``` -socket.setsockopt(level, optname, value) -``` - -参数 - -level: -socket选项级别。 - -optname: -socket选项。 - -value: -既可以是一个整数,也可以是一个表示缓冲区的bytes类对象。 - -返回值 - -无。 - - - -**sock.setblocking** - -​ 该函数用于设置Socket为阻塞模式或者非阻塞模式。如果flag为false,则将Socket设置为非阻塞模式,否则设置为阻塞模式。 - -函数原型 - -``` -socket.setblocking(flag) -``` - -参数 - -flag: -Ture 阻塞模式 -False 非阻塞模式 - -返回值 - -无。 - - - -**sock.settimeout** - -​ 该函数用于设置Socket的超时时间,单位:秒。 - -函数原型 - -``` -socket.settimeout(value) -``` - -参数 - -value: - 可以是秒的非负浮点数,也可以是None。如果将其设置为一个非零值,OSError在该操作完成之前已超过超时时间值,则随后的Socket操作将引发异常;如果将其设置为零,则将Socket置于非阻塞模式。如果未指定该值,则Socket将处于阻塞模式。 - -返回值 - -无。 - - - -**Socket.makefile** - -​ 该函数用于生成一个文件与socket对象关联,之后即可像读取普通文件一样使用socket。(普通文件的操作有open和write等。) - -函数原型 - -``` -socket.makefile(mode='rb')、 -``` - -参数 - -mode: -二进制模式(rb和wb)。 - -返回值 - -返回与套接字关联的文件对象。 - - - -#### Socket功能实现 - -​ 为了使用户更清楚的了解Socket功能,本章节提供了一个在QuecPython上创建Socket的实例,即模拟浏览器访问web服务器获取网页内容。首先在Xshell中,连接模块主串口,进入交互界面,然后按如下步骤实现Socket功能: - -1. 导入usocket模块,创建一个Socket实例: - - ``` - import usocket - sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM) - ``` - - ![](media/sbs_socket_picture1.jpg) - -2. 解析域名 - - ``` - sockaddr=usocket.getaddrinfo('www.tongxinmao.com',80)[0][-1] - ``` - - ​ 将主机域名(host)和端口(port)转换为用于创建Socket的 5 元组序列,元组结构如下: - -(family, type, proto, canonname, sockaddr) - -![](media/sbs_socket_picture2.jpg) - -3. 建立与服务端的连接: - - ``` - sock.connect(sockaddr) - ``` - -![](media/sbs_socket_picture3.jpg) - -4. 向服务端发送消息: - - ``` - ret=sock.send('GET /News HTTP/1.1\r\nHost: www.tongxinmao.com\r\nAccept-Encoding:deflate\r\nConnection: keep-alive\r\n\r\n') - print('send %d bytes' % ret) - ``` - - ![](media/sbs_socket_picture4.jpg) - -5. 接收服务端的消息: - - ``` - data=sock.recv(1024) - print('recv %s bytes:' % len(data)) - print(data.decode()) - ``` - - ![](media/sbs_socket_picture5.jpg) - - ​ 服务端消息接收完成后,可在浏览器上发起请求,验证返回消息是否与Socket接收的消息一致,如下所示: - - ![](media/sbs_socket_picture6.jpg) - -6. 关闭连接: - - ``` - sock.close() - ``` +![sbs_socket_picture_9](media/sbs_socket_picture_9.png) - ![](media/sbs_socket_picture7.jpg) +执行断开指令后服务器端的设备将会下线,如下图: ![sbs_socket_picture_10](media/sbs_socket_picture_10.png) - ​ 以上部分代码可见于移远通信提供的SDK工具包中,路径为moudles/socket/example_socket.py,也可通过example模块来执行该脚本文件。 +至此,模块做TCP客户端连接服务器完毕。 - +### 代码实验 - usocket服务端功能实现代码如下图: +usocket服务端功能实现代码如下图: ```python #导入usocket模块 @@ -564,7 +144,7 @@ while True: break ``` -#### 附录 +## 附录术语缩写 表 1 :术语缩写 diff --git a/docs/sbs/zh/sidebar.yaml b/docs/sbs/zh/sidebar.yaml index 81264c678b50f4df02d3f2596ec14dec526c3bfd..d2b673f66407bd9114427d4ff60a8afe9df74aa8 100644 --- a/docs/sbs/zh/sidebar.yaml +++ b/docs/sbs/zh/sidebar.yaml @@ -6,8 +6,12 @@ items: items: - label: Socket编程 file: sbs/socket.md - - label: MQTT客户端开发 - file: sbs/mqtt.md + - label: Mqtt + items: + - label: Mqtt基础使用 + file: mqtt/mqtt_base_how_to_use.md + - label: Mqtt常见问题 + file: mqtt/mqtt_Faq_use.md - label: HTTP客户端开发 file: sbs/http.md - label: NTP应用开发 @@ -17,7 +21,7 @@ items: - label: 文件读写使用说明 file: sbs/file.md - label: 多线程应用开发指导 - file: sbs/thread.md + file: thread/thread.md - label: 总线使用指导 file: sbs/bus.md - label: 定时器使用指导 @@ -34,5 +38,7 @@ items: # file: sbs/tts.md - label: LCD使用指导 file: sbs/lcd.md + - label: st7789 240*240 LCD 显示图片 + file: lcd/st7789_lcd.md # - label: Record录音使用指导 # file: sbs/record.md diff --git a/docs/sbs/zh/thread/code/Qp_thread_exit.py b/docs/sbs/zh/thread/code/Qp_thread_exit.py new file mode 100644 index 0000000000000000000000000000000000000000..55e4a63bb4a18e950147996c789806367d368eaa --- /dev/null +++ b/docs/sbs/zh/thread/code/Qp_thread_exit.py @@ -0,0 +1,24 @@ +import _thread as thread +import utime as time + +exited = False + + +def th_func(thread_id, delay): + global exited + print("thread:{} delay {}".format(thread_id, delay)) + time.sleep_ms(delay) + exited = True + + +def main(): + print("线程传递多个参数测试") + # for i in range(5): + thread.start_new_thread(th_func, (1, 2000)) + # 等待所有子线程回收 + while exited is False: + time.sleep_ms(100) + print("等待线程退出") + + +main() diff --git a/docs/sbs/zh/thread/code/Qp_thread_trans_mutil_args.py b/docs/sbs/zh/thread/code/Qp_thread_trans_mutil_args.py new file mode 100644 index 0000000000000000000000000000000000000000..5f563274fb34101201a343e0324c8f04f57728c0 --- /dev/null +++ b/docs/sbs/zh/thread/code/Qp_thread_trans_mutil_args.py @@ -0,0 +1,18 @@ +import _thread as thread +import utime as time + + +def th_func(thread_id, delay): + print("thread:{} delay {}".format(thread_id, delay)) + time.sleep_ms(delay) + + +def main(): + print("线程传递多个参数测试") + for i in range(5): + thread.start_new_thread(th_func, (i + 1, 2)) + # 等待所有子线程回收 + time.sleep_ms(100) + + +main() diff --git a/docs/sbs/zh/sbs/media/5b584fb5c2b36cb7e057ae95d87b295e.png b/docs/sbs/zh/thread/media/Qp_sbs_thread_01.png similarity index 100% rename from docs/sbs/zh/sbs/media/5b584fb5c2b36cb7e057ae95d87b295e.png rename to docs/sbs/zh/thread/media/Qp_sbs_thread_01.png diff --git a/docs/sbs/zh/sbs/media/e2d4afc1ebb0f7d9ad420489f74da40d.jpg b/docs/sbs/zh/thread/media/Qp_sbs_thread_02.jpg similarity index 100% rename from docs/sbs/zh/sbs/media/e2d4afc1ebb0f7d9ad420489f74da40d.jpg rename to docs/sbs/zh/thread/media/Qp_sbs_thread_02.jpg diff --git a/docs/sbs/zh/sbs/thread.md b/docs/sbs/zh/thread/thread.md similarity index 32% rename from docs/sbs/zh/sbs/thread.md rename to docs/sbs/zh/thread/thread.md index d45e97446f3d858fd729fab56337650f5d2faad9..185184f65a2d54bc8580ec42122931030a4c1c05 100644 --- a/docs/sbs/zh/sbs/thread.md +++ b/docs/sbs/zh/thread/thread.md @@ -1,6 +1,16 @@ -### 多线程 应用开发指导 +## 多线程 应用开发指导 +本片文章主要简介 QUecPython 的使用教程,关于QuecPython 线程的API 讲解、请参考 +[QuecPYthon wiki thread API 讲解](https://python.quectel.com/wiki/#/zh-cn/api/pythonStdlib?id=_thread-%e5%a4%9a%e7%ba%bf%e7%a8%8b) -#### 多线程/进程的基本概念 +## 文档历史 + +**修订记录** + +| **版本** | **日期** | **作者** | **变更表述** | +| -------- | -------- | -------- | ------------ | +| 1.0 | 2021-4-6 | chengzhu | 初始版本 | + +### 多线程/进程的基本概念 Python 运行在 Python 虚拟机中,用户创建的多线程只是在 Python 虚拟机中的虚拟线程,而非在操作系统中的真正的线程。也就是说,Python @@ -12,7 +22,7 @@ Python 运行在 Python 虚拟机中,用户创建的多线程只是在 Python > 线程具有 5 种状态,状态转换的过程如下: -![5b584fb5c2b36cb7e057ae95d87b295e](media/5b584fb5c2b36cb7e057ae95d87b295e.png) +![线程5种状态](media/Qp_sbs_thread_01.png) > 图 **1**:线程的 **5** 种状态 @@ -26,169 +36,72 @@ Python 运行在 Python 虚拟机中,用户创建的多线程只是在 Python 3. 进程和线程对操作系统的资源管理的方式不同。 -#### 多线程 **API** 详解 - -**_thread.allocate_lock** - -> 该函数用于创建一个互斥锁对象。 - -- 函数原型 - - _thread.allocate_lock() - -- 参数 - - 无 - - 返回值 - - 返回互斥锁对象。互斥锁对象的函数详见第**3.1.1**章。 - -**互斥锁对象函数** - -**lock.acquire** - -> 该方法用于获取锁。 - -- 函数原型 - - lock.acquire() - -- 参数 - - 无 - -- 返回值 - -True 成功 - -> False 失败 - -**lock.release** - -> 该方法用于释放锁。 - -- 函数原型 - - lock.release() - -- 参数 - - 无 - -- 返回值 - - 无 - -**lock.locked** - -> 该方法用于返回锁的状态。 - -- 函数原型 +## QuecPython 常见使用情形 - lock.locked() +### 使用线程、传递多个参数 +[线程传递多个参数](code/Qp_thread_trans_mutil_args.py) -- 参数 +传递多个参数的时候, 使用**元组**来进行数据的传递。 - 无 - -- 返回值 - -True 表示被某个线程获取 - -> False 表示没有被线程获取 - -**_thread.get_ident** - -> 该方法用于获取当前线程号。 - -- 函数原型 - - _thread.get_ident() - -- 参数 - - 无 - -- 返回值 - - 返回当前线程号。 - -**_thread.stack_size** - -> 该方法用于设置创建新线程使用的堆栈大小。单位:字节。 - -- 函数原型 - - _thread.stack_size(size) - -- 参数 - - *size*:堆栈大小。默认值:8192。 - -- 返回值 - - 返回当前堆栈大小。 - -**_thread.start_new_thread** - -> 该方法用于创建一个新线程。 - -- 函数原型 - - _thread.start_new_thread(function, args) - -- 参数 - - *function*: - - 接收执行函数 - - *args*: +```python +import _thread as thread +import utime as time - 被执行函数参数 -- 返回值 +def th_func(thread_id, delay): + print("thread:{} delay {}".format(thread_id, delay)) + time.sleep_ms(delay) - 无 -#### 多线程使用示例 +def main(): + print("线程传递多个参数测试") + for i in range(5): + thread.start_new_thread(th_func, (i + 1, 2)) + # 等待所有子线程回收 + time.sleep_ms(100) -> 步骤**1**: -> 将开发板接入电脑。接入后的操作方法详见《Quectel_QuecPython_基础操作说明》。 -> ![](media/782cd2c870c62e6f022cca4e47c7c806.jpg) +main() -> 图 **2**:开发板接入电脑 +``` -> 步骤**2**: 创建 *test.py* 文件,在文件内导入 QuecPython 中的_thread -> 模块,编写多线程代码。 +### 线程退出 +暂时没有提供类似于 **join** 函数之类的操作, 前期可以使用一个全局的标志位来标志线程的退出。 +[线程退出代码](code/Qp_thread_exit.py) ```python -import _thread - -def th_func(thread_id): +import _thread as thread +import utime as time - Print("thread id is:%d" % thread_id) +exited = False -for i in range(5): - _thread.start_new_thread(th_func,(i+1,)) -``` +def th_func(thread_id, delay): + global exited + print("thread:{} delay {}".format(thread_id, delay)) + time.sleep_ms(delay) + exited = True +def main(): + print("线程传递多个参数测试") + # for i in range(5): + thread.start_new_thread(th_func, (1, 2000)) + # 等待所有子线程回收 + while exited is False: + time.sleep_ms(100) + print("等待线程退出") -> 步骤**3**: 将 test.py -> 文件上传到开发板,上传方法详见《Quectel_QuecPython_基础操作说明》。 -> 步骤**4**: 程序运行结果,如图所示: +main() +``` -![](media/e2d4afc1ebb0f7d9ad420489f74da40d.jpg) +### 线程间通讯 +待补充 -#### 附录参考文档 +### 同时访问共享变量、需要注意的问题 +待补充 -> 表 **1**:参考文档 +### 设置线程优先级 +待补充 -| 序号 | 文档名称 | 备注 | -| ---- | ------------------------------- | --------------------------- | -| [1] | Quectel_QuecPython_基础操作说明 | QuecPython 上传下载文件说明 | \ No newline at end of file diff --git a/script/auto_creat_toc.py b/script/auto_creat_toc.py index 544947e881ea1c8913fa533f942df1a1fb610aa8..be7f3f98f1e03764a73fd52258132f34a4949a22 100644 --- a/script/auto_creat_toc.py +++ b/script/auto_creat_toc.py @@ -37,7 +37,8 @@ def creat_toc(args): # 2. 根据 url 找到 某一个目录下所有的指定文件 List_file_path = [] for _ in dir_list: - r = find_file("docs/" + _, "sidebar.yaml") + (filepath, tempfilename) = os.path.split(_) + r = find_file("out/doc/" + filepath + '/', "sidebar.yaml") if r is not None: List_file_path.append(r) logger.debug("找到了 {}".format(List_file_path))