A interface HAL de sensores, declarada em sensors.h, representa a interface entre o framework do Android e o software específico do hardware. Uma implementação do HAL precisa definir cada função declarada em sensors.h. As funções principais são:
get_sensors_list
: retorna a lista de todos os sensores.activate
: inicia ou para um sensor.batch
: define os parâmetros de um sensor, como a frequência de amostragem e a latência máxima de relatórios.setDelay
: usado apenas na versão 1.0 do HAL. Define a frequência de amostragem para um determinado sensor.flush
: limpa o FIFO do sensor especificado e informa um evento de limpeza concluído quando isso é feito.poll
: retorna eventos de sensor disponíveis.
A implementação precisa ser thread-safe e permitir que essas funções sejam chamadas em linhas de execução diferentes.
A interface também define vários tipos usados por essas funções. O principal são:
sensors_module_t
sensors_poll_device_t
sensor_t
sensors_event_t
Além das seções abaixo, consulte sensors.h para mais informações sobre esses tipos.
get_sensors_list(lista)
int (*get_sensors_list)(struct sensors_module_t* module, struct sensor_t const** list);
Fornece a lista de sensores implementados pelo HAL. Consulte sensor_t para mais detalhes sobre como os sensores são definidos.
Os sensores aparecem na lista na ordem em que o os sensores serão informados aos aplicativos. Normalmente, os sensores básicos aparecem primeiro, seguidos pelos sensores compostos.
Se vários sensores compartilharem o mesmo tipo e a mesma propriedade de ativação, o primeiro
na lista será chamado de sensor "padrão". É aquele retornado pelo
getDefaultSensor(int sensorType, bool wakeUp)
:
Essa função retorna o número de sensores na lista.
ativar(sensor; verdadeiro/falso)
int (*activate)(struct sensors_poll_device_t *dev, int sensor_handle, int enabled);
Ativa ou desativa um sensor.
sensor_handle
é o identificador do sensor a ser ativado/desativado. O identificador de um sensor
é definido pelo campo handle
da estrutura sensor_t.
enabled
é definido como 1 para ativar ou 0 para desativar o sensor.
Os sensores únicos são desativados automaticamente ao receber um evento
e ainda precisam aceitar a desativação por uma chamada para activate(...,
enabled=0)
.
Sensores que não ativam nunca impedem que o SoC entre no modo de suspensão. Ou seja, o HAL não pode manter um wake lock parcial em nome de aplicativos.
Os sensores de ativação, ao fornecer eventos continuamente, podem impedir que o SoC entrar em modo de suspensão, mas se nenhum evento precisar ser fornecido, a parte o wake lock deve ser liberado.
Se enabled
for 1 e o sensor já estiver ativado, esta função será um ambiente autônomo.
e funciona.
Se enabled
for 0 e o sensor já estiver desativado, essa função será um ambiente autônomo.
e funciona.
Essa função retorna 0 em caso de sucesso e um número de erro negativo, caso contrário.
lote(sensor, sinalizações, período de amostragem, latência máxima do relatório)
int (*batch)( struct sensors_poll_device_1* dev, int sensor_handle, int flags, int64_t sampling_period_ns, int64_t max_report_latency_ns);
Define os parâmetros de um sensor, incluindo frequência de amostragem e máximo de relatórios latência. Essa função pode ser chamada enquanto o sensor está ativado. Nesse caso, ele não pode causar a perda de nenhuma medição do sensor: a transição de uma taxa de amostragem para outra não pode causar a perda de eventos, nem a transição de uma latência máxima alta para uma baixa.
sensor_handle
é a alça do sensor a ser configurado.
flags
não é usado no momento.
sampling_period_ns
é o período de amostragem em que o sensor
deve ser executada em nanossegundos. Consulte sampling_period_ns para
mais detalhes.
max_report_latency_ns
é o tempo máximo em que os eventos podem ser
atrasados antes de serem relatados pela HAL, em nanossegundos. Consulte o parágrafo max_report_latency_ns
para mais detalhes.
Essa função retorna 0 em caso de sucesso e um número de erro negativo, caso contrário.
setDelay(sensor, sampling period)
int (*setDelay)( struct sensors_poll_device_t *dev, int sensor_handle, int64_t sampling_period_ns);
Após a versão 1.0 da HAL, essa função foi descontinuada e nunca é chamada.
Em vez disso, a função batch
é chamada para definir o
parâmetro sampling_period_ns
.
Na versão 1.0 da HAL, foi usado setDelay em vez de lote para definir sample_period_ns.
descarga(sensor)
int (*flush)(struct sensors_poll_device_1* dev, int sensor_handle);
Adiciona um evento Clean Complete ao final do FIFO do hardware para o sensor especificado e limpa o FIFO. esses eventos sejam entregues como de costume (ou seja, como se a latência máxima dos relatórios expirou) e removido do FIFO.
A limpeza ocorre de forma assíncrona (ou seja, esta função precisa retornar imediatamente). Se a implementação usar um único FIFO para vários sensores, esse FIFO será limpa e o evento de limpeza completa é adicionado apenas para o sensor especificado.
Se o sensor especificado não tiver FIFO (sem armazenamento em buffer possível) ou se o FIFO,
estava vazio no momento da chamada, flush
ainda deve funcionar e
enviar um evento de limpeza completa para esse sensor. Isso se aplica a todos os sensores,
exceto os de disparo único.
Quando flush
é chamado, mesmo que um evento de limpeza já esteja no
FIFO para esse sensor, um outro precisa ser criado e adicionado ao final
do FIFO e o FIFO deve ser liberado. O número de chamadas flush
precisa ser igual ao número de eventos de limpeza completa criados.
flush
não se aplica a sensores one-shot.
Se sensor_handle
se referir a um sensor one-shot,
flush
precisará retornar -EINVAL
e não gerar nenhum
evento de limpeza de metadados completo.
Essa função retorna 0 em caso de sucesso, -EINVAL
se o sensor especificado for um
sensor único ou não foi ativado; caso contrário, será um número de erro negativo.
enquete().
int (*poll)(struct sensors_poll_device_t *dev, sensors_event_t* data, int
count);
Retorna uma matriz de dados do sensor preenchendo o argumento data
. Essa função
precisam ser bloqueados até que os eventos estejam disponíveis. Ele vai retornar o número de eventos lidos
em caso de sucesso ou um número de erro negativo em caso de erro.
O número de eventos retornados em data
precisa ser menor ou igual ao
argumento count
. Essa função nunca vai retornar 0 (nenhum evento).
Sequência de chamadas
Quando o dispositivo é inicializado, get_sensors_list
é chamado.
Quando um sensor é ativado, a função batch
é chamada com os
parâmetros solicitados, seguidos por activate(..., enable=1)
.
Na versão 1_0 da HAL, a ordem era o oposto: activate
era chamado.
primeiro, seguido por set_delay
.
Quando as características solicitadas de um sensor estão mudando enquanto ele está
ativado, a função batch
é chamada.
flush
pode ser chamado a qualquer momento, mesmo em sensores não ativados. Nesse caso,
ele precisa retornar -EINVAL
.
Quando um sensor é desativado, o método activate(..., enable=0)
é chamado.
Paralelamente a essas chamadas, a função poll
será chamada repetidamente para
solicitar dados. O poll
pode ser chamado mesmo quando nenhum sensor é ativado.
sensores_módulo_t
sensors_module_t
é o tipo usado para criar o módulo de hardware
do Android para os sensores. A implementação da HAL deve definir um objeto
HAL_MODULE_INFO_SYM
desse tipo para expor a função get_sensors_list. Consulte a
definição de sensors_module_t
em sensors.h e a definição de hw_module_t
para mais informações.
sensors_poll_device_t / sensors_poll_device_1_t
sensors_poll_device_1_t
contém o restante dos métodos definidos acima:
activate
, batch
, flush
e
poll
. O campo common
(do tipo hw_device_t)
define o número da versão da HAL.
sensor_t
sensor_t
representa um sensor
Android. Estes são alguns dos campos importantes:
name:uma string visível para o usuário que representa o sensor. Essa string geralmente contém o nome da parte do sensor subjacente, o tipo do sensor e se ele é um sensor de ativação. Por exemplo, "Acelerômetro LIS2HH12", "Giroscópio MAX21000 não calibrado", "Barômetro de ativação BMP280", "Vetor de rotação do jogo MPU6515"
handle: o número inteiro usado para se referir ao sensor ao se registrar nele ou gerar eventos dele.
type: o tipo do sensor. Confira a explicação do sensor
Digite O que são os sensores do Android? para saber mais e consulte Tipos de sensores para conferir os tipos oficiais. Para
tipos de sensores não oficiais, type
precisa começar com SENSOR_TYPE_DEVICE_PRIVATE_BASE
.
stringType: o tipo do sensor como uma string. Quando o
o sensor tem um tipo oficial, definido como SENSOR_STRING_TYPE_*
. Quando
o sensor tem um tipo específico do fabricante, stringType
precisa
começar com o nome de domínio reverso do fabricante. Por exemplo, um sensor (digamos, um
detector de unicórnio) definido pela equipe de Produtos legais em
Empresa fictícia pode ser usada
stringType=”com.fictional_company.cool_product.unicorn_detector”
O stringType
é usado para identificar exclusivamente os tipos de sensores
não oficiais. Consulte sensors.h para saber mais sobre tipos e string
tipos
requiredPermission:uma string que representa a permissão.
necessários para os aplicativos verem, registrarem e receberem o sensor
os dados. Uma string vazia significa que os aplicativos não precisam de nenhuma permissão para
acessar esse sensor. Alguns tipos de sensor, como o monitor de frequência cardíaca, têm
requiredPermission
obrigatório. Todos os sensores que fornecem informações sensíveis
do usuário (como a frequência cardíaca) precisam ser protegidos por uma
permissão.
flags: flags para esse sensor, que definem o modo de relatório do sensor e se
ele é um sensor de ativação ou não. Por exemplo, um sensor de ativação único
terá flags = SENSOR_FLAG_ONE_SHOT_MODE | SENSOR_FLAG_WAKE_UP
. Os pedaços de
as sinalizações que não são usadas na versão atual da HAL precisam ficar iguais a 0.
maxRange:o valor máximo que o sensor pode informar, na mesma unidade que o
os valores informados. O sensor precisa ser capaz de informar valores sem saturar
dentro de [-maxRange; maxRange]
. Isso significa que o intervalo total
sensor no sentido genérico é 2*maxRange
. Quando o sensor informa valores em
vários eixos, o intervalo se aplica a cada eixo. Por exemplo, um acelerômetro "+/- 2g"
vai informar maxRange = 2*9.81 = 2g
.
resolução: a menor diferença de valor que o sensor pode medir.
Geralmente calculado com base em maxRange
e no número de bits na medição.
power: o custo de energia para ativar o sensor, em miliampéres.
Isso quase sempre é maior que o consumo de energia informado na
folha de dados do sensor. Consulte Sensores básicos != físicos
sensores para mais detalhes e consulte Medição de energia
para detalhes sobre como medir o consumo de energia de um sensor.
Se o consumo de energia do sensor depender de se o dispositivo está em movimento, o
consumo de energia em movimento será o informado no campo
power
.
minDelay: para sensores contínuos, o período de amostragem, em
microssegundos, correspondendo à taxa mais rápida que o sensor aceita. Consulte sample_period_ns para
detalhes sobre como esse valor é usado. Esteja ciente de que minDelay
é
expresso em microssegundos, enquanto sampling_period_ns
está no
nanossegundos. Para sensores durante a mudança e no modo de relatório especial, a menos que
especificado de outra forma, minDelay
precisa ser 0. No caso dos sensores one-shot,
deve ser -1.
maxDelay: para sensores contínuos e ao mudar, a amostragem
período, em microssegundos, correspondendo à taxa mais lenta
suporta. Consulte sampling_period_ns para
saber como esse valor é usado. Esteja ciente de que maxDelay
é
expresso em microssegundos, enquanto sampling_period_ns
está no
nanossegundos. Para sensores especiais e de um disparo, maxDelay
precisa ser
0.
fifoScheduledEventCount: o número de eventos reservados para esse sensor no
FIFO de hardware. Se houver um FIFO dedicado para esse sensor,
fifoReservedEventCount
é o tamanho deste FIFO dedicado. Se o FIFO é
compartilhada com outros sensores, fifoReservedEventCount
é o tamanho da parte do
no FIFO reservado para esse sensor. Na maioria dos sistemas FIFO compartilhados,
sistemas que não têm um FIFO de hardware, esse valor será 0.
fifoMaxEventCount: o número máximo de eventos que podem
ser armazenados nos FIFOs deste sensor. Isto é sempre maior ou igual a
fifoReservedEventCount
: Esse valor é usado para estimar a
rapidez com que a FIFO vai ficar cheia ao se registrar no sensor a uma taxa
específica, supondo que nenhum outro sensor seja ativado. Em sistemas que não têm um
FIFO de hardware, fifoMaxEventCount
é 0. Consulte Agrupamento em lotes para mais detalhes.
Para sensores com um tipo oficial, alguns campos são substituídos
pelo framework. Por exemplo, sensores de acelerômetro.
precisam usar um modo contínuo de geração de relatórios, e os monitores de frequência cardíaca
precisam ser protegidas pela política de SENSOR_PERMISSION_BODY_SENSORS
permissão.
sensores_event_t
Os eventos de sensor gerados por sensores do Android e informados pela função poll são de type sensors_event_t
. Confira alguns
campos importantes de sensors_event_t
:
version:precisa ser sizeof(struct sensors_event_t)
.
sensor:a alça do sensor que gerou o evento, conforme definido pelo
sensor_t.handle
type:o tipo do sensor que gerou o evento, conforme definido pelo
sensor_t.type
carimbo de data/hora: o carimbo de data/hora do evento em nanossegundos. É o horário em que o
evento ocorreu (uma etapa foi realizada ou uma medição do acelerômetro foi feita),
não o horário em que o evento foi informado. O timestamp
precisa estar sincronizado com o
relógio elapsedRealtimeNano
e, no caso de sensores contínuos, a instabilidade
precisa ser pequeno. Às vezes, a filtragem de carimbo de data/hora é necessária para atender ao CDD.
como usar apenas o horário de interrupção de SoC para definir os carimbos de data/hora
causa instabilidade muito alta e usa apenas o tempo do chip do sensor para definir o
os carimbos de data/hora podem causar dessincronização do
Relógio elapsedRealtimeNano
, à medida que o relógio do sensor muda.
Dados e campos sobrepostos: os valores medidos pelo
sensor. O significado e as unidades desses campos são específicos para cada tipo de
sensor. Consulte sensors.h e a definição dos diferentes tipos de sensor para ver uma descrição dos
campos de dados. Para alguns sensores, a precisão das leituras também é informada.
como parte dos dados, usando um campo status
. Este campo só é
que são transmitidos para os tipos de sensor selecionados, aparecendo na camada do SDK
o valor de acurácia. Para esses sensores, o fato de que o campo de status deve ser definido
é mencionado no tipo de sensor deles.
definição.
Eventos de limpeza de metadados concluída
Os eventos de metadados têm o mesmo tipo que os eventos de sensor normais:
sensors_event_meta_data_t = sensors_event_t
. Eles são retornados com
outros eventos de sensor por meio de pesquisa. Eles têm os seguintes campos:
version: precisa ser META_DATA_VERSION
type: precisa ser SENSOR_TYPE_META_DATA
sensor, reservado e carimbo de data/hora: precisa ser 0.
meta_data.what: contém o tipo de metadados para este evento. No momento, há um
único tipo de metadados válido: META_DATA_FLUSH_COMPLETE
.
Os eventos META_DATA_FLUSH_COMPLETE
representam a conclusão da limpeza de um
sensor FIFO. Quando meta_data.what=META_DATA_FLUSH_COMPLETE
, meta_data.sensor
precisa ser definido como o identificador do sensor que foi limpo. São
gerados somente quando flush
é chamado em um sensor. Consulte a seção sobre
a função clean para mais informações.