怎么區(qū)分開關檢測設備的“動作”和“狀態(tài)”?至于為什么要區(qū)分“動作”和“狀態(tài)”。是因為在嵌入式產(chǎn)品中,有一種很常見的應用邏輯:開關A、B、C處于閉合狀態(tài)且開關D、E、F處于斷開狀態(tài)時,按下或松開開關G,執(zhí)行某個操作。
在開關檢測設備這種邏輯里,“按下”和“松開”是兩種動作,“閉合”和“斷開”是兩種狀態(tài)。用電路的知識來類比的話,動作是沿跳變,狀態(tài)是電平。“動作”是一閃即逝的花火,狀態(tài)是千年不變的承諾。我們做區(qū)分為的是,讓動作“閱后即焚”,不至于成為反復觸發(fā)操作的脈搏。
為了說明開關檢測設備這一點,我跟大家分享一下自己設計的結(jié)構體和代碼實現(xiàn),這部分也可以用在問題的解答上。在這個結(jié)構體的成員變量里面,switch_id標識開關節(jié)點,大家可以用“解釋性”很強的枚舉來表示它。這里的switch_state表示的是開關信號的狀態(tài),swon_event和swoff_event分別表示開關從斷開到閉合和從閉合到斷開的變化,即上述的“動作”。 cursw和detect_cnt用于開關信號采集的軟件消抖功能。
當開關檢測設備開關動作發(fā)生時,swon_event和swoff_event置一,在執(zhí)行完相關操作之后,將swon_event和swoff_event清零,就完成了讓動作“閱后即焚”。正如上面講過的那樣,對于一般的開關節(jié)點,設計一10ms的定時器周期性地讀取開關當前狀態(tài)cursw,然后根據(jù)其維持當前狀態(tài)的周期次數(shù)(根據(jù)不同應用場景,可以設置為5次或者10次,分別對應50ms或100ms的濾波時間)以判斷switch_state、swon_event、swoff_event。