搜索
bottom↓
回复: 25

(RTGUI)SSD1963 显示芯片驱动程序

[复制链接]

出110入93汤圆

发表于 2013-7-13 10:16:35 | 显示全部楼层 |阅读模式
STM32 + RT Thread OS 学习笔记[三]

RTGUI

据说RTGUI是多线程的,因此与RT-Thread OS的耦合度较高,有可能要访问RT-Thread的线程控制块。如果要移植到其它OS,估计难度较大。目前还处于Alpha状态,最终将会包含进RT-Thread中,成为其中的标准组件。

1、  RTGUI下载

当前,要获取包含RTGUI的源码,需要到SVN库里去拉。

因此,需要先安装SVN客户端。比较简单的就是命令行,当然你也可以其它选择。

这里使用Apache Subversion command line tools,下载地址:http://www.visualsvn.com/downloads/


下载文件是一个压缩包,解压到任意目录即可。


RT-Thread SVN源码浏览


打开cmd窗口,进入上面解压缩目录,运行下面的命令:

svn checkout http://rt-thread.googlecode.com/svn/tags/rtt_1_1_1\mcu\rtt111

这样就把rtt_1_1_1这个版本下载到根目录下的 mcu\rtt111中。




注1:由于众所周知的原因,从googlecode下载有点困难,建议使用VPN等方式。

注2:下载的bsp目录,实际只需要simulator(模拟器)和stm32f10x(奋斗板V3对应),其它的都可以删除或转移到其它目录。

2、  项目生成

与之前一样,修改rtconfig.h,打开RT_USING_RTGUI选项;


运行命令:scons –target=mdk4 –s

打开生成的项目文件,可以看到已经包含了RTGUI。

3、  LCD驱动(SSD1963)

a)      这是重新下载的源码,所以对LED的定义,还需要按之前章节所述,修改相应代码。

b)      编译

在驱动未完成前,examples和calibration.c(由文件名看应该是触摸屏校准程序)都可以不要。从项目中移除(remove)组gui_examples以及文件calibration.c,重新编译,成功。


阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出110入93汤圆

 楼主| 发表于 2013-7-13 10:17:26 | 显示全部楼层

c)      驱动代码

默认状态下,包含了ssd1289这个驱动文件,我们要参照它来写一个ssd1963的驱动。

代码:

ssd1963.c


[cpp] view plaincopyprint?


  • #include <rtthread.h>  
  • #include "stm32f10x.h"  
  •    
  • // 分辨率(H:0-479 V:0-271)  
  • unsigned int  HDP=479;  
  • unsigned int  VDP=271;  
  •    
  • unsigned int  HT=531;  
  • unsigned int  HPS=43;  
  • unsigned int  LPS=8;  
  • unsigned char HPW=1;  
  •    
  • unsigned int  VT=288;  
  • unsigned int  VPS=12;  
  • unsigned int  FPS=4;  
  • unsigned char VPW=10;  
  •    
  • #define Bank1_LCD_D    ((uint32_t)0x60020000)    //disp Data ram  
  • #define Bank1_LCD_C    ((uint32_t)0x60000000)     //disp Reg ram  
  •    
  • void Delay(__IO uint32_t nCount)  
  • {  
  •   for(; nCount != 0; nCount--);  
  • }  
  •    
  • void LCD_WR_REG(u16 index)  
  • {  
  • *(__IO uint16_t *) (Bank1_LCD_C)= index;  
  • }  
  •    
  • u16 LCD_RD_DAT(void)  
  • {  
  • u16 a=0;  
  • a=*(__IO uint16_t *) (Bank1_LCD_D);  
  • return(a);  
  • }  
  •    
  • void LCD_WR_DAT(u16 val)  
  • {   
  • *(__IO uint16_t *) (Bank1_LCD_D)= val;        
  • }  
  •    
  • void _set_window(u16 x1, u16 y1, u16 x2, u16 y2)  
  • {  
  • LCD_WR_REG(0x002A);  
  •          LCD_WR_DAT(x1>>8);        
  •          LCD_WR_DAT(x1&0x00ff);  
  •          LCD_WR_DAT(x2>>8);  
  •          LCD_WR_DAT(x2&0x00ff);  
  •          LCD_WR_REG(0x002b);  
  •          LCD_WR_DAT(y1>>8);  
  •          LCD_WR_DAT(y1&0x00ff);  
  •          LCD_WR_DAT(y2>>8);  
  •          LCD_WR_DAT(y2&0x00ff);  
  • }  
  •    
  • void _set_cursor(u16 x,u16 y)  
  • {  
  • _set_window(x, y, HDP, VDP);  
  • }  
  •    
  • void lcd_set_pixel(const char* pixel, int x, int y)  
  • {  
  • _set_cursor(x, y);  
  • LCD_WR_REG(0x2c);  
  • LCD_WR_DAT(*(rt_uint16_t*)pixel);  
  • }  
  •    
  • void lcd_get_pixel(char* pixel, int x, int y)  
  • {  
  • _set_cursor(x, y);  
  • LCD_WR_REG(0x2e);  
  • *(rt_uint16_t*)pixel = LCD_RD_DAT();  
  • }  
  •    
  • void lcd_draw_hline(const char* pixel, int x1, int x2, int y)  
  • {  
  • _set_cursor(x1, y);  
  • LCD_WR_REG(0x2c);  
  •     while (x1 < x2)  
  •     {  
  •         LCD_WR_DAT(*(rt_uint16_t*)pixel);  
  •         x1++;  
  •     }  
  • }  
  •    
  • void lcd_draw_vline(const char* pixel, int x, int y1, int y2)  
  • {  
  • _set_window(x, y1, x, y2);  
  • LCD_WR_REG(0x2c);  
  •     while (y1 < y2)  
  •     {  
  •         LCD_WR_DAT(*(rt_uint16_t*)pixel);  
  •         y1++;  
  •     }  
  • }  
  •    
  • void lcd_blit_line(const char* pixels, int x, int y, rt_size_t size)  
  • {  
  • rt_uint16_t *ptr;  
  • ptr = (rt_uint16_t*)pixels;  
  •    
  • _set_cursor(x, y);  
  • LCD_WR_REG(0x2c);  
  •     while (size)  
  •     {  
  •         LCD_WR_DAT(*ptr ++);  
  •            size --;  
  •     }  
  • }  
  •    
  • void lcd_clear()  
  • {                     
  •     int w = HDP + 1, h = VDP + 1;  
  • _set_cursor(0, 0);  
  • LCD_WR_REG(0x2c);  
  •     while (w--)  
  •     {  
  •         while(h--)  
  •         {  
  •             LCD_WR_DAT(0xffff);  
  •         }  
  •            h = VDP + 1;  
  •     }  
  • }  
  •    
  • void LCD_INIT(void)  
  • {  
  • GPIO_ResetBits(GPIOE, GPIO_Pin_1);  
  •     Delay(0xAFFFF);                                          
  •     GPIO_SetBits(GPIOE, GPIO_Pin_1 );                           
  • Delay(0xAFFFF);  
  •    
  •     LCD_WR_REG(0x00E2);                 // PLL=10*36/3=120M  
  • LCD_WR_DAT(0x0023);          //N=0x36 for 6.5M, 0x23 for 10M crystal  
  • LCD_WR_DAT(0x0002);  
  • LCD_WR_DAT(0x0004);  
  • LCD_WR_REG(0x00E0);         
  • LCD_WR_DAT(0x0001);  
  • Delay(0xAFFF);  
  • LCD_WR_REG(0x00E0);  
  • LCD_WR_DAT(0x0003);               
  • Delay(0xAFFF);  
  • LCD_WR_REG(0x0001);        
  • Delay(0xAFFF);  
  • LCD_WR_REG(0x00E6);              //PLL setting for PCLK, depends on resolution  
  • LCD_WR_DAT(0x0001);  
  • LCD_WR_DAT(0x0033);  
  • LCD_WR_DAT(0x0032);  
  •    
  • LCD_WR_REG(0x00B0);              //module  
  • LCD_WR_DAT(0x0000);  
  • LCD_WR_DAT(0x0000);  
  • LCD_WR_DAT((HDP>>8)&0X00FF);  //Set HDP  
  • LCD_WR_DAT(HDP&0X00FF);  
  •     LCD_WR_DAT((VDP>>8)&0X00FF);  //Set VDP  
  • LCD_WR_DAT(VDP&0X00FF);  
  •     LCD_WR_DAT(0x0000);  
  •    
  • LCD_WR_REG(0x00B4);      //HSYNC  
  • LCD_WR_DAT((HT>>8)&0X00FF);  //Set HT  
  • LCD_WR_DAT(HT&0X00FF);  
  • LCD_WR_DAT((HPS>>8)&0X00FF);  //Set HPS  
  • LCD_WR_DAT(HPS&0X00FF);  
  • LCD_WR_DAT(HPW);                       //Set HPW  
  • LCD_WR_DAT((LPS>>8)&0X00FF);  //Set HPS  
  • LCD_WR_DAT(LPS&0X00FF);  
  • LCD_WR_DAT(0x0000);  
  •    
  • LCD_WR_REG(0x00B6);      //VSYNC  
  • LCD_WR_DAT((VT>>8)&0X00FF);   //Set VT  
  • LCD_WR_DAT(VT&0X00FF);  
  • LCD_WR_DAT((VPS>>8)&0X00FF);  //Set VPS  
  • LCD_WR_DAT(VPS&0X00FF);  
  • LCD_WR_DAT(VPW);                       //Set VPW  
  • LCD_WR_DAT((FPS>>8)&0X00FF);  //Set FPS  
  • LCD_WR_DAT(FPS&0X00FF);  
  •    
  • LCD_WR_REG(0x00BA);  
  • LCD_WR_DAT(0x000F);    //GPIO[3:0] out 1  
  •    
  • LCD_WR_REG(0x00B8);  
  • LCD_WR_DAT(0x0007);    //GPIO3=input, GPIO[2:0]=output  
  • LCD_WR_DAT(0x0001);    //GPIO0 normal  
  •    
  • LCD_WR_REG(0x0036);            //rotation  
  • LCD_WR_DAT(0x0000);  
  •    
  • LCD_WR_REG(0x00F0);             //16位  565 color module  
  • LCD_WR_DAT(0x0003);  
  •    
  • Delay(0xAFFF);  
  •    
  • LCD_WR_REG(0x0029); //display on  
  •    
  • LCD_WR_REG(0x00BE); //set PWM for B/L  
  • LCD_WR_DAT(0x0006);  
  • LCD_WR_DAT(0x0080);  
  • LCD_WR_DAT(0x0001);  
  • LCD_WR_DAT(0x00f0);  
  • LCD_WR_DAT(0x0000);  
  • LCD_WR_DAT(0x0000);  
  •    
  • LCD_WR_REG(0x00d0);// backlight  
  • LCD_WR_DAT(0x000d);  
  • }  
  •    
  • void GPIO_INIT(void)  
  • {  
  •     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC  
  •                                                        | RCC_APB2Periph_GPIOD| RCC_APB2Periph_GPIOE| RCC_APB2Periph_GPIOF , ENABLE);  
  • }  
  •    
  • void FSMC_LCD_Init(void)  
  • {  
  •   FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;  
  •   FSMC_NORSRAMTimingInitTypeDef  p;  
  •   GPIO_InitTypeDef  GPIO_InitStructure;  
  •    
  •   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);         
  •    
  •   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;                                 
  •   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                     
  •   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                    
  •   GPIO_Init(GPIOD, &GPIO_InitStructure);     
  •   GPIO_SetBits(GPIOD, GPIO_Pin_13);                                    
  •    
  •    
  •   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                 
  •   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                     
  •   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                    
  •   GPIO_Init(GPIOE, &GPIO_InitStructure);   
  •    
  •          
  •    
  •   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 |  
  •                                 GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 |  
  •                                 GPIO_Pin_15;  
  •   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                  
  •   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;           
  •   GPIO_Init(GPIOD, &GPIO_InitStructure);  
  •    
  •    
  •   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |  
  •                                 GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 |  
  •                                 GPIO_Pin_15;  
  •   GPIO_Init(GPIOE, &GPIO_InitStructure);  
  •    
  •    
  •    
  •    
  •   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;  
  •   GPIO_Init(GPIOD, &GPIO_InitStructure);  
  •    
  •    
  •   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 ;  
  •   GPIO_Init(GPIOD, &GPIO_InitStructure);  
  •    
  •   p.FSMC_AddressSetupTime = 0x02;  
  •   p.FSMC_AddressHoldTime = 0x00;  
  •   p.FSMC_DataSetupTime = 0x05;  
  •   p.FSMC_BusTurnAroundDuration = 0x00;  
  •   p.FSMC_CLKDivision = 0x00;  
  •   p.FSMC_DataLatency = 0x00;  
  •   p.FSMC_AccessMode = FSMC_AccessMode_B;  
  •    
  •   FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;  
  •   FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;  
  •   FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR;  
  •   FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;  
  •   FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;  
  •   FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;  
  •   FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;  
  •   FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;  
  •   FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;  
  •   FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;  
  •   FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;  
  •   FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;  
  •   FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;  
  •   FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;  
  •   FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;  
  •    
  •   FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  
  •    
  •    
  •   FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);   
  • }  
  •    
  •    
  • struct rt_device_graphic_ops ssd1963_ops =  
  • {  
  • lcd_set_pixel,  
  • lcd_get_pixel,  
  • lcd_draw_hline,  
  • lcd_draw_vline,  
  • lcd_blit_line  
  • };  
  •    
  • struct rt_device _lcd_device;  
  • static rt_err_t lcd_init(rt_device_t dev)  
  • {  
  • return RT_EOK;  
  • }  
  •    
  • static rt_err_t lcd_open(rt_device_t dev, rt_uint16_t oflag)  
  • {  
  • return RT_EOK;  
  • }  
  •    
  • static rt_err_t lcd_close(rt_device_t dev)  
  • {  
  • return RT_EOK;  
  • }  
  •    
  • static rt_err_t lcd_control(rt_device_t dev, rt_uint8_t cmd, void *args)  
  • {  
  • switch (cmd)  
  • {  
  • case RTGRAPHIC_CTRL_GET_INFO:  
  •            {  
  •                     struct rt_device_graphic_info *info;  
  •    
  •                     info = (struct rt_device_graphic_info*) args;  
  •                     RT_ASSERT(info != RT_NULL);  
  •    
  •                     info->bits_per_pixel = 16;  
  •                     info->pixel_format = RTGRAPHIC_PIXEL_FORMAT_RGB565P;  
  •                     info->framebuffer = RT_NULL;  
  •                     info->width = HDP + 1;  
  •                     info->height = VDP + 1;  
  •            }  
  •            break;  
  •    
  • case RTGRAPHIC_CTRL_RECT_UPDATE:  
  •            /* nothong to be done */  
  •            break;  
  •    
  • default:  
  •            break;  
  • }  
  •    
  • return RT_EOK;  
  • }  
  •    
  • void rt_hw_lcd_init(void)  
  • {  
  •    
  • /* register lcd device */  
  • _lcd_device.type  = RT_Device_Class_Graphic;  
  • _lcd_device.init  = lcd_init;  
  • _lcd_device.open  = lcd_open;  
  • _lcd_device.close = lcd_close;  
  • _lcd_device.control = lcd_control;  
  • _lcd_device.read  = RT_NULL;  
  • _lcd_device.write = RT_NULL;  
  •    
  • _lcd_device.user_data = &ssd1963_ops;  
  •     GPIO_INIT();  
  •     FSMC_LCD_Init();  
  •     LCD_INIT();  
  •     lcd_clear();  
  •    
  •     /* register graphic device driver */  
  • rt_device_register(&_lcd_device, "lcd",  
  •            RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STANDALONE);  
  • }  


这个文件中,直接被调用的只有一个函数:void rt_hw_lcd_init(void),执行完成后,在系统中注册了名为“lcd”的设备。


[cpp] view plaincopyprint?


  • _lcd_device.type  = RT_Device_Class_Graphic;  
  • _lcd_device.init  = lcd_init;  
  • _lcd_device.open  = lcd_open;  
  • _lcd_device.close = lcd_close;  
  • _lcd_device.control = lcd_control;  
  • _lcd_device.read  = RT_NULL;  
  • _lcd_device.write = RT_NULL;  



这些是一个标准设备必须的函数,作为LCD显示设备,这里只有control是有用的,其它实际上是个空函数。


[cpp] view plaincopyprint?


  • struct rt_device_graphic_ops ssd1963_ops =  
  • {  
  •          lcd_set_pixel,  
  •          lcd_get_pixel,  
  •          lcd_draw_hline,  
  •          lcd_draw_vline,  
  •          lcd_blit_line  
  • };  
  •    
  • void rt_hw_lcd_init(void)  
  • {  
  •    
  •          …………  
  •    
  •          _lcd_device.user_data = &ssd1963_ops;  
  • …………  


与显示设备相关的,主要是这五个画图相关函数。


出110入93汤圆

 楼主| 发表于 2013-7-13 10:18:27 | 显示全部楼层

d)      测试程序

测试程序分两个,一个是底层硬件画图函数测试,一个是RTGUI API测试。

lcd_hw_test.c


[cpp] view plaincopyprint?


  • #include <rtthread.h>  
  •    
  • extern const unsigned char* icon;  
  •    
  • void lcd_hw_test(){  
  •     char pixel[] = {0x00, 0xf8};  
  •     int width, height = 59, i=5;  
  •     unsigned char* p;  
  •     char tmp[] = {0xff, 0xff};  
  •    
  •     rt_device_t drv = rt_device_find("lcd");  
  •     struct rt_device_graphic_ops* ops = ((struct rt_device_graphic_ops *)(drv->user_data));  
  •    
  •     // hline  
  •     while(i--)  
  •     {  
  •         ops->draw_hline(pixel, 0, 480, 50 + i);  
  •     }  
  •    
  •     // vline  
  •     i = 5;  
  •     while(i--)  
  •     {  
  •         ops->draw_vline(pixel, 80 + i, 0, 272);  
  •     }  
  •    
  •     // draw icon  
  •     p = (unsigned char*)&icon;  
  •     while(height--){  
  •         ops->blit_line((char*)p, 200, 180 - height, 59);  
  •         p += 59 * 2;  
  •     }  
  •      
  •     // copy icon  
  •     width = height = 59;  
  •     while(height--)  
  •     {  
  •         while(width--)  
  •         {  
  •             ops->get_pixel(tmp, 200 + width, 180 - height);  
  •             ops->set_pixel(tmp, 290 + width,  180 - height);  
  •         }  
  •         width = 59;  
  •     }  
  • }  


