github.com/champo/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  }