RDA UMF进程 & UMF_IR.C 遥控处理
SIS架构图:
SW Structure
APP Event Flow :消息分发流程
UMF进程:
int umf_main(int argc, char* argv[])
{
umf_Init();
/* AFW initialize public module */
AL_FW_Init(FW_MAIN_INIT, MAINAPP_FW_Callback, MAINAPP_FW_GetContext);
SW_init(); MainApp_InitCfg_t stMainAppInit =
{
.pfInitFlow = MAINAPP_InitFlow, //软件初始化,及回调通过“MAINAPP_Initialize()”注册到“g_pfInitFlow”。并在“MAINAPP_MainRoutine”完成执行
.pGUIObjectTable = MAIN_APP_GUI_Obj_List, //已创建UI窗口链表,主要用于窗口的创建、销毁和消息的流动
.pfOnTimerUpdate = MAINAPP_OnTimerUpdate,
.pfOnEvent = MAINAPP_OnEvent //UI事件处理,在MAINAPP_MainRoutine->_MAINAPP_ExternalEventHandler中调用
};
MAINAPP_Initialize(&stMainAppInit); //创建主线程"MAINAPP_MainRoutine",主要负责消息调度、服务注册、消息投递和消息处理 while ()
{
sleep();
} }
主线程“main_app.c”->MAINAPP_MainRoutine:
主要负责消息调度和消息驱动,最后都会转到服务例程处理"_SYSAPP_MainRoutine":
void MAINAPP_MainRoutine(void *pParam)
{
unsigned int dMessage;
unsigned int dMessageType;
App_MessageBody_t MsgReceived; if (g_pfInitFlow != NULL)
{
g_pfInitFlow((void *)(&gdTotalAppSize)); //执行"MAINAPP_InitFlow"
} while (!bMPBreakCondition)
{
bMainAppRunning = ;
GL_Status_t MsgReport; //取消息
MsgReport = GL_QueueReceive(MainAppQueueHandle, (void *)(&MsgReceived), APP_MESSAGE_BODY_SIZE, GL_INFINITE_WAIT);
//消息转换"APP_CustomerFuncStart",主要是IR KEYPAD等UI_EVENT等消息在处理前做必要的转换
MAINAPP_MessageDisposeStart(&MsgReceived.dMessage, &MsgReceived.dParam); dMessageType = ((MsgReceived.dMessage) & APPLICATION_MESSAGE_TYPE_MASK);
dMessage = ((MsgReceived.dMessage) & APPLICATION_MESSAGE_MASK);
//OS消息处理
switch (dMessageType)
{
case APPLICATION_INTERNAL_MESSAGE_TYPE:
_MAINAPP_InternalEventHandler(dMessage, MsgReceived.dParam);
break; case APPLICATION_EXTERNAL_MESSAGE_TYPE:
case APPLICATION_EXTERNAL_MESSAGE_TYPE|APPLICATION_EXTERNAL_UI_MESSAGE_TYPE:
_MAINAPP_ExternalEventHandler(dMessage, MsgReceived.dParam);
break; default:
break;
}
MAINAPP_MessageDisposeEnd(&MsgReceived.dMessage, &MsgReceived.dParam);
} GL_TaskYield(); //线程让步 return ;
}
SW及消息队列初始化:
int MAINAPP_InitFlow(void *param)
{
_MAINAPP_SW_Init(); /* initialize message filter. */
_MAINAPP_InitSysApp((UINT32 *)param); /* initialize PQ relative function */
PQ_Init(); /*create App Infra update timer.*/
SYSAPP_TIMER_CreateTimer();
return SP_SUCCESS;
}
IR回调:
static int _MAINAPP_InitSysApp(UINT32* dTotalApp)
{
SYSAPP_IF_Initialize(TOTAL_SYS_APP_SIZE, apstSysAppInst); //将服务apstSysAppInst注册到gpAppInstTable。
*dTotalApp = TOTAL_SYS_APP_SIZE; APP_RegionMgr_Init();
APP_GuiMgr_Set_Menu() ;
APP_GuiMgr_SwitchShareMenu(TOTAL_SYS_APP_SIZE);
UINT8 i;
for (i = 0; i < TOTAL_SYS_APP_SIZE; i++)
{
SYSAPP_IF_InitializeSysApp(i, MainAppQueueHandle); //1 by 1 创建服务线程"_SYSAPP_MainRoutine",DTV服务有SYS_APP_DVB/SYS_APP_ATV/SYS_APP_FILE_PLAYER
}
/* initialize IR */
ir_SetMappingTable(stIR_map, dIR_map_size);
ir_LoadEventCode();
KP_LoadCustomerConfig();
ir_init(_MAINAPP_Ir_Callback); //接收线程“ir_Receive”接收到IR后,通过此回调将消息投递到“消息队列”
joystick_init(_MAINAPP_Joystick_Callback);
MAINAPP_RegisterFunc(APP_CustomerFuncStart, APP_CustomerFuncEnd); //IR处理,回调注册到"g_pfMessageDisposeStart",通过主例程MAINAPP_MainRoutine->GL_QueueReceive取消息后调用MAINAPP_MessageDisposeStart
return ;
}
创建IR/KEYPAD接收线程及“IR_CallBack”回调指针的注册:
int ir_init(IR_CallBack_t pIR_CallBackFunc)
{
IR_IOC_IOData irbuf;
pthread_t irthread; irdev = open("/dev/sisir", O_RDWR); if(KP_init() == E_FAIL)
{
return E_FAIL;
}
size_t stacksize = *; pthread_attr_t attr;
pthread_attr_init(&attr);
pthread_attr_setstacksize(&attr, stacksize);
if(pthread_create(&irthread, &attr, ir_Receive, NULL) != ) //IR接收线程ir_Receive,接收IR并调用"IR_CallBack"投递消息到消息队列
{
UMFDBG(,"IR pthread_create fail \n");
}
pthread_attr_destroy(&attr);
IR_CallBack = pIR_CallBackFunc; //注册回调指针,即在ir_Receive线程中,调用“IR_CallBack”即调用“_MAINAPP_Ir_Callback”将IR投递到消息队列 return S_OK;
}
服务例程“_SYSAPP_MainRoutine”:
static void _SYSAPP_MainRoutine(void *pParam)
{
SysAppInstDef *pstCurrentSysApp = (SysAppInstDef *) pParam;
SystemAppInfra_t *pstTempInfra = (SystemAppInfra_t *) pstCurrentSysApp->stSystemAppInfrastructure; pstCurrentSysApp->fpOnCreate(&(pstTempInfra->pPrivateData)); UINT32 dMessage;
UINT32 dMessageType;
App_MessageBody_t Message;
while (!pstTempInfra->dBreakCondition)
{
//取消息
GL_QueueReceive(pstTempInfra->stMsgQueueHandle, (void *)(&Message), APP_MESSAGE_BODY_SIZE, GL_INFINITE_WAIT);
//消息转换"APP_CustomerFuncStart",主要是IR KEYPAD等UI_EVENT等消息在消息处理前做必要的转换
MAINAPP_MessageDisposeStart(&Message.dMessage, &Message.dParam); dMessageType = ((Message.dMessage) & APPLICATION_MESSAGE_TYPE_MASK);
dMessage = ((Message.dMessage) & APPLICATION_MESSAGE_MASK);
sysappfl2("[SysApp] System app Received MSG, types is:%d.\n", Message.dMessage);
//OS消息处理
switch (dMessageType)
{
case APPLICATION_INTERNAL_MESSAGE_TYPE:
_SYSAPP_InternalEventHandler(pstCurrentSysApp, pstTempInfra, dMessage, Message.dParam);
break; case APPLICATION_EXTERNAL_MESSAGE_KEY_RELEASE_TYPE:
case APPLICATION_EXTERNAL_MESSAGE_KEY_RELEASE_TYPE|APPLICATION_EXTERNAL_UI_MESSAGE_TYPE:
_SYSAPP_ExternalEventHandler(pstCurrentSysApp, pstTempInfra, dMessage, Message.dParam);
break; case APPLICATION_EXTERNAL_MESSAGE_TYPE:
case APPLICATION_EXTERNAL_MESSAGE_TYPE|APPLICATION_EXTERNAL_UI_MESSAGE_TYPE:
_SYSAPP_ExternalEventHandler(pstCurrentSysApp, pstTempInfra, dMessage, Message.dParam);
break; default:
break;
} MAINAPP_MessageDisposeEnd(&Message.dMessage, &Message.dParam);
}
GL_TaskYield();
return;
}
服务例程事件处理:
static void _SYSAPP_ExternalEventHandler(SysAppInstDef *pstSysApp,
SystemAppInfra_t *pstInfra, UINT32 dMessage, UINT32 dParam)
{
switch(dMessage)
{
case APPLICATION_EXTERNAL_TIMER_MESSAGE:
pstSysApp->fpOnTimerUpdate(pstInfra->pPrivateData);
_SYSAPP_GOBJ_GUIObjectTimerUpdate(pstSysApp->dSystemApplicationIndex);
break; default:
//当前菜单先处理,如果没有聚焦UI,则转到相应的服务处理,如:atv_app.c->_ATVApp_OnEvent处理
if(_SYSAPP_GOBJ_GUIObjectMessageHandler(pstSysApp->dSystemApplicationIndex, dMessage, dParam) //主要负责GUI_OBJECT_POST_EVENT及GUI_OBJECT_EVENT_BYPASS的事件处理
== SYSTEM_APP_NO_FOCUSED_GUIOBJ)
{
pstSysApp->fpOnEvent(pstInfra->pPrivateData, dMessage, dParam);
}
break;
} return;
}
RDA UMF进程 & UMF_IR.C 遥控处理的更多相关文章
- RDA项目打包
注意APP的编译搭建: ./aps/Makefile.toolchain //ccoption path的设定 ./aps/rules.mak //统一的编译规则 MAKE -C 1.TOOLS的可执 ...
- RDA CoreDump 实例
UMF进程的Coredump问题追踪: 通河code开机DUMP问题 现象: 开机Dump,原因:_MAINAPP_SW_Init()调用了Factory_Ver_Debug()内存溢出. 分析流程: ...
- 基于Arduino、STM32进行红外遥控信号接收
catalogue . 遥控器原理简介 . 红外遥控原理 . 常见红外遥控器红外线信号传输协议 . 遙控器的发展 . 实验过程 . 攻击面 . 基于STM32实现红外信号解码 1. 遥控器原理简介 0 ...
- 查看那个进程占用了端口号(LINUX与AIX)
在LINUX中: netstat命令 [root@limt ~]# netstat -tulp Active Internet connections (only servers) Proto Rec ...
- 追踪app崩溃率、事件响应链、Run Loop、线程和进程、数据表的优化、动画库、Restful架构、SDWebImage的原理
1.如何追踪app崩溃率,如何解决线上闪退 当 iOS设备上的App应用闪退时,操作系统会生成一个crash日志,保存在设备上.crash日志上有很多有用的信息,比如每个正在执行线程的完整堆栈 跟踪信 ...
- Minigui3.0 自定义遥控输入引擎
本人最近在从事minigui的开发工作,使用的gui版本为最新的3.0.12,平台环境为海思的HI3515. 在历经千辛万苦,终于将gui成功的移植到了开发板上,这里不多赘述,没有移植成功的朋友可以点 ...
- RDA的使用和说明
一.RDA 说明 RDA(RemoteDiagnostic Agent)是oracle用来收集.分析数据库的工具,运行该工具不会改变系统的任何参数,RDA收集的相关数据非常全面,可以简化我们日常监控. ...
- Android中通过进程注入技术修改系统返回的Mac地址
致谢 感谢看雪论坛中的这位大神,分享了这个技术:http://bbs.pediy.com/showthread.php?t=186054,从这篇文章中学习到了很多内容,如果没有这篇好文章,我在研究的过 ...
- 手机遥控Office,变身演讲达人
编者按:在商业演讲中,需要在PPT/Word/Excel文件中切换以达到最佳演讲效果-Office Remote可帮助Windows Phone变身Office的智能遥控.以蓝牙控制电脑,触屏操作多种 ...
随机推荐
- socketserver模块使用方法
一.socketserver模块介绍 Python提供了两个基本的socket模块.一个是socket,它提供了标准的BSD Socket API: 另一个是socketserver,它提供了服务器中 ...
- Python基础知识点总结
Python基础知识与常用数据类型 一.Python概述: 1.1.Python的特点: 1.Python是一门面向对象的语言,在Python中一切皆对象 2.Python是一门解释性语言 3.Pyt ...
- DFS求连通块(漫水填充法)
G - DFS(floodfill),推荐 Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I6 ...
- c# TcpClient简易聊天工具
说明: TcpClient 链接是一个比较安全稳定的链接,作为聊天或者是数据稳定传输,是比较合适的,下面的代码测试过,如果你吧他放在公网服务器上,也是可以用的 using System; using ...
- python模糊匹配之fuzzywuzzy
fuzzywyzzy 是python下一个模糊匹配的模块.首先要安装fuzzywuzzy 示例: from fuzzywuzzy import fuzz from fuzzywuzzy import ...
- 九度oj 题目1058:反序输出
题目1058:反序输出 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:9677 解决:3495 题目描述: 输入任意4个字符(如:abcd), 并按反序输出(如:dcba) 输入: 题目可 ...
- msp430入门编程01
msp430单片机最小系统 msp430入门学习 msp430入门编程
- SystemTap 学习笔记 - 安装篇
https://segmentfault.com/a/1190000000671438 在安装前,需要知道下自己的系统环境,我的环境如下: uname -r 2.6.18-308.el5 Linux ...
- Python学习系列之内置函数
数学相关 abs(a):求取绝对值 max(list):求取list最大值 min(list):求取list最小值 sum(list):求取list元素的和 sorted(list):排序,返回排序后 ...
- 戴尔iDRAC服务器远程控制设置
对于远程的服务器,我们不能经常性的去机房维护,所以远程控制对于服务器来说就显得至关重要.那么你是用什么方式对服务器进行远程控制呢?远程桌面?还是KVM切换器?NO,你OUT了!如果你用的是戴尔的服务器 ...