Sensores HAL 1.0

A interface Sensors HAL, declarada emsens.h , representa a interface entre a estrutura Android e o software específico de 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 – libera o FIFO do sensor especificado e relata um evento de flush completo quando isso é feito.
  • poll - Retorna eventos de 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, consultesensores.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 reportados às aplicações. Normalmente, os sensores básicos aparecem primeiro, seguidos pelos sensores compostos.

Se vários sensores compartilharem o mesmo tipo de sensor e propriedade de ativação, o primeiro da lista será chamado de sensor “padrão”. É aquele 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 é o identificador do sensor para ativar/desativar. O identificador de um sensor é definido pelo campo handle de sua estrutura sensor_t .

enabled é definido como 1 para ativar ou 0 para desativar o sensor.

Os sensores one-shot se desativam automaticamente ao receber um evento, e ainda devem aceitar ser desativados por meio de uma chamada para activate(..., enabled=0) .

Sensores não ativados nunca impedem que o SoC entre no modo de suspensão; isto é, o HAL não deverá realizar um wake-lock parcial em nome das aplicações.

Os sensores de ativação, 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 deverá ser liberado.

Se enabled for 1 e o sensor já estiver ativado, esta função é autônoma e é bem-sucedida.

Se enabled for 0 e o sensor já estiver desativado, esta função é autônoma 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 em que o sensor deve funcionar, 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. Consulte o parágrafo max_report_latency_ns para obter 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, esta função está obsoleta e nunca é chamada. Em vez disso, a função batch é chamada para definir o parâmetro sampling_period_ns .

Na versão 1.0 do HAL, 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 flush complete ao final do FIFO de hardware para o sensor especificado e libere o FIFO; esses eventos são entregues normalmente (ou seja: como se a latência máxima de relatório tivesse expirado) e removidos do FIFO.

A liberação 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 flush complete será adicionado apenas para o sensor especificado.

Se o sensor especificado não tiver FIFO (sem buffer possível), ou se o FIFO estiver vazio no momento da chamada, flush ainda deverá ser bem-sucedida e enviar um evento de liberação completa para esse sensor. Isto se aplica a todos os sensores, exceto sensores de disparo único.

Quando flush é chamado, mesmo que um evento de flush já esteja no FIFO desse sensor, um evento adicional deve ser criado e adicionado ao final do FIFO, e o FIFO deve ser liberado. O número de chamadas flush deve ser igual ao número de eventos de conclusão de liberação criados.

flush não se aplica a sensores únicos ; se sensor_handle se referir a um sensor único, flush deverá retornar -EINVAL e não gerar nenhum evento de metadados completo de flush.

