Как GpioCallback регистрирует «ложь» дважды подряд?

У меня очень простая настройка настроек Android, где GPIO (выход) генерирует очень короткий (10u) импульс, и я пытаюсь прочитать этот импульс через другой GPIO (ввод).

Тем не менее, мои журналы меня странят: как я могу получить два «ложных» чтения подряд? Если у меня есть выключатель света, я не могу отключить его дважды подряд … Мне нужно включить его между ними, верно? Могут ли события GpioCallback удалить события? Я слишком короткое время? Может ли быть мягкая рампа между напряжениями, которые никогда не считаются «краем»?

val gpioIn = PeripheralManagerService().openGpio(gpioPinName) gpioIn.setEdgeTriggerType(Gpio.EDGE_NONE) // reset for Android Things bug gpioIn.setDirection(Gpio.DIRECTION_IN) gpioIn.setActiveType(Gpio.ACTIVE_HIGH) gpioIn.setEdgeTriggerType(Gpio.EDGE_BOTH) // I should get all changes, right? gpioIn.registerGpioCallback(object : GpioCallback() { override fun onGpioEdge(gpio: Gpio?): Boolean { netLog((gpio?.value ?: "null").toString()) return true } override fun onGpioError(gpio: Gpio?, error: Int) { netLog("GPIO $gpio Error event $error") } }) 

приводит к

 06-02 06:33:37.052 I/NetGpioListener: NET GPIO LISTENER: 118730013 true 06-02 06:33:37.091 I/NetGpioListener: NET GPIO LISTENER: 118769152 false 06-02 06:33:37.094 I/NetGpioListener: NET GPIO LISTENER: 118772102 false 

Да, это довольно часто встречается с шумными входными сигналами, такими как кнопки, контакты реле и «wiggly wire». Сигнальный отскок, возникающий при замыкании контактов, может происходить очень быстро, так что не каждое событие триггера захватывается входными регистрами.

Это справедливо для всех систем GPIO (а не только для Android Things), и одна из причин, почему сигнализация является такой обычной практикой. Код дебюта в драйвере кнопки был фактически написан для обработки таких случаев, чтобы гарантировать, что они не генерируют ложные события.