天天看點

TRTOS 使用消息隊列鍵盤通用驅動

先加入一段廢話,不加的話部落格首頁展示的時候會很醜,廢話如下:這是一個可以通用的鍵盤驅動程式,隻需要在任務參數中傳入擷取鍵值的函數,鍵盤任務會把所有按鍵的短按長按,擡起等操作全都通過消息發送到受體任務内,進而實作了鍵盤驅動隔離,更有效的節省了系統運作開支和加快了按鍵響應時間,消息隊列的引用,更大的減少了操作漏執行。

#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;
        }
            
        }
    }
}