开发延时按键功能

这篇博客详细介绍了如何开发一个延时按键功能,该功能允许从JSON配置中读取延时数据,并在按键按下后按设定的时间延迟自动发送指令。通过获取JSON文件中的延时参数(yanshi),并在全局结构体中存储,结合系统时间进行判断和计时,最终实现按键延时发码。同时,博主分享了关键函数及其作用,如获取系统时间、添加按键到缓冲区和延迟时间判断函数。

开发任务

配置json按钮的时候,可以配置延时数据,最大60s,设定后按下按钮到时间后自动发码。json配置时每一个按钮都有一个yanshi参数,用来使按钮按下后按参数值延时发码,按钮的UI显示也要在发码后随即显示。

 

思路:从json文件中获取到yanshi这个参数的值,判断它的值是否为零;为零时表示按键正常不用延时操作;否则,需要启动延时操作。延时操作有两个函数,一个函数作为在按键按下时记录到yanshi参数的值并且放到一个全局结构体中,结构体中包含了延时完成之后需要操作的变量参数。一个函数需要放到一个线程中,一直进行判断,延时操作响应之后,等待延时时间到了时进行发码。

 

具体实行

  1. 获取json文件参数的办法,使用函数

s = json_check_string(arrobj2[j],"yanshi");  //校验json文件中的yanshi参数的值

g_SmartHomeInfo->m_pPage[i].m_pBtn[j].delay = strtol((char*)s.c_str(),NULL,10);

//将获取得到的yanshi参数里面的值放到全局结构体成员delay中;

 

这是初始化json页面时进行的操作。

 

2.在CAppmain.cpp工程文件中,类CMainApp里面有个函数

BOOL DoProcess(DWORD uMsg, DWORD wParam, DWORD lParam, DWORD zParam);通过按键或者触摸都会跑进这个函数的

                            case TOUCH_MESSAGE:

                                     {

                                               lbg_outtime = 0;

                                               DoCtrlTouchMsg(wParam,lParam,zParam);

                                     }

                                     break;

触摸信息里面。也就是进入函数DoCtrlTouchMsg(wParam,lParam,zParam);

 

通过分析可以发现

                                     switch(pBtn->btnType)

                                     {

                                     case BTNTYPE_COMBINATION_CONTROL://集控按钮处理!

                                               ButtonCombination(pBtn,pressCount);

                                               break;

                                     case BTNTYPE_SINGLE_CONTROL://单独控制按钮处理!

                                               ButtonSingle(pBtn,pressCount);

                                               break;

                                     case BTNTYPE_COMBINATION_SWITCH://联合控制按钮处理!

                                               ButtonCombinationSwitch(pBtn,pressCount);

                                               break;

                                     case BTNTYPE_FUNCTION://功能按钮处理!没有长按的操作

                                               ButtonFunction(pBtn);

                                               break;

                                     default:

                                               break;

                                     }

 

函数DoCtrlTouchMsg里面有以上按键类型的分类,并且都有相对应的操作函数。也就是说每按一次按键都会在DoCtrlTouchMsg里面进行相应的操作。

 

以单个按键类型BTNTYPE_SINGLE_CONTROL为例。进入它的操作函数

ButtonSingle(pBtn,pressCount);之后分析可知:

 

SwitchButton(pBtn, bLongPress);   //数据处理,必须放在发指令前面,有一些数据需要改变然后发出去!

SendButtonMsg(*pBtn, bLongPress);     //发送指令

 

有两个函数比较明显是发送信息的函数,第一个是更新按键的数据的,第二个是发码函数。

 

通过进入第二个函数里面分析发现

 

在通过一系列的属性类型判断之后,发送信息的操作是SendSmartHomeMsg(model, FALSE, btn.btnId);这个函数发送的。

 

在找到发送信息的函数SendSmartHomeMsg(model, FALSE, btn.btnId);之后,我们便可以对于延时发码任务有了一个好的信心。在找到重要函数之后还有一个需要解决的问题,那就是系统时间的获取。

 

接下来是系统时间的获取和线程的应用:

 

时间结构体

typedef struct _SYSTEMTIME {

    WORD wYear;

    WORD wMonth;

    WORD wDayOfWeek;

    WORD wDay;

    WORD wHour;

    WORD wMinute;

    WORD wSecond;

    WORD wMilliseconds;

} SYSTEMTIME, *LPSYSTEMTIME;

 