lcd_gui_test.c[cpp] view plaincopyprint?


  • #include <rtthread.h>  
  •    
  • #ifdef RT_USING_RTGUI  
  • #include <rtgui/rtgui.h>  
  • #include <rtgui/rtgui_server.h>  
  • #include <rtgui/rtgui_system.h>  
  • #include <rtgui/driver.h>  
  • #endif  
  •    
  • const unsigned char icon[] = {0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X9F,0XF7,0XFE,0XD6,  
  • 0XFE,0XDE,0X3F,0XE7,0X1E,0XDF,0X1E,0XDF,0X1E,0XDF,0X1E,0XDF,0X1E,0XDF,0X1E,0XDF,  
  • 0X1E,0XDF,0X1E,0XDF,0X1E,0XDF,0X1E,0XDF,0X1E,0XDF,0X1E,0XDF,0X1E,0XDF,0X3F,0XDF,  
  • 0X1E,0XDF,0X1E,0XDF,0X1E,0XDF,0X3F,0XDF,0X1E,0XDF,0X1E,0XDF,0X1E,0XDF,0X1E,0XDF,  
  • 0X1E,0XDF,0X1E,0XDF,0X1E,0XDF,0X1E,0XDF,0X1E,0XDF,0X1E,0XDF,0X1E,0XDF,0X1E,0XDF,  
  • 0X1E,0XDF,0X1E,0XDF,0X1E,0XDF,0X1E,0XDF,0X1E,0XDF,0X1E,0XDF,0X1E,0XDF,0X1E,0XDF,  
  • 0X1E,0XDF,0X3F,0XE7,0XFE,0XDE,0XFE,0XD6,0X9F,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,  
  • 0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDF,0XFF,  
  • 0XFE,0XD6,0X1E,0XDF,0XBE,0XD6,0X7E,0XC6,0X5E,0XC6,0X5E,0XC6,0X5E,0XC6,0X5E,0XC6,  
  • 0X5E,0XC6,0X5E,0XC6,0X5E,0XC6,0X5E,0XC6,0X5E,0XC6,0X5E,0XC6,0X5E,0XC6,0X5E,0XC6,  
  • 0X5E,0XC6,0X7E,0XC6,0X9E,0XC6,0X9E,0XC6,0X9E,0XC6,0X9E,0XC6,0X7E,0XC6,0X5E,0XC6,  
  • 0X5E,0XC6,0X5E,0XC6,0X5E,0XC6,0X5E,0XC6,0X5E,0XC6,0X5E,0XC6,0X5E,0XC6,0X5E,0XC6,  
  • 0X5E,0XC6,0X5E,0XC6,0X5E,0XC6,0X5E,0XC6,0X5E,0XC6,0X5E,0XC6,0X5E,0XC6,0X5E,0XC6,  
  • 0X5E,0XC6,0X5E,0XC6,0X5E,0XC6,0X5E,0XC6,0X5E,0XC6,0X7E,0XC6,0XBE,0XD6,0X1E,0XDF,  
  • 0XFE,0XDE,0XDF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,  
  • 0XFF,0XFF,0XBE,0XF7,0XDE,0XD6,0XBE,0XCE,0X5E,0XBE,0X5D,0XBE,0X5D,0XBE,0X5D,0XBE,  
  • 0X5D,0XBE,0X5D,0XBE,0X5D,0XBE,0X5E,0XBE,0X5D,0XBE,0X5D,0XBE,0X5D,0XBE,0X5D,0XBE,  
  • 0X5D,0XBE,0X5E,0XBE,0X5E,0XC6,0X7E,0XC6,0X9E,0XC6,0X9E,0XC6,0X9E,0XC6,0X9E,0XC6,  
  • 0X7E,0XC6,0X5D,0XBE,0X5D,0XBE,0X5D,0XBE,0X5D,0XBE,0X5D,0XBE,0X5D,0XBE,0X5D,0XBE,  
  • 0X5D,0XBE,0X5D,0XBE,0X5D,0XBE,0X5D,0XBE,0X5D,0XBE,0X5D,0XBE,0X5D,0XBE,0X5D,0XBE,  
  • 0X5D,0XBE,0X5D,0XBE,0X5D,0XBE,0X5D,0XBE,0X5D,0XBE,0X5D,0XBE,0X5D,0XBE,0X5D,0XBE,  
  • 0X5D,0XBE,0X5D,0XBE,0X5E,0XC6,0XDE,0XD6,0XFE,0XD6,0XBE,0XF7,0XFF,0XFF,0XFF,0XFF,  
  • 0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBE,0XF7,0XBD,0XCE,0X7E,0XC6,0X3D,0XBE,0X3D,0XBE,  
  • 0X3D,0XBE,0X3D,0XBE,0X3D,0XBE,0X3D,0XBE,0X3E,0XBE,0X5E,0XBE,0X7E,0XBE,0X7E,0XBE,  
  • 0X7E,0XBE,0X7E,0XBE,0X7E,0XBE,0X7E,0XBE,0X7E,0XBE,0X7E,0XBE,0X7E,0XBE,0X7E,0XBE,  
  • 0X7E,0XBE,0X7E,0XBE,0X5E,0XBE,0X3D,0XBE,0X3D,0XBE,0X3D,0XBE,0X3E,0XBE,0X5E,0XBE,  
  • 0X3E,0XBE,0X3D,0XBE,0X3D,0XBE,0X3D,0XBE,0X3D,0XBE,0X3D,0XBE,0X3D,0XBE,0X3D,0XBE,  
  • 0X3D,0XBE,0X3D,0XBE,0X3D,0XBE,0X3D,0XBE,0X3D,0XBE,0X3D,0XBE,0X3D,0XBE,0X3D,0XBE,  
  • 0X3D,0XBE,0X3D,0XBE,0X3D,0XBE,0X3D,0XBE,0X3D,0XBE,0X5E,0XBE,0X5E,0XBE,0XBE,0XCE,  
  • 0XDE,0XD6,0XBE,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDF,0XFF,0XDD,0XD6,0X7E,0XC6,  
  • 0X1D,0XB6,0X1D,0XB6,0X3E,0XBE,0X3E,0XBE,0X5E,0XBE,0X3E,0XBE,0X5E,0XBE,0X5E,0XBE,  
  • 0X5E,0XBE,0X5E,0XBE,0X5E,0XBE,0X5E,0XBE,0X5E,0XBE,0X5E,0XBE,0X5E,0XBE,0X5E,0XBE,  
  • 0X5E,0XBE,0X5E,0XBE,0X5E,0XBE,0X5E,0XBE,0X3E,0XBE,0X1D,0XB6,0X1D,0XB6,0X1D,0XB6,  
  • 0X1D,0XB6,0X3E,0XBE,0X5E,0XBE,0X5E,0XBE,0X1D,0XB6,0X5E,0XBE,0X3D,0XB6,0X1D,0XB6,  
  • 0X1D,0XB6,0X1D,0XB6,0X1D,0XB6,0X1D,0XB6,0X1D,0XB6,0X1D,0XB6,0X1D,0XB6,0X1D,0XB6,  
  • 0X1D,0XB6,0X1D,0XB6,0X1D,0XB6,0X1D,0XB6,0X1D,0XB6,0X1D,0XB6,0X1D,0XB6,0X1D,0XB6,  
  • 0X1D,0XB6,0X1D,0XB6,0X1D,0XB6,0X9E,0XC6,0XFD,0XD6,0XDF,0XFF,0XFF,0XFF,0XDF,0XFF,  
  • 0X5D,0XEF,0X7E,0XC6,0X1E,0XB6,0X5E,0XB6,0X5E,0XB6,0X5E,0XB6,0X5E,0XB6,0X5E,0XB6,  
  • 0X5E,0XB6,0X5E,0XB6,0X5E,0XB6,0X5E,0XB6,0X5E,0XB6,0X5E,0XB6,0X5E,0XB6,0X5E,0XB6,  
  • 0X5E,0XB6,0X5E,0XB6,0X5E,0XB6,0X5E,0XB6,0X5E,0XB6,0X5E,0XB6,0X5E,0XB6,0XFD,0XB5,  
  • 0XFD,0XB5,0XFD,0XB5,0XFD,0XB5,0XFD,0XB5,0XFD,0XB5,0X5E,0XB6,0X5E,0XB6,0X3E,0XB6,  
  • 0X5E,0XB6,0X5E,0XB6,0X1D,0XB6,0XFD,0XB5,0XFD,0XB5,0XFD,0XB5,0XFD,0XB5,0XFD,0XB5,  
  • 0XFD,0XB5,0XFD,0XB5,0XFD,0XB5,0XFD,0XB5,0XFD,0XB5,0XFD,0XB5,0XFD,0XB5,0XFD,0XB5,  
  • 0XFD,0XB5,0XFD,0XB5,0XFD,0XB5,0XFD,0XB5,0XFD,0XB5,0XFD,0XB5,0X1D,0XB6,0XBE,0XC6,  
  • 0X5D,0XEF,0XDF,0XFF,0XBE,0XF7,0X9C,0XCE,0X3E,0XB6,0X3E,0XB6,0X3E,0XB6,0X3E,0XB6,  
  • 0X3E,0XB6,0X3E,0XB6,0X3E,0XB6,0X3E,0XB6,0X3E,0XB6,0X3E,0XB6,0X3E,0XB6,0X3E,0XB6,  
  • 0X3E,0XB6,0X3E,0XB6,0X3E,0XB6,0X3E,0XB6,0X3E,0XB6,0X3E,0XB6,0X3E,0XB6,0X3E,0XB6,  
  • 0X3E,0XB6,0X3E,0XB6,0XDD,0XAD,0XDD,0XAD,0XDD,0XAD,0XDD,0XAD,0XBD,0XAD,0XFD,0XB5,  
  • 0X1D,0XAE,0X3E,0XB6,0X3E,0XB6,0X3E,0XB6,0X3E,0XB6,0X3E,0XB6,0XFD,0XB5,0XDD,0XAD,  
  • 0XDD,0XAD,0XDD,0XAD,0XDD,0XAD,0XDD,0XAD,0XDD,0XAD,0XDD,0XAD,0XDD,0XAD,0XDD,0XAD,  
  • 0XDD,0XAD,0XDD,0XAD,0XDD,0XAD,0XDD,0XAD,0XDD,0XAD,0XDD,0XAD,0XDD,0XAD,0XDD,0XAD,  
  • 0XDD,0XAD,0XDD,0XAD,0X3E,0XB6,0XBD,0XCE,0XBE,0XF7,0X5D,0XEF,0X3D,0XBE,0X1E,0XAE,  
  • 0X1E,0XAE,0X1E,0XAE,0X1E,0XAE,0X1E,0XAE,0X1E,0XAE,0X1E,0XAE,0X1E,0XAE,0X1E,0XAE,  
  • 0X1E,0XAE,0X1E,0XAE,0X1E,0XAE,0X1E,0XAE,0X1E,0XAE,0X1E,0XAE,0X1E,0XAE,0X1E,0XAE,  
  • 0X1E,0XAE,0X1E,0XAE,0X1E,0XAE,0X1E,0XAE,0X1E,0XAE,0XDD,0XAD,0XBD,0XAD,0XBD,0XAD,  
  • 0XBD,0XA5,0X5C,0X9D,0XDE,0XD6,0XDD,0XA5,0X1D,0XAE,0X1E,0XAE,0X1E,0XAE,0X1E,0XAE,  
  • 0X1E,0XAE,0X1E,0XAE,0XDD,0XAD,0XBD,0XAD,0XBD,0XAD,0XBD,0XAD,0XBD,0XAD,0XBD,0XAD,  
  • 0XBD,0XAD,0XBD,0XAD,0XBD,0XAD,0XBD,0XAD,0XBD,0XAD,0XBD,0XA5,0XBD,0XA5,0XBD,0XA5,  
  • 0XBD,0XAD,0XBD,0XAD,0XDD,0XAD,0XFD,0XAD,0X1E,0XAE,0X1E,0XAE,0X1D,0XB6,0X5D,0XEF,  
  • 0XFB,0XDE,0XDD,0XAD,0XFD,0XAD,0X1D,0XAE,0X1D,0XAE,0X1D,0XAE,0X1D,0XAE,0X1D,0XAE,  
  • 0X1D,0XAE,0X1D,0XAE,0X1D,0XAE,0X1D,0XAE,0X1D,0XAE,0X1D,0XAE,0X1D,0XAE,0X1D,0XAE,  
  • 0X1D,0XAE,0X1D,0XAE,0X1D,0XAE,0X1D,0XAE,0X1D,0XAE,0X1D,0XAE,0X1D,0XAE,0X1D,0XAE,  
  • 0XFD,0XAD,0XFD,0XAD,0XFD,0XAD,0XBC,0XA5,0X1B,0X95,0XDF,0XFF,0X7C,0X95,0XFD,0XA5,  
  • 0X1D,0XAE,0X1D,0XAE,0X1D,0XAE,0XFD,0XAD,0XBD,0XA5,0XBD,0XA5,0XBD,0XA5,0XBD,0XA5,  
  • 0XBD,0XA5,0XBD,0XA5,0XBD,0XA5,0XBD,0XA5,0XBD,0XA5,0XBD,0XA5,0X9D,0XA5,0X9C,0XA5,  
  • 0X9C,0XA5,0X3A,0XA5,0X9D,0XA5,0X9D,0XA5,0XBD,0XA5,0XBD,0XA5,0XDD,0XAD,0XFD,0XAD,  
  • 0X1D,0XAE,0XDD,0XAD,0XFB,0XDE,0XBA,0XD6,0XFD,0XAD,0XDD,0XA5,0XFD,0XA5,0XFD,0XA5,  
  • 0XFD,0XA5,0XFD,0XA5,0XFD,0XA5,0XFD,0XA5,0XFD,0XA5,0XFD,0XA5,0XFD,0XA5,0XFD,0XA5,  
  • 0XFD,0XA5,0XFD,0XA5,0XFD,0XA5,0XFD,0XA5,0XFD,0XA5,0XFD,0XA5,0XFD,0XA5,0XFD,0XA5,  
  • 0XFD,0XA5,0XFD,0XA5,0XFD,0XA5,0XFD,0XA5,0XFD,0XA5,0XFD,0XA5,0XBC,0X9D,0X7B,0XA5,  
  • 0XFF,0XFF,0XDC,0XA5,0XBC,0X9D,0XFD,0XA5,0XDD,0XA5,0X9D,0XA5,0X9D,0X9D,0X9D,0X9D,  
  • 0XFD,0XA5,0XBD,0XA5,0X9D,0X9D,0X9D,0X9D,0X9D,0X9D,0X9D,0X9D,0X9D,0X9D,0X7D,0X9D,  
  • 0X7C,0X9D,0X7C,0X9D,0X1A,0XA5,0X8F,0XB3,0X5C,0X9D,0X7C,0X9D,0X7D,0X9D,0X9D,0X9D,  
  • 0X9D,0X9D,0XDD,0XA5,0XDD,0XA5,0XDD,0XA5,0XBD,0XA5,0XBA,0XD6,0X79,0XCE,0X9D,0X9D,  
  • 0XDD,0XA5,0XDD,0XA5,0XDD,0XA5,0XDD,0XA5,0XBD,0X9D,0X9D,0X9D,0XBD,0XA5,0XDD,0XA5,  
  • 0XDD,0XA5,0XDD,0XA5,0XDD,0XA5,0XDD,0XA5,0XDD,0XA5,0XDD,0XA5,0XDD,0XA5,0XDD,0XA5,  
  • 0XDD,0XA5,0XDD,0XA5,0XDD,0XA5,0XDD,0XA5,0XDD,0XA5,0XDD,0XA5,0XDD,0XA5,0XDD,0XA5,  
  • 0XDD,0XA5,0X7C,0X95,0X3C,0XB6,0XFF,0XFF,0X3C,0XB6,0X7C,0X95,0XDD,0XA5,0X9D,0X9D,  
  • 0XBD,0X9D,0X5C,0X9D,0X7D,0X9D,0X5C,0X9D,0X5C,0X9D,0X5C,0X9D,0X5C,0X9D,0X5C,0X9D,  
  • 0X5C,0X9D,0X5C,0X95,0X5C,0X95,0X3B,0X95,0X75,0XA4,0X67,0XBA,0XB8,0X94,0X3B,0X95,  
  • 0X5C,0X95,0X5C,0X95,0X5C,0X9D,0X5C,0X9D,0X7D,0X9D,0X7D,0X9D,0X9D,0X9D,0X9D,0X9D,  
  • 0X79,0XCE,0X59,0XCE,0XBD,0X9D,0XBD,0X9D,0XBD,0X9D,0XBD,0X9D,0XBD,0X9D,0X5D,0X95,  
  • 0X3C,0X95,0X3C,0X95,0X5D,0X95,0XBD,0X9D,0XBD,0X9D,0XBD,0X9D,0XBD,0X9D,0XBD,0X9D,  
  • 0XBD,0X9D,0XBD,0X9D,0XBD,0X9D,0XBD,0X9D,0XBD,0X9D,0XBD,0X9D,0XBD,0X9D,0XBD,0X9D,  
  • 0XBD,0X9D,0XBD,0X9D,0XBD,0X9D,0X9D,0X9D,0X1B,0X8D,0XBD,0XCE,0XFF,0XFF,0XBD,0XCE,  
  • 0X1B,0X8D,0X9D,0X9D,0XBD,0X9D,0XBD,0X9D,0X9D,0X9D,0X5C,0X95,0X3C,0X95,0X3C,0X95,  
  • 0X3C,0X95,0X3C,0X95,0X3C,0X95,0X3C,0X95,0X3C,0X8D,0XFB,0X8C,0XB0,0XB3,0XC2,0XC9,  
  • 0XF4,0X8B,0XDA,0X84,0X1B,0X8D,0X3C,0X95,0X3C,0X95,0X3C,0X95,0X3C,0X95,0X3C,0X95,  
  • 0X7D,0X95,0XBD,0X9D,0XBD,0X9D,0X59,0XCE,0X38,0XC6,0X5D,0X95,0X7D,0X95,0X9D,0X95,  
  • 0X5D,0X95,0X3C,0X95,0X1C,0X8D,0X1C,0X8D,0X1C,0X8D,0X1C,0X8D,0X3C,0X8D,0X3C,0X95,  
  • 0X7D,0X95,0X9D,0X95,0X9D,0X95,0X9D,0X95,0X9D,0X95,0X9D,0X95,0X9D,0X95,0X9D,0X95,  
  • 0X9D,0X95,0X9D,0X95,0X9D,0X95,0X9D,0X95,0X9D,0X95,0X9D,0X95,0X7C,0X95,0XDA,0X84,  
  • 0X5E,0XE7,0XFF,0XFF,0X5E,0XE7,0XDA,0X84,0X7C,0X95,0X7D,0X95,0X3C,0X8D,0X3C,0X8D,  
  • 0X1C,0X8D,0X1C,0X8D,0X1C,0X8D,0X1C,0X8D,0X1C,0X8D,0X1C,0X8D,0XFB,0X8C,0XB9,0X84,  
  • 0XEA,0XCA,0XA1,0XC9,0X2E,0X93,0X79,0X7C,0XDA,0X84,0XFC,0X8C,0X1C,0X8D,0X1C,0X8D,  
  • 0X1C,0X8D,0X1C,0X8D,0X3C,0X8D,0X9D,0X95,0X9D,0X95,0X9D,0X95,0X38,0XC6,0X38,0XC6,  
  • 0XFC,0X84,0X1C,0X8D,0X5D,0X8D,0XFC,0X84,0XFC,0X84,0XFC,0X84,0XFC,0X84,0XFC,0X84,  
  • 0XFC,0X84,0XFC,0X84,0XFC,0X84,0X3C,0X8D,0X7D,0X95,0X7D,0X95,0X7D,0X95,0X7D,0X95,  
  • 0X7D,0X95,0X7D,0X95,0X7D,0X95,0X7D,0X95,0X7D,0X95,0X7D,0X95,0X7D,0X95,0X7D,0X95,  
  • 0X7D,0X95,0X5C,0X8D,0XBA,0X7C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBA,0X7C,0X5C,0X8D,  
  • 0XFC,0X84,0XFC,0X84,0XFC,0X84,0XFC,0X84,0XFC,0X84,0XFC,0X84,0XFC,0X84,0XFC,0X84,  
  • 0XDB,0X84,0X36,0X8C,0X65,0XE2,0XA1,0XC9,0X69,0X9A,0X37,0X74,0X79,0X7C,0XDB,0X84,  
  • 0XFC,0X84,0XFC,0X84,0XFC,0X84,0XFC,0X84,0XFC,0X84,0XFC,0X84,0X7D,0X95,0X7D,0X95,  
  • 0X7D,0X95,0X38,0XC6,0X38,0XC6,0XFC,0X84,0X1C,0X85,0XFC,0X84,0XFC,0X84,0XFC,0X84,  
  • 0XFC,0X84,0XFC,0X84,0XFC,0X84,0XFC,0X84,0XFC,0X84,0XFC,0X84,0XFC,0X84,0X1C,0X85,  
  • 0X7D,0X8D,0X7D,0X8D,0X7D,0X8D,0X7D,0X8D,0X7D,0X8D,0X7D,0X8D,0X7D,0X8D,0X7D,0X8D,  
  • 0X7D,0X8D,0X7D,0X8D,0X7D,0X8D,0X5D,0X8D,0X3C,0X85,0X3A,0X8D,0XFF,0XFF,0XFF,0XFF,  
  • 0XFF,0XFF,0X1A,0X8D,0XBB,0X7C,0XDC,0X84,0XFC,0X84,0XFC,0X84,0XFC,0X84,0XFC,0X84,  
  • 0XDC,0X84,0XDB,0X7C,0XBA,0X7C,0XB2,0X9B,0X23,0XF2,0XA1,0XC9,0XE5,0XA9,0XD5,0X6B,  
  • 0X58,0X74,0X9A,0X7C,0XDB,0X7C,0XDC,0X84,0XFC,0X84,0XFC,0X84,0XFC,0X84,0XFC,0X84,  
  • 0X1C,0X85,0X7D,0X8D,0X7D,0X8D,0X7D,0X8D,0X38,0XC6,0X38,0XC6,0XDC,0X7C,0XBC,0X7C,  
  • 0XBC,0X7C,0XBC,0X7C,0XBC,0X7C,0XBC,0X7C,0XBC,0X7C,0XBC,0X7C,0XBC,0X7C,0XBC,0X7C,  
  • 0XBC,0X7C,0XBC,0X7C,0XDC,0X7C,0X3D,0X85,0X5D,0X8D,0X5D,0X8D,0X5D,0X85,0X5D,0X8D,  
  • 0X5D,0X8D,0X5D,0X8D,0X5D,0X8D,0X5D,0X8D,0X5D,0X8D,0X5D,0X8D,0X5C,0X85,0XFB,0X7C,  
  • 0XDB,0XA5,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X9B,0XA5,0X5A,0X6C,0XBC,0X7C,0XBC,0X7C,  
  • 0XBC,0X7C,0XBC,0X7C,0XBC,0X7C,0X9B,0X7C,0X7A,0X74,0X0D,0XB3,0X01,0XFA,0XA1,0XC9,  
  • 0XA2,0XB9,0X52,0X6B,0XF7,0X6B,0X7A,0X74,0XBB,0X7C,0XBC,0X7C,0XBC,0X7C,0XBC,0X7C,  
  • 0XBC,0X7C,0XBC,0X7C,0XFC,0X84,0X3C,0X85,0XFC,0X84,0X3C,0X85,0X5D,0X8D,0X38,0XC6,  
  • 0X38,0XC6,0X9C,0X74,0X9C,0X74,0X9C,0X74,0X9C,0X74,0X9C,0X74,0X9C,0X74,0X9C,0X74,  
  • 0X9C,0X74,0X9C,0X74,0X9C,0X74,0X9C,0X74,0X9C,0X74,0X9C,0X74,0XDC,0X7C,0X3D,0X85,  
  • 0X3C,0X85,0XFC,0X7C,0XBC,0X74,0X1C,0X7D,0X3C,0X85,0X3D,0X85,0X3D,0X85,0X3D,0X85,  
  • 0X3C,0X85,0X1C,0X7D,0X9A,0X74,0X7C,0XC6,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X5C,0XC6,  
  • 0X19,0X64,0X7B,0X74,0X9C,0X74,0X9C,0X74,0X9B,0X74,0X7B,0X74,0X18,0X74,0X87,0XD2,  
  • 0X01,0XFA,0XA1,0XC9,0X81,0XB9,0XCE,0X72,0XB6,0X5B,0X39,0X6C,0X7B,0X74,0X9C,0X74,  
  • 0X9C,0X74,0X9C,0X74,0X9C,0X74,0X9C,0X74,0X9C,0X74,0XDC,0X7C,0XFC,0X7C,0X1C,0X85,  
  • 0X3D,0X85,0X3D,0X85,0X38,0XC6,0X38,0XC6,0X9C,0X74,0X9C,0X74,0X9C,0X74,0X9C,0X74,  
  • 0X9C,0X74,0X9C,0X74,0X9C,0X74,0X9C,0X74,0X9C,0X74,0X9C,0X74,0X9C,0X74,0X9C,0X74,  
  • 0X9C,0X74,0XBC,0X74,0X3D,0X7D,0X1C,0X7D,0X9B,0X6C,0X9E,0XC6,0X1C,0X85,0XDC,0X74,  
  • 0X1C,0X7D,0X1C,0X7D,0XFC,0X74,0XBB,0X6C,0X1B,0X85,0X3C,0XB6,0XBF,0XF7,0XFF,0XFF,  
  • 0XFF,0XFF,0XFF,0XFF,0XBF,0XF7,0XDC,0XAD,0X7A,0X74,0X1A,0X64,0X3A,0X64,0X5A,0X6C,  
  • 0XB4,0X83,0X44,0XEA,0X01,0XFA,0XA1,0XC9,0X81,0XB9,0X4A,0X82,0X96,0X5B,0X18,0X64,  
  • 0X5A,0X6C,0X9B,0X6C,0X9C,0X74,0X9C,0X74,0X9C,0X74,0X9C,0X74,0X9C,0X74,0X9C,0X74,  
  • 0XBC,0X74,0XBC,0X74,0X1C,0X7D,0X3D,0X7D,0X3D,0X7D,0X38,0XC6,0X38,0XC6,0X7B,0X6C,  
  • 0X7B,0X6C,0X7B,0X6C,0X7B,0X6C,0X7B,0X6C,0X7B,0X6C,0X7B,0X6C,0X7B,0X6C,0X7B,0X6C,  
  • 0X7B,0X6C,0X7B,0X6C,0X7B,0X6C,0X7B,0X6C,0X9C,0X6C,0X1C,0X7D,0X1C,0X7D,0XDC,0X74,  
  • 0XFB,0X7C,0XDF,0XFF,0X1D,0XAE,0X7B,0X6C,0X9B,0X6C,0X1B,0X85,0X5E,0XE7,0XFF,0XFF,  
  • 0XFF,0XFF,0XBD,0XCE,0X3C,0XBE,0X3B,0XBE,0X3B,0XBE,0X9D,0XCE,0XFF,0XFF,0XFF,0XFF,  
  • 0XFD,0XDE,0X79,0X7C,0X0F,0X93,0X02,0XFA,0X01,0XFA,0XA1,0XC9,0X81,0XB9,0XE6,0X99,  
  • 0X55,0X53,0XD8,0X5B,0X3A,0X64,0X5B,0X6C,0X7B,0X6C,0X7B,0X6C,0X7B,0X6C,0X7B,0X6C,  
  • 0X7B,0X6C,0X7B,0X6C,0X7B,0X6C,0X9C,0X74,0X1C,0X7D,0X1C,0X7D,0X1C,0X7D,0X1C,0X7D,  
  • 0X38,0XC6,0X38,0XC6,0X5B,0X64,0X5B,0X64,0X5B,0X64,0X5B,0X64,0X5B,0X64,0X5B,0X64,  
  • 0X5B,0X64,0X5B,0X64,0X5B,0X64,0X5B,0X64,0X5B,0X64,0X5B,0X64,0X5B,0X64,0X7C,0X6C,  
  • 0X1C,0X75,0XFC,0X74,0XFC,0X74,0X7A,0X64,0XFC,0XAD,0XFF,0XFF,0X3E,0XDF,0X5D,0XBE,  
  • 0XFF,0XFF,0X7E,0XEF,0X7B,0X95,0X18,0X64,0X18,0X5C,0X18,0X5C,0X18,0X5C,0XB7,0X53,  
  • 0X77,0X4B,0X97,0X53,0XF9,0X8C,0XBC,0XD6,0X0C,0XEC,0X01,0XFA,0X01,0XFA,0XA1,0XC9,  
  • 0X81,0XB9,0XA3,0XA9,0X12,0X53,0XB7,0X53,0X1A,0X64,0X5B,0X64,0X5B,0X64,0X5B,0X64,  
  • 0X5B,0X64,0X5B,0X64,0X5B,0X64,0X5B,0X64,0X5B,0X64,0X5B,0X64,0X7C,0X6C,0X1C,0X75,  
  • 0X1C,0X75,0X1C,0X75,0X1C,0X75,0X38,0XC6,0X38,0XC6,0X5B,0X5C,0X5B,0X5C,0X5B,0X5C,  
  • 0X5B,0X5C,0X5B,0X5C,0X5B,0X5C,0X5B,0X5C,0X5B,0X5C,0X5B,0X5C,0X5B,0X5C,0X5B,0X5C,  
  • 0X5B,0X5C,0X5B,0X5C,0X5B,0X64,0XDC,0X74,0XFC,0X74,0XFC,0X6C,0XBB,0X6C,0X18,0X5C,  
  • 0X1E,0XDF,0XFF,0XFF,0XFF,0XFF,0XFC,0XAD,0X18,0X5C,0X59,0X5C,0X7A,0X64,0X5A,0X64,  
  • 0X3A,0X64,0X5A,0X64,0X9A,0X6C,0XF9,0X53,0XD8,0X53,0X33,0X5B,0X25,0XD2,0X01,0XFA,  
  • 0X01,0XFA,0XA1,0XC9,0X81,0XB9,0X81,0XB9,0XAF,0X5A,0X76,0X4B,0XF9,0X5B,0X3B,0X5C,  
  • 0X3B,0X5C,0X5B,0X5C,0X5B,0X5C,0X5B,0X5C,0X5B,0X5C,0X5B,0X5C,0X5B,0X5C,0X5B,0X5C,  
  • 0X5B,0X5C,0X5B,0X64,0XDC,0X6C,0XFC,0X74,0XFC,0X74,0XFC,0X74,0X38,0XC6,0X38,0XC6,  
  • 0X3B,0X5C,0X3B,0X5C,0X3B,0X5C,0X3B,0X5C,0X3B,0X5C,0X3B,0X5C,0X3B,0X5C,0X3B,0X5C,  
  • 0X3B,0X5C,0X3B,0X5C,0X3B,0X5C,0X3B,0X5C,0X3B,0X5C,0X3B,0X5C,0X5B,0X5C,0XFC,0X6C,  
  • 0XDC,0X6C,0XBB,0X6C,0X39,0X5C,0X3C,0XB6,0XFF,0XFF,0X5A,0X95,0X18,0X5C,0X7A,0X64,  
  • 0X3A,0X5C,0X3B,0X5C,0X1B,0X5C,0X1B,0X5C,0X1B,0X5C,0XBB,0X6C,0XFA,0X5B,0X32,0X7B,  
  • 0X23,0XF2,0X01,0XFA,0X01,0XFA,0XA1,0XC9,0X81,0XB9,0X81,0XB9,0X2B,0X6A,0X55,0X43,  
  • 0XD9,0X53,0X1A,0X5C,0X3B,0X5C,0X3B,0X5C,0X3B,0X5C,0X3B,0X5C,0X3B,0X5C,0X3B,0X5C,  
  • 0X3B,0X5C,0X3B,0X5C,0X3B,0X5C,0X3B,0X5C,0X3B,0X5C,0X7C,0X64,0XDC,0X6C,0XFC,0X6C,  
  • 0XFC,0X6C,0X38,0XC6,0X38,0XC6,0X1B,0X54,0X3B,0X54,0X3B,0X54,0X3B,0X54,0X3B,0X54,  
  • 0X3B,0X54,0X3B,0X54,0X3B,0X54,0X3B,0X54,0X3B,0X54,0X3B,0X54,0X3B,0X54,0X3B,0X54,  
  • 0X3B,0X54,0X3B,0X54,0X7C,0X5C,0XDC,0X6C,0X9B,0X64,0XDA,0X74,0XFF,0XFF,0X1C,0XAE,  
  • 0X18,0X54,0X9A,0X64,0X3B,0X5C,0X1B,0X54,0X1B,0X54,0X3B,0X54,0X1B,0X54,0X1B,0X54,  
  • 0XFA,0X53,0XED,0X9A,0X01,0XFA,0X01,0XFA,0X01,0XFA,0XA1,0XC9,0X81,0XB9,0X81,0XB9,  
  • 0X09,0XB3,0X94,0X5B,0X77,0X43,0XFA,0X53,0X1B,0X54,0X3B,0X54,0X3B,0X54,0X3B,0X54,  
  • 0X3B,0X54,0X3B,0X54,0X3B,0X54,0X3B,0X54,0X3B,0X54,0X3B,0X54,0X3B,0X54,0X3B,0X54,  
  • 0X3B,0X54,0X5C,0X5C,0XDC,0X6C,0XFC,0X6C,0X38,0XC6,0X38,0XC6,0X5A,0X2B,0X1B,0X54,  
  • 0X1B,0X54,0X1B,0X54,0X1B,0X54,0X1B,0X54,0X1B,0X54,0X1B,0X54,0X1B,0X54,0X1B,0X54,  
  • 0X1B,0X54,0X1B,0X54,0X1B,0X54,0X1B,0X54,0X1B,0X54,0X1B,0X54,0X5B,0X5C,0X3A,0X5C,  
  • 0X3E,0XDF,0X7E,0XE7,0XF8,0X53,0X7A,0X5C,0XBB,0X64,0X3B,0X54,0X1B,0X54,0X1B,0X54,  
  • 0X1B,0X54,0XFA,0X4B,0XB8,0X53,0X88,0XC2,0X01,0XFA,0X01,0XFA,0X01,0XFA,0XA1,0XC9,  
  • 0X81,0XB9,0X81,0XB9,0XA4,0X99,0X56,0XAD,0X3A,0XC6,0X58,0X3B,0XFB,0X53,0X1B,0X54,  
  • 0X1B,0X54,0X1B,0X54,0X1B,0X54,0X1B,0X54,0X1B,0X54,0X1B,0X54,0X1B,0X54,0X1B,0X54,  
  • 0X1B,0X54,0X1B,0X54,0X1B,0X54,0X1B,0X54,0X1B,0X54,0X5B,0X54,0X1B,0X44,0X38,0XC6,  
  • 0X38,0XC6,0XFA,0X1A,0X5A,0X2B,0XFB,0X43,0X1B,0X4C,0X1B,0X4C,0X1B,0X4C,0X1B,0X4C,  
  • 0X1B,0X4C,0X1B,0X4C,0X1B,0X4C,0X1B,0X4C,0X1B,0X4C,0X1B,0X4C,0X1B,0X4C,0X1B,0X4C,  
  • 0X1B,0X4C,0XDA,0X43,0XDB,0X74,0XFF,0XFF,0X3A,0X8D,0X39,0X54,0XBB,0X64,0XDC,0X64,  
  • 0X7C,0X5C,0X1B,0X4C,0XFB,0X4B,0XFA,0X4B,0X75,0X6B,0X24,0XE2,0X01,0XFA,0X01,0XFA,  
  • 0X01,0XFA,0XA1,0XC9,0X81,0XB9,0X81,0XB9,0X82,0XB1,0X6F,0X3A,0X16,0X6C,0X7D,0XEF,  
  • 0X79,0X6C,0XDA,0X43,0X1B,0X4C,0X1B,0X4C,0X1B,0X4C,0X1B,0X4C,0X1B,0X4C,0X1B,0X4C,  
  • 0X1B,0X4C,0X1B,0X4C,0X1B,0X4C,0X1B,0X4C,0X1B,0X4C,0X1B,0X4C,0X1B,0X4C,0XFB,0X43,  
  • 0X5A,0X2B,0XFA,0X1A,0X38,0XC6,0X38,0XC6,0X1A,0X1B,0X1A,0X1B,0X1A,0X1B,0X9B,0X33,  
  • 0XFB,0X43,0X1B,0X4C,0X1B,0X4C,0X1B,0X4C,0X1B,0X4C,0X1B,0X4C,0X1B,0X4C,0X1B,0X4C,  
  • 0X1B,0X4C,0XFB,0X4B,0XFB,0X43,0XBA,0X43,0X79,0X3B,0XFC,0XAD,0XDF,0XFF,0X98,0X43,  
  • 0X5A,0X54,0XDC,0X64,0XDC,0X64,0XBC,0X5C,0XFB,0X4B,0XDA,0X43,0X71,0X8B,0X22,0XF2,  
  • 0X01,0XFA,0X01,0XFA,0X01,0XFA,0XA1,0XC9,0X81,0XB9,0X81,0XB9,0X81,0XB9,0X6E,0X52,  
  • 0X15,0X33,0X15,0X3B,0X9E,0XF7,0XFC,0XAD,0X79,0X3B,0XBA,0X43,0XFB,0X43,0XFB,0X4B,  
  • 0X1B,0X4C,0X1B,0X4C,0X1B,0X4C,0X1B,0X4C,0X1B,0X4C,0X1B,0X4C,0X1B,0X4C,0X1B,0X4C,  
  • 0XFB,0X43,0X9B,0X33,0X1A,0X1B,0X1A,0X1B,0X1A,0X1B,0X38,0XC6,0X38,0XC6,0X3A,0X1B,  
  • 0X3A,0X1B,0X3A,0X1B,0X3A,0X1B,0X3A,0X23,0X7B,0X2B,0XDB,0X3B,0X1B,0X44,0XFB,0X43,  
  • 0XFB,0X43,0XBA,0X43,0XBA,0X3B,0X9A,0X3B,0X79,0X3B,0X5A,0X5C,0X3B,0X85,0X1C,0XAE,  
  • 0XDF,0XF7,0XBD,0XCE,0X58,0X3B,0XFA,0X43,0XDC,0X5C,0XDC,0X64,0XDC,0X64,0X3A,0X4C,  
  • 0X3A,0X85,0X17,0XEE,0X06,0X7A,0X07,0X42,0X06,0X7A,0XA2,0XB9,0X81,0XB9,0X81,0XB9,  
  • 0X81,0XB9,0X2A,0X72,0X15,0X33,0X77,0X3B,0X37,0X33,0X9D,0XC6,0XDF,0XF7,0X1C,0XAE,  
  • 0X3B,0X85,0X5A,0X5C,0X79,0X3B,0X9A,0X3B,0XBA,0X3B,0XBA,0X43,0XFB,0X43,0XFB,0X43,  
  • 0X1B,0X44,0XDB,0X3B,0X7B,0X2B,0X3A,0X23,0X3A,0X1B,0X3A,0X1B,0X3A,0X1B,0X3A,0X1B,  
  • 0X38,0XC6,0X38,0XC6,0X5A,0X23,0X5A,0X23,0X5A,0X23,0X5A,0X23,0X5A,0X23,0X5A,0X23,  
  • 0X3A,0X1B,0XF9,0X1A,0X19,0X23,0X1A,0X54,0X3B,0X85,0X1D,0XAE,0X1E,0XD7,0XFF,0XFF,  
  • 0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1C,0XAE,0X78,0X3B,0XFB,0X43,0X7C,0X54,  
  • 0XDC,0X5C,0XBB,0X5C,0XFA,0X74,0XDF,0XF7,0X10,0X84,0X55,0XAD,0XFF,0XFF,0X55,0XAD,  
  • 0X48,0X6A,0X81,0XB9,0X81,0XB9,0XE6,0X91,0X75,0X43,0X18,0X4C,0X5A,0X54,0XF9,0X4B,  
  • 0X3C,0XB6,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X1E,0XD7,0X1D,0XAE,  
  • 0X3B,0X85,0X1A,0X54,0X19,0X23,0XF9,0X1A,0X3A,0X1B,0X5A,0X23,0X5A,0X23,0X5A,0X23,  
  • 0X5A,0X23,0X5A,0X23,0X5A,0X23,0X38,0XC6,0X38,0XC6,0X7B,0X23,0X7B,0X23,0X7B,0X23,  
  • 0X7B,0X23,0X7B,0X23,0X5A,0X1B,0XDA,0X43,0XFD,0XA5,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,  
  • 0XFF,0XF7,0XFF,0XF7,0XFF,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBB,0X9D,  
  • 0X99,0X33,0XFB,0X3B,0X1B,0X3C,0X1B,0X44,0X19,0X4C,0X5E,0XE7,0XFF,0XFF,0XAE,0X73,  
  • 0XBA,0XD6,0XDB,0XDE,0XBA,0XD6,0X6D,0X73,0X81,0XB9,0XA3,0XA9,0X73,0X4B,0X38,0X4C,  
  • 0XBA,0X54,0XDB,0X5C,0X5A,0X4C,0XFB,0XA5,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,  
  • 0XFF,0XF7,0XFF,0XF7,0XFF,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFD,0XA5,0XFA,0X4B,  
  • 0X5A,0X1B,0X7B,0X23,0X7B,0X23,0X7B,0X23,0X7B,0X23,0X7B,0X23,0X38,0XC6,0X38,0XC6,  
  • 0X7B,0X23,0X7B,0X23,0X7B,0X23,0X7B,0X23,0X7B,0X23,0X7A,0X23,0X5A,0X23,0XF9,0X1A,  
  • 0XD7,0X1A,0XD8,0X43,0XDA,0X74,0XDB,0X9D,0XFD,0XCE,0XFF,0XF7,0XFF,0XF7,0XFF,0XF7,  
  • 0XFF,0XF7,0XFF,0XF7,0XFC,0XA5,0X39,0X2B,0XDB,0X33,0XDB,0X33,0XB9,0X33,0X7D,0XBE,  
  • 0XFF,0XFF,0XFF,0XFF,0X75,0XAD,0XD3,0X9C,0X34,0XA5,0XD3,0X9C,0XCE,0X9B,0X82,0XB9,  
  • 0XF0,0X4A,0X17,0X4C,0X9A,0X54,0XBC,0X54,0XBC,0X54,0X3A,0X44,0X3C,0XAE,0XFF,0XFF,  
  • 0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XFD,0XCE,0XDB,0X9D,0XDA,0X74,0XD8,0X43,  
  • 0XD7,0X1A,0XF9,0X1A,0X5A,0X1B,0X7A,0X23,0X7B,0X23,0X7B,0X23,0X7B,0X23,0X7B,0X23,  
  • 0X7B,0X23,0X38,0XC6,0X38,0XC6,0X9B,0X23,0X9B,0X23,0X9B,0X23,0X9B,0X23,0X9B,0X23,  
  • 0X9B,0X23,0X9A,0X23,0X7A,0X23,0X79,0X23,0X39,0X1B,0X18,0X1B,0XD7,0X1A,0XB6,0X1A,  
  • 0X95,0X1A,0XB7,0X43,0XB9,0X74,0XDB,0X9D,0XBF,0XEF,0X9D,0XBE,0X18,0X1B,0X7A,0X23,  
  • 0X59,0X23,0X5B,0X8D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X59,0XCE,0X96,0XB5,0X75,0XAD,  
  • 0X96,0XB5,0XF2,0XBC,0X4D,0X52,0X16,0X23,0X39,0X3C,0X7B,0X44,0X9C,0X44,0X9C,0X44,  
  • 0XFA,0X3B,0XDD,0XC6,0XDF,0XF7,0X3B,0XAE,0X39,0X85,0X58,0X5C,0X15,0X2B,0X36,0X2B,  
  • 0X97,0X2B,0X98,0X2B,0XB9,0X2B,0X99,0X23,0X7A,0X23,0X9A,0X23,0X9B,0X23,0X9B,0X23,  
  • 0X9B,0X23,0X9B,0X23,0X9B,0X23,0X9B,0X23,0X38,0XC6,0X38,0XC6,0XBB,0X23,0XBB,0X23,  
  • 0XBB,0X23,0XBB,0X23,0XBB,0X23,0XBB,0X23,0XBB,0X23,0XBB,0X23,0X9A,0X23,0X9A,0X23,  
  • 0X9A,0X23,0X79,0X23,0X79,0X23,0X79,0X23,0X38,0X1B,0X17,0X1B,0XD6,0X1A,0XDB,0X9D,  
  • 0XDF,0XEF,0X18,0X23,0X79,0X23,0X7A,0X54,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X79,0XCE,  
  • 0XF7,0XBD,0XF7,0XBD,0XF7,0XBD,0XD7,0XB5,0XB4,0X53,0XF5,0X1A,0X58,0X23,0X9B,0X44,  
  • 0XBC,0X44,0XBC,0X4C,0X9B,0X44,0X19,0X3C,0XDF,0XFF,0X3C,0XAE,0XB7,0X33,0XF8,0X3B,  
  • 0X39,0X3C,0X5A,0X44,0X7A,0X44,0X7A,0X44,0X7B,0X44,0X9B,0X44,0X9B,0X44,0XBB,0X23,  
  • 0XBB,0X23,0XBB,0X23,0XBB,0X23,0XBB,0X23,0XBB,0X23,0XBB,0X23,0XBB,0X23,0X38,0XC6,  
  • 0X38,0XC6,0XDB,0X23,0XDB,0X23,0XDB,0X23,0XDB,0X23,0XDB,0X23,0XDB,0X23,0XDB,0X23,  
  • 0XDB,0X23,0XDB,0X23,0XDB,0X23,0XDB,0X23,0XDB,0X23,0XBB,0X23,0XBA,0X23,0XBA,0X23,  
  • 0X9A,0X23,0X58,0X23,0X39,0X54,0XFF,0XF7,0X9A,0X64,0XB8,0X33,0X9F,0XEF,0XFF,0XFF,  
  • 0XFF,0XFF,0X79,0XCE,0XF7,0XBD,0XF7,0XBD,0XF7,0XBD,0X76,0XA5,0X33,0X33,0XF5,0X1A,  
  • 0X58,0X23,0X1A,0X34,0XDC,0X4C,0XDC,0X4C,0XDC,0X4C,0X7B,0X44,0X7B,0X7D,0XFF,0XFF,  
  • 0XFA,0X6C,0X59,0X44,0X9B,0X44,0XBB,0X4C,0XBB,0X4C,0XBC,0X4C,0XDC,0X4C,0XDC,0X4C,  
  • 0XDC,0X4C,0XDC,0X4C,0XFB,0X23,0XDB,0X23,0XDB,0X23,0XDB,0X23,0XDB,0X23,0XDB,0X23,  
  • 0XDB,0X23,0XDB,0X23,0X38,0XC6,0X38,0XC6,0XFB,0X23,0XFB,0X23,0XFB,0X23,0XFB,0X23,  
  • 0XFB,0X23,0XFB,0X23,0XFB,0X23,0XFB,0X23,0XFB,0X23,0XFB,0X23,0XFB,0X23,0XFB,0X23,  
  • 0XFB,0X23,0XFB,0X23,0XFB,0X23,0XFB,0X23,0XDA,0X23,0X38,0X1B,0XFD,0XCE,0XBC,0XCE,  
  • 0XDD,0XCE,0XFF,0XFF,0XFF,0XFF,0X79,0XCE,0XF7,0XBD,0XF7,0XBD,0XF7,0XBD,0XD5,0X8C,  
  • 0XF3,0X22,0X36,0X1B,0X98,0X23,0XDA,0X23,0X9C,0X3C,0XFC,0X4C,0XFC,0X4C,0XDC,0X4C,  
  • 0X7A,0X44,0X7E,0XE7,0X3E,0XDF,0X19,0X3C,0XDB,0X4C,0XFC,0X4C,0XFC,0X4C,0XFC,0X4C,  
  • 0X1C,0X4D,0X1C,0X4D,0X1C,0X4D,0X1C,0X4D,0XDC,0X44,0XFB,0X23,0XFB,0X23,0XFB,0X23,  
  • 0XFB,0X23,0XFB,0X23,0XFB,0X23,0XFB,0X23,0XFB,0X23,0X38,0XC6,0X38,0XC6,0X1C,0X24,  
  • 0X1C,0X24,0X1C,0X24,0X1C,0X24,0X1C,0X24,0X1C,0X24,0X1C,0X24,0X1C,0X24,0X1C,0X24,  
  • 0X1C,0X24,0X1C,0X24,0X1C,0X24,0X1C,0X24,0X1C,0X24,0X1C,0X24,0X1B,0X24,0XFB,0X23,  
  • 0X99,0X23,0X58,0X54,0X7D,0XEF,0XFF,0XFF,0XFF,0XFF,0X79,0XCE,0XF7,0XBD,0XF7,0XBD,  
  • 0XF7,0XBD,0X34,0X64,0XF4,0X1A,0X57,0X23,0XB9,0X23,0XFA,0X23,0X1B,0X24,0X9C,0X3C,  
  • 0X3D,0X55,0X1C,0X4D,0XBB,0X44,0X3C,0XA6,0XFF,0XFF,0XFA,0X64,0X9A,0X44,0XFC,0X4C,  
  • 0X1C,0X55,0X3D,0X55,0X3D,0X55,0X3D,0X55,0X3D,0X55,0X3D,0X55,0X3D,0X55,0X9C,0X3C,  
  • 0X1C,0X24,0X1C,0X24,0X1C,0X24,0X1C,0X24,0X1C,0X24,0X1C,0X24,0X1C,0X24,0X1C,0X24,  
  • 0X38,0XC6,0X38,0XC6,0X3C,0X2C,0X3C,0X2C,0X3C,0X2C,0X3C,0X2C,0X3C,0X2C,0X3C,0X2C,  
  • 0X3C,0X2C,0X3C,0X2C,0X3C,0X2C,0X3C,0X2C,0X3C,0X2C,0X3C,0X2C,0X3C,0X2C,0X3C,0X2C,  
  • 0X3C,0X2C,0X3C,0X2C,0X1B,0X24,0XD9,0X23,0XF9,0X74,0XFF,0XFF,0XFF,0XFF,0X79,0XCE,  
  • 0XF7,0XBD,0XF7,0XBD,0XB7,0XB5,0X94,0X43,0X35,0X1B,0X97,0X23,0XDA,0X23,0X1B,0X2C,  
  • 0X3C,0X2C,0X3C,0X2C,0X5C,0X2C,0X1C,0X4D,0XDB,0X4C,0XBC,0X85,0XFF,0XFF,0X5C,0XAE,  
  • 0X79,0X44,0X1B,0X4D,0X3C,0X55,0X3D,0X55,0X3D,0X55,0X3D,0X55,0X3D,0X55,0X3D,0X55,  
  • 0X3D,0X55,0X3D,0X55,0X1C,0X45,0X3C,0X2C,0X3C,0X2C,0X3C,0X2C,0X3C,0X2C,0X3C,0X2C,  
  • 0X3C,0X2C,0X3C,0X2C,0X3C,0X2C,0X38,0XC6,0X38,0XC6,0X5C,0X2C,0X5C,0X2C,0X5C,0X2C,  
  • 0X5C,0X2C,0X5C,0X2C,0X5C,0X2C,0X5C,0X2C,0X5C,0X2C,0X5C,0X2C,0X5C,0X2C,0X5C,0X2C,  
  • 0X5C,0X2C,0X5C,0X2C,0X5C,0X2C,0X5C,0X2C,0X5C,0X2C,0X1B,0X2C,0X99,0X4C,0XDF,0XF7,  
  • 0XFF,0XFF,0X79,0XCE,0XF7,0XBD,0XF7,0XBD,0X36,0X9D,0X33,0X2B,0X76,0X23,0XD8,0X23,  
  • 0X1A,0X2C,0X5B,0X2C,0X5C,0X2C,0X7C,0X2C,0X5C,0X2C,0X1B,0X24,0X3A,0X2C,0X5D,0XA6,  
  • 0XFF,0XFF,0XFF,0XFF,0X3E,0XD7,0X99,0X44,0X3C,0X55,0X7C,0X55,0X7D,0X55,0X7D,0X55,  
  • 0X7D,0X55,0X7D,0X55,0X7D,0X55,0X7D,0X55,0X7D,0X55,0X5D,0X55,0X5C,0X2C,0X5C,0X2C,  
  • 0X5C,0X2C,0X5C,0X2C,0X5C,0X2C,0X5C,0X2C,0X5C,0X2C,0X5C,0X2C,0X38,0XC6,0X38,0XC6,  
  • 0X7C,0X2C,0X7C,0X2C,0X7C,0X2C,0X7C,0X2C,0X7C,0X2C,0X7C,0X2C,0X7C,0X2C,0X7C,0X2C,  
  • 0X7C,0X2C,0X7C,0X2C,0X7C,0X2C,0X7C,0X2C,0X7C,0X2C,0X7C,0X2C,0X7C,0X2C,0X5B,0X2C,  
  • 0X5A,0X34,0X7E,0XE7,0XFF,0XFF,0X79,0XCE,0XF7,0XBD,0XF7,0XBD,0X96,0XB5,0X56,0XA5,  
  • 0X56,0X5C,0X98,0X23,0XFA,0X23,0X1B,0X24,0X3B,0X24,0X1B,0X24,0X1B,0X24,0X1A,0X2C,  
  • 0X5C,0X6D,0X7F,0XE7,0XFF,0XFF,0X7C,0XAE,0X3E,0XD7,0XFF,0XFF,0X3C,0X9E,0X1C,0X4D,  
  • 0X9D,0X5D,0X9D,0X5D,0X9D,0X55,0X9D,0X55,0X9D,0X55,0X9D,0X55,0X9D,0X55,0X9D,0X55,  
  • 0X7D,0X55,0X7C,0X2C,0X7C,0X2C,0X7C,0X2C,0X7C,0X2C,0X7C,0X2C,0X7C,0X2C,0X7C,0X2C,  
  • 0X7C,0X2C,0X38,0XC6,0X38,0XC6,0X9C,0X2C,0X9C,0X2C,0X9C,0X2C,0X9C,0X2C,0X9C,0X2C,  
  • 0X9C,0X2C,0X9C,0X2C,0X9C,0X2C,0X9C,0X2C,0X9C,0X2C,0X9C,0X2C,0X9C,0X2C,0X9C,0X2C,  
  • 0X9C,0X2C,0X7C,0X2C,0X5A,0X2C,0XDD,0XC6,0XFF,0XFF,0X79,0XCE,0XF7,0XBD,0XD7,0XBD,  
  • 0XD3,0X53,0X73,0X3B,0XF9,0XAD,0X5D,0XE7,0X9E,0XEF,0XBD,0XBE,0X5D,0XA6,0X3D,0XA6,  
  • 0X5D,0XA6,0XDE,0XBE,0XDF,0XF7,0XFF,0XFF,0X3E,0XD7,0X79,0X4C,0X58,0X34,0X78,0X44,  
  • 0X3C,0X9E,0XDF,0XF7,0X7B,0X65,0X9C,0X55,0XBD,0X5D,0XBD,0X5D,0XBD,0X5D,0XBD,0X5D,  
  • 0XBD,0X5D,0XBD,0X5D,0XBD,0X5D,0X9D,0X4D,0X9C,0X2C,0X9C,0X2C,0X9C,0X2C,0X9C,0X2C,  
  • 0X9C,0X2C,0X9C,0X2C,0X9C,0X2C,0X9C,0X2C,0X38,0XC6,0X38,0XC6,0XBD,0X2C,0XBD,0X2C,  
  • 0XBD,0X2C,0XBD,0X2C,0XBD,0X2C,0XBD,0X2C,0XBD,0X2C,0XBD,0X2C,0XBD,0X2C,0XBD,0X2C,  
  • 0XBD,0X2C,0XBD,0X2C,0XBC,0X2C,0XBC,0X2C,0X7B,0X2C,0XFC,0X95,0XFF,0XFF,0X79,0XCE,  
  • 0XF7,0XBD,0X97,0XAD,0XB3,0X3B,0X74,0X23,0XB6,0X23,0XB7,0X23,0X58,0X44,0XDB,0X8D,  
  • 0XBF,0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBF,0XEF,0XFC,0X95,0X99,0X4C,0XF9,0X23,  
  • 0X39,0X2C,0X7A,0X2C,0X7A,0X34,0X79,0X2C,0X7B,0X6D,0XDD,0XB6,0X5C,0X55,0XDD,0X5D,  
  • 0XDD,0X5D,0XDD,0X5D,0XDD,0X5D,0XDD,0X5D,0XDD,0X5D,0X7D,0X45,0XDD,0X2C,0XBD,0X2C,  
  • 0XBD,0X2C,0XBD,0X2C,0XBD,0X2C,0XBD,0X2C,0XBD,0X2C,0XBD,0X2C,0XBD,0X2C,0X38,0XC6,  
  • 0X38,0XC6,0XDD,0X2C,0XDD,0X2C,0XDD,0X2C,0XDD,0X2C,0XDD,0X2C,0XDD,0X2C,0XDD,0X2C,  
  • 0XDD,0X2C,0XDD,0X2C,0XDD,0X34,0XDD,0X34,0XFD,0X34,0XDC,0X34,0XBB,0X2C,0X5B,0X65,  
  • 0XDF,0XFF,0X79,0XCE,0XF7,0XBD,0X36,0X95,0X94,0X2B,0XF7,0X2B,0X59,0X2C,0X9A,0X2C,  
  • 0X9A,0X34,0X7A,0X2C,0X19,0X2C,0X5C,0XAE,0XFF,0XFF,0XFF,0XF7,0XFF,0XFF,0X5C,0XAE,  
  • 0X19,0X2C,0X7A,0X2C,0XBB,0X34,0XBC,0X34,0XDC,0X34,0XDC,0X34,0XBB,0X34,0X9C,0X5D,  
  • 0X5B,0X55,0XBC,0X5D,0XFD,0X65,0XFD,0X65,0XFD,0X65,0XFD,0X65,0XFD,0X65,0XDD,0X5D,  
  • 0XDD,0X34,0XDD,0X2C,0XDD,0X2C,0XDD,0X2C,0XDD,0X2C,0XDD,0X2C,0XDD,0X2C,0XDD,0X2C,  
  • 0XDD,0X2C,0XDD,0X2C,0X38,0XC6,0X38,0XC6,0X1D,0X35,0X1D,0X35,0X1D,0X35,0X1D,0X35,  
  • 0X1D,0X35,0X1D,0X35,0X1D,0X35,0X1D,0X35,0X1D,0X35,0X1D,0X35,0X1D,0X35,0X1D,0X35,  
  • 0XDC,0X34,0XFA,0X4C,0X9E,0XEF,0X79,0XCE,0XF7,0XBD,0X95,0X74,0XB5,0X23,0X38,0X2C,  
  • 0X9A,0X34,0XDC,0X34,0XFC,0X34,0XFC,0X34,0XFC,0X34,0X7A,0X2C,0X9B,0X7D,0XFF,0XFF,  
  • 0XFF,0XFF,0XFF,0XFF,0X9B,0X7D,0X7A,0X2C,0XFC,0X34,0X1C,0X35,0X1D,0X35,0X1D,0X35,  
  • 0X1D,0X35,0X1D,0X35,0XDD,0X55,0XFD,0X65,0X1D,0X66,0X1D,0X66,0X1D,0X66,0X1D,0X66,  
  • 0X1D,0X66,0X1D,0X66,0X1D,0X5E,0X1D,0X35,0X1D,0X35,0X1D,0X35,0X1D,0X35,0X1D,0X35,  
  • 0X1D,0X35,0X1D,0X35,0X1D,0X35,0X1D,0X35,0X1D,0X35,0X38,0XC6,0X38,0XC6,0X3D,0X35,  
  • 0X3D,0X35,0X3D,0X35,0X3D,0X35,0X3D,0X35,0X3D,0X35,0X3D,0X35,0X3D,0X35,0X3D,0X35,  
  • 0X3D,0X35,0X3D,0X35,0X1C,0X35,0XDB,0X34,0X3E,0XD7,0X79,0XCE,0XD7,0XB5,0X35,0X54,  
  • 0XF6,0X2B,0X79,0X2C,0XFB,0X34,0X3C,0X35,0X5D,0X3D,0X5D,0X3D,0X5D,0X3D,0X3D,0X3D,  
  • 0XFB,0X34,0XFA,0X54,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFA,0X54,0XFB,0X34,0X3D,0X3D,  
  • 0X5D,0X3D,0X5D,0X3D,0X5D,0X3D,0X5D,0X3D,0X5D,0X3D,0XFD,0X4D,0X3D,0X6E,0X3D,0X6E,  
  • 0X3D,0X6E,0X5E,0X6E,0X5E,0X6E,0X5E,0X6E,0X5E,0X6E,0X1D,0X56,0X3D,0X35,0X3D,0X35,  
  • 0X3D,0X35,0X3D,0X35,0X3D,0X35,0X3D,0X35,0X3D,0X35,0X3D,0X35,0X3D,0X35,0X3D,0X35,  
  • 0X38,0XC6,0X38,0XC6,0X5D,0X35,0X5D,0X35,0X5D,0X35,0X5D,0X35,0X5D,0X35,0X5D,0X35,  
  • 0X5D,0X35,0X5D,0X35,0X5D,0X35,0X5D,0X35,0X3D,0X35,0XFB,0X34,0X9D,0XAE,0X79,0XCE,  
  • 0X97,0XA5,0X15,0X3C,0X37,0X2C,0XB9,0X34,0X1B,0X35,0X5D,0X3D,0X7D,0X3D,0X7D,0X3D,  
  • 0X7D,0X3D,0X7D,0X3D,0X7D,0X3D,0X3C,0X3D,0X99,0X34,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,  
  • 0X99,0X34,0X3C,0X3D,0X7D,0X3D,0X7D,0X3D,0X7D,0X3D,0X7D,0X3D,0X7D,0X3D,0X7D,0X3D,  
  • 0XBD,0X45,0X7E,0X6E,0X7E,0X6E,0X7E,0X6E,0X7E,0X6E,0X7E,0X6E,0X7E,0X6E,0X5E,0X6E,  
  • 0X3E,0X56,0X5D,0X35,0X5D,0X35,0X5D,0X35,0X5D,0X35,0X5D,0X35,0X5D,0X35,0X5D,0X35,  
  • 0X5D,0X35,0X5D,0X35,0X5D,0X35,0X38,0XC6,0X38,0XC6,0X7D,0X35,0X7D,0X35,0X7D,0X35,  
  • 0X7D,0X35,0X7D,0X35,0X7D,0X35,0X7D,0X35,0X7D,0X35,0X7D,0X35,0X5D,0X35,0X3C,0X35,  
  • 0X1C,0X86,0X79,0XCE,0X57,0X8D,0X36,0X34,0X98,0X34,0XFA,0X34,0X5C,0X3D,0X9D,0X3D,  
  • 0X9D,0X3D,0X9E,0X3D,0X9E,0X45,0XBE,0X45,0XBE,0X45,0X9D,0X45,0X7D,0X3D,0XDA,0X34,  
  • 0X3E,0XD7,0XFF,0XFF,0X3E,0XD7,0XDA,0X34,0X7D,0X3D,0X9D,0X45,0XBE,0X45,0XBE,0X45,  
  • 0X9E,0X45,0X9E,0X3D,0X9E,0X3D,0X9E,0X3D,0X7E,0X66,0X9E,0X76,0X9E,0X76,0X9E,0X76,  
  • 0X9E,0X76,0X9E,0X76,0X7E,0X6E,0XDE,0X45,0X7D,0X35,0X7D,0X35,0X7D,0X35,0X7D,0X35,  
  • 0X7D,0X35,0X7D,0X35,0X7D,0X35,0X7D,0X35,0X7D,0X35,0X7D,0X35,0X38,0XC6,0X38,0XC6,  
  • 0X9E,0X35,0X9E,0X35,0X9E,0X35,0X9E,0X35,0X9E,0X35,0X9E,0X35,0X9E,0X35,0X9E,0X35,  
  • 0X9D,0X3D,0X7D,0X35,0XBC,0X65,0X59,0XC6,0X17,0X6D,0X77,0X2C,0XD9,0X34,0X3B,0X3D,  
  • 0X9D,0X3D,0XBD,0X3D,0XBE,0X45,0XDE,0X45,0XDE,0X45,0XDE,0X45,0XDE,0X45,0XDE,0X45,  
  • 0XDE,0X45,0XBD,0X45,0X3B,0X3D,0XBD,0XAE,0XFF,0XFF,0XBD,0XAE,0X3B,0X3D,0XBD,0X45,  
  • 0XDE,0X45,0XDE,0X45,0XDE,0X45,0XDE,0X45,0XDE,0X45,0XDE,0X45,0XDE,0X45,0X7E,0X56,  
  • 0XBE,0X76,0XBE,0X76,0XBE,0X76,0XBE,0X76,0XBE,0X76,0XFE,0X45,0XBE,0X3D,0X9E,0X3D,  
  • 0X9E,0X3D,0X9E,0X35,0X9E,0X35,0X9E,0X35,0X9E,0X35,0X9E,0X35,0X9E,0X35,0X9E,0X35,  
  • 0X9E,0X35,0X38,0XC6,0X38,0XC6,0XBE,0X35,0XBE,0X35,0XBE,0X35,0XBE,0X3D,0XBE,0X3D,  
  • 0XBE,0X3D,0XBE,0X3D,0XBE,0X3D,0XBD,0X3D,0X9C,0X4D,0X39,0XAE,0X18,0X55,0XD9,0X34,  
  • 0X1A,0X35,0X7C,0X3D,0XBD,0X3D,0XDE,0X45,0XFE,0X45,0XFE,0X45,0XFE,0X45,0XFE,0X45,  
  • 0XFE,0X45,0XFE,0X45,0X1E,0X4E,0X1E,0X4E,0XFD,0X45,0X7C,0X3D,0X3C,0X8E,0XFF,0XFF,  
  • 0X3C,0X8E,0X7C,0X3D,0XFD,0X45,0X1E,0X4E,0X1E,0X4E,0XFE,0X45,0XFE,0X45,0XFE,0X45,  
  • 0XFE,0X45,0XFE,0X45,0X7E,0X56,0XDE,0X7E,0XDE,0X7E,0XDE,0X76,0XDE,0X76,0XDE,0X76,  
  • 0X7E,0X56,0XDE,0X3D,0XDE,0X3D,0XDE,0X3D,0XBE,0X3D,0XBE,0X3D,0XBE,0X3D,0XBE,0X3D,  
  • 0XBE,0X3D,0XBE,0X35,0XBE,0X35,0XBE,0X35,0X38,0XC6,0X38,0XC6,0XBD,0X3D,0XDE,0X35,  
  • 0XDE,0X3D,0XDE,0X3D,0XDE,0X3D,0XDE,0X3D,0XDE,0X3D,0XDE,0X3D,0XBD,0X3D,0XFA,0X85,  
  • 0X5A,0X45,0X3A,0X35,0X5B,0X3D,0XBC,0X3D,0XFD,0X45,0X1E,0X46,0X1E,0X46,0X1E,0X46,  
  • 0X1E,0X46,0X1E,0X46,0X3E,0X4E,0X3E,0X4E,0X3E,0X4E,0X3E,0X4E,0X3E,0X4E,0X3E,0X4E,  
  • 0XDC,0X45,0XDB,0X5D,0XFF,0XFF,0XDB,0X65,0XDC,0X45,0X3E,0X4E,0X3E,0X4E,0X3E,0X4E,  
  • 0X3E,0X4E,0X3E,0X4E,0X3E,0X4E,0X1E,0X46,0X1E,0X46,0XBE,0X5E,0XFE,0X7E,0XFE,0X7E,  
  • 0XFE,0X7E,0XFE,0X7E,0X9E,0X56,0X1E,0X46,0XFE,0X3D,0XFE,0X3D,0XFE,0X3D,0XFE,0X3D,  
  • 0XDE,0X3D,0XDE,0X3D,0XDE,0X3D,0XDE,0X3D,0XDE,0X3D,0XDE,0X35,0XBD,0X3D,0X38,0XC6,  
  • 0X38,0XC6,0XBC,0X4D,0XFE,0X3D,0XFE,0X3D,0XFE,0X3D,0XFE,0X3D,0XFE,0X3D,0XFE,0X3D,  
  • 0XFE,0X3D,0XDD,0X4D,0XBC,0X3D,0X9C,0X3D,0XBC,0X3D,0XDD,0X45,0X1E,0X46,0X3E,0X46,  
  • 0X3E,0X46,0X3E,0X4E,0X3E,0X4E,0X5E,0X4E,0X5E,0X4E,0X5E,0X4E,0X5E,0X4E,0X5E,0X56,  
  • 0X7E,0X56,0X7E,0X56,0X5E,0X4E,0X3D,0X4E,0X9B,0X45,0XDF,0XF7,0X9B,0X45,0X3D,0X4E,  
  • 0X5E,0X4E,0X7E,0X56,0X7E,0X56,0X5E,0X56,0X5E,0X4E,0X5E,0X4E,0X5E,0X4E,0X5E,0X4E,  
  • 0X9E,0X56,0X1E,0X87,0X1E,0X87,0X1E,0X87,0XFE,0X6E,0X1E,0X46,0X1E,0X46,0X1E,0X46,  
  • 0X1E,0X46,0X1E,0X3E,0X1E,0X3E,0X1E,0X3E,0XFE,0X3D,0XFE,0X3D,0XFE,0X3D,0XFE,0X3D,  
  • 0XFE,0X3D,0XBC,0X45,0X38,0XC6,0X59,0XCE,0X79,0X5D,0X1E,0X3E,0X1E,0X3E,0X1E,0X3E,  
  • 0X1E,0X3E,0X1E,0X3E,0X1E,0X46,0X1E,0X3E,0X1E,0X46,0XFD,0X3D,0X1D,0X46,0X1E,0X46,  
  • 0X3E,0X46,0X5E,0X4E,0X5E,0X4E,0X5E,0X4E,0X7E,0X4E,0X7E,0X4E,0X7E,0X4E,0X7E,0X4E,  
  • 0X9E,0X56,0X9E,0X56,0X9E,0X56,0X9E,0X56,0X9E,0X56,0X9E,0X56,0X7E,0X56,0XFC,0X4D,  
  • 0X1E,0XB7,0XFC,0X4D,0X7E,0X56,0X9E,0X56,0X9E,0X56,0X9E,0X56,0X9E,0X56,0X9E,0X56,  
  • 0X9E,0X56,0X7E,0X4E,0X7E,0X4E,0X7E,0X4E,0X3F,0X7F,0X3F,0X87,0X3F,0X87,0X1F,0X6F,  
  • 0X5E,0X46,0X5E,0X46,0X5E,0X46,0X3E,0X46,0X3E,0X46,0X3E,0X46,0X3E,0X46,0X1E,0X3E,  
  • 0X1E,0X3E,0X1E,0X3E,0X1E,0X3E,0X1E,0X3E,0X79,0X5D,0X59,0XCE,0X79,0XCE,0X16,0X7D,  
  • 0X3F,0X3E,0X3F,0X3E,0X3F,0X3E,0X3F,0X3E,0X5F,0X46,0X3E,0X46,0X5E,0X46,0X5E,0X46,  
  • 0X5E,0X46,0X5E,0X46,0X7E,0X4E,0X7F,0X4E,0X7F,0X4E,0X7F,0X4E,0X9F,0X4E,0X9F,0X56,  
  • 0X9F,0X56,0XBF,0X56,0XBF,0X56,0XBF,0X56,0XBF,0X56,0XBF,0X56,0XBF,0X5E,0XDF,0X5E,  
  • 0XDF,0X5E,0XBE,0X5E,0X7D,0X56,0X9D,0X76,0X7D,0X56,0XBE,0X5E,0XDF,0X5E,0XDF,0X5E,  
  • 0XBF,0X5E,0XBF,0X56,0XBF,0X56,0XBF,0X56,0XBF,0X56,0XBF,0X56,0X9F,0X56,0XFF,0X5E,  
  • 0X5F,0X8F,0X5F,0X8F,0X3F,0X6F,0X7F,0X4E,0X7F,0X4E,0X5F,0X46,0X5F,0X46,0X5F,0X46,  
  • 0X5F,0X46,0X5F,0X46,0X5F,0X46,0X3F,0X3E,0X3F,0X3E,0X3F,0X3E,0X3F,0X3E,0X16,0X7D,  
  • 0X79,0XCE,0XBA,0XD6,0XF3,0X9C,0XDC,0X45,0X5F,0X46,0X5F,0X46,0X7F,0X46,0X7F,0X46,  
  • 0X7F,0X46,0X7F,0X46,0X7F,0X46,0X7F,0X4E,0X9F,0X4E,0X9F,0X4E,0X9F,0X4E,0X9F,0X4E,  
  • 0XBF,0X56,0XBF,0X56,0XBF,0X56,0XDF,0X56,0XDF,0X56,0XDF,0X5E,0XDF,0X5E,0XFF,0X5E,  
  • 0XFF,0X5E,0XFF,0X5E,0XFF,0X5E,0XFF,0X5E,0XFE,0X5E,0XDE,0X5E,0XBE,0X56,0XDE,0X5E,  
  • 0XFE,0X5E,0XFF,0X5E,0XFF,0X5E,0XFF,0X5E,0XFF,0X5E,0XFF,0X5E,0XDF,0X5E,0XDF,0X5E,  
  • 0XDF,0X56,0XDF,0X56,0XFF,0X5E,0X7F,0X97,0X7F,0X97,0X7F,0X7F,0XDF,0X56,0X9F,0X4E,  
  • 0X9F,0X4E,0X9F,0X4E,0X7F,0X46,0X7F,0X46,0X7F,0X46,0X7F,0X46,0X7F,0X46,0X5F,0X46,  
  • 0X5F,0X46,0XDC,0X45,0XF3,0X9C,0XBA,0XD6,0X1C,0XE7,0X96,0XB5,0X73,0X64,0X7F,0X46,  
  • 0X7F,0X46,0X7F,0X46,0X7F,0X46,0X9F,0X46,0X9F,0X46,0X9F,0X4E,0X9F,0X4E,0XBF,0X4E,  
  • 0XBF,0X4E,0XBF,0X56,0XDF,0X56,0XDF,0X56,0XDF,0X56,0XFF,0X5E,0XFF,0X5E,0XFF,0X5E,  
  • 0X1F,0X5F,0X1F,0X5F,0X1F,0X5F,0X1F,0X5F,0X1F,0X67,0X1F,0X67,0X3F,0X67,0X1F,0X67,  
  • 0X1F,0X67,0X1E,0X67,0X1F,0X67,0X1F,0X67,0X3F,0X67,0X1F,0X67,0X1F,0X67,0X1F,0X5F,  
  • 0X1F,0X5F,0X1F,0X5F,0X1F,0X5F,0XFF,0X5E,0XFF,0X5E,0XFF,0X5E,0X7F,0X7F,0X9F,0X97,  
  • 0X9F,0X97,0XFF,0X5E,0XBF,0X4E,0XBF,0X4E,0X9F,0X4E,0X9F,0X4E,0X9F,0X46,0X9F,0X46,  
  • 0X7F,0X46,0X7F,0X46,0X7F,0X46,0X7F,0X46,0X73,0X64,0X96,0XB5,0X1C,0XE7,0X7D,0XEF,  
  • 0X59,0XCE,0X71,0X8C,0XB5,0X44,0X9F,0X46,0X9F,0X46,0XBF,0X46,0XBF,0X4E,0XBF,0X4E,  
  • 0XBF,0X4E,0XDF,0X4E,0XDF,0X4E,0XDF,0X56,0XFF,0X56,0XFF,0X56,0X1F,0X57,0X1F,0X5F,  
  • 0X1F,0X5F,0X1F,0X5F,0X3F,0X5F,0X3F,0X67,0X3F,0X67,0X3F,0X67,0X3F,0X67,0X3F,0X67,  
  • 0X3F,0X67,0X3F,0X67,0X5F,0X67,0X5F,0X67,0X5F,0X67,0X5F,0X67,0X5F,0X67,0X3F,0X67,  
  • 0X3F,0X67,0X3F,0X67,0X3F,0X67,0X3F,0X67,0X3F,0X67,0X3F,0X67,0X3F,0X5F,0X1F,0X5F,  
  • 0X1F,0X5F,0X9F,0X77,0X9F,0X87,0X9F,0X87,0XFF,0X56,0XDF,0X56,0XDF,0X4E,0XDF,0X4E,  
  • 0XBF,0X4E,0XBF,0X4E,0XBF,0X4E,0XBF,0X46,0X9F,0X46,0X9F,0X46,0XB5,0X44,0X71,0X8C,  
  • 0X59,0XCE,0X7D,0XEF,0XBE,0XF7,0XFB,0XDE,0X96,0XB5,0XAF,0X73,0X33,0X44,0X9E,0X46,  
  • 0XBF,0X46,0XDF,0X4E,0XDF,0X4E,0XDF,0X4E,0XFF,0X56,0XFF,0X56,0XFF,0X56,0X1F,0X57,  
  • 0X1F,0X5F,0X1F,0X5F,0X3F,0X5F,0X3F,0X5F,0X3F,0X67,0X5F,0X67,0X5F,0X67,0X5F,0X67,  
  • 0X5F,0X67,0X5F,0X6F,0X7F,0X6F,0X7F,0X6F,0X7F,0X6F,0X7F,0X6F,0X7F,0X6F,0X7F,0X6F,  
  • 0X7F,0X6F,0X7F,0X6F,0X7F,0X6F,0X7F,0X6F,0X7F,0X6F,0X5F,0X6F,0X5F,0X67,0X5F,0X67,  
  • 0X5F,0X67,0X5F,0X67,0X3F,0X67,0X3F,0X5F,0X9F,0X6F,0XBF,0X8F,0XBF,0X7F,0X5F,0X67,  
  • 0XFF,0X56,0XFF,0X56,0XFF,0X56,0XDF,0X4E,0XDF,0X4E,0XDF,0X4E,0XBF,0X46,0X9E,0X46,  
  • 0X33,0X44,0XAE,0X73,0X96,0XB5,0XFB,0XDE,0XBE,0XF7,0XDF,0XFF,0X7D,0XEF,0X9A,0XD6,  
  • 0X34,0XA5,0X8E,0X73,0XCB,0X42,0XBA,0X45,0XFF,0X4E,0XFF,0X4E,0XFF,0X56,0X1F,0X57,  
  • 0X1F,0X57,0X3F,0X5F,0X3F,0X5F,0X3F,0X5F,0X5F,0X5F,0X5F,0X67,0X5F,0X67,0X7F,0X67,  
  • 0X7F,0X67,0X7F,0X6F,0X7F,0X6F,0X9F,0X6F,0X9F,0X6F,0X9F,0X6F,0X9F,0X6F,0X9F,0X6F,  
  • 0X9F,0X6F,0X9F,0X6F,0X9F,0X6F,0X9F,0X6F,0X9F,0X6F,0X9F,0X6F,0X9F,0X6F,0X9F,0X6F,  
  • 0X9F,0X6F,0X9F,0X6F,0X7F,0X6F,0X7F,0X6F,0X7F,0X67,0X7F,0X67,0X5F,0X67,0X5F,0X67,  
  • 0X9F,0X6F,0XDF,0X7F,0XDF,0X77,0X3F,0X5F,0X1F,0X57,0X1F,0X57,0XFF,0X56,0XFF,0X4E,  
  • 0XFF,0X4E,0XBA,0X45,0XCC,0X42,0X8E,0X73,0X34,0XA5,0X9A,0XD6,0X7D,0XEF,0XDF,0XFF,  
  • 0XFF,0XFF,0XDF,0XFF,0X5D,0XEF,0X9A,0XD6,0X55,0XAD,0XEF,0X7B,0XAA,0X52,0X8F,0X43,  
  • 0X16,0X45,0XFA,0X4D,0X3F,0X57,0X3F,0X57,0X5F,0X5F,0X5F,0X5F,0X7F,0X5F,0X7F,0X67,  
  • 0X7F,0X67,0X9F,0X67,0X9F,0X67,0X9F,0X6F,0XBF,0X6F,0XBF,0X6F,0XBF,0X6F,0XBF,0X6F,  
  • 0XBF,0X6F,0XBF,0X6F,0XBF,0X6F,0XDF,0X77,0XDF,0X77,0XDF,0X77,0XDF,0X77,0XDF,0X77,  
  • 0XBF,0X6F,0XBF,0X6F,0XBF,0X6F,0XBF,0X6F,0XBF,0X6F,0XBF,0X6F,0XBF,0X6F,0X9F,0X6F,  
  • 0X9F,0X67,0X9F,0X67,0X7F,0X67,0X7F,0X67,0X7F,0X5F,0X5F,0X5F,0X5F,0X5F,0X3F,0X57,  
  • 0X3F,0X57,0XFA,0X4D,0X36,0X45,0X8F,0X43,0XAA,0X52,0XCF,0X7B,0X55,0XAD,0X9A,0XD6,  
  • 0X5D,0XEF,0XDF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDF,0XFF,0X7D,0XEF,0XBA,0XD6,  
  • 0XD7,0XBD,0X92,0X94,0X8E,0X73,0XAA,0X52,0X49,0X4A,0X08,0X42,0XC7,0X39,0XC7,0X39,  
  • 0XC7,0X39,0XC7,0X39,0XC7,0X39,0XC7,0X39,0XC7,0X39,0XC7,0X39,0XC7,0X39,0XC7,0X39,  
  • 0XC7,0X39,0XC7,0X39,0XC7,0X39,0XC7,0X39,0XC7,0X39,0XC7,0X39,0XC7,0X39,0XC7,0X39,  
  • 0XC7,0X39,0XC7,0X39,0XC7,0X39,0XC7,0X39,0XC7,0X39,0XC7,0X39,0XC7,0X39,0XC7,0X39,  
  • 0XC7,0X39,0XC7,0X39,0XC7,0X39,0XC7,0X39,0XC7,0X39,0XC7,0X39,0XC7,0X39,0XC7,0X39,  
  • 0XC7,0X39,0XC7,0X39,0XC7,0X39,0X08,0X42,0X49,0X4A,0XAA,0X52,0X8E,0X73,0X92,0X94,  
  • 0XD7,0XBD,0XBA,0XD6,0X7D,0XEF,0XDF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,  
  • 0XFF,0XFF,0XDF,0XFF,0X9E,0XF7,0X1C,0XE7,0X79,0XCE,0X96,0XB5,0XF3,0X9C,0X71,0X8C,  
  • 0X10,0X84,0XCF,0X7B,0XCF,0X7B,0XCF,0X7B,0XCF,0X7B,0XCF,0X7B,0XCF,0X7B,0XCF,0X7B,  
  • 0XCF,0X7B,0XCF,0X7B,0XCF,0X7B,0XCF,0X7B,0XCF,0X7B,0XCF,0X7B,0XCF,0X7B,0XCF,0X7B,  
  • 0XCF,0X7B,0XCF,0X7B,0XCF,0X7B,0XCF,0X7B,0XCF,0X7B,0XCF,0X7B,0XCF,0X7B,0XCF,0X7B,  
  • 0XCF,0X7B,0XCF,0X7B,0XCF,0X7B,0XCF,0X7B,0XCF,0X7B,0XCF,0X7B,0XCF,0X7B,0XCF,0X7B,  
  • 0XCF,0X7B,0XCF,0X7B,0XCF,0X7B,0XCF,0X7B,0XCF,0X7B,0XCF,0X7B,0X10,0X84,0X71,0X8C,  
  • 0XF3,0X9C,0X96,0XB5,0X79,0XCE,0X1C,0XE7,0X9E,0XF7,0XDF,0XFF,0XFF,0XFF,0XFF,0XFF,  
  • 0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XDF,0XFF,0X7D,0XEF,  
  • 0X1C,0XE7,0XBA,0XD6,0X79,0XCE,0X59,0XCE,0X38,0XC6,0X38,0XC6,0X38,0XC6,0X38,0XC6,  
  • 0X38,0XC6,0X38,0XC6,0X38,0XC6,0X38,0XC6,0X38,0XC6,0X38,0XC6,0X38,0XC6,0X38,0XC6,  
  • 0X38,0XC6,0X38,0XC6,0X38,0XC6,0X38,0XC6,0X38,0XC6,0X38,0XC6,0X38,0XC6,0X38,0XC6,  
  • 0X38,0XC6,0X38,0XC6,0X38,0XC6,0X38,0XC6,0X38,0XC6,0X38,0XC6,0X38,0XC6,0X38,0XC6,  
  • 0X38,0XC6,0X38,0XC6,0X38,0XC6,0X38,0XC6,0X38,0XC6,0X38,0XC6,0X38,0XC6,0X38,0XC6,  
  • 0X38,0XC6,0X59,0XCE,0X79,0XCE,0XBA,0XD6,0X1C,0XE7,0X7D,0XEF,0XDF,0XFF,0XFF,0XFF,  
  • 0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF};  
  •    
  •    
  • void lcd_gui_test(){  
  •     rtgui_color_t pixel = white;  
  •     int width, height = 59, i;  
  •     rt_uint8_t* p;  
  •     rtgui_color_t tmp[] = {0xffff};  
  •    
  •     struct rtgui_graphic_driver* drv = rtgui_graphic_driver_get_default();  
  •     const struct rtgui_graphic_driver_ops* ops = drv->ops;  
  •    
  •     // clear  
  •     i = 272;  
  •     while(i--)  
  •     {  
  •         ops->draw_hline(&pixel, 0, 480, i);  
  •     }  
  •    
  •     // hline  
  •     i = 5;  
  •     pixel = red;  
  •     while(i--)  
  •     {  
  •         ops->draw_hline(&pixel, 0, 480, 50 + i);  
  •     }  
  •    
  •     // vline  
  •     i = 5;  
  •     while(i--)  
  •     {  
  •         ops->draw_vline(&pixel, 80 + i, 0, 272);  
  •     }  
  •    
  •     // draw icon  
  •     p = (unsigned char*)&icon;  
  •     while(height--){  
  •         ops->draw_raw_hline((rt_uint8_t*)p, 200, 200 + 59, 180 - height);  
  •         p += 59 * 2;  
  •     }  
  •      
  •     // copy icon  
  •     width = height = 59;  
  •     while(height--)  
  •     {  
  •         while(width--)  
  •         {  
  •             ops->get_pixel(tmp, 200 + width, 180 - height);  
  •             ops->set_pixel(tmp, 290 + width,  180 - height);  
  •         }  
  •         width = 59;  
  •     }  
  • }  


