開發延時按鍵功能

2021-10-25 03:01:55 字數 3041 閱讀 2153

開發任務

配置json按鈕的時候,可以配置延時資料,最大60s,設定後按下按鈕到時間後自動發碼。json配置時每乙個按鈕都有乙個yanshi引數,用來使按鈕按下後按引數值延時發碼,按鈕的ui顯示也要在發碼後隨即顯示。

思路:從json檔案中獲取到yanshi這個引數的值,判斷它的值是否為零;為零時表示按鍵正常不用延時操作;否則,需要啟動延時操作。延時操作有兩個函式,乙個函式作為在按鍵按下時記錄到yanshi引數的值並且放到乙個全域性結構體中,結構體中包含了延時完成之後需要操作的變數引數。乙個函式需要放到乙個執行緒中,一直進行判斷,延時操作響應之後,等待延時時間到了時進行發碼。

具體實行

獲取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.裡面有個函式

bool doprocess(dword umsg, dword wparam, dword lparam, dword zparam);通過按鍵或者觸控都會跑進這個函式的

case touch_message:

break;

觸控資訊裡面。也就是進入函式doctrltouchmsg(wparam,lparam,zparam);

通過分析可以發現

switch(pbtn->btntype)

函式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 systemtime, *lpsystemtime;

獲取時間的函式介面

winapi

getlocaltime (

__out lpsystemtime lpsystemtime

);void

那麼獲取系統時間便可以這樣打**:

systemtime  cur_jishu_system;

getlocaltime(&cur_jishu_system);

那麼通過json檔案獲取到的延時時間和系統獲取的當前時間可以進行邏輯操作以達到多長時間發碼的效果,別忘記了操作之前需要定義全域性結構體以同步按鍵資訊。

//按鍵延時

typedef struct

btnbuff;

static btnbuff lbgbuff[20] = ;

static dword lbgggjishu;

static dword lbg_outtime = 0;

void add_message_to_btnbuff(smarthomebtn *pbtn,dword presscount,

dword m_pageindex)

else

lbgbuff[lbgggjishu].time_s = stime;

//分dtime = cur_jishu_system.wminute + dtime;

if(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()

lbgggjishu --;

//***ostmessage(test_lbg_message, 0, 0, 0);}}

}}}最後實現效果是,按鍵按下後yanshi的值是多少就延時多久才傳送資訊出去。多個按鍵按下時,按照yanshi值的大小來進行傳送資訊,時間越小傳送越快,反之越慢。(親測有效)。

繫結按鍵功能

給鍵盤上下左右繫結移動事件 document.onkeydown function k 以下 是2048小遊戲的一段 的功能是繫結上下左右鍵所要執行的功能,首先使用document.onkeydown給它賦予函式,函式的引數k表示乙個能夠處理按鍵的物件,通過這個物件.key來獲取按鍵輸入的值,按鍵輸...

模擬電路實現延時功能

說到延時,很多人都會想到用軟體件來實現,比如定時器之類的。今天就來說說用硬體來實現定時的方式,雖說沒有那麼準,但是有些場合還是用得到的。實現方式如下圖 乙個電阻與乙個穩壓二極體相連,然後乙個電容在它們連線處與它們併聯。下面說說原理 我們知道穩壓二極體有乙個特性,比如上面的穩壓二極體的穩壓就是5.6v...

取消滾輪的按鍵功能

剛開始玩linux,都是問題。正好實驗室配了個機器,裝了個ubuntu玩一玩,然後問題來了。裝了個chrome,結果發現總是莫名其妙的開一堆網頁,甚至劃一下滾輪也會出現 關閉瀏覽頁 等莫名其妙的操作,與傳說中的神一般的作業系統相去甚遠。查了一下,竟還有這種操作 在chrome中,在標籤頁按下滾輪,會...