diff --git a/docs/Product_case/zh/poc/README.md b/docs/Product_case/zh/poc/README.md new file mode 100644 index 0000000000000000000000000000000000000000..bd26a60e5e0e50a3cca3e39d117ba3a9f878af4f --- /dev/null +++ b/docs/Product_case/zh/poc/README.md @@ -0,0 +1,482 @@ +## 引言 + +本文档基于Helios_service 框架对POC各个组件进行说明。 + + + +## 模块说明 + +​ 目前POC只针对 EC600N EC600S 对应系类推出指定固件。客户可基于该类固件开发POC功能。 + +​ 关于poc 接口请参考wiki poc部分 + +​ 后续会将给POC相关内容移植至HeliosSDK。 + + + +## 资源说明 + +​ POC对讲机主要资源消耗分为统计如下: + +​ (1)POC库本身消耗的资源。 RO:600KB + +​ (2)LVGL消耗的资源。 RO:500KB(主要时字体库消耗和dispbuf) + +​ (3)LCD屏幕消耗。heap (水平分辨率\*垂直分辨率\*2) + +​ (4)对讲时audio消耗的heap (100K) + + + + + +## 硬件配置 + +​ 目前我们POC支持两种平台,伯纳德和善里。 + +​ sim卡:使用quecpython POC功能,需将sim 加入指定的上述平台(联系我们即可)。否则无法注册成功。 + +​ LCD:使用POC功能,一般会搭配GUI使用,故需要一款屏幕。屏幕驱动的内容可参考([LCD使用说明](https://python.quectel.com/doc/doc/sbs/zh/sbs/lcd.html)) + +​ KEY:一款对讲机,需要进行按键控制。 + + + +​ + +## 软件组件说明 + +​ POC对讲机solution分为如下7个组件: + +​ (1)mmi : 主控,接收并处理各个组件的消息,充当消息收集处理中心。 + +​ (2)key: 监听按键状态,上报按键状态至mmi(key:按键功能 state:按键状态(长按,按下,释放)) + +​ (3)led: 反应设备状态,由mmi控制 + +​ (4)net: 检测sim和注网状态,将状态上报至mmi + +​ (5)broad: 实现poc对讲机功能和tts播放 + +​ (6)LVGL: 实现对屏幕的驱动以及gui的绘制 + +​ (7)Timer: 定时器。提供相关定时功能,为需要定时控制的组件服务。例如控制息屏,键盘锁等。 + + + +​ 对应分成如下11个线程(线程之间通过队列实现通信) + +![poc](media\poc.png) + +## 实物演示 + +​ 以下视频分别为彩色屏(st7789)和 黑白屏(uc1603)的实物演示 + + + + + + + +## POC_solution目录结构说明 + +``` +usr # 用户分区 +├─main.py # 用户代码(程序入口) +├─bin # 脚本和启动器(下面放着一些共有服务和一些公有的组件) +│ ├─cloud_service.py # 云服务组件 +│ ├─exception_service.py # 异常服务组件 +│ ├─guard.py # 全局监控和配置文件的启动容器 +│ ├─log_service.py # 日志服务组件 +│ ├─media_service.py # 媒体服务组件 +│ ├─net_service.py # 网络服务组件 +│ ├─pm_service.py # 低功耗服务组件 +│ └─components # 该目录下存放一些公共组件 +│ │ ├─abstract_service.py # 服务抽象类 +│ │ ├─blinker_min.py +│ │ ├─monitor.py +│ │ ├─OTA.py # OTA升级组件 +│ │ └─service_models.py # 服务模型基类 +│ └─third_party +│ ├─ql_interrupter.py # 第三方服务组件,外部中断/看门狗等 +│ └─ ... +├─etc # 配置文件目录(非必须存在) +│ ├─app_config # app业务服务配置文件目录 +│ └─system_config # 系统服务配置文件目录 +├─log # 日志存储服务(非必须存在,选择日志存储为本地时自动创建) +└─utils # 通用工具目录 +│ ├─JsonParserUtils.py # josn处理utils +│ ├─resolver.py # 时间格式化处理器 +│ └─service_utils.py # 单例模式类实现 +| +| +└─poc_solution # poc solution文件目录 +│ ├─config.json # 配置文件,保存一些亮度值,音量值等信息 +│ ├─config_bak.py # 配置文件备份 +│ └─ql_enum.py # solution 一些公共变量 +│ └─ql_key.py # solution 按键实现组件 +│ └─ql_led.py # solution led实现组件 +│ └─ql_poc_broad.py # solution 对讲机功能实现组件 +│ └─ql_poc_lvgl.py # solution GUI绘制和联动组件 +│ └─ql_poc_mmi.py # solution 中央控制器组件 +│ └─ql_poc_network.py # solution 网络组件 +│ └─ql_poc_timer.py # solution 定时器组件 +│ └─ ... + +``` + +## 基于solution二次开发 + +### 1.如何添加LCD + +​ (1)编写对应LCD的驱动,具体参考([LCD使用说明](https://python.quectel.com/doc/doc/sbs/zh/sbs/lcd.html)) + +​ (2)直接替换LVGL组件中的LCD相关代码。 + +​ 1. 将lvgl组件中的初始化参数替换 + +​ 2. 将lvgl组件中的写屏参数替换 + +​ 3. 将lvgl组件中的息屏,亮屏参数替换 + +​ 4. 将lvgl组件中的屏幕分包率替换 + +​ 举例:如将屏幕st7789 替换为 ILI9225 + +​ 左侧为st7789 240X240, 右侧为ILI9225 176X220 + +| #ST7789
lcd_init_param=(
2, 0, 120,
0, 0, 0x11,
0, 1, 0x36,
1, 1, 0x00,
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,
)
lcd_invalid_param = (
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,
)