这两个测试文件的显示内容是一样的。

显示一条5个像素宽的横条与竖条,以及一个图标,再复制一份同样的图标。通过这些来测试基本的五个函数有没有按预期效果显示。


在application.c中添加测试代码:(L55-L59)



编译,下载,可以看到测试结果:


出110入93汤圆

 楼主| 发表于 2013-7-13 10:18:58 | 显示全部楼层

e)      模拟器运行RTGUI

模拟器在目录bsp\simulator下,在开始之前,请阅读目录下的readme.txt。

使用命令:scons --target=vs –s 来创建Visaul C++ 2005的项目文件。

打开生成的project.vcproj。

将lcd_gui_test.c加入,再在application.c中添加测试代码(默认是运行贪吃蛇游戏);


修改project -> Drivers -> sdl_fb.c,让屏幕分辨率与开发板的一致。

运行后,就可以看到效果了(注:可能因调用低层代码,窗口没刷新,用其它窗口盖一下,再挪开,就可以看到上图了)


出0入8汤圆

发表于 2013-7-13 11:47:17 | 显示全部楼层
可惜我还没入这个门,,

出110入93汤圆

 楼主| 发表于 2013-7-13 15:00:04 | 显示全部楼层
STM32 + RT Thread OS 学习笔记[四]

