// Copyright 2015 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. #include #include #include #include "sensors_android.h" void android_createManager(int looperId, android_SensorManager* dst) { ASensorManager* manager = ASensorManager_getInstance(); ALooper* looper = ALooper_forThread(); if (looper == NULL) { looper = ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS); } ASensorEventQueue* queue = ASensorManager_createEventQueue(manager, looper, looperId, NULL, NULL); dst->looper = looper; dst->queue = queue; dst->looperId = looperId; } int android_enableSensor(ASensorEventQueue* q, int s, int32_t usec) { ASensorManager* manager = ASensorManager_getInstance(); const ASensor* sensor = ASensorManager_getDefaultSensor(manager, s); if (sensor == NULL) { return 1; } ASensorEventQueue_enableSensor(q, sensor); ASensorEventQueue_setEventRate(q, sensor, usec); return 0; } void android_disableSensor(ASensorEventQueue* q, int s) { ASensorManager* manager = ASensorManager_getInstance(); const ASensor* sensor = ASensorManager_getDefaultSensor(manager, s); ASensorEventQueue_disableSensor(q, sensor); } int android_readQueue(int looperId, ASensorEventQueue* q, int n, int32_t* types, int64_t* timestamps, float* vectors) { int id; int events; ASensorEvent event; int i = 0; // Block for 30 secs at most, timeout if nothing happens. // Try n times read from the event queue. // If anytime timeout occurs, don't retry to read and immediately return. // Consume the event queue entirely between polls. while (i < n && (id = ALooper_pollAll(30*1000, NULL, &events, NULL)) >= 0) { if (id != looperId) { continue; } while (i < n && ASensorEventQueue_getEvents(q, &event, 1)) { types[i] = event.type; timestamps[i] = event.timestamp; vectors[i*3] = event.vector.x; vectors[i*3+1] = event.vector.y; vectors[i*3+2] = event.vector.z; i++; } } return i; } void android_destroyManager(android_SensorManager* m) { ASensorManager* manager = ASensorManager_getInstance(); ASensorManager_destroyEventQueue(manager, m->queue); ALooper_release(m->looper); }