Sensoren HAL 1.0

Die in sensors.h deklarierte HAL-Schnittstelle ist die Schnittstelle zwischen dem Android-Framework und dem Hardware-spezifische Software zu implementieren. Eine HAL-Implementierung muss jede Funktion definieren Sensoren.h. Die Hauptfunktionen sind:

  • get_sensors_list: gibt die Liste aller Sensoren zurück.
  • activate – Startet oder stoppt einen Sensor.
  • batch: Legt die Parameter eines Sensors fest, z. B. die Abtasthäufigkeit und der Maximalwert Berichtslatenz.
  • setDelay: Wird nur in HAL-Version 1.0 verwendet. Legt die Abtastrate für einen bestimmten Sensor fest.
  • flush – Der FIFO des angegebenen Sensors wird geleert und es wird ein Ereignis ausgegeben, wenn der Vorgang abgeschlossen ist.
  • poll – Gibt verfügbare Sensorereignisse zurück.

Die Implementierung muss threadsicher sein und das Aufrufen dieser Funktionen zulassen aus verschiedenen Threads.

Über die -Schnittstelle werden auch mehrere Typen definiert, die von diesen Funktionen verwendet werden. Die wichtigsten Typen sind:

  • sensors_module_t
  • sensors_poll_device_t
  • sensor_t
  • sensors_event_t

Zusätzlich zu den Abschnitten unten finden Sie unter sensors.h weitere Informationen zu diesen Typen.

get_sensors_list(list)

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

Liste der von der HAL implementierten Sensoren. Weitere Informationen zur Definition der Sensoren findest du unter sensor_t.

Die Sensoren erscheinen in der Liste an die Anwendungen gemeldet werden. Normalerweise werden zuerst die Basissensoren angezeigt, gefolgt von den Composite-Sensoren.

Wenn mehrere Sensoren denselben Sensortyp und dieselbe Weckeigenschaft haben, wird der erste in der Liste als „Standardsensor“ bezeichnet. Es handelt sich um die von getDefaultSensor(int sensorType, bool wakeUp)

Diese Funktion gibt die Anzahl der Sensoren in der Liste zurück.

activate(sensor, true/false)

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

Aktiviert oder deaktiviert einen Sensor.

sensor_handle ist der Ziehpunkt des Sensors, der aktiviert oder deaktiviert werden soll. Der Handle eines Sensors wird durch das Feld handle der Struktur sensor_t definiert.

Wenn enabled auf „1“ gesetzt ist, ist der Sensor aktiviert. Bei „0“ ist er deaktiviert.

One-Shot-Sensoren werden beim Empfang eines Ereignisses automatisch deaktiviert. und sie müssen der Deaktivierung durch einen Aufruf von activate(..., enabled=0) zustimmen.

Nicht-Aktivierungssensoren verhindern niemals, dass das SoC in den Ruhemodus wechselt. das hat der HAL keinen Teil-Wakelock im Namen von Anwendungen.

Wake-up-Sensoren können bei kontinuierlicher Bereitstellung von Ereignissen verhindern, dass das SoC in den Sperrmodus versetzt werden, aber wenn kein Ereignis übermittelt werden muss, muss freigegeben werden.

Wenn enabled = 1 ist und der Sensor bereits aktiviert ist, wird diese Funktion nicht ausgeführt und der Vorgang ist erfolgreich.

Wenn enabled 0 ist und der Sensor bereits deaktiviert ist, ist diese Funktion eine Nullfunktion. und erfolgreich ist.

Diese Funktion gibt bei Erfolg 0 und ansonsten eine negative Fehlerzahl zurück.

batch(sensor, flags, sampling period, maximum report latency)

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

Hiermit werden die Parameter eines Sensors festgelegt, einschließlich Abtastrate und maximaler Berichtslatenz. Diese Funktion kann aufgerufen werden, während der Sensor aktiviert ist: In diesem Fall darf dies nicht zu einem Verlust von Sensormessungen führen: Übergang von einer Stichprobenrate zur anderen Rate verloren gegangen sind. Ebenso wenig Übergang von einer hohen maximalen Berichtslatenz zu einem niedrigen maximalen Bericht Latenz.

sensor_handle ist der Handle des zu konfigurierenden Sensors.

flags wird derzeit nicht verwendet.

sampling_period_ns ist die Abtastzeit, mit der der Sensor ausgeführt werden soll, in Nanosekunden. Siehe sampling_period_ns für erhalten Sie weitere Informationen.

max_report_latency_ns ist die maximale Zeit, innerhalb der Ereignisse in Nanosekunden, bevor sie über den HAL gemeldet werden. Siehe max_report_latenz_ns finden Sie weitere Informationen.

Diese Funktion gibt bei Erfolg 0 und ansonsten eine negative Fehlerzahl zurück.