1、  补注

a)      硬件,打通通讯通道

若学习者购买了学习板,通常可以在学习板提供的示例代码中找到LCD的相关驱动代码,基本上,这里的驱动的所有代码都可以从里面找到。

从上面的示意图可见,MCU要在LCD上显示内容,需要经过:

1、  Core

2、  Dbus,SystemBus

3、  Bus Matrix

4、  FSMC

5、  SSD1963

6、  LCM


驱动LCD,就要相应地将这些通道开启,初始化,只要其中一个环节未打通,就不可能成功点亮LCD屏。


首先是到SSD1963的引脚,虽然说,MCU与SSD1963显示芯片的连接是通过FSMC方式,但由于FSMC与GPIO是共用引脚的,因此,需要先打开相应的GPIO。

代码:


[cpp] view plaincopyprint?


  • void GPIO_INIT(void)  
  • {  
  •     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC  
  •                         | RCC_APB2Periph_GPIOD| RCC_APB2Periph_GPIOE| RCC_APB2Periph_GPIOF , ENABLE);  
  • }  


作为新手,我就因为没打开GPIO,这么一句代码的问题,查了一个月才找到,杯具得不能再杯具了……

其次,就是FSMC了,这部分的代码,可以直接从学习板的示例代码中复制出来。


然后,是SSD1963显示芯片的初始化代码,也可以直接从学习板的示例代码中复制。

