android.c 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. //go:build android
  5. // +build android
  6. #include <stdlib.h>
  7. #include <jni.h>
  8. #include <android/sensor.h>
  9. #define GO_ANDROID_SENSOR_LOOPER_ID 100
  10. #define GO_ANDROID_READ_TIMEOUT_MS 1000
  11. ASensorEventQueue* queue = NULL;
  12. ALooper* looper = NULL;
  13. static ASensorManager* getSensorManager() {
  14. #pragma clang diagnostic push
  15. // Builders convert C warnings to errors, so suppress the
  16. // error from ASensorManager_getInstance being deprecated
  17. // in Android 26.
  18. #pragma clang diagnostic ignored "-Wdeprecated-declarations"
  19. return ASensorManager_getInstance();
  20. #pragma clang diagnostic pop
  21. }
  22. void GoAndroid_createManager() {
  23. ASensorManager* manager = getSensorManager();
  24. looper = ALooper_forThread();
  25. if (looper == NULL) {
  26. looper = ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS);
  27. }
  28. queue = ASensorManager_createEventQueue(manager, looper, GO_ANDROID_SENSOR_LOOPER_ID, NULL, NULL);
  29. }
  30. int GoAndroid_enableSensor(int s, int32_t usec) {
  31. ASensorManager* manager = getSensorManager();
  32. const ASensor* sensor = ASensorManager_getDefaultSensor(manager, s);
  33. if (sensor == NULL) {
  34. return 1;
  35. }
  36. ASensorEventQueue_enableSensor(queue, sensor);
  37. ASensorEventQueue_setEventRate(queue, sensor, usec);
  38. return 0;
  39. }
  40. void GoAndroid_disableSensor(int s) {
  41. ASensorManager* manager = getSensorManager();
  42. const ASensor* sensor = ASensorManager_getDefaultSensor(manager, s);
  43. ASensorEventQueue_disableSensor(queue, sensor);
  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_pollOnce(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. void GoAndroid_destroyManager() {
  69. ASensorManager* manager = getSensorManager();
  70. ASensorManager_destroyEventQueue(manager, queue);
  71. queue = NULL;
  72. looper = NULL;
  73. }