mirror of
https://github.com/godotengine/godot.git
synced 2026-01-05 06:11:29 +03:00
Add magnetometer sensor support for Android
This commit is contained in:
committed by
George Marques
parent
eb7227a20b
commit
4877b714b3
@@ -313,6 +313,7 @@ struct engine {
|
||||
|
||||
ASensorManager* sensorManager;
|
||||
const ASensor* accelerometerSensor;
|
||||
const ASensor* magnetometerSensor;
|
||||
ASensorEventQueue* sensorEventQueue;
|
||||
|
||||
bool display_active;
|
||||
@@ -735,16 +736,29 @@ static void engine_handle_cmd(struct android_app* app, int32_t cmd) {
|
||||
ASensorEventQueue_setEventRate(engine->sensorEventQueue,
|
||||
engine->accelerometerSensor, (1000L/60)*1000);
|
||||
|
||||
}
|
||||
// Also start monitoring the magnetometer.
|
||||
if (engine->magnetometerSensor != NULL) {
|
||||
ASensorEventQueue_enableSensor(engine->sensorEventQueue,
|
||||
engine->magnetometerSensor);
|
||||
// We'd like to get 60 events per second (in us).
|
||||
ASensorEventQueue_setEventRate(engine->sensorEventQueue,
|
||||
engine->magnetometerSensor, (1000L/60)*1000);
|
||||
|
||||
}
|
||||
engine->animating = 1;
|
||||
break;
|
||||
case APP_CMD_LOST_FOCUS:
|
||||
// When our app loses focus, we stop monitoring the accelerometer.
|
||||
// When our app loses focus, we stop monitoring the sensors.
|
||||
// This is to avoid consuming battery while not being used.
|
||||
if (engine->accelerometerSensor != NULL) {
|
||||
ASensorEventQueue_disableSensor(engine->sensorEventQueue,
|
||||
engine->accelerometerSensor);
|
||||
}
|
||||
if (engine->magnetometerSensor != NULL) {
|
||||
ASensorEventQueue_disableSensor(engine->sensorEventQueue,
|
||||
engine->magnetometerSensor);
|
||||
}
|
||||
// Also stop animating.
|
||||
engine->animating = 0;
|
||||
engine_draw_frame(engine);
|
||||
@@ -768,10 +782,12 @@ void android_main(struct android_app* state) {
|
||||
|
||||
FileAccessAndroid::asset_manager=state->activity->assetManager;
|
||||
|
||||
// Prepare to monitor accelerometer
|
||||
// Prepare to monitor sensors
|
||||
engine.sensorManager = ASensorManager_getInstance();
|
||||
engine.accelerometerSensor = ASensorManager_getDefaultSensor(engine.sensorManager,
|
||||
ASENSOR_TYPE_ACCELEROMETER);
|
||||
ASENSOR_TYPE_ACCELEROMETER);
|
||||
engine.magnetometerSensor = ASensorManager_getDefaultSensor(engine.sensorManager,
|
||||
ASENSOR_TYPE_MAGNETIC_FIELD);
|
||||
engine.sensorEventQueue = ASensorManager_createEventQueue(engine.sensorManager,
|
||||
state->looper, LOOPER_ID_USER, NULL, NULL);
|
||||
|
||||
@@ -812,16 +828,21 @@ void android_main(struct android_app* state) {
|
||||
// If a sensor has data, process it now.
|
||||
// LOGI("events\n");
|
||||
if (ident == LOOPER_ID_USER) {
|
||||
if (engine.accelerometerSensor != NULL) {
|
||||
if (engine.accelerometerSensor != NULL || engine.magnetometerSensor != NULL) {
|
||||
ASensorEvent event;
|
||||
while (ASensorEventQueue_getEvents(engine.sensorEventQueue,
|
||||
&event, 1) > 0) {
|
||||
|
||||
|
||||
if (engine.os) {
|
||||
if (event.acceleration != NULL) {
|
||||
engine.os->process_accelerometer(Vector3(event.acceleration.x, event.acceleration.y,
|
||||
event.acceleration.z));
|
||||
|
||||
}
|
||||
if (event.magnetic != NULL) {
|
||||
engine.os->process_magnetometer(Vector3(event.magnetic.x, event.magnetic.y,
|
||||
event.magnetic.z));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user