Датчики Android IIO
Как я могу поймать iio_events
генерируется датчиками iio на уровне приложения и на собственном уровне (например, из оболочки adb или с помощью существующего демона) на Android Nougat? (например, событие in_intensity_falling_threshold датчика внешнего освещения)
Я попробовал классический способ: SensorManager Listener (я написал себе тестовое приложение, но также попробовал несколько приложений Sensortest из магазина приложений).
Однако кажется, что iio-датчики не запускают никаких событий (хотя я могу прочитать изменяющиеся данные из sysfs).
Создают ли устройства iio события того же типа, что и устройства ввода в Android? Могу ли я видеть события с помощью команды getevent? (Я могу дать более конкретную информацию о системе / датчике, если это необходимо.)
1 ответ
Позвольте мне поделиться тем, что я узнал и испытал:
Краткий ответ о том, как отлавливать события iio, зависит от драйвера ядра датчика и Sensor-HAL на Android.
Прежде всего, событие iio управляется прерыванием на основе hw; контакт прерывания на датчике, подключенном и распознанном платой, посылает сигнал плате, когда, например, появляются новые данные.
Во-вторых, Менеджер датчиков / Сервис не связывается с драйвером напрямую. То, что он слушает, это Sensor-HAL. Sensor-HAL генерирует события для службы датчиков, а не для самого драйвера напрямую. Это означает, что SensorHAL должен считывать данные из sysfs(файловые интерфейсы, созданные драйвером) и возвращать эти данные в вызовы службы датчиков (см. Poll(), sensor_event структура в https://android.googlesource.com/platform/hardware/libhardware/+/master/include/hardware/sensors.h)
Наконец, catchevent предназначен только для "событий прерывания", которые генерируются устройствами, определенными как устройства прерывания (например, сенсорный экран). Interrupt, iio и hwmon - это различные типы структур устройств на основе sw в ядре Linux.
Вывод: если у вас есть новый датчик и вы хотите получать / считывать данные с него в Android, вам следует
1. Найти / написать драйвер с подходящей моделью устройства (input, iio, hwmon и т. Д.)
2. Сделайте так, чтобы плата распознала устройство (добавив информацию в дерево устройств или файл конфигурации платы).
3. Найдите / напишите подходящий Sensor-HAL или добавьте датчик в существующий HAL.
Только после этих шагов приложение может получить доступ к данным датчика через SensorListener.
как ловить / проверять ловлю событий с нативного уровня: не удается найти прямой способ ловить события. Обычный способ получения данных с датчиков (после добавления правильного драйвера и получения платы, распознающей устройство) - это использование интерфейсов sysfs.
Например, из оболочки устройства Android (как root):
#sys/bus/iio/devices/iio:device0/ls
in_accel_x_raw in_accel_y_raw in_accel_z_raw in_accel_scale ....
#cat in_accel_x_raw