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