A interface Sensors HAL, declarada em sensores.h , representa a interface entre o framework Android e o software específico do hardware. Uma implementação HAL deve definir cada função declarada em sensores.h. As principais funções 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 frequência de amostragem e latência máxima de relatório. -
setDelay
- Usado apenas no HAL versão 1.0. Define a frequência de amostragem para um determinado sensor. -
flush
- Lava o FIFO do sensor especificado e relata um evento de lavagem completa quando isso é feito. -
poll
- Retorna os eventos do sensor disponíveis.
A implementação deve ser thread-safe e permitir que essas funções sejam chamadas de diferentes threads.
A interface também define vários tipos usados por essas funções. Os principais tipos são:
-
sensors_module_t
-
sensors_poll_device_t
-
sensor_t
-
sensors_event_t
Além das seções abaixo, consulte sensores.h para obter 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 obter detalhes sobre como os sensores são definidos.
A ordem em que os sensores aparecem na lista é a ordem em que os sensores serão relatados aos aplicativos. Normalmente, os sensores básicos aparecem primeiro, seguidos pelos sensores compostos.
Se vários sensores compartilham o mesmo tipo de sensor e propriedade de ativação, o primeiro da lista é chamado de sensor “padrão”. É o retornado por getDefaultSensor(int sensorType, bool wakeUp)
.
Esta 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
é a alça do sensor para ativar/desativar. O handle de um sensor é definido pelo campo handle
de sua estrutura sensor_t .
enabled
é definido como 1 para habilitar ou 0 para desabilitar o sensor.
Os sensores one-shot se desativam automaticamente ao receber um evento, devendo ainda aceitar ser desativados através de uma chamada para activate(..., enabled=0)
.
Os sensores que não despertam nunca impedem que o SoC entre no modo de suspensão; ou seja, o HAL não deve manter um wake-lock parcial em nome dos aplicativos.
Os sensores de despertar, ao entregar eventos continuamente, podem impedir que o SoC entre no modo de suspensão, mas se nenhum evento precisar ser entregue, o wake-lock parcial deve ser liberado.
Se enabled
for 1 e o sensor já estiver ativado, esta função é no-op e é bem-sucedida.
Se enabled
for 0 e o sensor já estiver desativado, esta função é no-op e é bem-sucedida.
Esta função retorna 0 em caso de sucesso e um número de erro negativo caso contrário.
lote (sensor, sinalizadores, 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 latência máxima do relatório . Esta função pode ser chamada enquanto o sensor está ativado, caso em que não deve causar a perda de nenhuma medição do sensor: A transição de uma taxa de amostragem para outra não pode causar perda de eventos, nem a transição de uma latência de relatório máxima alta para uma baixa latência máxima do relatório.
sensor_handle
é o identificador do sensor a ser configurado.
flags
não está sendo usado no momento.
sampling_period_ns
é o período de amostragem no qual o sensor deve ser executado, em nanossegundos. Consulte sampling_period_ns para obter mais detalhes.
max_report_latency_ns
é o tempo máximo pelo qual os eventos podem ser atrasados antes de serem relatados por meio do HAL, em nanossegundos. Veja o parágrafo max_report_latency_ns para mais detalhes.
Esta função retorna 0 em caso de sucesso e um número de erro negativo caso contrário.
setDelay(sensor, período de amostragem)
int (*setDelay)( struct sensors_poll_device_t *dev, int sensor_handle, int64_t sampling_period_ns);
Após a versão 1.0 do HAL, essa função é preterida e nunca é chamada. Em vez disso, a função batch
é chamada para definir o parâmetro sampling_period_ns
.
No HAL versão 1.0, setDelay foi usado em vez de batch para definir sampling_period_ns .
descarga (sensor)
int (*flush)(struct sensors_poll_device_1* dev, int sensor_handle);
Adicione um evento de liberação completa ao final do FIFO de hardware para o sensor especificado e libera o FIFO; esses eventos são entregues como de costume (ou seja: como se a latência máxima de relatório tivesse expirado) e removidos do FIFO.
A descarga acontece de forma assíncrona (ou seja: esta função deve retornar imediatamente). Se a implementação usar um único FIFO para vários sensores, esse FIFO será liberado e o evento de liberação completa será adicionado apenas para o sensor especificado.
Se o sensor especificado não tiver FIFO (sem buffering possível), ou se o FIFO estava vazio no momento da chamada, a flush
ainda deve ser bem-sucedida e enviar um evento de liberação completa para esse sensor. Isso se aplica a todos os sensores que não sejam sensores de disparo único.
Quando o flush
é chamado, mesmo que um evento de flush já esteja no FIFO para aquele sensor, um evento adicional deve ser criado e adicionado ao final do FIFO, e o FIFO deve ser liberado. O número de chamadas de flush
deve ser igual ao número de eventos de liberação completa criados.
flush
não se aplica a sensores de disparo único ; se sensor_handle
se referir a um sensor de disparo único, a liberação deve retornar flush
e não gerar nenhum evento de metadados de -EINVAL
completa.
Esta função retorna 0 em caso de sucesso, -EINVAL
se o sensor especificado for um sensor de disparo único ou não foi habilitado, e um número de erro negativo caso contrário.
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 de data
. Esta função deve bloquear até que os eventos estejam disponíveis. Ele 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 nos data
deve ser menor ou igual ao argumento de count
. Esta função nunca deve retornar 0 (sem evento).
Sequência de chamadas
Quando o dispositivo é inicializado, get_sensors_list
é chamado.
Quando um sensor é ativado, a função batch
será chamada com os parâmetros solicitados, seguido de activate(..., enable=1)
.
Observe que no HAL versão 1_0, a ordem era oposta: activate
foi chamado primeiro, seguido por set_delay
.
Quando as características solicitadas de um sensor estão mudando enquanto ele está ativado, a função de batch
é chamada.
flush
pode ser chamado a qualquer momento, mesmo em sensores não ativados (nesse caso deve retornar -EINVAL
)
Quando um sensor for desativado, activate(..., enable=0)
será chamado.
Em paralelo a essas chamadas, a função poll
será chamada repetidamente para solicitar dados. poll
pode ser chamado mesmo quando nenhum sensor estiver ativado.
sensores_módulo_t
sensors_module_t
é o tipo usado para criar o módulo de hardware Android para os sensores. A implementação do HAL deve definir um objeto HAL_MODULE_INFO_SYM
deste tipo para expor a função get_sensors_list . Consulte a definição de sensores_module_t em sensores.he a definição de sensors_module_t
para hw_module_t
mais informações.
sensores_poll_device_t / sensores_poll_device_1_t
sensors_poll_device_1_t
contém o restante dos métodos definidos acima: activate
, batch
, flush
e poll
. Seu campo common
(do tipo hw_device_t ) define o número da versão do HAL.
sensor_t
sensor_t
representa um sensor Android . Aqui estão alguns de seus campos importantes:
name: uma string visível ao usuário que representa o sensor. Essa string geralmente contém o nome da parte do sensor subjacente, o tipo do sensor e se é um sensor de ativação. Por exemplo, “LIS2HH12 Acelerômetro”, “MAX21000 Giroscópio não calibrado”, “BMP280 Wake-up Barometer”, “MPU6515 Game Rotation Vector”
handle: O inteiro usado para se referir ao sensor ao se registrar nele ou gerar eventos a partir dele.
type: O tipo do sensor. Veja a explicação do tipo de sensor em O que são sensores Android? para obter mais detalhes e consulte Tipos de sensores para tipos de sensores oficiais. Para tipos de sensores não oficiais, o type
deve começar com SENSOR_TYPE_DEVICE_PRIVATE_BASE
stringType: O tipo do sensor como uma string. Quando o sensor tiver um tipo oficial, defina como SENSOR_STRING_TYPE_*
. Quando o sensor tem um tipo específico do fabricante, stringType
deve começar com o nome de domínio reverso do fabricante. Por exemplo, um sensor (digamos, um detector de unicórnio) definido pela equipe Cool-product da Fictional-Company pode usar stringType=”com.fictional_company.cool_product.unicorn_detector”
. O stringType
é usado para identificar exclusivamente tipos de sensores não oficiais. Consulte sensores.h para obter mais informações sobre tipos e tipos de string.
requiredPermission: Uma string que representa a permissão que os aplicativos devem possuir para ver o sensor, registrar-se nele e receber seus dados. Uma string vazia significa que os aplicativos não precisam de permissão para acessar esse sensor. Alguns tipos de sensores, como o monitor de frequência cardíaca, têm um requiredPermission
obrigatório. Todos os sensores que fornecem informações confidenciais do usuário (como a frequência cardíaca) devem ser protegidos por uma permissão.
sinalizadores: sinalizadores para este sensor, definindo o modo de relatório do sensor e se o sensor é um sensor de despertar ou não. Por exemplo, um sensor de ativação de disparo único terá flags = SENSOR_FLAG_ONE_SHOT_MODE | SENSOR_FLAG_WAKE_UP
. Os bits do sinalizador que não são usados na versão atual do HAL devem ser deixados iguais a 0.
maxRange: O valor máximo que o sensor pode reportar, na mesma unidade dos valores reportados. O sensor deve ser capaz de relatar valores sem saturar dentro de [-maxRange; maxRange]
. Observe que isso significa que o alcance total do sensor no sentido genérico é 2*maxRange
. Quando o sensor informa valores em vários eixos, a faixa se aplica a cada eixo. Por exemplo, um acelerômetro “+/- 2g” reportará maxRange = 2*9.81 = 2g
.
resolução: A menor diferença de valor que o sensor pode medir. Normalmente calculado com base em maxRange
e o número de bits na medição.
power: O custo de energia para habilitar o sensor, em miliAmps. Isso é quase sempre mais do que o consumo de energia relatado na folha de dados do sensor subjacente. Consulte Sensores básicos != sensores físicos para obter mais detalhes e consulte Processo de medição de energia para obter detalhes sobre como medir o consumo de energia de um sensor. Se o consumo de energia do sensor depende de o dispositivo estar em movimento, o consumo de energia durante o movimento é o relatado no campo de power
.
minDelay: Para sensores contínuos, o período de amostragem, em microssegundos, corresponde à taxa mais rápida que o sensor suporta. Consulte sampling_period_ns para obter detalhes sobre como esse valor é usado. Observe que minDelay
é expresso em microssegundos enquanto sampling_period_ns
é em nanossegundos. Para sensores de modo de relatório em mudança e especial, a menos que especificado de outra forma, minDelay
deve ser 0. Para sensores de disparo único, deve ser -1.
maxDelay: Para sensores contínuos e em mudança, o período de amostragem, em microssegundos, corresponde à taxa mais lenta que o sensor suporta. Consulte sampling_period_ns para obter detalhes sobre como esse valor é usado. Observe que maxDelay
é expresso em microssegundos enquanto sampling_period_ns
é em nanossegundos. Para sensores especiais e de disparo único, maxDelay
deve ser 0.
fifoReservedEventCount: O número de eventos reservados para este sensor no FIFO de hardware. Se houver um FIFO dedicado para este sensor, então fifoReservedEventCount
será o tamanho desse FIFO dedicado. Se o FIFO for compartilhado com outros sensores, fifoReservedEventCount
será o tamanho da parte do FIFO reservada para esse sensor. Na maioria dos sistemas FIFO compartilhados e em sistemas que não possuem um FIFO de hardware, esse valor é 0.
fifoMaxEventCount: O número máximo de eventos que podem ser armazenados nas FIFOs para este sensor. Isso é sempre maior ou igual a fifoReservedEventCount
. Este valor é usado para estimar a rapidez com que o FIFO ficará cheio ao se registrar no sensor em uma taxa específica, supondo que nenhum outro sensor seja ativado. Em sistemas que não possuem um FIFO de hardware, fifoMaxEventCount
é 0. Consulte Batching para obter mais detalhes.
Para sensores com um tipo de sensor oficial, alguns dos campos são substituídos pela estrutura. Por exemplo, os sensores do acelerômetro são forçados a ter um modo de relatório contínuo e os monitores de frequência cardíaca são forçados a serem protegidos pela permissão SENSOR_PERMISSION_BODY_SENSORS
.
sensores_event_t
Os eventos de sensor gerados por sensores Android e relatados por meio da função poll são do type sensors_event_t
. Aqui estão alguns campos importantes de sensors_event_t
:
versão: deve ser sizeof(struct sensors_event_t)
sensor: o identificador do sensor que gerou o evento, conforme definido por sensor_t.handle
.
type: O tipo de sensor do sensor que gerou o evento, conforme definido por sensor_t.type
.
timestamp: O timestamp do evento em nanossegundos. Esta é a hora em que o evento aconteceu (um passo foi dado ou uma medição do acelerômetro foi feita), não a hora em que o evento foi relatado. timestamp
deve ser sincronizado com o relógio elapsedRealtimeNano
e, no caso de sensores contínuos, o jitter deve ser pequeno. A filtragem de timestamp às vezes é necessária para satisfazer os requisitos do CDD, pois usar apenas o tempo de interrupção do SoC para definir os timestamps causa jitter muito alto e usar apenas o tempo do chip do sensor para definir os timestamps pode causar dessincronização do relógio elapsedRealtimeNano
, pois o O relógio do sensor oscila.
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. Veja sensores.he a definição dos diferentes tipos de Sensor para uma descrição dos campos de dados. Para alguns sensores, a precisão das leituras também é informada como parte dos dados, por meio de um campo de status
. Este campo só é canalizado para os tipos de sensor selecionados, aparecendo na camada SDK como um valor de precisão. Para esses sensores, o fato de que o campo de status deve ser definido é mencionado na definição do tipo de sensor .
Eventos completos de liberação de metadados
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 junto com outros eventos do sensor por meio de pesquisa. Eles possuem os seguintes campos:
versão: deve ser META_DATA_VERSION
tipo: deve ser SENSOR_TYPE_META_DATA
sensor, reservado e timestamp : deve ser 0
meta_data.what: contém o tipo de metadados para este evento. Atualmente, há um único tipo de metadados válido: META_DATA_FLUSH_COMPLETE
.
Os eventos META_DATA_FLUSH_COMPLETE
representam a conclusão da descarga de um sensor FIFO. Quando meta_data.what=META_DATA_FLUSH_COMPLETE
, meta_data.sensor
deve ser definido para o identificador do sensor que foi liberado. Eles são gerados quando e somente quando a flush
é chamada em um sensor. Consulte a seção sobre a função de descarga para obter mais informações.