SSD1963,具体的信息可以查看学习板中带的PDF文件,以下是部分摘录:

1  GENERAL DESCRIPTION

SSD1963 is a display controller of 1215K byte frame buffer to support up to 864 x 480 x 24bit graphics
content.  It also equips parallel MCU interfaces in different bus width to receive graphics data and command
from MCU.  Its display interface supports common RA M-less LCD driver of color depth up to 24 bit-per-pixel.

2  FEATURES

•  Display feature
−  Built-in 1215K bytes frame buffer.  Support up to 864 x 480 at 24bpp display
−  Support TFT 18/24-bit generic RGB interface panel
−  Support 8-bit serial RGB interface
−  Hardware rotation of 0, 90, 180, 270 degree
−  Hardware display mirroring
−  Hardware windowing
−  Programmable brightness, contrast and saturation control
−  Dynamic Backlight Control (DBC) via PWM signal
•  MCU connectivity
−  8/9/16/18/24-bit MCU interface
−  Tearing effect signal
•  I/O Connectivity
−  4 GPIO pins
•  Built-in clock generator
•  Deep sleep mode for power saving
•  Core supply power (VDDPLL and VDDD): 1.2V±0.1V
•  I/O supply power(VDDIO): 1.65V to 3.6V
•  LCD interface supply power (VDDLCD): 1.65V to 3.6V

