2 years ago
#31222
Anh Vu Bui
The accelerometer sensor of Samsung S21 works irregularly in android 12
I created a small program to draw a line by accelerometer sensor in my Samsung S21. But when the phone updates to android 12, my program doesn't work sometimes. I found the reason is that the accelerometer sensor event doesn't work.
This is init function
const int LOOPER_ID_USER = 3;
const int SENSOR_HISTORY_LENGTH = 100;
const int SENSOR_REFRESH_RATE_HZ = 50;
constexpr int32_t SENSOR_REFRESH_PERIOD_US = int32_t(1000000 / SENSOR_REFRESH_RATE_HZ);
const float SENSOR_FILTER_ALPHA = 0.1f;
void init(AAssetManager *assetManager) {
AAsset *vertexShaderAsset = AAssetManager_open(assetManager, "shader.glslv",
AASSET_MODE_BUFFER);
assert(vertexShaderAsset != NULL);
const void *vertexShaderBuf = AAsset_getBuffer(vertexShaderAsset);
assert(vertexShaderBuf != NULL);
off_t vertexShaderLength = AAsset_getLength(vertexShaderAsset);
vertexShaderSource = std::string((const char*)vertexShaderBuf,
(size_t)vertexShaderLength);
AAsset_close(vertexShaderAsset);
AAsset *fragmentShaderAsset = AAssetManager_open(assetManager, "shader.glslf",
AASSET_MODE_BUFFER);
assert(fragmentShaderAsset != NULL);
const void *fragmentShaderBuf = AAsset_getBuffer(fragmentShaderAsset);
assert(fragmentShaderBuf != NULL);
off_t fragmentShaderLength = AAsset_getLength(fragmentShaderAsset);
fragmentShaderSource = std::string((const char*)fragmentShaderBuf,
(size_t)fragmentShaderLength);
AAsset_close(fragmentShaderAsset);
sensorManager = AcquireASensorManagerInstance();
assert(sensorManager != NULL);
accelerometer = ASensorManager_getDefaultSensor(sensorManager, ASENSOR_TYPE_ACCELEROMETER);
assert(accelerometer != NULL);
looper = ALooper_prepare(ALOOPER_PREPARE_ALLOW_NON_CALLBACKS);
assert(looper != NULL);
accelerometerEventQueue = ASensorManager_createEventQueue(sensorManager, looper,
LOOPER_ID_USER, NULL, NULL);
assert(accelerometerEventQueue != NULL);
auto status = ASensorEventQueue_enableSensor(accelerometerEventQueue,
accelerometer);
assert(status >= 0);
status = ASensorEventQueue_setEventRate(accelerometerEventQueue,
accelerometer,
SENSOR_REFRESH_PERIOD_US);
assert(status >= 0);
(void)status; //to silent unused compiler warning
generateXPos();
}
This is update function
void update() {
ALooper_pollAll(0, NULL, NULL, NULL);
ASensorEvent event;
float a = SENSOR_FILTER_ALPHA;
int status = ASensorEventQueue_getEvents(accelerometerEventQueue, &event, 1);
while (status > 0) {
sensorDataFilter.x = a * event.acceleration.x + (1.0f - a) * sensorDataFilter.x;
sensorDataFilter.y = a * event.acceleration.y + (1.0f - a) * sensorDataFilter.y;
sensorDataFilter.z = a * event.acceleration.z + (1.0f - a) * sensorDataFilter.z;
status = ASensorEventQueue_getEvents(accelerometerEventQueue, &event, 1);
}
sensorData[sensorDataIndex] = sensorDataFilter;
sensorData[SENSOR_HISTORY_LENGTH+sensorDataIndex] = sensorDataFilter;
sensorDataIndex = (sensorDataIndex + 1) % SENSOR_HISTORY_LENGTH;
}
android
c++
samsung-mobile
android-12
0 Answers
Your Answer