github.com/SahandAslani/gomobile@v0.0.0-20210909130135-2cb2d44c09b2/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  static ASensorManager* getSensorManager() {
    20    #pragma clang diagnostic push
    21    // Builders convert C warnings to errors, so suppress the
    22    // error from ASensorManager_getInstance being deprecated
    23    // in Android 26.
    24    #pragma clang diagnostic ignored "-Wdeprecated-declarations"
    25    return ASensorManager_getInstance();
    26    #pragma clang diagnostic pop
    27  }
    28  
    29  void GoAndroid_createManager() {
    30    ASensorManager* manager = getSensorManager();
    31    looper = ALooper_forThread();
    32    if (looper == NULL) {
    33      looper = ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS);
    34    }
    35    queue = ASensorManager_createEventQueue(manager, looper, GO_ANDROID_SENSOR_LOOPER_ID, NULL, NULL);
    36  }
    37  
    38  int GoAndroid_enableSensor(int s, int32_t usec) {
    39    ASensorManager* manager = getSensorManager();
    40    const ASensor* sensor = ASensorManager_getDefaultSensor(manager, s);
    41    if (sensor == NULL) {
    42      return 1;
    43    }
    44    ASensorEventQueue_enableSensor(queue, sensor);
    45    ASensorEventQueue_setEventRate(queue, sensor, usec);
    46    return 0;
    47  }
    48  
    49  void GoAndroid_disableSensor(int s) {
    50    ASensorManager* manager = getSensorManager();
    51    const ASensor* sensor = ASensorManager_getDefaultSensor(manager, s);
    52    ASensorEventQueue_disableSensor(queue, sensor);
    53  }
    54  
    55  int GoAndroid_readQueue(int n, int32_t* types, int64_t* timestamps, float* vectors) {
    56    int id;
    57    int events;
    58    ASensorEvent event;
    59    int i = 0;
    60    // Try n times read from the event queue.
    61    // If anytime timeout occurs, don't retry to read and immediately return.
    62    // Consume the event queue entirely between polls.
    63    while (i < n && (id = ALooper_pollAll(GO_ANDROID_READ_TIMEOUT_MS, NULL, &events, NULL)) >= 0) {
    64      if (id != GO_ANDROID_SENSOR_LOOPER_ID) {
    65        continue;
    66      }
    67      while (i < n && ASensorEventQueue_getEvents(queue, &event, 1)) {
    68        types[i] = event.type;
    69        timestamps[i] = event.timestamp;
    70        vectors[i*3] = event.vector.x;
    71        vectors[i*3+1] = event.vector.y;
    72        vectors[i*3+2] = event.vector.z;
    73        i++;
    74      }
    75    }
    76    return i;
    77  }
    78  
    79  void GoAndroid_destroyManager() {
    80    ASensorManager* manager = getSensorManager();
    81    ASensorManager_destroyEventQueue(manager, queue);
    82    queue = NULL;
    83    looper = NULL;
    84  }