Mit der L-Version von Android wird die Unterstützung für einige HAL-Versionen von Sensoren eingestellt. Die einzigen unterstützten Versionen sind SENSORS_DEVICE_API_VERSION_1_0
und SENSORS_DEVICE_API_VERSION_1_3
.
In den nächsten Releases wird die Unterstützung für 1_0 wahrscheinlich ebenfalls eingestellt.
1_0 unterstützt kein Batching. Nach Möglichkeit sollten alle Geräte, auf denen 1_0 verwendet wird, auf 1_3 umgestellt werden.
1_1 und 1_2 haben eine schlechte Definition des Batching-Konzepts und werden nicht mehr unterstützt.
Alle Geräte, auf denen derzeit 1_1 oder 1_2 verwendet wird, MÜSSEN auf 1_3 umgestellt werden.
In 1_3 haben wir das Batching vereinfacht und Wecksensoren eingeführt.
Wenn Sie auf Version 1_3 umstellen möchten, führen Sie die unten aufgeführten Änderungen aus.
Batchfunktion implementieren
Auch wenn Sie kein Batching implementieren (Ihre Hardware hat keinen FIFO), müssen Sie die Funktion batch
implementieren. Mit batch
wird der Messzeitraum und die maximale Berichtslatenz für einen bestimmten Sensor festgelegt. Er ersetzt setDelay
. setDelay
wird nicht mehr aufgerufen.
Wenn Sie kein Batching implementieren, können Sie batch
implementieren, indem Sie einfach Ihre vorhandene setDelay
-Funktion mit dem bereitgestellten sampling_period_ns
-Parameter aufrufen.
Flush-Funktion implementieren
Auch wenn Sie kein Batching implementieren, müssen Sie die Funktion flush
implementieren.
Wenn Sie das Batching nicht implementieren, muss flush
ein META_DATA_FLUSH_COMPLETE
-Ereignis generieren und 0 (Erfolg) zurückgeben.
Ändern Sie „sensors_poll_device_t.common.version“.
your_poll_device.common.version = SENSORS_DEVICE_API_VERSION_1_3
Fügen Sie die neuen Felder der Definition Ihrer Sensoren hinzu.
Geben Sie bei der Definition der einzelnen Sensoren zusätzlich zu den üblichen sensor_t-Feldern Folgendes an:
.name = "My magnetic field Sensor", .vendor = "My company", .version = 1, .handle = mag_handle, .type = SENSOR_TYPE_MAGNETIC_FIELD, .maxRange = 200.0f, .resolution = CONVERT_M, .power = 5.0f, .minDelay = 16667,
Außerdem müssen Sie die neuen Felder zwischen 1_0 und 1_3 festlegen:
.fifoReservedEventCount = 0, .fifoMaxEventCount = 0, .stringType = 0, .requiredPermission = 0, .maxDelay = 200000 .flags = SENSOR_FLAG_CONTINUOUS_MODE,
fifoReservedEventCount: Wenn Sie die Batchverarbeitung nicht implementieren, setzen Sie diesen Wert auf 0.
fifoMaxEventCount: Wenn Sie die Batchverarbeitung nicht implementieren, setzen Sie diesen Wert auf 0.
stringType: Legen Sie für alle offiziellen Android-Sensoren (die in sensors.h definiert sind) den Wert „0“ fest, da dieser Wert vom Framework überschrieben wird. Informationen zur Einrichtung von nicht offiziellen Sensoren finden Sie unter sensor_t.
requiredPermission: Diese Berechtigung müssen Apps haben, um auf Ihren Sensor zugreifen zu können. Normalerweise können Sie diesen Wert für alle Sensoren auf „0“ festlegen. Bei Sensoren vom Typ HEART_RATE
muss er jedoch auf „SENSOR_PERMISSION_BODY_SENSORS.
“ festgelegt werden.
maxDelay: Dieser Wert ist wichtig und muss entsprechend den Funktionen des Sensors und seines Treibers festgelegt werden.
Dieser Wert wird nur für kontinuierliche und bei Änderung erfassende Sensoren definiert. Das ist die Verzögerung zwischen zwei Sensorereignissen, die der niedrigsten Frequenz entspricht, die dieser Sensor unterstützt. Wenn über die Funktion batch
niedrigere Frequenzen angefordert werden, werden die Ereignisse stattdessen mit dieser Frequenz generiert. Es kann vom Framework oder von Anwendungen verwendet werden, um abzuschätzen, wann der Batch-FIFO voll sein könnte. Wenn dieser Wert nicht richtig festgelegt ist, schlägt CTS fehl.
Legen Sie für Sensoren im Modus „Einzelmessung“ und im speziellen Berichtsmodus maxDelay
auf „0“ fest.
Legen Sie für kontinuierliche Sensoren die maximal zulässige Abtastzeit in Mikrosekunden fest.
Für period_ns
, maxDelay
und minDelay
gilt Folgendes:
period_ns
ist in Nanosekunden, währendmaxDelay
/minDelay
in Mikrosekunden angegeben sind.maxDelay
sollte immer in eine vorzeichenbehaftete 32‑Bit-Ganzzahl passen. Sie wird nur aus Gründen der binären Kompatibilität auf 64‑Bit-Architekturen als 64‑Bit deklariert.
flags: Dieses Feld definiert den Berichtsmodus des Sensors und ob es sich um einen Wecksensor handelt.
Wenn Sie keine Batchverarbeitung implementieren und nur von 1.0 auf 1.3 umstellen, legen Sie Folgendes fest:
SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ONE_SHOT_MODE
für One-Shot-Sensoren
SENSOR_FLAG_CONTINUOUS_MODE
für kontinuierliche SensorenSENSOR_FLAG_ON_CHANGE_MODE
für bei Änderung Sensoren mit Ausnahme des Näherungssensors
SENSOR_FLAG_SPECIAL_REPORTING_MODE
für Sensoren mit besonderem Berichtsmodus mit Ausnahme des Neigungssensors
SENSOR_FLAG_WAKE_UP | SENSOR_FLAG_ON_CHANGE_MODE
für den Näherungssensor und den offiziellen Neigungssensor von Android.
Hinweise beim Upgrade von 1_1 oder 1_2
- Die Funktion
batch
funktioniert jetzt fast immer, auch bei Sensoren, die das Batching nicht unterstützen, unabhängig vom Wert des Timeout-Arguments. Diebatch
-Funktion kann nur bei internen Fehlern oder bei einem falschensensor_handle,
, einer negativensampling_period_ns
oder einer negativenmax_report_latency_ns
fehlschlagen. - Ob ein Sensor Batching unterstützt, wird dadurch bestimmt, ob
fifoMaxEventCount
größer als 0 ist. In früheren Versionen basierte sie auf dem Rückgabewert vonbatch()
. - Sensoren, die Batching unterstützen, befinden sich immer in dem in früheren Versionen als „Batch-Modus“ bezeichneten Modus: Auch wenn der Parameter
max_report_latency_ns
0 ist, muss der Sensor weiterhin in Batches verarbeitet werden. Das bedeutet, dass die Ereignisse im FIFO gespeichert werden müssen, wenn das SoC in den Ruhemodus wechselt. - Der Parameter
flags
der Funktionbatch
wird nicht mehr verwendet.DRY_RUN
undWAKE_UPON_FIFO_FULL
sind eingestellt und werden nie an diebatch
-Funktion übergeben. - Das Argument für die Batch-Zeitüberschreitung wird jetzt als
max_report_latency
-Argument bezeichnet.