Sensoren HAL 1.0

Die in sensors.h deklarierte Sensors-HAL-Schnittstelle stellt die Schnittstelle zwischen dem Android- Framework und der hardwarespezifischen Software dar. Eine HAL-Implementierung muss jede in sensors.h deklarierte Funktion definieren. 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. Abtastfrequenz und maximale Berichtslatenz.
  • setDelay – Wird nur in HAL-Version 1.0 verwendet. Legt die Abtastfrequenz für einen bestimmten Sensor fest.
  • flush – Leert den FIFO des angegebenen Sensors und meldet ein „Flush Complete“-Ereignis, wenn dies geschehen ist.
  • poll - Gibt verfügbare Sensorereignisse zurück.

Die Implementierung muss Thread-sicher sein und zulassen, dass diese Funktionen von verschiedenen Threads aufgerufen werden.

Die Schnittstelle definiert auch mehrere Typen, die von diesen Funktionen verwendet werden. Die Haupttypen sind:

  • sensors_module_t
  • sensors_poll_device_t
  • sensor_t
  • sensors_event_t

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

get_sensors_list(Liste)

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

Stellt die Liste der vom HAL implementierten Sensoren bereit. Siehe sensor_t für Details darüber, wie die Sensoren definiert sind.

Die Reihenfolge, in der die Sensoren in der Liste erscheinen, ist die Reihenfolge, in der die Sensoren an die Anwendungen gemeldet werden. Normalerweise erscheinen die Basissensoren zuerst, gefolgt von den zusammengesetzten Sensoren.

Wenn mehrere Sensoren den gleichen Sensortyp und die gleiche Aufweckeigenschaft haben, wird der erste in der Liste als „Standard“-Sensor bezeichnet. Es ist derjenige, der von getDefaultSensor(int sensorType, bool wakeUp) .

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

aktivieren (Sensor, wahr/falsch)

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

Aktiviert oder deaktiviert einen Sensor.

sensor_handle ist das Handle des zu aktivierenden/deaktivierenden Sensors. Das Handle eines Sensors wird durch das handle -Feld seiner sensor_t- Struktur definiert.

enabled wird auf 1 gesetzt, um den Sensor zu aktivieren, oder auf 0, um den Sensor zu deaktivieren.

One-Shot-Sensoren deaktivieren sich automatisch beim Empfang eines Ereignisses und müssen noch akzeptieren, dass sie durch einen Aufruf von activate(..., enabled=0) deaktiviert werden.

Non-Wake-up-Sensoren verhindern niemals, dass das SoC in den Suspend-Modus wechselt; das heißt, die HAL soll keine partielle Wecksperre für Anwendungen halten.

Wake-up-Sensoren können bei kontinuierlicher Bereitstellung von Ereignissen verhindern, dass das SoC in den Suspend-Modus wechselt, aber wenn kein Ereignis übermittelt werden muss, muss die teilweise Wake-Lock aufgehoben werden.

Wenn enabled “ 1 ist und der Sensor bereits aktiviert ist, ist diese Funktion ohne Operation und erfolgreich.

Wenn enabled 0 ist und der Sensor bereits deaktiviert ist, ist diese Funktion ohne Operation und erfolgreich.

Diese Funktion gibt bei Erfolg 0 und andernfalls eine negative Fehlernummer zurück.

Batch (Sensor, Flags, Abtastzeitraum, maximale Berichtslatenz)

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

Legt die Parameter eines Sensors fest, einschließlich der Abtastfrequenz und der maximalen Berichtslatenz . Diese Funktion kann aufgerufen werden, während der Sensor aktiviert ist, in diesem Fall darf sie nicht dazu führen, dass Sensormessungen verloren gehen: Der Übergang von einer Abtastrate zur anderen kann keine verlorenen Ereignisse verursachen, ebenso wenig wie der Übergang von einer hohen maximalen Berichtslatenz zu einer niedrigen maximale Meldelatenz.

sensor_handle ist das Handle des zu konfigurierenden Sensors.

flags wird derzeit nicht verwendet.

sampling_period_ns ist die Abtastperiode, in der der Sensor laufen soll, in Nanosekunden. Weitere Einzelheiten finden Sie unter „ sampling_period_ns “.

