Descontinuação da versão da HAL

Na versão L do Android, estamos interrompendo o suporte a algumas versões do HAL do sensor. As únicas versões compatíveis são SENSORS_DEVICE_API_VERSION_1_0 e SENSORS_DEVICE_API_VERSION_1_3.

Nas próximas versões, provavelmente não vamos oferecer suporte à versão 1_0.

O 1_0 não tem o conceito de lote. Se possível, todos os dispositivos que usam 1_0 precisam fazer upgrade para 1_3.

1_1 e 1_2 têm uma definição ruim do conceito de lote e não têm mais suporte

Todos os dispositivos que usam a versão 1_1 ou 1_2 precisam fazer upgrade para a 1_3.

Na 1_3, simplificamos a noção de agrupamento e introduzimos os sensores de ativação.

Para fazer upgrade para a versão 1_3, siga as mudanças listadas abaixo.

Implementar a função de lote

Mesmo que você não implemente o lote (seu hardware não tem FIFO), é necessário implementar a função batch. batch é usado para definir o período de amostragem e a latência máxima de geração de relatórios para um determinado sensor. Ele substitui setDelay. setDelay não será mais chamado.

Se você não implementar o lote, poderá implementar batch simplesmente chamando a função setDelay com o parâmetro sampling_period_ns fornecido.

Implementar a função de limpeza

Mesmo que você não implemente o lote, é necessário implementar a função flush.

Se você não implementar o lote, o flush vai precisar gerar um evento META_DATA_FLUSH_COMPLETE e retornar 0 (sucesso).

Mude o sensors_poll_device_t.common.version.

your_poll_device.common.version = SENSORS_DEVICE_API_VERSION_1_3

Adicionar os novos campos à definição dos sensores

Ao definir cada sensor, além dos campos sensor_t comuns:

.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,

Você também precisa definir os novos campos, definidos entre 1_0 e 1_3:

.fifoReservedEventCount = 0,
.fifoMaxEventCount =   0,
.stringType =         0,
.requiredPermission = 0,
.maxDelay =      200000
.flags =
SENSOR_FLAG_CONTINUOUS_MODE,

fifoReservedEventCount: se você não implementar o agrupamento, defina esse valor como 0.

fifoMaxEventCount: se você não implementar o lote, defina esse valor como 0.

stringType: definido como 0 para todos os sensores oficiais do Android (aqueles que são definidos em sensors.h), já que esse valor será substituído pelo framework. Para sensores não oficiais, consulte sensor_t para detalhes sobre como configurá-los.

requiredPermission: é a permissão que os apps precisam ter para ter acesso ao sensor. Normalmente, é possível definir esse valor como 0 para todos os sensores, mas os sensores do tipo HEART_RATE precisam ser definidos como SENSOR_PERMISSION_BODY_SENSORS..

maxDelay: esse valor é importante e precisa ser definido de acordo com os recursos do sensor e do driver dele.

Esse valor é definido apenas para sensores contínuos e de mudança. É o intervalo entre dois eventos do sensor correspondentes à frequência mais baixa com suporte do sensor. Quando frequências mais baixas são solicitadas pela função batch, os eventos são gerados nessa frequência. Ele pode ser usado pelo framework ou pelos aplicativos para estimar quando o FIFO do lote pode estar cheio. Se esse valor não for definido corretamente, o CTS vai falhar. Para sensores de modo de relatório único e especial, defina maxDelay como 0.

Para sensores contínuos, defina o período de amostragem máximo permitido em microssegundos.

O seguinte é aplicável a period_ns, maxDelay e minDelay:

  • period_ns está em nanossegundos, enquanto maxDelay/minDelay estão em microssegundos.
  • maxDelay sempre precisa caber em um número inteiro assinado de 32 bits. Ele é declarado como 64 bits em arquiteturas de 64 bits apenas por motivos de compatibilidade binária.

flags: esse campo define o modo de relatório do sensor e se ele é um sensor de ativação.

Se você não implementar o agrupamento e estiver apenas passando da versão 1.0 para a 1.3, defina como:

SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ONE_SHOT_MODE para sensores one-shot

SENSOR_FLAG_CONTINUOUS_MODE para sensores contínuos SENSOR_FLAG_ON_CHANGE_MODE para sensores de mudança, exceto proximidade SENSOR_FLAG_SPECIAL_REPORTING_MODE para sensores com modo de relatório especial, exceto o detector de inclinação.

SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ON_CHANGE_MODE para o sensor de proximidade e o sensor detector de inclinação oficial do Android.

Observações ao fazer upgrade da versão 1_1 ou 1_2

  • A função batch agora quase sempre tem sucesso, mesmo para sensores que não oferecem suporte a agrupamento, independente do valor do argumento de tempo limite. Os únicos casos em que a função batch pode falhar são erros internos ou um sensor_handle, incorreto ou um sampling_period_ns negativo ou max_report_latency_ns negativo.
  • A compatibilidade de um sensor com o agrupamento é definida por um fifoMaxEventCount maior que 0. Nas versões anteriores, ela era baseada no valor de retorno de batch().
  • Os sensores que oferecem suporte a agrupamento estão sempre no que chamamos de "modo de lote" em versões anteriores: mesmo que o parâmetro max_report_latency_ns seja 0, o sensor ainda precisa ser agrupado, ou seja, os eventos precisam ser armazenados no FIFO quando o SoC entra no modo de suspensão.
  • O parâmetro flags da função batch não é mais usado. DRY_RUN e WAKE_UPON_FIFO_FULL foram descontinuados e nunca serão transmitidos para a função batch.
  • O argumento de tempo limite de lote agora é chamado de max_report_latency.