HAL de sensores 1.0

La interfaz de la HAL de sensores, declarada en sensors.h, representa la interfaz entre el framework de Android y las software específico de hardware. Una implementación de HAL debe definir cada función declarada en sensors.h. Las funciones principales son las siguientes:

  • get_sensors_list: muestra la lista de todos los sensores.
  • activate: Inicia o detiene un sensor.
  • batch: Establece los parámetros de un sensor, como la frecuencia de muestreo y el valor máximo. la latencia de informes.
  • setDelay: Solo se usa en la versión 1.0 del HAL. Establece la frecuencia de muestreo de un sensor determinado.
  • flush: Limpia el FIFO del sensor especificado e informa un vaciado completo. cuando esto esté listo.
  • poll: Muestra los eventos de sensor disponibles.

La implementación debe ser segura para subprocesos y permitir que se llame a estas funciones desde diferentes subprocesos.

La interfaz también define varios tipos que usan esas funciones. Los tipos principales son los siguientes:

  • sensors_module_t
  • sensors_poll_device_t
  • sensor_t
  • sensors_event_t

Además de las secciones a continuación, consulta sensors.h para obtener más información sobre esos tipos.

get_sensors_list(list)

int (*get_sensors_list)(struct sensors_module_t* module, struct sensor_t
  const** list);

Proporciona la lista de sensores que implementa el sistema HAL. Consulta sensor_t para obtener detalles sobre cómo se definen los sensores.

El orden en el que aparecen los sensores en la lista es el orden en que de sensores se informará a las aplicaciones. Por lo general, los sensores de base aparecen primero, seguidos de los sensores compuestos.

Si varios sensores comparten el mismo tipo de sensor y propiedad de activación, el primero uno de la lista se llama sensor “predeterminado”. Es el que devuelve getDefaultSensor(int sensorType, bool wakeUp)

Esta función muestra el número de sensores en la lista.

activate(sensor, true/false)

int (*activate)(struct sensors_poll_device_t *dev, int sensor_handle, int
  enabled);

Activa o desactiva un sensor.

sensor_handle es el controlador del sensor que se activa o desactiva. El identificador de un sensor se define mediante el campo handle de su estructura sensor_t.

enabled se establece en 1 para habilitar el sensor o en 0 para inhabilitarlo.

Los sensores de un solo disparo se desactivan automáticamente al recibir un evento e igualmente deben aceptar la desactivación a través de una llamada a activate(..., enabled=0).

Los sensores que no activan nunca impiden que el SoC entre en modo suspendido, es decir, el HAL no debe mantener un bloqueo de activación parcial en nombre de las aplicaciones.

Cuando los sensores de activación envían eventos de forma continua, pueden evitar que el SoC entre en modo suspendido, pero si no se debe entregar ningún evento, se debe liberar el bloqueo de activación parcial.

Si enabled es 1 y el sensor ya está activado, esta función no realiza ninguna acción y se realiza correctamente.

Si enabled es 0 y el sensor ya está desactivado, esta función es no-op y tenga éxito.

Esta función muestra 0 si se realiza correctamente y un número de error negativo en caso contrario.

lote(sensor, marcas, período de muestreo, latencia máxima del informe)

int (*batch)(
     struct sensors_poll_device_1* dev,
     int sensor_handle,
     int flags,
     int64_t sampling_period_ns,
     int64_t max_report_latency_ns);

Establece los parámetros de un sensor, incluida la frecuencia de muestreo y informe de máximos latencia. Se puede llamar a esta función mientras el sensor está activado, en cuyo caso no debe provocar la pérdida de ninguna medición del sensor: la transición de una tasa de muestreo a la otra no puede provocar eventos perdidos, ni tampoco la transición de una latencia máxima de informe alta a una latencia máxima de informe baja.

sensor_handle es el controlador del sensor que se configurará.

flags no está en uso actualmente.

sampling_period_ns es el período de muestreo en el que el sensor debería ejecutarse en nanosegundos. Consulta sample_period_ns más detalles.

max_report_latency_ns es el tiempo máximo en el que se pueden retrasar los eventos antes de informarse a través del HAL, en nanosegundos. Consulta el párrafo max_report_latency_ns para obtener más detalles.