lcd_displayon_param = (
0,0,0x11,
2,0,20,
0,0,0x29,
)

lcd_displayoff_param = (
0,0,0x28,
2,0,120,
0,0,0x10,
)
# 分辨率
LCD_SIZE_W = 240
LCD_SIZE_H = 240 | ILI9225
lcd_init_param=(
2, 0, 120,
0,1,0x02,
1,2,0x01,0x00,
0,1,0x01,
1,2,0x01,0x1C,
0,1,0x03,
1,2,0x10,0x30,
0,1,0x08,
1,2,0x08,0x08,
0,1,0x0B,
1,2,0x11,0x00,
0,1,0x0C,
1,2,0x00,0x00,
0,1,0x0F,
1,2,0x14,0x01,
0,1,0x15,
1,2,0x00,0x00,
0,1,0x20,
1,2,0x00,0x00,
0,1,0x21,
1,2,0x00,0x00,
0,1,0x10,
1,2,0x08,0x00,
0,1,0x11,
1,2,0x1F,0x3F,
0,1,0x12,
1,2,0x01,0x21,
0,1,0x13,
1,2,0x00,0x0F,
0,1,0x14,
1,2,0x43,0x49,
0,1,0x30,
1,2,0x00,0x00,
0,1,0x31,
1,2,0x00,0xDB,
0,1,0x32,
1,2,0x00,0x00,
0,1,0x33,
1,2,0x00,0x00,
0,1,0x34,
1,2,0x00,0xDB,
0,1,0x35,
1,2,0x00,0x00,
0,1,0x36,
1,2,0x00,0xAF,
0,1,0x37,
1,2,0x00,0x00,
0,1,0x38,
1,2,0x00,0xDB,
0,1,0x39,
1,2,0x00,0x00,
0,1,0x50,
1,2,0x00,0x01,
0,1,0x51,
1,2,0x20,0x0B,
0,1,0x52,
1,2,0x00,0x00,
0,1,0x53,
1,2,0x04,0x04,
0,1,0x54,
1,2,0x0C,0x0C,
0,1,0x55,
1,2,0x00,0x0C,
0,1,0x56,
1,2,0x01,0x01,
0,1,0x57,
1,2,0x04,0x00,
0,1,0x58,
1,2,0x11,0x08,
0,1,0x59,
1,2,0x05,0x0C,
0,1,0x07,
1,2,0x10,0x17,
0,1,0x22,
)
lcd_invalid_param = (
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,
)

lcd_displayon_param = (
0,1,0x07,
1,2,0x10,0x17,
)