max_report_latency_ns ist die maximale Zeit in Nanosekunden, um die Ereignisse verzögert werden können, bevor sie über die HAL gemeldet werden. Weitere Einzelheiten finden Sie im Absatz max_report_latency_ns .

Diese Funktion gibt bei Erfolg 0 und andernfalls eine negative Fehlernummer zurück.

setDelay(Sensor, Abtastperiode)

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 batch aufgerufen, um den Parameter „ sampling_period_ns “ festzulegen.

In HAL Version 1.0 wurde setDelay anstelle von batch verwendet, um sample_period_ns festzulegen.

Spülung (Sensor)

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

Fügt am Ende des Hardware-FIFOs für den angegebenen Sensor ein Flush-Complete-Ereignis hinzu und löscht den FIFO; diese Ereignisse werden wie gewöhnlich geliefert (dh: als ob die maximale Berichtslatenzzeit abgelaufen wäre) und aus dem FIFO entfernt.

Das Flush geschieht asynchron (dh: diese Funktion muss sofort zurückkehren). Wenn die Implementierung einen einzelnen FIFO für mehrere Sensoren verwendet, wird dieser FIFO geleert und das Leerungs-Abgeschlossen-Ereignis wird nur für den angegebenen Sensor hinzugefügt.

Wenn der angegebene Sensor keinen FIFO hat (keine Pufferung möglich) oder wenn der FIFO zum Zeitpunkt des Aufrufs leer war, muss die flush trotzdem erfolgreich sein und ein Spülungs-Abgeschlossen-Ereignis für diesen Sensor senden. Dies gilt für alle Sensoren außer One-Shot-Sensoren.

Wenn das flush aufgerufen wird, muss, selbst wenn bereits ein Spülereignis für diesen Sensor im FIFO vorhanden ist, ein zusätzliches Ereignis erstellt und am Ende des FIFO hinzugefügt werden, und das FIFO muss geleert werden. Die Anzahl der flush Aufrufe muss gleich der Anzahl der erstellten Flush-Complete-Ereignisse sein.

flush gilt nicht für One-Shot- Sensoren; Wenn sich sensor_handle auf einen One-Shot-Sensor bezieht, muss flush -EINVAL und darf kein Metadatenereignis zum vollständigen Flush generieren.

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

Umfrage()

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

Gibt ein Array von Sensordaten zurück, indem das data ausgefüllt wird. Diese Funktion muss blockieren, bis Ereignisse verfügbar sind. Es gibt die Anzahl der gelesenen Ereignisse bei Erfolg oder eine negative Fehlernummer im Fehlerfall zurück.

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

Anruffolge

Wenn das Gerät bootet, wird get_sensors_list aufgerufen.

Wenn ein Sensor aktiviert wird, wird die batch Funktion mit den angeforderten Parametern aufgerufen, gefolgt von activate(..., enable=1) .

Beachten Sie, dass in HAL-Version 1_0 die Reihenfolge umgekehrt war: 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 muss -EINVAL zurückgegeben werden)

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

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

Sensoren_Modul_t

sensors_module_t ist der Typ, der verwendet wird, um das Android-Hardwaremodul für die Sensoren zu erstellen. Die Implementierung der HAL muss ein Objekt HAL_MODULE_INFO_SYM dieses Typs definieren, um die get_sensors_list- Funktion 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 / sensors_poll_device_1_t

sensors_poll_device_1_t enthält den Rest der oben definierten Methoden: activate , batch , flush und poll . Sein common Feld (vom Typ hw_device_t ) definiert die Versionsnummer der HAL.

sensor_t

sensor_t repräsentiert einen Android-Sensor . Hier sind einige der wichtigsten Felder:

name: Eine für den Benutzer sichtbare Zeichenfolge, die den Sensor darstellt. Diese Zeichenfolge enthält häufig den Teilenamen des zugrunde liegenden Sensors, den Typ des Sensors und ob es sich um einen Wecksensor handelt. Zum Beispiel „LIS2HH12 Accelerometer“, „MAX21000 Unkalibriertes Gyroskop“, „BMP280 Wake-up Barometer“, „MPU6515 Game Rotation Vector“

