github.com/acrespo/mobile@v0.0.0-20190107162257-dc0771356504/exp/sensor/android.c (about) 1 // Copyright 2015 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // +build android 6 7 #include <stdlib.h> 8 #include <jni.h> 9 10 #include <android/sensor.h> 11 12 #define GO_ANDROID_SENSOR_LOOPER_ID 100 13 14 #define GO_ANDROID_READ_TIMEOUT_MS 1000 15 16 ASensorEventQueue* queue = NULL; 17 ALooper* looper = NULL; 18 19 void GoAndroid_createManager() { 20 ASensorManager* manager = ASensorManager_getInstance(); 21 looper = ALooper_forThread(); 22 if (looper == NULL) { 23 looper = ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS); 24 } 25 queue = ASensorManager_createEventQueue(manager, looper, GO_ANDROID_SENSOR_LOOPER_ID, NULL, NULL); 26 } 27 28 int GoAndroid_enableSensor(int s, int32_t usec) { 29 ASensorManager* manager = ASensorManager_getInstance(); 30 const ASensor* sensor = ASensorManager_getDefaultSensor(manager, s); 31 if (sensor == NULL) { 32 return 1; 33 } 34 ASensorEventQueue_enableSensor(queue, sensor); 35 ASensorEventQueue_setEventRate(queue, sensor, usec); 36 return 0; 37 } 38 39 void GoAndroid_disableSensor(int s) { 40 ASensorManager* manager = ASensorManager_getInstance(); 41 const ASensor* sensor = ASensorManager_getDefaultSensor(manager, s); 42 ASensorEventQueue_disableSensor(queue, sensor); 43 } 44 45 int GoAndroid_readQueue(int n, int32_t* types, int64_t* timestamps, float* vectors) { 46 int id; 47 int events; 48 ASensorEvent event; 49 int i = 0; 50 // Try n times read from the event queue. 51 // If anytime timeout occurs, don't retry to read and immediately return. 52 // Consume the event queue entirely between polls. 53 while (i < n && (id = ALooper_pollAll(GO_ANDROID_READ_TIMEOUT_MS, NULL, &events, NULL)) >= 0) { 54 if (id != GO_ANDROID_SENSOR_LOOPER_ID) { 55 continue; 56 } 57 while (i < n && ASensorEventQueue_getEvents(queue, &event, 1)) { 58 types[i] = event.type; 59 timestamps[i] = event.timestamp; 60 vectors[i*3] = event.vector.x; 61 vectors[i*3+1] = event.vector.y; 62 vectors[i*3+2] = event.vector.z; 63 i++; 64 } 65 } 66 return i; 67 } 68 69 void GoAndroid_destroyManager() { 70 ASensorManager* manager = ASensorManager_getInstance(); 71 ASensorManager_destroyEventQueue(manager, queue); 72 queue = NULL; 73 looper = NULL; 74 }