可以看到,这款芯片内建1215K字节帧缓存,最大支持分辨率864x 480,真24位彩色的LCD屏

如果要提高显示效果,可考虑使用帧缓存(framebuffer)。RTGUI支持帧缓存,以后有时间,再更新驱动。


为了显示LCD屏上的每一个像素点,SSD1963提供了很多命令,如:

设置作图坐标,我们会使用 0x2A,0x2B来确定一个矩形区域。

然后开始写入数据之前,调用0x2C来通知SSD1963。同样,可以发送命令0x2E来通知SSD1963,将当前点的像素颜色值放到数据总线上,MCU随后就可以通过FSMC来读取。


其它更多内容,请查看PDF文件。


奋斗板V3的4.3” LCD屏,用的是翰彩4.3” ColorTFT-LCD Module,在相关资料文件夹中,也有相应的PDF文档。硬件连接只要按文档说明正确对应即可。

LCM型号(Model)是 HSD043I9W1-A**


完成以上,整个通讯通道就被打通,LCD屏才能成功点亮。

b)      GUI基础函数

RTGUI与UCGUI,其底层的绘图函数都只有很少的几个,复杂图形及文字等显示操作,都在这些功能简单的函数基础上进行的扩展。

RTGUI的五个基本绘图函数(未使用frame buffer的情况下):