setDelay(Sensor, Stichprobenzeitraum)

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

Nach HAL Version 1.0 ist diese Funktion veraltet und wird nie aufgerufen. Stattdessen wird die Funktion batch aufgerufen, um den sampling_period_ns-Parameter.

In HAL-Version 1.0 wurde zum Festlegen von sampling_period_ns anstelle eines Batches setDelay verwendet.

flush(sensor)

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

Fügen Sie am Ende des Hardware-FIFO für den angegebenen Sensor ein vollständiges Flush-Ereignis hinzu und leeren Sie den FIFO. Diese Ereignisse werden wie gewohnt gesendet (d. h., als wäre die maximale Berichtslatenz abgelaufen) und aus dem FIFO entfernt.

Das Leeren erfolgt asynchron (d. h., diese Funktion muss sofort zurückgeben). Wenn in der Implementierung ein einzelner FIFO für mehrere Sensoren verwendet wird, wird dieser FIFO geleert und das Ereignis „Flush complete“ wird nur für den angegebenen Sensor hinzugefügt.

Wenn der angegebene Sensor keinen FIFO hat (keine Pufferung möglich) oder der FIFO, zum Zeitpunkt des Aufrufs leer war, muss flush trotzdem erfolgreich sein und für diesen Sensor ein Ereignis des abgeschlossenen Leerens Das gilt für alle Sensoren mit Ausnahme von Einmalsensoren.

Wenn flush aufgerufen wird, selbst wenn ein Leerung-Ereignis bereits im FIFO für diesen Sensor muss ein zusätzlicher Sensor erstellt und am Ende des Sensors hinzugefügt werden. und der FIFO muss geleert werden. Die Anzahl der flush-Aufrufe muss der Anzahl der erstellten Ereignisse vom Typ „Flush complete“ entsprechen.

flush gilt nicht für One-Shot-Sensoren. Wenn sensor_handle sich auf einen One-Shot-Sensor bezieht, muss flush -EINVAL zurückgeben und darf kein Ereignis vom Typ „Metadaten vollständig löschen“ generieren.

Diese Funktion gibt bei Erfolg 0 und -EINVAL zurück, wenn der angegebene Sensor ein One-Shot-Sensor oder nicht aktiviert, andernfalls eine negative Fehlerzahl.

poll()

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

Gibt ein Array von Sensordaten zurück, indem das Argument data ausgefüllt wird. Diese Funktion müssen blockiert werden, bis Ereignisse verfügbar sind. Bei Erfolg wird die Anzahl der gelesenen Ereignisse zurückgegeben, bei einem Fehler eine negative Fehlernummer.

Die Anzahl der in data zurückgegebenen Ereignisse muss kleiner oder gleich sein Das Argument count. Diese Funktion darf niemals den Wert 0 (kein Ereignis) zurückgeben.

Aufrufabfolge

Beim Starten des Geräts wird get_sensors_list aufgerufen.

Wenn ein Sensor aktiviert wird, wird die Funktion batch mit dem Parameter Angeforderte Parameter, gefolgt von activate(..., enable=1).

In HAL-Version 1_0 war die Reihenfolge umgekehrt: activate wurde zuerst aufgerufen, gefolgt von set_delay.

Wenn sich die angeforderten Eigenschaften eines Sensors ändern, während er aktiviert ist, wird die batch-Funktion aufgerufen.

flush kann jederzeit aufgerufen werden, auch bei nicht aktivierten Sensoren (in diesem Fall) Es muss -EINVAL zurückgegeben werden.

Wenn ein Sensor deaktiviert wird, wird activate(..., enable=0) aufgerufen.

Parallel zu diesen Aufrufen wird die Funktion poll wiederholt aufgerufen, Daten anzufordern. poll kann auch dann aufgerufen werden, wenn keine Sensoren aktiviert sind.

Sensorenmodult

sensors_module_t ist der Typ, der zum Erstellen des Android-Hardwaremoduls für die Sensoren verwendet wird. Die Implementierung des HAL muss ein Objekt definieren. HAL_MODULE_INFO_SYM dieses Typs, um die Funktion get_sensors_list verfügbar zu machen. Weitere Informationen finden Sie in der Definition von sensors_module_t in sensors.h und in der Definition von hw_module_t.

sensor_poll_device_t / sensor_poll_device_1_t

sensors_poll_device_1_t enthält die restlichen oben definierten Methoden: activate, batch, flush und poll. Das Feld common (vom Typ hw_device_t) definiert die Versionsnummer des HAL.

Sensor_t

sensor_t steht für ein Android- . Hier sind einige wichtige Felder:

name: Ein für Nutzer sichtbarer String, der den Sensor darstellt. Dieser String enthält häufig den Teilnamen des zugrunde liegenden Sensors, den Sensortyp und ob es sich um einen Wecksensor handelt. Beispiel: „LIS2HH12-Beschleunigungsmesser“, „MAX21000 Unkalibrated Gyrosscope“, „BMP280 Wake-up Barometer“, „MPU6515 Game“ Rotationsvektor“

