42
42
43
43
Runtime *runtime = nullptr ;
44
44
45
+ // the sensorTypes corresponding to _sensors[] positions
46
+ constexpr int SENSOR_TYPES[MAX_SENSORS] = {
47
+ ASENSOR_TYPE_ACCELEROMETER,
48
+ ASENSOR_TYPE_MAGNETIC_FIELD,
49
+ ASENSOR_TYPE_GYROSCOPE,
50
+ ASENSOR_TYPE_LIGHT,
51
+ ASENSOR_TYPE_PROXIMITY,
52
+ ASENSOR_TYPE_PRESSURE,
53
+ ASENSOR_TYPE_RELATIVE_HUMIDITY,
54
+ ASENSOR_TYPE_AMBIENT_TEMPERATURE,
55
+ };
56
+
45
57
MAEvent *getMotionEvent (int type, AInputEvent *event) {
46
58
auto *result = new MAEvent ();
47
59
result->type = type;
48
- result->point .x = AMotionEvent_getX (event, 0 );
49
- result->point .y = AMotionEvent_getY (event, 0 );
60
+ result->point .x = ( int ) AMotionEvent_getX (event, 0 );
61
+ result->point .y = ( int ) AMotionEvent_getY (event, 0 );
50
62
return result;
51
63
}
52
64
@@ -211,7 +223,7 @@ void onContentRectChanged(ANativeActivity *activity, const ARect *rect) {
211
223
}
212
224
213
225
jbyteArray newByteArray (JNIEnv *env, const char *str) {
214
- int size = strlen (str);
226
+ int size = ( int ) strlen (str);
215
227
jbyteArray result = env->NewByteArray (size);
216
228
env->SetByteArrayRegion (result, 0 , size, (const jbyte *)str);
217
229
return result;
@@ -224,7 +236,6 @@ Runtime::Runtime(android_app *app) :
224
236
_graphics(nullptr ),
225
237
_app(app),
226
238
_eventQueue(nullptr ),
227
- _sensor(nullptr ),
228
239
_sensorEventQueue(nullptr ) {
229
240
_app->userData = nullptr ;
230
241
_app->onAppCmd = handleCommand;
@@ -238,6 +249,7 @@ Runtime::Runtime(android_app *app) :
238
249
pthread_mutex_init (&_mutex, nullptr );
239
250
_looper = ALooper_forThread ();
240
251
_sensorManager = ASensorManager_getInstance ();
252
+ memset (&_sensors, 0 , sizeof (_sensors));
241
253
memset (&_sensorEvent, 0 , sizeof (_sensorEvent));
242
254
}
243
255
@@ -317,31 +329,34 @@ void Runtime::construct() {
317
329
void Runtime::disableSensor () {
318
330
logEntered ();
319
331
if (_sensorEventQueue) {
320
- if (_sensor) {
321
- ASensorEventQueue_disableSensor (_sensorEventQueue, _sensor);
332
+ for (auto & i : _sensors) {
333
+ if (i) {
334
+ ASensorEventQueue_disableSensor (_sensorEventQueue, i);
335
+ i = nullptr ;
336
+ }
322
337
}
323
338
ASensorManager_destroyEventQueue (_sensorManager, _sensorEventQueue);
324
339
}
325
340
_sensorEventQueue = nullptr ;
326
- _sensor = nullptr ;
327
341
}
328
342
329
- bool Runtime::enableSensor (int sensorType) {
330
- _sensorEvent.type = 0 ;
331
- if (!_sensorEventQueue) {
332
- _sensorEventQueue =
333
- ASensorManager_createEventQueue (_sensorManager, _looper, ALOOPER_POLL_CALLBACK,
334
- get_sensor_events, nullptr );
335
- } else if (_sensor) {
336
- ASensorEventQueue_disableSensor (_sensorEventQueue, _sensor);
337
- }
338
- _sensor = ASensorManager_getDefaultSensor (_sensorManager, sensorType);
343
+ bool Runtime::enableSensor (int sensorId) {
339
344
bool result;
340
- if (_sensor) {
341
- ASensorEventQueue_enableSensor (_sensorEventQueue, _sensor);
342
- result = true ;
343
- } else {
345
+ _sensorEvent.type = 0 ;
346
+ if (sensorId < 0 || sensorId >= MAX_SENSORS) {
344
347
result = false ;
348
+ } else if (_sensors[sensorId] == nullptr ) {
349
+ if (!_sensorEventQueue) {
350
+ _sensorEventQueue =
351
+ ASensorManager_createEventQueue (_sensorManager, _looper, ALOOPER_POLL_CALLBACK, get_sensor_events, nullptr );
352
+ }
353
+ _sensors[sensorId] = ASensorManager_getDefaultSensor (_sensorManager, SENSOR_TYPES[sensorId]);
354
+ result = _sensors[sensorId] != nullptr ;
355
+ if (result) {
356
+ ASensorEventQueue_enableSensor (_sensorEventQueue, _sensors[sensorId]);
357
+ }
358
+ } else {
359
+ result = true ;
345
360
}
346
361
return result;
347
362
}
@@ -467,8 +482,18 @@ void Runtime::setLocationData(var_t *retval) {
467
482
void Runtime::setSensorData (var_t *retval) {
468
483
v_init (retval);
469
484
map_init (retval);
470
- if (_sensor != nullptr ) {
471
- v_setstr (map_add_var (retval, " name" , 0 ), ASensor_getName (_sensor));
485
+
486
+ // find the sensor for the retrieved sensor type
487
+ const ASensor *sensor = nullptr ;
488
+ for (int i = 0 ; i < MAX_SENSORS; i++) {
489
+ if (_sensorEvent.type == SENSOR_TYPES[i]) {
490
+ sensor = _sensors[i];
491
+ break ;
492
+ }
493
+ }
494
+
495
+ if (sensor != nullptr ) {
496
+ v_setstr (map_add_var (retval, " name" , 0 ), ASensor_getName (sensor));
472
497
switch (_sensorEvent.type ) {
473
498
case ASENSOR_TYPE_ACCELEROMETER:
474
499
case ASENSOR_TYPE_MAGNETIC_FIELD:
@@ -1329,33 +1354,9 @@ int gps_off(int param_count, slib_par_t *params, var_t *retval) {
1329
1354
int sensor_on (int param_count, slib_par_t *params, var_t *retval) {
1330
1355
int result = 0 ;
1331
1356
if (param_count == 1 ) {
1332
- switch (v_getint (params[0 ].var_p )) {
1333
- case 0 :
1334
- result = runtime->enableSensor (ASENSOR_TYPE_ACCELEROMETER);
1335
- break ;
1336
- case 1 :
1337
- result = runtime->enableSensor (ASENSOR_TYPE_MAGNETIC_FIELD);
1338
- break ;
1339
- case 2 :
1340
- result = runtime->enableSensor (ASENSOR_TYPE_GYROSCOPE);
1341
- break ;
1342
- case 3 :
1343
- result = runtime->enableSensor (ASENSOR_TYPE_LIGHT);
1344
- break ;
1345
- case 4 :
1346
- result = runtime->enableSensor (ASENSOR_TYPE_PROXIMITY);
1347
- break ;
1348
- case 5 :
1349
- result = runtime->enableSensor (ASENSOR_TYPE_PRESSURE);
1350
- break ;
1351
- case 6 :
1352
- result = runtime->enableSensor (ASENSOR_TYPE_RELATIVE_HUMIDITY);
1353
- break ;
1354
- case 7 :
1355
- result = runtime->enableSensor (ASENSOR_TYPE_AMBIENT_TEMPERATURE);
1356
- break ;
1357
- default :
1358
- break ;
1357
+ int sensor = v_getint (params[0 ].var_p );
1358
+ if (sensor >= 0 && sensor < MAX_SENSORS) {
1359
+ result = runtime->enableSensor (sensor);
1359
1360
}
1360
1361
}
1361
1362
if (!result) {
0 commit comments