[cpp] view plaincopyprint?


  • /**
  • * graphic operations
  • */  
  • struct rt_device_graphic_ops  
  • {  
  •     void (*set_pixel) (const char *pixel, int x, int y);  
  •     void (*get_pixel) (char *pixel, int x, int y);  
  •    
  •     void (*draw_hline)(const char *pixel, int x1, int x2, int y);  
  •     void (*draw_vline)(const char *pixel, int x, int y1, int y2);  
  •    
  •     void (*blit_line) (const char *pixel, int x, int y, rt_size_t size);  
  • };  


分别是:

  • l  画一个点
  • l  取一个点的色彩值
  • l  画一条水平线
  • l  画一条垂直线
  • l  画一条水平线,水平线上每个点的色彩值在“数组”中指定


在RTGUI中,把显示驱动作为一个设备来注册。以上五个函数则保存到通用设备的私有数据段。再将显示设备注册为“lcd”。

其中基类rt_devicer的control方法,我们返回了一些信息,如屏幕大小,色彩格式定义等。而其它几个方法其实都是空方法,因为LCD驱动不提供这些功能。

如下:


[cpp] view plaincopyprint?


  • void rt_hw_lcd_init(void)  
  • {  
  •    
  •     /* register lcd device */  
  •     _lcd_device.type  = RT_Device_Class_Graphic;  
  •     _lcd_device.init  = lcd_init;  
  •     _lcd_device.open  = lcd_open;  
  •     _lcd_device.close = lcd_close;  
  •     _lcd_device.control = lcd_control;  
  •     _lcd_device.read  = RT_NULL;  
  •     _lcd_device.write = RT_NULL;  
  •    
  •     _lcd_device.user_data = &ssd1963_ops;  
  •     GPIO_INIT();  
  •     FSMC_LCD_Init();  
  •     LCD_INIT();  
  •     lcd_clear();  
  •    
  •     /* register graphic device driver */  
  •     rt_device_register(&_lcd_device, "lcd",  
  •         RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STANDALONE);  
  • }  


在application.c中,RTGUI取得设备“lcd”,并将它转化为rtgui_graphic_driver类,如下:

[cpp] view plaincopyprint?


  • …………  
  • #ifdef RT_USING_RTGUI  
  •     {  
  •         extern void rtgui_system_server_init(void);  
  •         extern void rt_hw_lcd_init();  
  •         extern void rtgui_touch_hw_init(void);  
  •    
  •         rt_device_t lcd;  
  •    
  •         /* init lcd */  
  •         rt_hw_lcd_init();  
  •    
  •         /* init touch panel */  
  •         rtgui_touch_hw_init();  
  •    
  •         /* re-init device driver */  
  •         rt_device_init_all();  
  •    
  •         /* find lcd device */  
  •         lcd = rt_device_find("lcd");  
  •    
  •         /* set lcd device as rtgui graphic driver */  
  •        <strong> rtgui_graphic_set_device(lcd);</strong>  
  •    
  •         /* init rtgui system server */  
  •         rtgui_system_server_init();  
  •     }  
  • #endif /* #ifdef RT_USING_RTGUI */  
  • }  
  •    
  • int rt_application_init()  
  • {  
  • …………  





[cpp] view plaincopyprint?


  • /*
  • * File      : driver.h
  • * This file is part of RTGUI in RT-Thread RTOS
  • * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
  • *
  • * The license and distribution terms for this file may be
  • * found in the file LICENSE in this distribution or at
  • * http://www.rt-thread.org/license/LICENSE
  • *
  • * Change Logs:
  • * Date           Author       Notes
  • * 2009-10-04     Bernard      first version
  • */  
  • #ifndef __RTGUI_DRIVER_H__  
  • #define __RTGUI_DRIVER_H__  
  •    
  • #include <rtgui/list.h>  
  • #include <rtgui/color.h>  
  •    
  • <strong>struct rtgui_graphic_driver_ops</strong>  
  • {  
  •     /* set and get pixel in (x, y) */  
  •     void (*set_pixel)(rtgui_color_t *c, int x, int y);  
  •     void (*get_pixel)(rtgui_color_t *c, int x, int y);  
  •    
  •     void (*draw_hline)(rtgui_color_t *c, int x1, int x2, int y);  
  •     void (*draw_vline)(rtgui_color_t *c, int x , int y1, int y2);  
  •    
  •     /* draw raw hline */  
  •     void (*<strong>draw_raw_hline</strong>)(rt_uint8_t *pixels, int x1, int x2, int y);  
  • };  
  •    
  • <strong>struct rtgui_graphic_driver</strong>  
  • {  
  •     /* pixel format and byte per pixel */  
  •     rt_uint8_t pixel_format;  
  •     rt_uint8_t bits_per_pixel;  
  •     rt_uint16_t pitch;  
  •    
  •     /* screen width and height */  
  •     rt_uint16_t width;  
  •     rt_uint16_t height;  
  •    
  •     /* framebuffer address and ops */  
  •     volatile rt_uint8_t *framebuffer;  
  •     rt_device_t device;  
  •     <strong>const struct rtgui_graphic_driver_ops *ops;</strong>  
  • };  
  • ………………  
  • ………………  
  • ………………  




[cpp] view plaincopyprint?


  • /*
  • * File      : driver.c
  • * This file is part of RTGUI in RT-Thread RTOS
  • * COPYRIGHT (C) 2006 - 2009, RT-Thread Development Team
  • *
  • * The license and distribution terms for this file may be
  • * found in the file LICENSE in this distribution or at
  • * http://www.rt-thread.org/license/LICENSE
  • *
  • * Change Logs:
  • * Date           Author       Notes
  • * 2009-10-04     Bernard      first version
  • */  
  • #include <rtthread.h>  
  • #include <rtgui/driver.h>  
  •    
  • struct rtgui_graphic_driver _driver;  
  •    
  • ………………  
  • ………………  
  • ………………  
  • rt_err_t rtgui_graphic_set_device(rt_device_t device)  
  • {  
  •     rt_err_t result;  
  •     struct rt_device_graphic_info info;  
  •    
  •     /* get framebuffer address */  
  •     result = rt_device_control(device, RTGRAPHIC_CTRL_GET_INFO, &info);  
  •     if (result != RT_EOK)  
  •     {  
  •         /* get device information failed */  
  •         return -RT_ERROR;  
  •     }  
  •    
  •     /* initialize framebuffer driver */  
  •     _driver.device = device;  
  •     _driver.pixel_format = info.pixel_format;  
  •     _driver.bits_per_pixel = info.bits_per_pixel;  
  •     _driver.width = info.width;  
  •     _driver.height = info.height;  
  •     _driver.pitch = _driver.width * _driver.bits_per_pixel / 8;  
  •     _driver.framebuffer = info.framebuffer;  
  •    
  •     if (info.framebuffer != RT_NULL)  
  •     {  
  •         /* is a frame buffer device */  
  •         _driver.ops = rtgui_framebuffer_get_ops(_driver.pixel_format);  
  •     }  
  •     else  
  •     {  
  •         /* is a pixel device */  
  •         <strong>_driver.ops = rtgui_pixel_device_get_ops(_driver.pixel_format);</strong>  
  •     }  
  •    
  •     return RT_EOK;  
  • }  
  • ………………  
  • ………………  
  • ………………  


其它代码就不列出来了,最终实现的是GUI色彩定义与硬件的色彩定义分隔,在RTGUI中统一一种方式定义色彩,而不用关心具体LCD硬件对色彩的定义。不过,对于函数draw_raw_hline()来说,需要手工转换色彩。

出0入8汤圆

发表于 2013-7-13 15:19:21 | 显示全部楼层
看了一些RTGUI源码,就是不理解怎么用,只好等教程了

出0入8汤圆

发表于 2013-7-13 15:19:38 | 显示全部楼层
看了一些RTGUI源码,就是不理解怎么用,只好等教程了

出110入93汤圆

 楼主| 发表于 2013-7-13 16:55:32 | 显示全部楼层
cbailjc 发表于 2013-7-13 11:47
可惜我还没入这个门,,

我也是刚接触嵌入开发,新手一个,大家共勉。

出110入93汤圆

 楼主| 发表于 2013-7-13 16:58:25 | 显示全部楼层
lindabell 发表于 2013-7-13 15:19
看了一些RTGUI源码,就是不理解怎么用,只好等教程了

是啊,要是有教程会省事很多。
RTGUI在改变中,原来1.0的那个pdf,只能作参考了,要使用,得看代码,确实累啊。

我的目的,就是怎么才能跑起来,至于控件,内部机制倒是其次。而官方pdf除了 realTouch,就没有其它的“怎么跑起来”的指导了,太遗憾了。

出110入93汤圆

 楼主| 发表于 2013-7-13 17:04:12 | 显示全部楼层
顺便吐槽一下,奋斗板的代码,给人的感觉是七拼八凑的,没整理好,就像小学生的作品。
看过了RT-Thread OS的代码,看奋斗板的代码,有种吃不下饭的感觉。

出0入8汤圆

发表于 2013-7-13 17:42:24 | 显示全部楼层
memstone 发表于 2013-7-13 16:58
是啊,要是有教程会省事很多。
RTGUI在改变中,原来1.0的那个pdf,只能作参考了,要使用,得看代码,确实 ...

我有realtouch,不过不理解一些基本原理很难入手

出0入0汤圆

发表于 2013-7-13 17:59:23 | 显示全部楼层
哈哈,我这几天正在看他的PDF,你这个就来了,支持一下

出0入4汤圆

发表于 2013-7-13 18:08:07 | 显示全部楼层
先Mark,有空再看

出110入93汤圆

 楼主| 发表于 2013-7-14 21:51:12 | 显示全部楼层

1、  触摸屏驱动

触摸屏驱动的原理非常简单,从硬件得到坐标数据,数据加工(适配屏幕分辨率,偏移量调整),最后调用rtgui_server_post_event()函数向GUI服务端发送坐标信息。


奋斗板V3,使用的AD芯片是XPT2046,是RTGUI bsp/stm32f10x下的ADS7846芯片的下一代产品,功能及硬件连接上完全兼容。因此,我们只要确认与MCU的管脚连接,在代码上正确配置即可。


注:奋斗板的源代码是以模数转换(ADS)方式直接读取的,而RTGUI里,则是以SPI方式读取,并采用中断(EXT INT)方式。另外,SPI1上接了三个设备,分别是触摸屏,10M LAN, 2M Flash,使用了三根MCU管脚作为片选(CS)。RTT中,使用的CS脚是PC4,IRQ是PB1,而奋斗板的CS是PB7,IRQ是PB6。


修正前后补丁:

17c17
< CS   PB7
---
> CS   PC4
20,21c20,21
< #define   CS_0()          GPIO_ResetBits(GPIOB,GPIO_Pin_7)
< #define   CS_1()          GPIO_SetBits(GPIOB,GPIO_Pin_7)
---
> #define   CS_0()          GPIO_ResetBits(GPIOC,GPIO_Pin_4)
> #define   CS_1()          GPIO_SetBits(GPIOC,GPIO_Pin_4)
78,79c78,79
< #define X_WIDTH 480
< #define Y_WIDTH 272
---
> #define X_WIDTH 240
> #define Y_WIDTH 320
147,148c147,148
<                 touch->y = total_x / 8;
<                 touch->x = total_y / 8;
---
>                 touch->x = total_x / 8;
>                 touch->y = total_y / 8;
154,155d153
<         rt_kprintf("physical position: (%d, %d)\n", touch->x, touch->y);
<        
202c200
<     if ((!touched_down) && GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_6) != 0)
---
>     if ((!touched_down) && GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) != 0)
205c203
<     if (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_6) != 0)
---
>     if (GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) != 0)
294,295c292,293
<     /* Enable the EXTI9_5 Interrupt */
<     NVIC_InitStructure.NVIC_IRQChannel = EXTI9_5_IRQn;
---
>     /* Enable the EXTI0 Interrupt */
>     NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
307c305
<     EXTI_InitStructure.EXTI_Line = EXTI_Line6;
---
>     EXTI_InitStructure.EXTI_Line = EXTI_Line1;
323c321
<     EXTI_ClearITPendingBit(EXTI_Line6);
---
>     EXTI_ClearITPendingBit(EXTI_Line1);
328c326
<     /* PB6 touch INT */
---
>     /* PB1 touch INT */
333c331
<         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;
---
>         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
339c337
<     GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource6);
---
>     GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);
351c349
<     // enable touch, disable other SPI1 device
---
>     /* PC4 touch CS */
355c353
<         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOB, ENABLE);
---
>         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
360d357
<         GPIO_Init(GPIOA,&GPIO_InitStructure);
362,369d358
<
<         GPIO_SetBits(GPIOA, GPIO_Pin_4);                      // disable ENC28J60(LAN)
<         GPIO_SetBits(GPIOB, GPIO_Pin_4);            // disable SST25VF016B(2M Flash)
<
<         /* PB7 touch CS */
<         {
<             GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_7;
<             GPIO_Init(GPIOB,&GPIO_InitStructure);
372d360
<     }
412c400
< void EXTI9_5_IRQHandler(void)
---
> void EXTI1_IRQHandler(void)
420c408
<     EXTI_ClearITPendingBit(EXTI_Line6);
---
>     EXTI_ClearITPendingBit(EXTI_Line1);

在 touch.c 中,第30行定义了一个结构体,其中最后两行,对于每个触摸屏,不同时期,可能采用不同的值才会取得最佳效果,这就是触摸屏校准程序要采集并计算的最佳数据。

struct rtgui_touch_device
{
    struct rt_device parent;

    rt_timer_t poll_timer;
    rt_uint16_t x, y;

    rt_bool_t calibrating;
    rt_touch_calibration_func_t calibration_func;

    rt_uint16_t min_x, max_x;
    rt_uint16_t min_y, max_y;
};


数值例:

点触摸屏右下角,硬件返回的坐标值:3955, 3463

校准数据:min_x = 208, max_x = 4069, min_y = 187, max_y = 3590


最后,综合硬件值,校准数据,屏幕分辨率,计算出一个相对精确的坐标数据(x, y),如果屏幕分辨率为480 X 640,则x < 480,y < 640。


注1:由于屏幕显示方向与触摸屏方向不一致,在代码的第147行,将 x, y 值对调。

注2:为了屏幕与触摸屏方向保持一致,修改了LCD驱动,将显示方向转了180度。

Ssd1963.c 第188行,参数值改为0x0003

        LCD_WR_REG(0x0036);            //rotation
         LCD_WR_DAT(0x0003);

具体参数意义,请参考PDF文件说明。



出110入93汤圆

 楼主| 发表于 2013-7-14 21:53:00 | 显示全部楼层
本帖最后由 memstone 于 2013-7-14 21:55 编辑

1、  触摸屏校准程序

由于GUI目前在持续变更中,有些函数在新版本中已经不同了,而bsp中的校准程序没有跟进修改,所以无法编译通过。