Esta función muestra 0 en caso de éxito y, de lo contrario, un número de error negativo.

setDelay(sensor, sampling period)

int (*setDelay)(
     struct sensors_poll_device_t *dev,
     int sensor_handle,
     int64_t sampling_period_ns);

Después de la versión 1.0 de HAL, esta función es obsoleta y nunca se llama. En su lugar, se llama a la función batch para establecer el parámetro sampling_period_ns.

En la versión 1.0 de la HAL, se usó setDelay en lugar de lote para configurar sample_period_ns.

vaciar(sensor)

int (*flush)(struct sensors_poll_device_1* dev, int sensor_handle);

Agrega un evento de vaciado completo al final del FIFO de hardware para el sensor especificado y limpia el FIFO. estos eventos se entregan como de costumbre (es decir, como si la latencia máxima de los informes venció) y se lo quitó del FIFO.

La limpieza se realiza de forma asíncrona (es decir, esta función debe mostrarse de inmediato). Si la implementación usa un único FIFO para varios sensores, ese FIFO se limpia y el evento de vaciado completo solo se agrega para el sensor especificado.

Si el sensor especificado no tiene FIFO (no es posible el almacenamiento en búfer) o si el FIFO estaba vacío en el momento de la llamada, flush aún debe tener éxito y enviar un evento de limpieza completa para ese sensor. Esto se aplica a todos los sensores que no sean que los sensores de un solo golpe.

Cuando se llama a flush, incluso si ya hay un evento de vaciado en el FIFO para ese sensor, se debe crear uno adicional y agregar al final del FIFO, y este se debe limpiar. La cantidad de llamadas a flush debe ser igual a la cantidad de eventos de limpieza completos creados.

flush no se aplica a los sensores únicos. Si sensor_handle hace referencia a un sensor único, flush debe mostrar -EINVAL y no generar ningún evento de metadatos completos.

Esta función muestra 0 en caso de éxito, -EINVAL si el sensor especificado es un sensor de un solo uso o no se habilitó, y un número de error negativo en caso contrario.

poll()

int (*poll)(struct sensors_poll_device_t *dev, sensors_event_t* data, int
  count);

Muestra un array de datos de sensores completando el argumento data. Esta función debe bloquearse hasta que los eventos estén disponibles. Devolverá la cantidad de eventos leídos si se realiza correctamente o un número de error negativo en caso de que se produzca un error.

La cantidad de eventos que se muestran en data debe ser menor o igual que el argumento count. Esta función nunca debe mostrar 0 (sin eventos).

Secuencia de llamadas

Cuando se inicia el dispositivo, se llama a get_sensors_list.

Cuando se active un sensor, se llamará a la función batch con los parámetros solicitados, seguidos de activate(..., enable=1).

Ten en cuenta que, en la versión 1_0 de HAL, el orden era el opuesto: se llamaba a activate. primero y, luego, set_delay.

Cuando las características solicitadas de un sensor cambian mientras está activado, se llama a la función batch.

Se puede llamar a flush en cualquier momento, incluso en sensores no activados (en cuyo caso debe mostrar -EINVAL).

Cuando se desactive un sensor, se llamará a activate(..., enable=0).

De forma simultánea a esas llamadas, se llamará a la función poll de forma reiterada para solicitar datos. Se puede llamar a poll incluso cuando no hay sensores activados.

sensors_module_t

sensors_module_t es el tipo que se usa para crear el módulo de hardware de Android para los sensores. La implementación de la HAL debe definir un objeto HAL_MODULE_INFO_SYM de este tipo para exponer la función get_sensors_list. Consulta la definición de sensors_module_t en sensors.h y la definición de hw_module_t para obtener más información.

sensors_poll_device_t / sensors_poll_device_1_t

sensors_poll_device_1_t contiene el resto de los métodos que se definieron anteriormente: activate, batch, flush y poll Su campo common (del tipo hw_device_t) define el número de versión de la HAL.

sensor_t

sensor_t representa un objeto Android sensor de movimiento. Estos son algunos de sus campos importantes:

name: Una cadena visible para el usuario que representa el sensor. A menudo, esta cadena contiene el nombre de la pieza del sensor subyacente, el tipo del sensor y si es un sensor de activación. Por ejemplo, "LIS2HH12 Accelerometer", "MAX21000 Uncalibrated Gyroscope", "BMP280 Wake-up Barometer", "MPU6515 Game Rotation Vector"

control: Es el número entero que se usa para hacer referencia al sensor cuando te registras en él o generas eventos a partir de él.

type: Es el tipo de sensor. Consulta la explicación de los sensores escribe ¿Qué son los sensores de Android? para obtener más información y consulta Tipos de sensores para conocer los tipos de sensores oficiales. Para tipos de sensores no oficiales, type debe comenzar con SENSOR_TYPE_DEVICE_PRIVATE_BASE.

stringType: el tipo de sensor como una cadena Cuando el sensor tenga un tipo oficial, configúralo en SENSOR_STRING_TYPE_*. Cuando el sensor tiene un tipo específico del fabricante, stringType debe comenzar con el nombre de dominio inverso del fabricante. Por ejemplo, un sensor (por ejemplo, un detector de unicornios) definido por el equipo de Producto-genial en Fictional-Company podría usar stringType=”com.fictional_company.cool_product.unicorn_detector”. stringType se usa para identificar de forma única los tipos de sensores no oficiales. Consulta sensors.h para obtener más información sobre los tipos y las cadenas. de tipos de datos.

requiredPermission: Es una cadena que representa el permiso que deben tener las aplicaciones para ver el sensor, registrarse en él y recibir sus datos. Una cadena vacía significa que las aplicaciones no requieren ningún permiso para acceder a este sensor. Algunos tipos de sensores, como el monitor de frecuencia cardíaca, tienen un requiredPermission obligatorio. Todos los sensores que proporcionan datos información del usuario (como la frecuencia cardíaca) debe estar protegida por un permiso.

flags: Son marcas para este sensor que definen el modo de generación de informes del sensor y si es un sensor de activación o no. Por ejemplo, un sensor de activación único tendrá flags = SENSOR_FLAG_ONE_SHOT_MODE | SENSOR_FLAG_WAKE_UP. Los bits de la marca que no se usan en la versión actual de HAL deben dejarse iguales a 0.

maxRange: el valor máximo que puede informar el sensor, en la misma unidad que y los valores informados. El sensor debe poder informar valores sin saturar en [-maxRange; maxRange]. Ten en cuenta que esto significa que el rango total de en el sentido genérico es 2*maxRange. Cuando el sensor informa valores durante varios ejes, el rango se aplica a cada uno de ellos. Por ejemplo, un acelerómetro de “+/- 2g” registrará maxRange = 2*9.81 = 2g.

resolución: es la diferencia más pequeña en valor que el sensor puede medir. Por lo general, se calcula en función de maxRange y la cantidad de bits en la medición.

power: Es el costo de energía de habilitar el sensor, expresado en miliamps. Esto casi siempre es mayor que el consumo de energía que se informa en la hoja de datos del sensor subyacente. Consulta Sensores base != físico sensores para obtener más información y consulta Medición de energía para obtener detalles sobre cómo medir el consumo de energía de un sensor. Si el consumo de energía del sensor depende de si el dispositivo se está moviendo, el consumo de energía durante el movimiento es el que se informa en el campo power.

minDelay: para sensores continuos, el período de muestreo, en microsegundos, que corresponden a la velocidad más rápida que admite el sensor. Consulta sampling_period_ns para obtener detalles sobre cómo se usa este valor. Ten en cuenta que minDelay se expresa en microsegundos, mientras que sampling_period_ns se expresa en nanosegundos. Para los sensores de modo de generación de informes especiales y de cambio, a menos que se especifique lo contrario, minDelay debe ser 0. En el caso de los sensores de un solo golpe, debe ser -1.

maxDelay: para sensores continuos y de cambio, la capacidad de tiempo en microsegundos, que corresponde a la velocidad más lenta a la que admite. Consulta sample_period_ns detalles sobre cómo se usa este valor. Ten en cuenta que maxDelay es se expresa en microsegundos, mientras que sampling_period_ns está en nanosegundos. Para los sensores especiales y únicos, maxDelay debe ser 0.