获取时间的函数接口

WINAPI

GetLocalTime (

    __out LPSYSTEMTIME lpSystemTime

    );

VOID

 

那么获取系统时间便可以这样打代码:

 

         SYSTEMTIME  cur_jishu_system;

         GetLocalTime(&cur_jishu_system);

 

那么通过json文件获取到的延时时间和系统获取的当前时间可以进行逻辑操作以达到多长时间发码的效果,别忘记了操作之前需要定义全局结构体以同步按键信息。

 

//按键延时

typedef struct

{

         DWORD time;  //存放json文件yanshi参数的值

         WORD Time_s;//秒

         WORD Time_d;//分

         WORD Time_h;//时

         SmartHomeBtn *linbtn; //存放按键信息

         DWORD prCount;  //存放是否长按的标志位

         DWORD PageIndex; //存放页面数量

}btnbuff;

static btnbuff lbgbuff[20] = {0};

static DWORD lbgggjishu;

static DWORD lbg_outtime = 0;

 

现在我将两个重要的函数贴出来,仅供参考

 

 

void Add_message_to_btnbuff(SmartHomeBtn *pBtn,DWORD pressCount,

DWORD m_PageIndex)

{

         WORD sTime = 0;//秒

         WORD dTime = 0;//分

         WORD hTime = 0;//时

         if (pressCount > 0)

                   lbgbuff[lbgggjishu].prCount = TRUE;

 

         SYSTEMTIME cur_jishu_system;

         GetLocalTime(&cur_jishu_system);

 

         sTime = pBtn->delay % 60;

         dTime = pBtn->delay / 60;

 

         //秒

         sTime = cur_jishu_system.wSecond + sTime;

         if(sTime >= 60)

         {

                   dTime++;

                   lbgbuff[lbgggjishu].Time_s = sTime - 60;

         }

         else

                   lbgbuff[lbgggjishu].Time_s = sTime;

 

         //分

         dTime = cur_jishu_system.wMinute + dTime;

         if(dTime >= 60)

         {

                   hTime++;

                   lbgbuff[lbgggjishu].Time_d = dTime - 60;

         }

         else

                   lbgbuff[lbgggjishu].Time_d = dTime;

 

         //时

         lbgbuff[lbgggjishu].Time_h = cur_jishu_system.wHour + hTime;

         if(lbgbuff[lbgggjishu].Time_h > 24)

                   lbgbuff[lbgggjishu].Time_h = 0;

 

         lbgbuff[lbgggjishu].time = pBtn->delay;

         lbgbuff[lbgggjishu].linbtn = pBtn;

         lbgbuff[lbgggjishu].PageIndex = m_PageIndex;

         lbgggjishu++;

         flag_i = 0;

}

 

 

void Delay_time_btn()

{

 

         SYSTEMTIME cur_jishu_system;

         GetLocalTime(&cur_jishu_system);

        

         for(WORD x = 0 ;x < lbgggjishu; x++)

         {

                   WORD time_sec = cur_jishu_system.wSecond;

                   if(time_sec == lbgbuff[x].Time_s)

                   {

                            WORD time_min = cur_jishu_system.wMinute;

                            if(time_min == lbgbuff[x].Time_d)

                            {

                                     WORD time_hour = cur_jishu_system.wHour;

                                     if(time_hour == lbgbuff[x].Time_h)

                                     {

                                               SmartHomeModel model = GetCurrentSmartHomeModel(

lbgbuff[x].linbtn,

                                                      lbgbuff[x].prCount);

                                               SendSmartHomeMsg(model, FALSE, lbgbuff[x].linbtn->btnId);

                                              

                                               for(WORD y = x ;y < lbgggjishu; y++)

                                               {

                                                        lbgbuff[y] = lbgbuff[y+1];

                                               }

                                               lbgggjishu --;

                                               //DPPostMessage(TEST_LBG_MESSAGE, 0, 0, 0);

                                     }

                            }

                   }

         }

 

}

最后实现效果是,按键按下后yanshi的值是多少就延时多久才发送信息出去。多个按键按下时,按照yanshi值的大小来进行发送信息,时间越小发送越快,反之越慢。(亲测有效)。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lbg_164

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值