lcd_displayoff_param = (
0,1,0x07,
1,2,0x10,0x04,
)
# 分辨率
LCD_SIZE_W = 176
LCD_SIZE_H = 220 | +| ------------------------------------------------------------ | ------------------------------------------------------------ | + + + +### 2.如何添加KEY + +​ 添加按键简单,但是要写好按键对应的功能项。 + +​ 添加按键步骤: + +​ (1):确定按键号,按键功能 + +​ (2):处理按键功能 + +举例如下: + +​ 添加PTT按键 + +​ (1):PTT 对应GPIO14, 实现呼叫 + +​ 例如:KEY_PTT = Pin.GPIO14 + +​ 即在ql_key.py 中的 key_value 写入对应值。 + +``` +key_value = [ + (KEY_MENU, QUEC_MMI_KEY_MENU), + (KEY_EXIT, QUEC_MMI_KEY_EXIT), + (KEY_UP, QUEC_MMI_KEY_PF1), + (KEY_DOWN, QUEC_MMI_KEY_PF2), + (KEY_VOL_UP, QUEC_MMI_KEY_VOL_UP), + (KEY_PTT, QUEC_MMI_KEY_PTT), #加上这一行即可 +] +``` + + + +​ (2):第二步中上报了KEY_PTT 至 MMI中控,需要在中控中控制对应的按键功能 + +​ 在ql_enum.py 中确定PTT 的位置,如果没有,可以添加。 + +``` +QUEC_MMI_KEY_NULL = 0 +QUEC_MMI_KEY_MENU = 1 +QUEC_MMI_KEY_OK = 2 +QUEC_MMI_KEY_EXIT = 3 +QUEC_MMI_KEY_PF1 = 4 +QUEC_MMI_KEY_PF2 = 5 +QUEC_MMI_KEY_PTT = 6 +QUEC_MMI_KEY_EXT_PTT = 7 +QUEC_MMI_KEY_VOL_UP = 8 +QUEC_MMI_KEY_VOL_DWON = 9 +QUEC_MMI_KEY_MAX = 9 +``` + +​ + +​ 在ql_poc_mmi.py 中,添加按键的处理内容 + +``` + def mmi_key_ptt(self,para): + if(para[1] == MMI_MSG_FUNC_KEY_PRESS): + print("call ...") + self.ON_SPEAK = 1 + key_to_lvgl_data=[LVGL_CONTROL_STATUE_CHANGE, LVGL_CONTROL_STATUS_CALL, "呼叫中"] + ui.lvgl_queue_put(key_to_lvgl_data) + key_to_poc_data=[MSG_TYPE_STACK, POC_CONTROL_SPEAK, 1] + poc.broad_queue_put(key_to_poc_data) + quec_mmi_led_set(QUEC_MMI_LED_RED) + #ql_led. + elif(para[1] == MMI_MSG_FUNC_KEY_UP): + print("kongxian") + self.ON_SPEAK = 0 + key_to_lvgl_data=[LVGL_CONTROL_STATUE_CHANGE, LVGL_CONTROL_STATUS_CALL, "空闲"] + ui.lvgl_queue_put(key_to_lvgl_data) + key_to_poc_data=[MSG_TYPE_STACK, POC_CONTROL_SPEAK, 0] + poc.broad_queue_put(key_to_poc_data) + quec_mmi_led_set(QUEC_MMI_LED_GREEN_FLASHING) +``` + + + +​ 将按键处理函数按ql_enum.py中的位置,添加至ql_poc_mmi.py中的self.mmi_key_handle_func_list 中,例如下面内容 + +​ PPT对应QUEC_MMI_KEY_PTT = 6, 故PPT的处理函数对应mmi_key_handle_func_lis[QUEC_MMI_KEY_PTT ] + +``` + self.mmi_key_handle_func_list = ( + None, self.mmi_key_memu, None, self.mmi_key_exit, self.mmi_key_pf1, self.mmi_key_pf2, self.mmi_key_ptt, + None, self.mmi_key_vol_up, self.mmi_key_vol_down + ) +``` + + + +### 3.注册平台 + +​ 目前平台是基于固件的,固件是伯纳德平台,则代码注册的就是伯纳德平台。同理,固件是善里平台,则代码注册的就是善里的平台。 + +### 4.如何修改GUI + +​ 添加GUI是POC中比较复杂的内容。其中涉及到当前界面各组件的变化,以及和按键之间的联动等。 + +​ 简单介绍该poc solution中的各个界面的层级关系 + +``` +# MenuIndex:菜单索引 MasterMenu:父菜单索引 MasterItem:父菜单项索引 MenuTitle:菜单标题 MenuConfig:菜单配置 ItemIndex:菜单项索引 ItemTitle:菜单项名 +# MenuConfig[0]:菜单项数目 +# MenuConfig[1]:需要操作的组件(为空则默认组件为roller) +# MenuConfig[2]:UP功能函数(为空则默认组件为roller,采用UP公共函数) +# MenuConfig[3]:DOWN功能函数(为空则默认组件为roller,采用UP公共函数) +# MenuConfig[4]:ENTER功能函数(为None则走公共的enter方法) +# MenuConfig[5]:EXIT功能函数(为None则走公共的enter方法) + +self.Menus = [ +{'MenuIndex': MENU_WELCOME, 'MenuObj': None, 'MasterMenu': None, 'MasterItem': None, 'MenuTitle': "初始化界面", +'MenuConfig': [0, None, None, None, self.ql_poc_switch_init_to_home_screen,self.ql_poc_switch_init_to_home_screen], +"ItemIndex" : None, 'ItemTitle':None}, + +{'MenuIndex': MENU_MAIN, 'MenuObj': None, 'MasterMenu': None, 'MasterItem': None, 'MenuTitle': "main界面", +'MenuConfig': [1, None, None, None, self.ql_poc_switch_home_to_main_menu_screen, None], +"ItemIndex" : [MENU_MENU], 'ItemTitle':None}, + +{'MenuIndex': MENU_MENU, 'MenuObj': None, 'MasterMenu': MENU_MAIN, 'MasterItem': None, 'MenuTitle': "menu界面", +'MenuConfig': [4, None, None, None, self.ql_poc_switch_main_menu_enter_handle, self.ql_poc_switch_main_menu_to_home_screen], +"ItemIndex" : [MENU_PUBLIC], 'ItemTitle' : None}, + +#主菜单以下的菜单 +{'MenuIndex': MENU_PUBLIC, 'MenuObj': None, 'MasterMenu': MENU_MENU, 'MasterItem': None, 'MenuTitle': "公共设置", +'MenuConfig': [1, None, None, None, self.ql_poc_switch_public_menu_enter_handle, self.ql_poc_switch_public_menu_exit_handle], +"ItemIndex" : None, 'ItemTitle':None}, + +{'MenuIndex': MENU_ABOUT, 'MenuObj': None, 'MasterMenu': MENU_MENU, 'MasterItem': None, 'MenuTitle': "关于本机", +'MenuConfig': [1, None, None, None, None, self.ql_poc_switch_loacl_informations_to_main_menu_screen], +"ItemIndex" : None, 'ItemTitle':None}, + + +{'MenuIndex': MENU_POWEROFF, 'MenuObj': None, 'MasterMenu': MENU_MENU, 'MasterItem': None, 'MenuTitle': "关机界面", +'MenuConfig': [0, None, None, None, self.ql_poc_poweroff_OK_handle, self.ql_poc_switch_poweroff_to_home_screen], +"ItemIndex" : None, 'ItemTitle':None}, +] +``` + +从该列表中,可以看出各个界面直接是如何通信联动,以及之间的层级关系。以PUBLIC 界面为例。 + +从字典MenuIndex中可以看出PUBLICde 索引号为MENU_PUBLIC。(该值用于实际操作中找到对应的界面) + +MenuObj 表示这个界面lvgl obj + +MasterMenu中可以看出,PUBLIC的父菜单为Main。 + +MasterItem表示PUBLIC在 父菜单的菜单项索引。目前solution中未使用,留着备用 + +MenuTitle 表示PUBLIC的一个标题。这个在solution中有重要作用。 + +MenuConfig 这个体现该界面的一些具体的操作方法。 + +​ MenuConfig[0]:菜单的菜单项数目 + +​ MenuConfig[1]:需要操作的组件(为空则默认组件为roller),这个是上翻下翻的操作对象 + +​ MenuConfig[2]:UP功能函数(为空则默认组件为roller,采用UP公共函数) + +​ MenuConfig[3]:DOWN功能函数(为空则默认组件为roller,采用UP公共函数) + +​ MenuConfig[4]:ENTER功能函数(为None则走公共的enter方法) + +​ MenuConfig[5]:EXIT功能函数(为None则走公共的enter方法) + +ItemIndex ItemTitle在solution中未体现,留着备用 + + + +完成一个界面的绘制需要如下几个步骤。 + +​ 具体操作步骤如下:(以关机界面举例,其它例子类推) + +​ (1)完成上述列表中的关机界面字典 + +​ (2)绘制关机界面,同步上述字典中的数值 + +​ (3)确定关机界面进入和退出动作 + +​ (4)编写关机界面OK操作函数 + +​ (5)编写如何进入关机界面 + +(以关机界面举例,其它例子类推) + +​ (1)编写关机界面字典项 + +``` +{'MenuIndex': MENU_POWEROFF, #关机界面索引号 +'MenuObj': None, #关机界面 lvgl obj +'MasterMenu': None, # 无父界面 +'MasterItem': None, #无父菜单项索引 +'MenuTitle': "关机界面", #界面label +'MenuConfig': [0, None, None, None, self.ql_poc_poweroff_OK_handle, self.ql_poc_switch_poweroff_to_home_screen], + #界面无操作组件,即上下翻无效 + #界面按下OK 界面对应的处理 self.ql_poc_poweroff_OK_handle + #界面按下exit,界面对应的处理 self.ql_poc_switch_poweroff_to_home_screen +"ItemIndex" : None, 'ItemTitle':None}, # 未使用 +``` + +​ (2)绘制界面 + +``` + def ql_poc_poweroff_screen_create(self): + poweroff_screen = lv.obj(self.middle_obj) + poweroff_screen.set_style(self.g_poc_style_plain_16) + poweroff_screen.set_size(LCD_SIZE_W,int(LCD_SIZE_H*0.625)) + # self.poweroff_screen = poweroff_screen + poweroff_item_Menu = self.getMenusByIndex(MENU_POWEROFF) #同步menu表对应MenuObj + poweroff_item_Menu['MenuObj'] = poweroff_screen + + + poweroff_label = lv.label(poweroff_screen) + poweroff_label.set_style(lv.label.STYLE.MAIN,self.g_poc_style_plain_16) + poweroff_label.set_text("警告") + poweroff_label.set_pos(int((LCD_SIZE_W- poweroff_label.get_width())/2), int(LCD_SIZE_H*0.025)) + + poweroff_information_label = lv.label(poweroff_screen) + poweroff_information_label.set_style(lv.label.STYLE.MAIN,self.g_poc_style_plain_16) + poweroff_information_label.set_text("是否确认关机!!!") + poweroff_information_label.set_long_mode(lv.label.LONG.SROLL_CIRC) + poweroff_information_label.set_align(lv.label.ALIGN.CENTER) + poweroff_information_label.set_pos(0, int(LCD_SIZE_H*0.31)) + poweroff_information_label.set_size(LCD_SIZE_W, int(LCD_SIZE_H*0.44)) + self.poweroff_information_label = poweroff_information_label +``` + +​ (3)确定关机界面进入和退出 + +``` + # 进入关机界面 + def ql_poc_switch_to_poweroff_screen(self): + active_item_Menu = self.getMenusByIndex(self.Active_Index) #找到当前活动界面的字典项 + poweroff_item_Menu = self.getMenusByIndex(MENU_POWEROFF) #找到关机界面的字典项 + + lv.obj.set_hidden(active_item_Menu['MenuObj'], True) #隐藏当前活动界面 + lv.obj.set_hidden(poweroff_item_Menu['MenuObj'], False) #进入关机界面 + + self.current_menu_label = poweroff_item_Menu['MenuTitle'] #同步当前界面标题 + self.Active_Index = MENU_POWEROFF #同步当前界面的索引号 + + # 关机界面返回 + def ql_poc_switch_poweroff_to_home_screen(self): + active_item_Menu = self.getMenusByIndex(self.Active_Index) #找到当前活动界面的字典项 (即关机界面) + main_item_Menu = self.getMenusByIndex(MENU_MAIN) #找到主界面的字典项 + + lv.obj.set_hidden(active_item_Menu['MenuObj'], True) #隐藏关机界面 + lv.obj.set_hidden(main_item_Menu['MenuObj'], False) #进入主界面 + + self.current_menu_label = main_item_Menu['MenuTitle'] #同步当前界面标题 + self.current_screen = MENU_MAIN #同步当前界面的索引号 +``` + +​ (4)编写关机界面OK操作函数 + +``` + def ql_poc_poweroff_OK_handle(self): + datatommi = [MMI_MSG_TYPE_UI_EVEN, MMI_MSG_FUNC_UI_EVENT_POWEROFF] #将消息传递给中控,由中控处理 + print(datatommi) + self.mmi.mmi_queue_put(datatommi) +``` + +​ (5)编写如何进入改界面。在solution中,长按exit键,即进入该界面。 + +​ 长按exit按键,按键组件将消息传递给中控,中控再将消息传递给lvgl组件,lvgl确定进入该组件 + +``` + def ui_lvgl_thread(self,thread_id): + print("lvgl thread id is:%d" % thread_id) + + global lvgl_queue + lvgl_queue = queue.Queue(50) + while(1): + lvgl_data = lvgl_queue.get() + if not lvgl_data: + continue + if(lvgl_data[0] == LVGL_CONTROL_SCREEN_CHANGE and lvgl_data[1] == LVGL_CONTROL_SCEREN_POWEROFF): + # 进入确认关机界面 + self.ql_poc_switch_to_poweroff_screen() + + + + ...#省略 +``` + + + +### 4.TTS使用 + +​ TTS的实际使用,是在ql_poc_broad组件中,其它组件需要播放tts时,需要将消息提交给中控,中控处理后将处理结果发送给ql_poc_broad,然后完成TTS播放。 + +​ 举例如下:lvgl组件需要播放菜单选择 + + + +​ 发送的队列为 datatommi = [MMI_MSG_TYPE_UI_EVEN, MMI_MSG_FUNC_UI_EVENT_MENU_TTS_PLAY, "菜单选择" ] + +​ MMI_MSG_TYPE_UI_EVEN:表示由UI发给中控 + +​ MMI_MSG_FUNC_UI_EVENT_MENU_TTS_PLAY :表示UI界面需要播放TTS + +​ "菜单选择" :具体播放的内容 + + + +​ 队列确定之后,调用 self.mmi.mmi_queue_put(datatommi) 发送至中控 + + + + + +### 5.代码调试指南 + +​ 我们poc solution代码是基于模块化实现的,每一个组件分为一个文件。各个组件只与mmi(中控)进行消息传递,更好的保障了各个组件的独立性。我们在调试的过程中,可以只运行各个组件,看看该组件是否满足你的需求。 + + + + +## 附录A术语缩写 + +表 2 :术语缩写 + +``` +缩写 英文全称 中文全称 + +LCD Liquid Crystal Display 液晶显示器 + +SPI Serial Peripheral Interface 串行外设接口 +``` + diff --git a/docs/Product_case/zh/poc/code/code.rar b/docs/Product_case/zh/poc/code/code.rar new file mode 100644 index 0000000000000000000000000000000000000000..12da6bfab9170a5e54dcdcdb281c83d56f6b1314 Binary files /dev/null and b/docs/Product_case/zh/poc/code/code.rar differ diff --git a/docs/Product_case/zh/poc/media/poc.png b/docs/Product_case/zh/poc/media/poc.png new file mode 100644 index 0000000000000000000000000000000000000000..059aed3d4421af91806ff07aaa5cb6a01e0db484 Binary files /dev/null and b/docs/Product_case/zh/poc/media/poc.png differ diff --git a/docs/Product_case/zh/poc/media/poc_key_1.jpg b/docs/Product_case/zh/poc/media/poc_key_1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..62cf9b4e1aca73fe49351e6b06d6c452e37200c2 Binary files /dev/null and b/docs/Product_case/zh/poc/media/poc_key_1.jpg differ diff --git a/docs/Product_case/zh/poc/media/poc_key_2.jpg b/docs/Product_case/zh/poc/media/poc_key_2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ec7d0003a265843b08c9a98d691bbb7e754dcc76 Binary files /dev/null and b/docs/Product_case/zh/poc/media/poc_key_2.jpg differ diff --git a/docs/Product_case/zh/poc/media/poc_key_3.jpg b/docs/Product_case/zh/poc/media/poc_key_3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..de0ebb754f3534e0a9cbc6a00a23fb525cf28912 Binary files /dev/null and b/docs/Product_case/zh/poc/media/poc_key_3.jpg differ diff --git a/docs/Product_case/zh/poc/media/poc_key_4.jpg b/docs/Product_case/zh/poc/media/poc_key_4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..87d84e9cb18bacf6c0d0a4d6fbe22b2bfd2a77f1 Binary files /dev/null and b/docs/Product_case/zh/poc/media/poc_key_4.jpg differ diff --git a/docs/Product_case/zh/poc/media/poc_show_1.mp4 b/docs/Product_case/zh/poc/media/poc_show_1.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..12e78781bb53f571e947932f4486a1a870953818 Binary files /dev/null and b/docs/Product_case/zh/poc/media/poc_show_1.mp4 differ diff --git a/docs/Product_case/zh/poc/media/poc_show_2.mp4 b/docs/Product_case/zh/poc/media/poc_show_2.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..338298cfd9ad65ec4925d51ff77ef3079f2c7ba6 Binary files /dev/null and b/docs/Product_case/zh/poc/media/poc_show_2.mp4 differ