fifoReservedEventCount: la cantidad de eventos reservados para este sensor en el FIFO de hardware. Si hay un FIFO dedicado para este sensor, fifoReservedEventCount es el tamaño de este FIFO dedicado. Si la FIFO se comparte con otros sensores, fifoReservedEventCount es el tamaño de la parte de la FIFO que se reserva para ese sensor. En la mayoría de los sistemas de FIFO compartidos y en los sistemas que no tienen un FIFO de hardware, este valor es 0.

fifoMaxEventCount: Es la cantidad máxima de eventos que se pueden almacenar en los FIFO de este sensor. Siempre es mayor o igual que fifoReservedEventCount Este valor se usa para estimar rápidamente, el FIFO se llenará cuando se registre en el sensor en un de procesamiento, suponiendo que no hay otros sensores activados. En los sistemas que no tienen FIFO de hardware, fifoMaxEventCount es 0. Consulta Ejecución por lotes para obtener más detalles.

En el caso de los sensores con un tipo de sensor oficial, algunos campos se reemplazan el framework. Por ejemplo, los sensores de acelerómetro. se ven obligados a tener un modo de informes continuos, y los monitores de frecuencia cardíaca forzadas a estar protegidas por las SENSOR_PERMISSION_BODY_SENSORS permiso.

evento_sensores

Los eventos de sensor que generan los sensores de Android y que se informan a través de la función de poll son de type sensors_event_t. Estos son algunos ejemplos campos importantes de sensors_event_t:

version: Debe ser sizeof(struct sensors_event_t).

sensor: El controlador del sensor que generó el evento, según lo define sensor_t.handle

type: El tipo de sensor del sensor que generó el evento, según lo definido por sensor_t.type

timestamp: Es la marca de tiempo del evento en nanosegundos. Es la hora en que ocurrió el evento (se dio un paso o se realizó una medición del acelerómetro), no la hora en que se informó. timestamp debe sincronizarse con el elapsedRealtimeNano y, en el caso de los sensores continuos, el Jitter debe ser pequeño. A veces, el filtrado de marca de tiempo es necesario para satisfacer el CDD. como usar solo el tiempo de interrupción del SoC provoca un jitter demasiado alto y usas solo el tiempo del chip del sensor para establecer las marcas de tiempo pueden provocar una desincronización desde elapsedRealtimeNano, a medida que el reloj del sensor se desvía.

datos y campos superpuestos: Son los valores que mide la sensor. El significado y las unidades de esos campos son específicos de cada tipo de sensor. Consulta sensors.h y la definición de los diferentes tipos de sensores para obtener una descripción de los campos de datos. En el caso de algunos sensores, también se informa la precisión de las lecturas como parte de los datos, a través de un campo status. Este campo solo se pasa para esos tipos de sensores seleccionados y aparece en la capa del SDK como un valor de precisión. Para esos sensores, el hecho de que el campo de estado se deba establecer se menciona en su tipo de sensor definición.

Eventos completos de limpieza de metadatos

Los eventos de metadatos tienen el mismo tipo que los eventos de sensores normales: sensors_event_meta_data_t = sensors_event_t Se devuelven junto con otros eventos de sensores a través de sondeos. Tienen los siguientes campos:

version: Debe ser META_DATA_VERSION.

type: Debe ser SENSOR_TYPE_META_DATA

sensor, reservado y marca de tiempo: Debe ser 0.

meta_data.what: Contiene el tipo de metadatos para este evento. Actualmente hay un único tipo de metadatos válido: META_DATA_FLUSH_COMPLETE.

Los eventos META_DATA_FLUSH_COMPLETE representan la finalización de la limpieza de un sensor FIFO. Cuando meta_data.what=META_DATA_FLUSH_COMPLETE, meta_data.sensor debe fijarse en la manija del sensor que se purgó. Son Se genera solo cuando se llama a flush en un sensor. Consulta la sección sobre la función flush para obtener más información.