修正可编译版本:

  1. #include <rtgui/rtgui.h>
  2. #include <rtgui/dc.h>
  3. #include <rtgui/rtgui_app.h>
  4. #include <rtgui/rtgui_system.h>
  5. #include <rtgui/widgets/window.h>

  6. #include "touch.h"

  7. // 校准步骤编号
  8. #define CALIBRATION_STEP_LEFTTOP                0
  9. #define CALIBRATION_STEP_RIGHTTOP                1
  10. #define CALIBRATION_STEP_RIGHTBOTTOM        2
  11. #define CALIBRATION_STEP_LEFTBOTTOM                3
  12. #define CALIBRATION_STEP_CENTER                        4

  13. // 窗口自定义消息代码
  14. #define TOUCH_WIN_UPDATE                                1
  15. #define TOUCH_WIN_CLOSE                                        2

  16. // 校准点大小
  17. #define CALIBRATION_WIDTH                                15
  18. #define CALIBRATION_HEIGHT                                15

  19. struct calibration_session
  20. {
  21.         rt_uint8_t step;

  22.         struct calibration_data data;

  23.         rt_uint16_t width; rt_uint16_t height;

  24.         rt_device_t device;
  25.         rt_thread_t tid;
  26.    
  27.     rtgui_win_t* wid;
  28. };
  29. static struct calibration_session* calibration_ptr = RT_NULL;

  30. // 校准回调函数,初化时,设置到touch device 中
  31. static void calibration_data_post(rt_uint16_t x, rt_uint16_t y)
  32. {
  33.         if (calibration_ptr != RT_NULL)
  34.         {
  35.                 // 取得每次校准点的x, y 坐标值,并与上一次求平均值
  36.                 switch (calibration_ptr->step)
  37.                 {
  38.                 case CALIBRATION_STEP_LEFTTOP:
  39.                         calibration_ptr->data.min_x = x;
  40.                         calibration_ptr->data.min_y = y;
  41.                         break;

  42.                 case CALIBRATION_STEP_RIGHTTOP:
  43.                         calibration_ptr->data.max_x = x;
  44.                         calibration_ptr->data.min_y = (calibration_ptr->data.min_y + y)/2;
  45.                         break;

  46.                 case CALIBRATION_STEP_LEFTBOTTOM:
  47.                         calibration_ptr->data.min_x = (calibration_ptr->data.min_x + x)/2;
  48.                         calibration_ptr->data.max_y = y;
  49.                         break;

  50.                 case CALIBRATION_STEP_RIGHTBOTTOM:
  51.                         calibration_ptr->data.max_x = (calibration_ptr->data.max_x + x)/2;
  52.                         calibration_ptr->data.max_y = (calibration_ptr->data.max_y + y)/2;
  53.                         break;

  54.                 case CALIBRATION_STEP_CENTER:
  55.                         /* calibration done */
  56.                         {
  57.                                 rt_uint16_t w, h;

  58.                                 // 创建关闭校准窗口的消息事件
  59.                                 struct rtgui_event_command ecmd;
  60.                                 RTGUI_EVENT_COMMAND_INIT(&ecmd);
  61.                 ecmd.wid = calibration_ptr->wid;
  62.                                 ecmd.command_id = TOUCH_WIN_CLOSE;

  63.                                 /* calculate calibrated data */
  64.                                 if (calibration_ptr->data.max_x > calibration_ptr->data.min_x)
  65.                                         w = calibration_ptr->data.max_x - calibration_ptr->data.min_x;
  66.                                 else
  67.                                         w = calibration_ptr->data.min_x - calibration_ptr->data.max_x;
  68.                                 w = (w/(calibration_ptr->width - 2 * CALIBRATION_WIDTH)) * CALIBRATION_WIDTH;

  69.                                 if (calibration_ptr->data.max_y > calibration_ptr->data.min_y)
  70.                                         h = calibration_ptr->data.max_y - calibration_ptr->data.min_y;
  71.                                 else
  72.                                         h = calibration_ptr->data.min_y - calibration_ptr->data.max_y;
  73.                                 h = (h/(calibration_ptr->height - 2 * CALIBRATION_HEIGHT)) * CALIBRATION_HEIGHT;

  74.                                 rt_kprintf("w: %d, h: %d\n", w, h);

  75.                                 if (calibration_ptr->data.max_x > calibration_ptr->data.min_x)
  76.                                 {
  77.                                         calibration_ptr->data.min_x -= w;
  78.                                         calibration_ptr->data.max_x += w;
  79.                                 }
  80.                                 else
  81.                                 {
  82.                                         calibration_ptr->data.min_x += w;
  83.                                         calibration_ptr->data.max_x -= w;
  84.                                 }

  85.                                 if (calibration_ptr->data.max_y > calibration_ptr->data.min_y)
  86.                                 {
  87.                                         calibration_ptr->data.min_y -= h;
  88.                                         calibration_ptr->data.max_y += h;
  89.                                 }
  90.                                 else
  91.                                 {
  92.                                         calibration_ptr->data.min_y += h;
  93.                                         calibration_ptr->data.max_y -= h;
  94.                                 }

  95.                                 rt_kprintf("calibration data: (%d, %d), (%d, %d)\n",
  96.                                         calibration_ptr->data.min_x,
  97.                                         calibration_ptr->data.max_x,
  98.                                         calibration_ptr->data.min_y,
  99.                                         calibration_ptr->data.max_y);
  100.                                        
  101.                                 // 关闭校准窗口
  102.                                 rtgui_send(calibration_ptr->tid, &ecmd.parent, sizeof(struct rtgui_event_command));
  103.                         }
  104.                         return;
  105.                 }

  106.                 calibration_ptr->step ++;

  107.                 /* post command event */
  108.                 {
  109.                         // 发送消息,通知窗口画下一个校准点
  110.                         struct rtgui_event_command ecmd;
  111.                         RTGUI_EVENT_COMMAND_INIT(&ecmd);
  112.             ecmd.wid = calibration_ptr->wid;
  113.                         ecmd.command_id = TOUCH_WIN_UPDATE;

  114.                         rtgui_send(calibration_ptr->tid, &ecmd.parent, sizeof(struct rtgui_event_command));
  115.                 }
  116.         }
  117. }

  118. // 窗口事件处理
  119. // 画校准点,关闭窗口
  120. rt_bool_t calibration_event_handler(struct rtgui_object* widget, struct rtgui_event* event)
  121. {
  122.         switch (event->type)
  123.         {
  124.         case RTGUI_EVENT_PAINT:
  125.         {
  126.                 struct rtgui_dc* dc;
  127.                 struct rtgui_rect rect;

  128.                 dc = rtgui_dc_begin_drawing((struct rtgui_widget*)widget);
  129.                 if (dc == RT_NULL) break;

  130.                 /* get rect information */
  131.                 rtgui_widget_get_rect((struct rtgui_widget*)widget, &rect);

  132.                 /* clear whole window */
  133.                 RTGUI_WIDGET_BACKGROUND(widget) = white;
  134.                 rtgui_dc_fill_rect(dc, &rect);

  135.                 /* reset color */
  136.                 RTGUI_WIDGET_BACKGROUND(widget) = green;
  137.                 RTGUI_WIDGET_FOREGROUND(widget) = black;

  138.                 switch (calibration_ptr->step)
  139.                 {
  140.                         case CALIBRATION_STEP_LEFTTOP:
  141.                                 rtgui_dc_draw_hline(dc, 0, 2 * CALIBRATION_WIDTH, CALIBRATION_HEIGHT);
  142.                                 rtgui_dc_draw_vline(dc, CALIBRATION_WIDTH, 0, 2 * CALIBRATION_HEIGHT);
  143.                                 RTGUI_WIDGET_FOREGROUND(widget) = red;
  144.                                 rtgui_dc_fill_circle(dc, CALIBRATION_WIDTH, CALIBRATION_HEIGHT, 4);
  145.                                 break;

  146.                         case CALIBRATION_STEP_RIGHTTOP:
  147.                                 rtgui_dc_draw_hline(dc, calibration_ptr->width - 2 * CALIBRATION_WIDTH,
  148.                                         calibration_ptr->width, CALIBRATION_HEIGHT);
  149.                                 rtgui_dc_draw_vline(dc, calibration_ptr->width - CALIBRATION_WIDTH, 0, 2 * CALIBRATION_HEIGHT);
  150.                                 RTGUI_WIDGET_FOREGROUND(widget) = red;
  151.                                 rtgui_dc_fill_circle(dc, calibration_ptr->width - CALIBRATION_WIDTH, CALIBRATION_HEIGHT, 4);
  152.                                 break;

  153.                         case CALIBRATION_STEP_LEFTBOTTOM:
  154.                                 rtgui_dc_draw_hline(dc, 0, 2 * CALIBRATION_WIDTH, calibration_ptr->height - CALIBRATION_HEIGHT);
  155.                                 rtgui_dc_draw_vline(dc, CALIBRATION_WIDTH, calibration_ptr->height - 2 * CALIBRATION_HEIGHT, calibration_ptr->height);
  156.                                 RTGUI_WIDGET_FOREGROUND(widget) = red;
  157.                                 rtgui_dc_fill_circle(dc, CALIBRATION_WIDTH, calibration_ptr->height - CALIBRATION_HEIGHT, 4);
  158.                                 break;

  159.                         case CALIBRATION_STEP_RIGHTBOTTOM:
  160.                                 rtgui_dc_draw_hline(dc, calibration_ptr->width - 2 * CALIBRATION_WIDTH,
  161.                                         calibration_ptr->width, calibration_ptr->height - CALIBRATION_HEIGHT);
  162.                                 rtgui_dc_draw_vline(dc, calibration_ptr->width - CALIBRATION_WIDTH, calibration_ptr->height - 2 * CALIBRATION_HEIGHT, calibration_ptr->height);
  163.                                 RTGUI_WIDGET_FOREGROUND(widget) = red;
  164.                                 rtgui_dc_fill_circle(dc, calibration_ptr->width - CALIBRATION_WIDTH, calibration_ptr->height - CALIBRATION_HEIGHT, 4);
  165.                                 break;

  166.                         case CALIBRATION_STEP_CENTER:
  167.                                 rtgui_dc_draw_hline(dc, calibration_ptr->width/2 - CALIBRATION_WIDTH, calibration_ptr->width/2 + CALIBRATION_WIDTH, calibration_ptr->height/2);
  168.                                 rtgui_dc_draw_vline(dc, calibration_ptr->width/2, calibration_ptr->height/2 - CALIBRATION_HEIGHT, calibration_ptr->height/2 + CALIBRATION_HEIGHT);
  169.                                 RTGUI_WIDGET_FOREGROUND(widget) = red;
  170.                                 rtgui_dc_fill_circle(dc, calibration_ptr->width/2, calibration_ptr->height/2, 4);
  171.                                 break;
  172.                 }
  173.                 rtgui_dc_end_drawing(dc);
  174.         }
  175.                 break;

  176.         case RTGUI_EVENT_COMMAND:
  177.                 {
  178.                         struct rtgui_event_command* ecmd = (struct rtgui_event_command*)event;

  179.                         switch (ecmd->command_id)
  180.                         {
  181.                         case TOUCH_WIN_UPDATE:
  182.                                 rtgui_widget_update((struct rtgui_widget*)widget);
  183.                                 break;
  184.                         case TOUCH_WIN_CLOSE:
  185.                                 rtgui_win_close(RTGUI_WIN(widget));
  186.                                 break;
  187.                         }
  188.                 }
  189.                 return RT_TRUE;

  190.         default:
  191.                 rtgui_win_event_handler(widget, event);
  192.         }

  193.         return RT_FALSE;
  194. }

  195. void calibration_entry(void* parameter)
  196. {
  197.     struct rtgui_app *application;
  198.         rtgui_win_t* win;
  199.         struct rtgui_rect rect;

  200.     application = rtgui_app_create(rt_thread_self(), "cali_app");
  201.     if (application == RT_NULL)
  202.     {
  203.         return;
  204.     }
  205.    
  206.         // 获取LCD 屏幕分辨率
  207.         rtgui_graphic_driver_get_rect(rtgui_graphic_driver_get_default(), &rect);

  208.         /* set screen rect */
  209.         calibration_ptr->width = rect.x2;
  210.         calibration_ptr->height = rect.y2;

  211.         /* create calibration window */
  212.         win = rtgui_win_create(RT_NULL,
  213.                 "calibration", &rect, RTGUI_WIN_STYLE_NO_TITLE | RTGUI_WIN_STYLE_NO_BORDER);
  214.         if (win == RT_NULL)
  215.         {
  216.             rt_kprintf("calibration_win create fail!\r\n");
  217.             return;
  218.         }

  219.     calibration_ptr->wid = win;
  220.         rtgui_object_set_event_handler(RTGUI_OBJECT(win), calibration_event_handler);
  221.     rtgui_win_show(win, RT_TRUE);
  222.    
  223.     rtgui_app_destroy(application);
  224.    
  225.         /* set calibration data */
  226.         rt_device_control(calibration_ptr->device, RT_TOUCH_CALIBRATION_DATA, &calibration_ptr->data);

  227.         /* recover to normal */
  228.         rt_device_control(calibration_ptr->device, RT_TOUCH_NORMAL, RT_NULL);

  229.         /* release memory */
  230.         rt_free(calibration_ptr);
  231.         calibration_ptr = RT_NULL;
  232.    
  233. }

  234. void calibration_init()
  235. {
  236.         rt_device_t device;

  237.         device = rt_device_find("touch");
  238.         if (device == RT_NULL) return; /* no this device */

  239.         calibration_ptr = (struct calibration_session*)rt_malloc(sizeof(struct calibration_session));
  240.         rt_memset(calibration_ptr, 0, sizeof(struct calibration_data));
  241.         calibration_ptr->device = device;

  242.         // 设置校准回调函数,进入校准状态
  243.         rt_device_control(calibration_ptr->device, RT_TOUCH_CALIBRATION, (void*)calibration_data_post);

  244.         calibration_ptr->tid = rt_thread_create("cali", calibration_entry, RT_NULL,
  245.                 2048, 20, 5);
  246.         if (calibration_ptr->tid != RT_NULL) rt_thread_startup(calibration_ptr->tid);
  247. }

  248. #ifdef RT_USING_FINSH
  249. #include <finsh.h>
  250. void calibration()
  251. {
  252.         calibration_init();
  253. }
  254. FINSH_FUNCTION_EXPORT(calibration, perform touch calibration);
  255. #endif
复制代码

2、  《贪吃蛇》例程

Step1: 在bsp\simulator\rtgui_demo\snake下有两个.c文件和一个.h文件,添加到stm32f10x项目中。

Step2: 在application.c中rt_init_thread_entry()函数的最后,添加calibration_init();


Step3: 在calibration.c中calibration_entry()函数的最后,添加snake_main(),在触摸屏校准完成后,进入贪吃蛇程序。


Step4: 贪吃蛇程序当前只支持键盘操作,我们还没驱动键盘,要使用触摸屏操作,要添加处理事件(红色部分为添加的代码):

static void snake_mouse_handler(struct rtgui_widget *widget, rtgui_event_t *event)
{
         struct rtgui_event_mouse *emouse;
         rt_uint32_t x, y;

         emouse = (struct rtgui_event_mouse *) event;

         if ((emouse->button & RTGUI_MOUSE_BUTTON_UP) == RTGUI_MOUSE_BUTTON_UP)
         {
                   x = lattice_rect.x1 + (LATTICE_SIZE * second_node.x);
                   y = (lattice_size_y - 1) - second_node.y;
                   y = lattice_rect.y1 + (LATTICE_SIZE * y);

                   if (run_state == SNAKE_DIR_UP || run_state == SNAKE_DIR_DOWN)
                   {
                            if (emouse->x > x + LATTICE_SIZE)
                            {
                                     run_state = SNAKE_DIR_RIGHT;
                            }
                            else
                            {
                                     run_state = SNAKE_DIR_LEFT;
                            }
                   }
                   else
                   {
                            if (emouse->y > y + LATTICE_SIZE)
                            {
                                     run_state = SNAKE_DIR_DOWN;
                            }
                            else
                            {
                                     run_state = SNAKE_DIR_UP;
                            }
                   }
         }
}

static rt_bool_t event_handler(struct rtgui_object *object, rtgui_event_t *event)
{
    struct rtgui_widget *widget = RTGUI_WIDGET(object);

    rt_kprintf("event_handler\r\n");

    if (event->type == RTGUI_EVENT_PAINT)
    {
        rt_kprintf("RTGUI_EVENT_PAINT\r\n");
        rtgui_win_event_handler((struct rtgui_object *)object, event);
        snake_draw(widget);
        rtgui_timer_start(timer);
    }
    else if (event->type == RTGUI_EVENT_SHOW)
    {
        rt_kprintf("RTGUI_EVENT_SHOW\r\n");
        rtgui_win_event_handler((struct rtgui_object *)object, event);
        snake_draw(widget);
        rtgui_timer_start(timer);
    }
    else if (event->type == RTGUI_EVENT_HIDE)
    {
        rt_kprintf("RTGUI_EVENT_HIDE\r\n");
        rtgui_win_event_handler((struct rtgui_object *)object, event);
        rtgui_timer_stop(timer);
    }
    else if (event->type == RTGUI_EVENT_WIN_DEACTIVATE)
    {
        rt_kprintf("RTGUI_EVENT_WIN_DEACTIVATE\r\n");
        rtgui_win_event_handler((struct rtgui_object *)object, event);
        rtgui_timer_stop(timer);
    }
    else if (event->type == RTGUI_EVENT_KBD)
    {
        rtgui_win_event_handler((struct rtgui_object *)object, event);
        snake_handler(widget, event);
    }
         else if (event->type == RTGUI_EVENT_MOUSE_BUTTON)
         {
                   rtgui_win_event_handler((struct rtgui_object *)object, event);
                   snake_mouse_handler(widget, event);
         }
    else
    {
        rt_kprintf("event->type:%d\r\n", event->type);

Step5: 添加文字标题(可选),下图选中代码为新增


Step6: 编译,下载运行


出0入14汤圆

发表于 2013-7-14 22:59:44 | 显示全部楼层
标记一下,正在找RTGUI的教程。

出0入0汤圆

发表于 2013-7-15 09:54:58 | 显示全部楼层
"Romeo"写的穿墙蛇果然NB

出110入93汤圆

 楼主| 发表于 2013-7-15 09:59:53 | 显示全部楼层

GUI分析

GUI代码编写,完全可以在visualC++中进行,没必要使用MDK。GUI的simulator是基于Visual C++ 2005的,目前在微软官网上找到的最低版本是Visual C++ 2008 Express Edition(Express版本是免费的,但功能要少些,但用来运行模拟器已经足够了),所以,用scons –target=vs –s生成的2005版project.vcproj在打开的时候,会提示进行转换,直接点Finish即可。



Visual C++ 2008的项目管理简介

Visual C++ 2008对代码的管理分成三层,分别是Solution(解决方案),Project(项目),Source(源码,包括代码,资源等)。在以前的版本,没有最上层的Solution,根节点是从Project开始的。引入Solution是因为,一个项目,可能要引用其它项目(Project)生成的中间件(dll, ocx等),方便管理。对于新手来说,可能只知道Project编译生成exe文件,其实还可以生成如dll, ocx等中间件,封装逻辑功能,提供给主应用程序调用,以实现代码简单复用,功能分割管理,交由团队不同组来完成。

打开一个project文件,会自动新建一个Solution来加载,下次直接打开project.sln文件即可。


运行贪吃蛇,在snake_gui.c中,设置一个断点到event_handler()的起始位置,然后操作贪吃蛇,这时程序被中断停止下来了,我们查看Call Stack,就可以对GUI的运行机制有个大概的判断了。

在我们的程序中,调用了rtgui_win_show(),就自动进入了rtgui_application_event_loop(),当前线程就运行在这个循环里,不断的从mq(消息队列)中检查是否有新事件进入,并处理。最后,收到close消息,关闭窗口,清理资源后,退出这个循环。当前线程如果没有循环后,线程即被回收销毁。我们的例程没有为贪吃蛇新建一个单独线程,而是使用了application.c中的rt_init_thread_entry()。

通常,rt_init_thread_entry()用来作系统初始化,如初始化LCD,触摸屏驱动等,完成后即被回收。一般建议为GUI创建独立的线程。如触摸屏校准程序calibration.c就在calibration_init()中动态创建了一个线程。

RTGUI主要两部分,一个是创建与销毁,另外就是消息处理。主要的功能都在消息处理这部分完成。消息有键盘,鼠标消息;控件管理消息(激活,重绘,移动,隐藏,关闭等);自定义消息(RTGUI_EVENT_COMMAND)。在贪吃蛇中,还定义了定时器,这是GUI提供的,编写定时器消息完成贪吃蛇的爬行。

在官方PDF对应的版本,创建控件,要自己提供消息队列(mq),在1.1.1版本中,这些都被封装了,连事件循环rtgui_application_event_loop()都不需要调用,减少了代码量。


对于RTGUI,其它的,似乎就剩下抄demo的代码了。


线程回收,在消息循环结束后,由系统自动完成。


最后提一句:rtgui_dc_begin_drawing()会阻止GUI的Timer,必须与rtgui_dc_end_drawing()成对出现,rtgui_dc_end_drawing()出现两次也不行。


出0入0汤圆

发表于 2013-7-18 16:43:22 | 显示全部楼层
MARK.
               

出0入0汤圆

发表于 2013-9-18 10:46:15 | 显示全部楼层
本帖最后由 caai2005 于 2013-9-18 11:01 编辑

太牛了~~   mark
就是STM32F103去驱动SSD1963感觉速度很慢啊....
我运行rtgui的demo平均FPS只有4左右。 使用外部ram。
使用内部RAM能跑到10,  F103的FSMC真慢....

出0入0汤圆

发表于 2013-10-28 11:55:50 | 显示全部楼层
收藏了                             

出0入0汤圆

发表于 2014-1-17 09:03:44 | 显示全部楼层
好啊,看看我有什么错的,系统初始化就崩溃了

出0入0汤圆

发表于 2014-4-22 20:55:53 | 显示全部楼层
好帖,不顶不行啊

出0入0汤圆

发表于 2014-10-3 22:24:45 | 显示全部楼层
标记一下稍后用

出0入0汤圆

发表于 2015-12-2 14:26:11 | 显示全部楼层
收藏
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-24 11:56

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表