handle: Die Ganzzahl, die sich auf den Sensor bezieht, wenn er registriert oder Ereignisse von ihm generiert werden.

type: Der Sensortyp. Weitere Informationen finden Sie in der Erklärung zum Sensortyp unter Was sind Android-Sensoren? und unter Sensortypen. Für nicht offizielle Sensortypen, type muss mit SENSOR_TYPE_DEVICE_PRIVATE_BASE beginnen

stringType: Der Sensortyp als String. Wenn der Parameter Sensor hat einen offiziellen Typ, der auf SENSOR_STRING_TYPE_* eingestellt ist. Wann? hat der Sensor einen herstellerspezifischen Typ, stringType muss mit dem Reverse-Domainnamen des Herstellers beginnen. Ein Sensor (z. B. Einhorndetektor, die vom Cool-product-Team bei Das fiktive Unternehmen könnte stringType=”com.fictional_company.cool_product.unicorn_detector” Die stringType wird verwendet, um nicht offizielle Sensoren eindeutig zu identifizieren Typen. Weitere Informationen zu Typen und Strings finden Sie unter sensors.h. Typen.

requiredPermission: Ein String, der die Berechtigung darstellt, die Anwendungen benötigen, um den Sensor zu sehen, sich bei ihm zu registrieren und seine Daten zu empfangen. Ein leerer String bedeutet, dass für Anwendungen keine Berechtigung zum Ausführen dieser Aktion erforderlich ist. auf diesen Sensor zugreifen können. Für einige Sensortypen wie den Herzfrequenzmesser ist eine obligatorische requiredPermission erforderlich. Alle Sensoren liefern sensible Benutzerinformationen (z. B. die Herzfrequenz) durch eine Berechtigung.

flags:Flags für diesen Sensor, mit denen der Berichtsmodus des Sensors definiert und angegeben wird, ob ob der Sensor eine Weckzeit ist oder nicht. Ein Einmal-Wecksensor hat beispielsweise flags = SENSOR_FLAG_ONE_SHOT_MODE | SENSOR_FLAG_WAKE_UP. Die Bits des Flags, die in der aktuellen HAL-Version nicht verwendet werden, müssen auf „0“ gesetzt bleiben.

maxRange: Der maximale Wert, den der Sensor melden kann, in denselben Einheiten wie die gemeldeten Werte. Der Sensor muss in der Lage sein, Werte ohne Übersättigung innerhalb von [-maxRange; maxRange] zu erfassen. Das bedeutet, dass der Gesamtbereich des Sensors im generischen Sinne 2*maxRange ist. Wenn der Sensor Werte über gilt der Bereich für jede Achse. Ein Beschleunigungsmesser mit der Angabe „+/- 2 g“ meldet beispielsweise maxRange = 2*9.81 = 2g.

Auflösung: Der kleinste Wertunterschied, den der Sensor messen kann. Wird in der Regel anhand von maxRange und der Anzahl der Bits in der Messung berechnet.

power:Die Kosten für das Aktivieren des Sensors in MilliAmp. Das ist fast immer höher als der im Datenblatt des zugrunde liegenden Sensors angegebene Energieverbrauch. Siehe Basissensoren != physisch Sensoren, um weitere Informationen zu erhalten, und siehe Leistungsmessung weitere Informationen dazu, wie Sie den Stromverbrauch eines Sensors messen können. Wenn der Stromverbrauch des Sensors davon abhängt, ob das Gerät bewegt wird, Der Stromverbrauch während der Bewegung ist der im power erfasste Stromverbrauch ein.

minDelay:Bei fortlaufenden Sensoren wird der Stichprobenzeitraum in Mikrosekunden. Dies entspricht der schnellsten Geschwindigkeit, die vom Sensor unterstützt wird. Weitere Informationen zur Verwendung dieses Werts finden Sie unter sampling_period_ns. minDelay ist in Mikrosekunden ausgedrückt, während der Wert für sampling_period_ns in Nanosekunden. Bei Sensoren mit dem Modus „Bei Änderung“ und dem speziellen Berichtsmodus muss minDelay, sofern nicht anders angegeben, 0 sein. Bei Einmalsensoren muss der Wert -1 sein.

maxDelay:Bei fortlaufenden und On-Change-Sensoren kann die Stichprobenerhebung Periode in Mikrosekunden, entsprechend der langsamsten Geschwindigkeit, die der Sensor unterstützt. Weitere Informationen zur Verwendung dieses Werts finden Sie unter sampling_period_ns. Beachten Sie, dass maxDelay in Mikrosekunden und sampling_period_ns in Nanosekunden angegeben wird. Bei speziellen und Einmalsensoren muss maxDelay 0 sein.

fifoReserviertEventCount:Die Anzahl der für diesen Sensor reservierten Ereignisse im Hardware-FIFO. Wenn es für diesen Sensor einen speziellen FIFO gibt, ist fifoReservedEventCount die Größe dieses speziellen FIFO. Wenn der FIFO mit anderen Sensoren geteilt wird, ist fifoReservedEventCount die Größe des für diesen Sensor reservierten Teils des FIFO. Bei den meisten Shared-FIFO-Systemen und Systemen ohne Hardware-FIFO ist dieser Wert 0.

fifoMaxEventCount:Die maximale Anzahl von Ereignissen, die für diesen Sensor in den FIFOs gespeichert werden. Dieser Wert ist immer größer oder gleich fifoReservedEventCount Mit diesem Wert wird geschätzt, wie schnell der FIFO bei einer bestimmten Registrierungsrate voll wird, vorausgesetzt, dass keine anderen Sensoren aktiviert sind. Bei Systemen ohne Hardware-FIFO ist fifoMaxEventCount = 0. Weitere Informationen finden Sie unter Batch-Verarbeitung.

Bei Sensoren mit einem offiziellen Sensortyp werden einige Felder vom Framework überschrieben. Zum Beispiel Sensoren des Beschleunigungsmessers haben einen kontinuierlichen Berichtsmodus erzwungen und die Herzfrequenzmessung durch SENSOR_PERMISSION_BODY_SENSORS geschützt werden muss, Berechtigung.

sensor_event_t

Sensorereignisse, die von Android-Sensoren generiert und über die poll-Funktion gemeldet werden, haben den Wert type sensors_event_t. Hier sind einige wichtige Felder von sensors_event_t:

version:Muss sizeof(struct sensors_event_t) sein

sensor:Der Handle des Sensors, der das Ereignis generiert hat, wie durch sensor_t.handle

type: Der Sensortyp des Sensors, der das Ereignis generiert hat, wie in sensor_t.type definiert.

timestamp:Der Zeitstempel des Ereignisses in Nanosekunden. Dies ist der Zeitpunkt, Ereignis eingetreten ist (ein Schritt wurde unternommen oder eine Messung des Beschleunigungsmessers durchgeführt). und nicht den Zeitpunkt, zu dem das Ereignis gemeldet wurde. timestamp muss mit der elapsedRealtimeNano-Taktzeit synchronisiert sein. Bei kontinuierlichen Sensoren muss der Jitter gering sein. Die Zeitstempelfilterung ist manchmal erforderlich, um die CDD-Anforderungen zu erfüllen wie die Verwendung der SoC-Unterbrechungszeit zum Festlegen der Zeitstempel verursacht einen zu hohen Jitter und es wird nur die Zeit des Sensor-Chips verwendet, um den können dazu führen, dass die Synchronisierung elapsedRealtimeNano Uhr, während die Sensoruhr in der Zeit verschoben wird.

Daten und sich überschneidende Felder: Die von der Sensor. Die Bedeutung und die Einheiten dieser Felder sind für jeden Sensor unterschiedlich. Typ. Eine Beschreibung der Datenfelder finden Sie in sensors.h und in der Definition der verschiedenen Sensortypen. Bei einigen Sensoren wird auch die Genauigkeit der Messwerte angegeben. als Teil der Daten über das Feld status. Dieses Feld wird nur für die ausgewählten Sensortypen übergeben und erscheint in der SDK-Ebene als Genauigkeitswert. Für diese Sensoren ist die Tatsache, dass das Statusfeld in ihrem Sensortyp erwähnt wird. Definition.

Ereignisse zu abgeschlossenem Leeren von Metadaten

Metadatenereignisse haben denselben Typ wie normale Sensorereignisse: sensors_event_meta_data_t = sensors_event_t. Sie werden zusammen mit andere Sensorereignisse über die Umfrage. Sie enthalten die folgenden Felder:

version: Muss META_DATA_VERSION sein.

type:Muss SENSOR_TYPE_META_DATA sein

Sensor, Reserviert und Zeitstempel: Muss 0 sein

meta_data.what: Enthält den Metadatentyp für dieses Ereignis. Derzeit gibt es nur einen gültigen Metadatentyp: META_DATA_FLUSH_COMPLETE.

META_DATA_FLUSH_COMPLETE-Ereignisse geben an, dass das Leeren des FIFO-Puffers eines Sensors abgeschlossen ist. Bei meta_data.what=META_DATA_FLUSH_COMPLETE muss meta_data.sensor auf den Handle des gelöschten Sensors festgelegt werden. Sie werden nur dann generiert, wenn flush auf einem Sensor aufgerufen wird. Weitere Informationen finden Sie im Abschnitt zur Funktion flush.