Esta função retorna 0 em caso de sucesso, -EINVAL se o sensor especificado for um sensor único ou não estiver 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 data . Esta função deve ser bloqueada 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 count . Esta função nunca deve retornar 0 (nenhum 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, seguida por activate(..., enable=1) .

Observe que na versão HAL 1_0, a ordem era oposta: activate foi chamado primeiro, seguido por set_delay .

Quando as características solicitadas de um sensor mudam enquanto ele está ativado, a função batch é chamada.

flush pode ser chamado a qualquer momento, mesmo em sensores não ativados (nesse caso deve retornar -EINVAL )

Quando um sensor é desativado, activate(..., enable=0) será chamado.

Paralelamente a essas chamadas, a função poll será chamada repetidamente para solicitar dados. poll pode ser chamada mesmo quando nenhum sensor está 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 sensors_module_t emsensores.h e a definição de hw_module_t para obter 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:

nome: uma string visível ao usuário que representa o sensor. Essa string geralmente contém o nome da peça do sensor subjacente, o tipo do sensor e se é um sensor de despertar. Por exemplo, “Acelerômetro LIS2HH12”, “Giroscópio não calibrado MAX21000”, “Barômetro de despertar BMP280”, “Vetor de rotação de jogo MPU6515”

identificador: O inteiro usado para se referir ao sensor ao registrá-lo ou gerar eventos a partir dele.

tipo: 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, 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, configure como SENSOR_STRING_TYPE_* . Quando o sensor possui 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 poderia usar stringType=”com.fictional_company.cool_product.unicorn_detector” . O stringType é usado para identificar exclusivamente tipos de sensores não oficiais. Consultesensores.h para obter mais informações sobre tipos e tipos de string.

requirePermission: 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 exigem permissão para acessar esse sensor. Alguns tipos de sensores, como o monitor de frequência cardíaca, têm uma requiredPermission obrigatória. Todos os sensores que fornecem informações confidenciais do usuário (como 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 única terá flags = SENSOR_FLAG_ONE_SHOT_MODE | SENSOR_FLAG_WAKE_UP . Os bits do flag 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 reportar 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 reporta valores em vários eixos, o intervalo se aplica a cada eixo. Por exemplo, um acelerômetro “+/- 2g” reportará maxRange = 2*9.81 = 2g .

resolução: A menor diferença no valor que o sensor pode medir. Geralmente calculado com base em maxRange e no número de bits na medição.

potência: O custo de energia para ativar o sensor, em miliamperes. Isso é quase sempre maior 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 do dispositivo estar em movimento, o consumo de energia durante o movimento é aquele relatado no campo power .

minDelay: Para sensores contínuos, o período de amostragem, em microssegundos, correspondente à taxa mais rápida que o sensor suporta. Consulte sampling_period_ns para obter detalhes sobre como esse valor é usado. Tenha em atenção que minDelay é expresso em microssegundos enquanto sampling_period_ns é expresso em nanossegundos. Para sensores on-change e modo de relatório especial, salvo especificação em contrário, minDelay deve ser 0. Para sensores one-shot, deve ser -1.

maxDelay: Para sensores contínuos e em mudança, o período de amostragem, em microssegundos, correspondente à taxa mais lenta que o sensor suporta. Consulte sampling_period_ns para obter detalhes sobre como esse valor é usado. Tenha em atenção que maxDelay é expresso em microssegundos, enquanto sampling_period_ns é expresso 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 deste 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 nos FIFOs deste sensor. É sempre maior ou igual a fifoReservedEventCount . Este valor é usado para estimar a rapidez com que o FIFO ficará cheio ao registrar no sensor a uma taxa específica, supondo que nenhum outro sensor esteja ativado. Em sistemas que não possuem um FIFO de hardware, fifoMaxEventCount é 0. Consulte Lote para obter mais detalhes.

Para sensores com tipo de sensor oficial, alguns 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 ser protegidos pela permissão SENSOR_PERMISSION_BODY_SENSORS .

sensores_evento_t

Os eventos de sensor gerados por sensores Android e relatados por meio da função de enquete são do type sensors_event_t . Aqui estão alguns campos importantes 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 que gerou o evento, conforme definido por sensor_t.type .

carimbo de data/hora: o carimbo de data/hora 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), e não a hora em que o evento foi relatado. timestamp deve estar sincronizado com o relógio elapsedRealtimeNano e, no caso de sensores contínuos, o jitter deve ser pequeno. A filtragem de carimbo de data e hora às vezes é necessária para satisfazer os requisitos de CDD, pois usar apenas o tempo de interrupção do SoC para definir os carimbos de data e hora causa jitter muito alto, e usar apenas o tempo do chip do sensor para definir os carimbos de data e hora pode causar dessincronização do relógio elapsedRealtimeNano , como o desvios do relógio do sensor.

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. Consultesensores.h e a definição dos diferentes tipos de sensores para obter uma descrição dos campos de dados. Para alguns sensores, a precisão das leituras também é informada como parte dos dados, através de um campo status . Este campo é canalizado apenas para os tipos de sensores 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 .

Metadados liberam eventos completos

Os eventos de metadados têm o mesmo tipo que os eventos normais de sensor: sensors_event_meta_data_t = sensors_event_t . Eles são retornados junto com outros eventos do sensor através de poll. Eles possuem os seguintes campos:

versão: deve ser META_DATA_VERSION

tipo: deve ser SENSOR_TYPE_META_DATA

sensor, reservado e carimbo de data/hora : deve ser 0

meta_data.what: Contém o tipo de metadados para este evento. Atualmente existe um único tipo de metadados válido: META_DATA_FLUSH_COMPLETE .

Os eventos META_DATA_FLUSH_COMPLETE representam a conclusão da liberação de um sensor FIFO. Quando meta_data.what=META_DATA_FLUSH_COMPLETE , meta_data.sensor deve ser definido como o identificador do sensor que foi liberado. Eles são gerados quando e somente quando flush é chamada em um sensor. Consulte a seção sobre a função de descarga para obter mais informações.