Как GpioCallback может дважды подряд регистрировать false?

У меня очень простая настройка android-things, где 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

person Benjamin H    schedule 02.06.2017    source источник
comment
Я хотел бы воспроизвести вашу проблему. Какой вывод gpio вы используете?   -  person Blundell    schedule 05.06.2017
comment
Я слушал контакт 20 и буквально взял провод от VCC, аккуратно поместил его во входной контактный порт и много шевелил. Я знаю, что это очень научно. :)   -  person Benjamin H    schedule 05.06.2017


Ответы (1)


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

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

person devunwired    schedule 06.06.2017