怎么区分开关检测设备的“动作”和“状态”?至于为什么要区分“动作”和“状态”。是因为在嵌入式产品中,有一种很常见的应用逻辑:开关A、B、C处于闭合状态且开关D、E、F处于断开状态时,按下或松开开关G,执行某个操作。
在开关检测设备这种逻辑里,“按下”和“松开”是两种动作,“闭合”和“断开”是两种状态。用电路的知识来类比的话,动作是沿跳变,状态是电平。“动作”是一闪即逝的花火,状态是千年不变的承诺。我们做区分为的是,让动作“阅后即焚”,不至于成为反复触发操作的脉搏。
为了说明开关检测设备这一点,我跟大家分享一下自己设计的结构体和代码实现,这部分也可以用在问题的解答上。在这个结构体的成员变量里面,switch_id标识开关节点,大家可以用“解释性”很强的枚举来表示它。这里的switch_state表示的是开关信号的状态,swon_event和swoff_event分别表示开关从断开到闭合和从闭合到断开的变化,即上述的“动作”。 cursw和detect_cnt用于开关信号采集的软件消抖功能。
当开关检测设备开关动作发生时,swon_event和swoff_event置一,在执行完相关操作之后,将swon_event和swoff_event清零,就完成了让动作“阅后即焚”。正如上面讲过的那样,对于一般的开关节点,设计一10ms的定时器周期性地读取开关当前状态cursw,然后根据其维持当前状态的周期次数(根据不同应用场景,可以设置为5次或者10次,分别对应50ms或100ms的滤波时间)以判断switch_state、swon_event、swoff_event。