電子產業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 595|回復: 0
收起左側

【HarmonyOS HiSpark Wi-Fi IoT 套件】實現(xiàn)S1,S2,User三個物理按鍵的獨立事件-下

[復制鏈接]

2607

主題

2607

帖子

7472

積分

高級會員

Rank: 5Rank: 5

積分
7472
跳轉到指定樓層
樓主
發(fā)表于 2020-12-7 17:56:23 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
【HarmonyOS HiSpark Wi-Fi IoT 套件】實現(xiàn)S1,S2,User三個物理按鍵的獨立事件-下, 在上一篇帖子《實現(xiàn)S1,S2,User三個物理按鍵的獨立事件-上(解決思路分析)》中,通過讀取 HI_ADC_CHANNEL_2 上的 ADC 值成功區(qū)分了 S1, S2, User 這 3 個物理按鍵。



上圖中的打印輸出是分別按下 User, S1, S2 的效果,這看起來完全符合了我們區(qū)分按鍵的需求,但是。。。



但是什么呢?有什么問題嗎?



我想說的是,但是問題非常明顯:這三個鍵中的任意一個被按下都會多次觸發(fā)按鍵事件(上圖的實驗通過打印輸出響應按鍵事件)。因此,僅僅區(qū)分 S1, S2, User 還不夠,還不能滿足實際開發(fā)的需要。所以,必須進一步的完善,使得每次按下按鍵只觸發(fā)一次事件。



看到這里,相信大家想到了之前開源的按鍵通用框架 DTButton !在 V0.0.2 版中已經(jīng)可以區(qū)分并觸發(fā)各種 GPIO 按鍵事件,卻唯獨區(qū)分不了 S1, S2, User。然而,現(xiàn)在已經(jīng)有了 S1, S2, User 的區(qū)分方案,那么將這個方案集成到 DTButton 框架不就完美了嗎??!



Ok!說干就干!



接下來要做的工作就是:



  • 將 GetSSU() 集成到框架,使得框架支持 S1, S2, User 的三種事件(Pressed, LongPressed, Released)
  • 不改變框架的對外接口(不改變框架調用方式,不增加新接口函數(shù))
  • 不影響框架 V0.0.2 版本的原有功能
      


要做好上述 3 個工作,就需要再回顧一下 DTButton 框架的核心設計:





GPIO 按鍵在中斷服務程序中
標記事件的發(fā)生,之后在事件處理線程中通過
標記調用事件回調函數(shù)(僅一次)!

注意:觸發(fā)事件后需要立即清除事件標記,防止多次調用回調函數(shù)。



所以,最簡單的集成方式就是:
當 S1, S2, User 中有鍵按下時進行事件標記,之后再通過事件標記調用相應回調函數(shù)(返回后清除事件標記)。



流程如下:



接下來要考慮的問題是:
如何構造 S1, S2, User 的按下事件和釋放事件?



要解決這個問題,可以參考一般 GPIO 按鍵的事件觸發(fā)方式:
上升沿觸發(fā)
下降沿觸發(fā)。然而,相信你也意識到了,S1, S2, User 是通過檢測 ADC 值來判斷區(qū)分的,無法像 GPIO 按鍵那樣直接準確的捕獲上升沿和下降沿。怎么辦呢???直接不行,可以間接:
通過模擬上升沿和下降沿構造釋放事件和按下事件。



具體方法如下:



在代碼層面可以用變量 preKey 記錄上一次通過 GetSSU() 獲得的按鍵狀態(tài),并與當前調用 GetSSU() 獲得的按鍵狀態(tài)進行比較,比較結果即可判斷是否構造按鍵事件。



有了以上分析就可以動手寫出下面的代碼了!



之后,整個框架以統(tǒng)一的方式處理按鍵事件,不管是 S1, S2, User 還是 GPIO 按鍵,但凡觸發(fā)了事件都會在 EventHandler() 得到處理。





到此,按鍵通用框架 V0.0.3 版的設計就完成了!具體代碼實現(xiàn)已開源(文末附件下載),開箱即用。



使用示例如下:



一樣的接口,一樣的方式,一樣的體驗,多出來的僅是對 S1, S2, User 三個物理按鍵的區(qū)分支持。
回復

使用道具 舉報

發(fā)表回復

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關注微信 下載APP 返回頂部 返回列表