Skip to content

Commit 9d84803

Browse files
committed
ANDROID: support for multiple sensors (experimental)
1 parent 5a8d574 commit 9d84803

File tree

2 files changed

+56
-53
lines changed

2 files changed

+56
-53
lines changed

src/platform/android/jni/runtime.cpp

+51-50
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,23 @@
4242

4343
Runtime *runtime = nullptr;
4444

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+
4557
MAEvent *getMotionEvent(int type, AInputEvent *event) {
4658
auto *result = new MAEvent();
4759
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);
5062
return result;
5163
}
5264

@@ -211,7 +223,7 @@ void onContentRectChanged(ANativeActivity *activity, const ARect *rect) {
211223
}
212224

213225
jbyteArray newByteArray(JNIEnv *env, const char *str) {
214-
int size = strlen(str);
226+
int size = (int)strlen(str);
215227
jbyteArray result = env->NewByteArray(size);
216228
env->SetByteArrayRegion(result, 0, size, (const jbyte *)str);
217229
return result;
@@ -224,7 +236,6 @@ Runtime::Runtime(android_app *app) :
224236
_graphics(nullptr),
225237
_app(app),
226238
_eventQueue(nullptr),
227-
_sensor(nullptr),
228239
_sensorEventQueue(nullptr) {
229240
_app->userData = nullptr;
230241
_app->onAppCmd = handleCommand;
@@ -238,6 +249,7 @@ Runtime::Runtime(android_app *app) :
238249
pthread_mutex_init(&_mutex, nullptr);
239250
_looper = ALooper_forThread();
240251
_sensorManager = ASensorManager_getInstance();
252+
memset(&_sensors, 0, sizeof(_sensors));
241253
memset(&_sensorEvent, 0, sizeof(_sensorEvent));
242254
}
243255

@@ -317,31 +329,34 @@ void Runtime::construct() {
317329
void Runtime::disableSensor() {
318330
logEntered();
319331
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+
}
322337
}
323338
ASensorManager_destroyEventQueue(_sensorManager, _sensorEventQueue);
324339
}
325340
_sensorEventQueue = nullptr;
326-
_sensor = nullptr;
327341
}
328342

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) {
339344
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) {
344347
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;
345360
}
346361
return result;
347362
}
@@ -467,8 +482,18 @@ void Runtime::setLocationData(var_t *retval) {
467482
void Runtime::setSensorData(var_t *retval) {
468483
v_init(retval);
469484
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));
472497
switch (_sensorEvent.type) {
473498
case ASENSOR_TYPE_ACCELEROMETER:
474499
case ASENSOR_TYPE_MAGNETIC_FIELD:
@@ -1329,33 +1354,9 @@ int gps_off(int param_count, slib_par_t *params, var_t *retval) {
13291354
int sensor_on(int param_count, slib_par_t *params, var_t *retval) {
13301355
int result = 0;
13311356
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);
13591360
}
13601361
}
13611362
if (!result) {

src/platform/android/jni/runtime.h

+5-3
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
#include <android/keycodes.h>
2121
#include <android/sensor.h>
2222

23+
constexpr int MAX_SENSORS = 8;
24+
2325
struct Runtime : public System {
2426
explicit Runtime(android_app *app);
2527
~Runtime() override;
@@ -36,7 +38,7 @@ struct Runtime : public System {
3638
void debugStop() {}
3739
void disableSensor();
3840
void enableCursor(bool enabled) override {}
39-
bool enableSensor(int sensorType);
41+
bool enableSensor(int sensorId);
4042
jlong getActivity() { return (jlong)_app->activity->clazz; }
4143
bool getBoolean(const char *methodName);
4244
String getString(const char *methodName);
@@ -48,7 +50,7 @@ struct Runtime : public System {
4850
void pause(int timeout);
4951
MAEvent processEvents(int waitFlag) override;
5052
void processEvent(MAEvent &event);
51-
bool hasEvent() { return _eventQueue && _eventQueue->size() > 0; }
53+
bool hasEvent() { return _eventQueue && !_eventQueue->empty(); }
5254
void playAudio(const char *path) { setString("playAudio", path); }
5355
void playTone(int frq, int dur, int vol, bool bgplay) { _audio.play(frq, dur, vol, bgplay); }
5456
void pollEvents(bool blocking);
@@ -93,7 +95,7 @@ struct Runtime : public System {
9395
pthread_mutex_t _mutex{};
9496
ALooper *_looper;
9597
ASensorManager *_sensorManager;
96-
const ASensor *_sensor;
98+
const ASensor * _sensors[MAX_SENSORS]{};
9799
ASensorEventQueue *_sensorEventQueue;
98100
ASensorEvent _sensorEvent{};
99101
Audio _audio;

0 commit comments

Comments
 (0)