handle: Die Ganzzahl, die verwendet wird, um auf den Sensor zu verweisen, wenn er sich bei ihm registriert oder Ereignisse daraus generiert.

Typ: Der Typ des Sensors. Siehe die Erklärung des Sensortyps in Was sind Android-Sensoren? Weitere Einzelheiten finden Sie unter Sensortypen für offizielle Sensortypen. Bei nicht offiziellen Sensortypen muss der type mit SENSOR_TYPE_DEVICE_PRIVATE_BASE

stringType: Der Typ des Sensors als String. Wenn der Sensor einen offiziellen Typ hat, stellen Sie ihn auf SENSOR_STRING_TYPE_* ein. Wenn der Sensor einen herstellerspezifischen Typ hat, muss stringType mit dem umgekehrten Domänennamen des Herstellers beginnen. Beispielsweise könnte ein vom Cool-product- Team bei Fictional-Company definierter Sensor (z. B. ein stringType=”com.fictional_company.cool_product.unicorn_detector” . Der stringType wird verwendet, um nicht offizielle Sensortypen eindeutig zu identifizieren. Weitere Informationen zu Typen und Zeichenfolgentypen finden Sie unter sensors.h .

requiredPermission: Eine Zeichenfolge, die die Berechtigung darstellt, die Anwendungen besitzen müssen, um den Sensor zu sehen, sich bei ihm zu registrieren und seine Daten zu empfangen. Eine leere Zeichenfolge bedeutet, dass Anwendungen keine Berechtigung benötigen, um auf diesen Sensor zuzugreifen. Einige Sensortypen wie der Herzfrequenzsensor haben eine zwingend requiredPermission Berechtigung . Alle Sensoren, die sensible Benutzerinformationen (z. B. die Herzfrequenz) liefern, müssen durch eine Berechtigung geschützt werden.

flags: Flags für diesen Sensor, die den Meldemodus des Sensors definieren und ob der Sensor ein Wecksensor ist oder nicht. Beispielsweise hat ein One-Shot- 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 belassen werden.

maxRange: Der maximale Wert, den der Sensor melden kann, in derselben Einheit wie die gemeldeten Werte. Der Sensor muss in der Lage sein, Werte ohne Sättigung innerhalb [-maxRange; maxRange] . Beachten Sie, dass dies bedeutet, dass die Gesamtreichweite des Sensors im allgemeinen Sinne 2*maxRange . Meldet der Sensor Werte über mehrere Achsen, gilt der Bereich für jede Achse. Ein „+/- 2g“ Beschleunigungssensor meldet maxRange = 2*9.81 = 2g .

Auflösung: Der kleinste Wertunterschied, den der Sensor messen kann. Normalerweise basierend auf maxRange und der Anzahl der Bits in der Messung berechnet.

power: Die Energiekosten für die Aktivierung des Sensors in Milliampere. Dies ist fast immer mehr als die im Datenblatt des zugrunde liegenden Sensors angegebene Leistungsaufnahme. Siehe Basissensoren != physikalische Sensoren für weitere Details und siehe Leistungsmessungsverfahren für Details zum Messen des Stromverbrauchs eines Sensors. Wenn der Stromverbrauch des Sensors davon abhängt, ob sich das Gerät bewegt, ist der Stromverbrauch während der Bewegung derjenige, der im power angegeben ist.

minDelay: Bei kontinuierlichen Sensoren die Abtastperiode in Mikrosekunden, die der schnellsten vom Sensor unterstützten Rate entspricht. Einzelheiten zur Verwendung dieses Werts finden Sie unter „ sampling_period_ns “. Beachten Sie, dass minDelay in Mikrosekunden ausgedrückt wird, während sampling_period_ns in Nanosekunden angegeben wird. Für On-Change- und Special-Reporting-Mode-Sensoren muss minDelay , sofern nicht anders angegeben, 0 sein. Für One-Shot-Sensoren muss es -1 sein.

maxDelay: Für kontinuierliche und On-Change-Sensoren die Abtastperiode in Mikrosekunden, die der langsamsten Rate entspricht, die der Sensor unterstützt. Einzelheiten zur Verwendung dieses Werts finden Sie unter „ sampling_period_ns “. Beachten Sie, dass maxDelay in Mikrosekunden ausgedrückt wird, während sampling_period_ns in Nanosekunden angegeben wird. Für Spezial- und One-Shot-Sensoren muss maxDelay 0 sein.

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

fifoMaxEventCount: Die maximale Anzahl von Ereignissen, die in den FIFOs für diesen Sensor gespeichert werden können. Dies ist immer größer oder gleich fifoReservedEventCount . Dieser Wert wird verwendet, um abzuschätzen, wie schnell der FIFO voll wird, wenn er sich mit einer bestimmten Rate beim Sensor registriert, vorausgesetzt, dass keine anderen Sensoren aktiviert sind. Auf Systemen ohne Hardware-FIFO ist fifoMaxEventCount 0. Weitere Einzelheiten finden Sie unter Stapelverarbeitung .

Bei Sensoren mit offiziellem Sensortyp werden einige Felder durch das Framework überschrieben. Beispielsweise müssen Beschleunigungssensoren einen kontinuierlichen Berichtsmodus haben, und Herzfrequenzmonitore müssen durch die SENSOR_PERMISSION_BODY_SENSORS geschützt werden.

Sensoren_Ereignis_t

Sensorereignisse, die von Android-Sensoren generiert und über die Abfragefunktion gemeldet werden, sind vom type sensors_event_t . Hier sind einige wichtige Felder von sensors_event_t :

version: Muss sizeof sein sizeof(struct sensors_event_t)

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

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

timestamp: Der Zeitstempel des Ereignisses in Nanosekunden. Dies ist die Zeit, zu der das Ereignis stattfand (ein Schritt wurde gemacht oder eine Beschleunigungsmessung durchgeführt), nicht die Zeit, zu der das Ereignis gemeldet wurde. timestamp muss mit der elapsedRealtimeNano Clock synchronisiert werden und bei kontinuierlichen Sensoren muss der Jitter gering sein. Die Zeitstempelfilterung ist manchmal erforderlich, um die CDD-Anforderungen zu erfüllen, da die Verwendung nur der SoC-Interruptzeit zum Setzen der Zeitstempel einen zu hohen Jitter verursacht und die Verwendung nur der Sensorchipzeit zum Setzen der Zeitstempel eine Desynchronisation von der verstrichenen Echtzeit- elapsedRealtimeNano verursachen kann, da die Sensoruhr driftet.

Daten und überlappende Felder: Die vom Sensor gemessenen Werte. Die Bedeutung und Einheiten dieser Felder sind für jeden Sensortyp spezifisch. Siehe sensors.h und die Definition der verschiedenen Sensortypen für eine Beschreibung der Datenfelder. Bei einigen Sensoren wird die Genauigkeit der Messwerte auch als Teil der Daten über ein status gemeldet. Dieses Feld wird nur für diese ausgewählten Sensortypen durchgeleitet und erscheint auf der SDK-Ebene als Genauigkeitswert. Für diese Sensoren wird die Tatsache, dass das Statusfeld gesetzt werden muss, in ihrer Sensortypdefinition erwähnt.

Metadaten-Flush-Ereignisse abgeschlossen

Metadatenereignisse haben den gleichen Typ wie normale Sensorereignisse: sensors_event_meta_data_t = sensors_event_t . Sie werden zusammen mit anderen Sensorereignissen per Abfrage zurückgegeben. Sie besitzen folgende Felder:

Version: Muss META_DATA_VERSION sein

Typ: Muss SENSOR_TYPE_META_DATA sein

sensor, reserviert und timestamp : Muss 0 sein

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

META_DATA_FLUSH_COMPLETE Ereignisse repräsentieren den Abschluss des Spülens eines Sensor-FIFO. Wenn meta_data.what=META_DATA_FLUSH_COMPLETE , muss meta_data.sensor auf den Griff des Sensors gesetzt werden, der gespült wurde. Sie werden nur dann generiert, wenn an einem Sensor eine flush wird. Weitere Informationen finden Sie im Abschnitt über die Spülfunktion .