TRTOS 使用消息队列键盘通用驱动
2017-03-17 13:36
141 查看
先加入一段废话,不加的话博客首页展示的时候会很丑,废话如下:这是一个可以通用的键盘驱动程序,只需要在任务参数中传入获取键值的函数,键盘任务会把所有按键的短按长按,抬起等操作全都通过消息发送到受体任务内,从而实现了键盘驱动隔离,更有效的节省了系统运行开支和加快了按键响应时间,消息队列的引用,更大的减少了操作漏执行。
#include <Include.h> #include <Key_Driver.h> uint8 KeyCode_Tos_TaskID=Tos_TaskNull; /******************************************************************************** Func:键盘任务 Date:2017-3-8 Note:传入参数为获取按键码调用 ********************************************************************************/ void Task_KeyBoard(void *Tags) { MGUI_KeyMsg KeyMsg; typedef uint8(*KeyBoardGetValue)(void); KeyBoardGetValue P; P=((KeyBoardGetValue)(Tags)); Tos_TaskDelay(2000); while(1) { Tos_TaskDelay(10); KeyMsg.KeyValue=P(); KeyMsg.KeyTime=0; if(KeyMsg.KeyValue!=0) { while(P()) { Tos_TaskDelay(10); if(KeyMsg.KeyTime<50)KeyMsg.KeyTime++; if(KeyMsg.KeyTime>=50) { Tos_TaskDelay(100); KeyMsg.KeyType=Key_DownTimeOut; Tos_TaskPutQmsg(KeyCode_Tos_TaskID,0,sizeof(MGUI_KeyMsg),&KeyMsg); } } if(KeyMsg.KeyTime<50) { KeyMsg.KeyType=Key_OneClick; Tos_TaskPutQmsg(KeyCode_Tos_TaskID,0,sizeof(MGUI_KeyMsg),&KeyMsg); } } } } /******************************************************************************** Func:获取按键消息 Date:2017-3-8 Note:传入参数为延时时间0为无限等待,返回按键消息 ********************************************************************************/ MGUI_KeyMsg * MUI_GetKey(uint16 D) { Tos_ArrayMessage *CurMsg; MGUI_KeyMsg *TaskMsg; if(D)CurMsg=Tos_TaskGetQMsgDelay(D); else CurMsg=Tos_TaskGetQMsg(); if(CurMsg) { TaskMsg=(MGUI_KeyMsg *)CurMsg->Qmsg_Addr; return TaskMsg; } return Null; } /******************************************************************************** Func:按键钩子 Date:2017-3-8 Note:想获取按键的任务可以指向该操作,消息始终被最后执行该函数的任务获取 ********************************************************************************/ void Tos_TaskGetHandKey() { KeyCode_Tos_TaskID=Tos_TaskCurrent; } 在任务表中加入键盘任务 const TaskInitList TaskList_putong[]={ {Task0,Null,"Task0",2000}, //{Task_LCD,Null,"Task0",2000}, {Sensor_Command,USART1,"Sensor_Command",2000}, {Task_Face,Null,"Task_Face",2000}, {Task_Action,Null,"Task_Action",2000}, {Task_KeyBoard,HandKey_GetValue,"Task_KeyBoard",2000},键盘任务 {TaskPlan_1,Null,"Task_Face",2000}, {Task_Arrary,(void *)2,"Task_Arrary",2000}, {Task_HistoryRecord1,Null,"Task_HistoryRecord",2000}, {Null}, }; 键盘任务传入的任务参数为获取键值函数 uint8 HandKey_GetValue() { uint8 Value=0x00; uint16 Temp; Temp=GPIO_GetAll(); if(!(Temp&S4)){Value=Key_Up;} if(!(Temp&S5)){Value=Key_Down;} if(!(Temp&S6)){Value=Key_Right;} if(!(Temp&S7)){Value=Key_Enter;} if((Temp&S8)){Value=Key_WkUp;} return Value; } 上面这些活干完了,就可以大大方方的使用了 void Task_Action(void *Tags) { BOOL SetEn=False; uint8 i; Tos_ArrayMessage Msg[5]; MGUI_KeyMsg *TaskMsg,TaskMsgBuf[5]; for(i=0;i<5;i++)Msg[i].Qmsg_Addr=&TaskMsgBuf[i]; Tos_TaskCreateQmsg(&Msg[0],5); Tos_TaskGetHandKey(); while(1) { Tos_TaskDelay(3); TaskMsg=MUI_GetKey(0); if(TaskMsg) { DeBug("%d,%d",TaskMsg->KeyType,TaskMsg->KeyValue,2); BEEP(); if(TaskMsg->KeyValue==Key_Enter) { SetEn=True; UIShowValue.SysWorkMode++; } if(TaskMsg->KeyValue==Key_Right){SetEn=False;Task_LoadConfigs();} if(TaskMsg->KeyValue==Key_WkUp){SetEn=False;System_SaveConfig();} if(SetEn) { switch(UIShowValue.SysWorkMode) { case 1: if(TaskMsg->KeyValue==Key_Up)if(TaskMsg->KeyType==Key_OneClick)UIShowValue.SaveValue.CH_Limit[0].Max+=0.1; if(TaskMsg->KeyValue==Key_Up)if(TaskMsg->KeyType==Key_DownTimeOut)UIShowValue.SaveValue.CH_Limit[0].Max+=1; if(TaskMsg->KeyValue==Key_Down)if(TaskMsg->KeyType==Key_OneClick)UIShowValue.SaveValue.CH_Limit[0].Max-=0.1; if(TaskMsg->KeyValue==Key_Down)if(TaskMsg->KeyType==Key_DownTimeOut)UIShowValue.SaveValue.CH_Limit[0].Max-=1; break; case 2: if(TaskMsg->KeyValue==Key_Up)if(TaskMsg->KeyType==Key_OneClick)UIShowValue.SaveValue.CH_Limit[0].Min+=0.1; if(TaskMsg->KeyValue==Key_Up)if(TaskMsg->KeyType==Key_DownTimeOut)UIShowValue.SaveValue.CH_Limit[0].Min+=1; if(TaskMsg->KeyValue==Key_Down)if(TaskMsg->KeyType==Key_OneClick)UIShowValue.SaveValue.CH_Limit[0].Min-=0.1; if(TaskMsg->KeyValue==Key_Down)if(TaskMsg->KeyType==Key_DownTimeOut)UIShowValue.SaveValue.CH_Limit[0].Min-=1; break; case 3: if(TaskMsg->KeyValue==Key_Up)if(TaskMsg->KeyType==Key_OneClick)UIShowValue.SaveValue.CH_Limit[1].Max+=0.1; if(TaskMsg->KeyValue==Key_Up)if(TaskMsg->KeyType==Key_DownTimeOut)UIShowValue.SaveValue.CH_Limit[1].Max+=1; if(TaskMsg->KeyValue==Key_Down)if(TaskMsg->KeyType==Key_OneClick)UIShowValue.SaveValue.CH_Limit[1].Max-=0.1; if(TaskMsg->KeyValue==Key_Down)if(TaskMsg->KeyType==Key_DownTimeOut)UIShowValue.SaveValue.CH_Limit[1].Max-=1; break; case 4: if(TaskMsg->KeyValue==Key_Up)if(TaskMsg->KeyType==Key_OneClick)UIShowValue.SaveValue.CH_Limit[1].Min+=0.1; if(TaskMsg->KeyValue==Key_Up)if(TaskMsg->KeyType==Key_DownTimeOut)UIShowValue.SaveValue.CH_Limit[1].Min+=1; if(TaskMsg->KeyValue==Key_Down)if(TaskMsg->KeyType==Key_OneClick)UIShowValue.SaveValue.CH_Limit[1].Min-=0.1; if(TaskMsg->KeyValue==Key_Down)if(TaskMsg->KeyType==Key_DownTimeOut)UIShowValue.SaveValue.CH_Limit[1].Min-=1; break; case 5: if(TaskMsg->KeyValue==Key_Up)if(TaskMsg->KeyType==Key_OneClick)UIShowValue.SaveValue.ServerPort[0]+=1; if(TaskMsg->KeyValue==Key_Up)if(TaskMsg->KeyType==Key_DownTimeOut)UIShowValue.SaveValue.ServerPort[0]+=10; if(TaskMsg->KeyValue==Key_Down)if(TaskMsg->KeyType==Key_OneClick)UIShowValue.SaveValue.ServerPort[0]-=1; if(TaskMsg->KeyValue==Key_Down)if(TaskMsg->KeyType==Key_DownTimeOut)UIShowValue.SaveValue.ServerPort[0]-=10; break; default:UIShowValue.SysWorkMode=1; } Ht1621_DrawMaxMin(UIShowValue.SysWorkMode); }else { if(TaskMsg->KeyValue==Key_Up){UIShowValue.SysWorkMode=0xff;Ht1621_DrawHold(1);Tos_TaskDelay(1000);} if(TaskMsg->KeyValue==Key_Down){UIShowValue.SysWorkMode=0xff;Ht1621_DrawHold(2);Tos_TaskDelay(1000);} UIShowValue.SysWorkMode=0; } } } }
相关文章推荐
- 消息队列(Message Queue)简介及其使用
- 使用日志钩子实现键盘消息勾挂的例子
- 消息队列(Message Queue)简介及其使用-.NET教程
- 消息队列(Message Queue)简介及其使用
- 消息队列(Message Queue)简介及其使用
- 消息队列(Message Queue)简介及其使用
- 使用日志钩子实现键盘消息勾挂的例子[z]
- 消息队列(Message Queue)简介及其使用
- 初次使用消息队列
- 如何使用 Mmcv.exe 工具来管理群集消息队列资源[转]
- [导入]使用微软消息队列构建可靠的移动应用程序
- 消息队列(Message Queue)简介及其使用(zz)
- 使用NBear.MQ分布式服务消息队列模块开发分布式系统
- 消息队列(Message Queue)简介及其使用 [转]
- 消息队列(Message Queue)简介及其使用
- 使用消息驱动Beans
- 消息队列(Message Queue)简介及其使用
- 消息队列(Message Queue)简介及其使用
- 使用C#来操作消息队列
- 使用java.util.concurrent实现的线程池、消息队列功能