В версии Android L мы прекращаем поддержку некоторых версий HAL датчиков. Поддерживаются только версии SENSORS_DEVICE_API_VERSION_1_0
и SENSORS_DEVICE_API_VERSION_1_3.
В следующих версиях мы, скорее всего, также прекратим поддержку версии 1_0.
В версии 1.0 нет понятия пакетной обработки. Если это возможно, все устройства, использующие версию 1.0, СЛЕДУЕТ обновить до версии 1.3.
Версии 1_1 и 1_2 имеют нечеткое определение концепции пакетной обработки и больше не поддерживаются.
Все устройства, на которых сейчас используется версия 1_1 или 1_2, необходимо обновить до версии 1_3.
В версии 1.3 мы упростили понятие пакетной обработки и добавили датчики пробуждения.
Чтобы перейти на версию 1.3, выполните описанные ниже изменения.
Как реализовать пакетную функцию
Даже если вы не используете пакетную обработку (в вашем оборудовании нет очереди FIFO), вы должны реализовать функцию batch. batch используется для установки периода выборки и максимальной задержки отчетов для данного датчика. Он заменяет setDelay. setDelay больше не будет звонить.
Если вы не используете пакетную обработку, то можете реализовать batch, просто вызвав существующую функцию setDelay с предоставленным параметром sampling_period_ns.
Как реализовать функцию flush
Даже если вы не используете пакетную обработку, вам необходимо реализовать функцию flush.
Если вы не используете пакетную обработку, flush должен создать одно событие META_DATA_FLUSH_COMPLETE и вернуть значение 0 (успешно).
Как изменить значение параметра sensors_poll_device_t.common.version
your_poll_device.common.version = SENSORS_DEVICE_API_VERSION_1_3
Добавьте новые поля в определение датчиков.
При определении каждого датчика, помимо обычных полей sensor_t:
.name = "My magnetic field Sensor", .vendor = "My company", .version = 1, .handle = mag_handle, .type = SENSOR_TYPE_MAGNETIC_FIELD, .maxRange = 200.0f, .resolution = CONVERT_M, .power = 5.0f, .minDelay = 16667,
Вам также необходимо задать новые поля, определенные между версиями 1_0 и 1_3:
.fifoReservedEventCount = 0, .fifoMaxEventCount = 0, .stringType = 0, .requiredPermission = 0, .maxDelay = 200000 .flags = SENSOR_FLAG_CONTINUOUS_MODE,
fifoReservedEventCount. Если вы не используете пакетную обработку, установите значение 0.
fifoMaxEventCount. Если вы не используете пакетную обработку, установите значение 0.
stringType: для всех официальных датчиков Android (определенных в sensors.h) задайте значение 0, поскольку оно будет перезаписано фреймворком. Для неофициальных датчиков см. sensor_t, чтобы узнать, как его настроить.
requiredPermission – разрешение, которое должно быть у приложений, чтобы получить доступ к вашему датчику. Обычно для всех датчиков можно указать значение 0, но для датчиков типа HEART_RATE необходимо указать SENSOR_PERMISSION_BODY_SENSORS..
maxDelay – важное значение, которое нужно задать в соответствии с возможностями датчика и его драйвера.
Это значение определяется только для датчиков, работающих непрерывно или при изменении. Это задержка между двумя событиями датчика, соответствующая самой низкой частоте, которую поддерживает этот датчик. Если с помощью функции batch задана более низкая частота, события будут генерироваться с этой частотой. Фреймворк или приложения могут использовать его, чтобы оценить, когда пакетный FIFO может быть заполнен. Если это значение задано неправильно, CTS не пройдет.
Для датчиков, работающих в режиме однократного или специального отчета, установите значение 0 для параметра maxDelay.
Для непрерывных датчиков задайте максимальный период выборки в микросекундах.
Для пользователей period_ns, maxDelay и minDelay действуют следующие условия:
period_ns– в наносекундах, аmaxDelay/minDelay– в микросекундах.- Значение параметра
maxDelayвсегда должно быть в пределах 32-битного целого числа со знаком. На 64-разрядных архитектурах он объявляется как 64-разрядный только для обеспечения совместимости с двоичными файлами.
flags – это поле определяет режим работы датчика и то, является ли он датчиком пробуждения.
Если вы не используете пакетную обработку и просто переходите с версии 1.0 на 1.3, задайте следующее значение:
SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ONE_SHOT_MODE для одноразовых датчиков
SENSOR_FLAG_CONTINUOUS_MODE – для непрерывных датчиков;
SENSOR_FLAG_ON_CHANGE_MODE – для датчиков, срабатывающих при изменении, кроме датчика приближения;
SENSOR_FLAG_SPECIAL_REPORTING_MODE – для датчиков со специальным режимом передачи данных, кроме датчика наклона.
SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ON_CHANGE_MODE для датчика расстояния и официального датчика наклона Android.
Примечания при обновлении с версии 1_1 или 1_2
- Функция
batchтеперь почти всегда выполняется успешно, даже для датчиков, которые не поддерживают пакетную обработку, независимо от значения аргумента timeout. Функцияbatchможет не работать только в случае внутренних ошибок или еслиsensor_handle,,sampling_period_nsилиmax_report_latency_nsимеют отрицательное значение. - Поддержка пакетной обработки определяется тем, имеет ли датчик значение
fifoMaxEventCountбольше нуля. (В предыдущих версиях он определялся на основе возвращаемого значения показателяbatch().) - Датчики, поддерживающие пакетную обработку, всегда работают в пакетном режиме, даже если параметр
max_report_latency_nsравен 0. Это означает, что события должны храниться в FIFO, когда SoC переходит в режим ожидания. - Параметр
flagsфункцииbatchбольше не используется.DRY_RUNиWAKE_UPON_FIFO_FULL– устаревшие параметры, которые никогда не будут передаваться функцииbatch. - Аргумент "Время ожидания пакета" теперь называется аргументом
max_report_latency.