app-->jni-->c++ native-->HAL(sensors.cpp)
SensorManager.java
增加个native方法:
static native void sensors_data_pollg(float[] values, int reset);
android_hardware_SensorManager.cpp
注册相应的方法:
static void
sensors_data_pollg(JNIEnv *env, jclass clazz, jfloatArray values, jint reset)
{
SensorManager& mgr(SensorManager::getInstance());
float* gArray = values ? env->GetFloatArrayElements(values, NULL) : NULL;
mgr.gsensorCalibrate(env->GetFloatArrayElements(values, NULL), reset);
if (gArray) {
env->ReleaseFloatArrayElements(values, gArray, 0);
}
}
SensorManager.cpp
void SensorManager::gsensorCalibrate(float g[], int reset)
{
mSensorServer->createSensorEventConnection()->gsensorCalibrate(g, reset);
}
SensorService.cpp
SensorService::SensorEventConnection
status_t SensorService::SensorEventConnection::gsensorCalibrate(float g[], int reset)
{
mService->gCalibrate(g, reset);
return 0;
}
ISensorEventConnection.cpp
virtual status_t gsensorCalibrate(float g[], int reset)
{
Parcel data, reply;
data.writeInterfaceToken(ISensorEventConnection::getInterfaceDescriptor());
data.writeFloat(g[0]);
data.writeFloat(g[1]);
data.writeFloat(g[2]);
data.writeInt32(reset);
remote()->transact(G_SENSOR, data, &reply);
return reply.readFloat(g);
}
status_t BnSensorEventConnection::onTransact(
...
case G_SENSOR: {
CHECK_INTERFACE(ISensorEventConnection, data, reply);
float g[3] = {0, 0, 0};
g[0] = data.readFloat();
g[1] = data.readFloat();
g[2] = data.readFloat();
int mReset = data.readInt32();
status_t result = gsensorCalibrate(g, mReset);
reply->writeFloat(result);
return NO_ERROR;
} break;
}
void SensorService::gCalibrate(float g[], int reset)
{
const size_t numEventMax = 16 * (1 + mVirtualSensorList.size());
sensors_event_t bufferg[numEventMax];
SensorDevice& device(SensorDevice::getInstance());
device.pollg(bufferg, numEventMax, g, reset);
}
SensorDevice.cpp
ssize_t SensorDevice::pollg(sensors_event_t* buffer, size_t count, float g[], int reset) {
if (!mSensorDevice) return NO_INIT;
return mSensorDevice->pollg(mSensorDevice, buffer, count, g, reset);
}
struct sensors_poll_device_t {
...
int (*pollg)(struct sensors_poll_device_t *dev,
sensors_event_t* data, int count, float g[], int reset);
}
HAL:
Sensors.cpp
open_sensors 方法中注册
dev->device.poll = poll__poll_GsensorCalibrate;
定义poll__poll_GsensorCalibrate
static int poll__poll_GsensorCalibrate(struct sensors_poll_device_t *device,
sensors_event_t* data, int count, float gValues[], int reset) {
FILE *fp;
fp = fopen("/data/gsensor.txt","w+");
fprintf(fp, "%f, %f, %f, %d", gValues[0], gValues[1], gValues[2], reset);
fclose(fp);
gsensor_calibrate.appRunFlg = 1;
return 1;
}
static int poll__poll(struct sensors_poll_device_t *device,
sensors_event_t* data, int count) {
struct input_event event;
int ret;
sensors_poll_context_t *dev = (sensors_poll_context_t *)device;
if (dev->fd < 0)
return 0;
FILE *fp;
if(gsensor_calibrate.appRunFlg == 1 || gsensor_calibrate.powerOnRead == 0)
{
gsensor_calibrate.appRunFlg = 0;
gsensor_calibrate.powerOnRead = 1;
fp = fopen("/data/gsensor.txt","r+");
if(fp == NULL)
{
}
else
{
fscanf(fp, "%f, %f, %f, %d", &gsensor_calibrate.offsetX, &gsensor_calibrate.offsetY,
&gsensor_calibrate.offsetZ, &gsensor_calibrate.appReset);
fclose(fp);
LOGD("offsetX=%f offsetY=%f offsetZ=%f \n",gsensor_calibrate.offsetX,
gsensor_calibrate.offsetY,gsensor_calibrate.offsetZ);
}
}
while (1) {
ret = read(dev->fd, &event, sizeof(event));
if (event.type == EV_ABS) {
switch (event.code) {
case ABS_X:
data->acceleration.y = -event.value * CONVERT_Y;
if(gsensor_calibrate.appReset == 1) {
data->acceleration.y -= gsensor_calibrate.offsetX;
}
break;
case ABS_Y:
data->acceleration.x = event.value * CONVERT_X;
if(gsensor_calibrate.appReset == 1) {
data->acceleration.x -= -gsensor_calibrate.offsetY;
}
break;
case ABS_Z:
data->acceleration.z = -event.value * CONVERT_Z;
if(gsensor_calibrate.appReset == 1) {
data->acceleration.z += gsensor_calibrate.offsetZ;
}
break;
}
} else if (event.type == EV_SYN) {
data->timestamp =
(int64_t)((int64_t)event.time.tv_sec*1000000000
+ (int64_t)event.time.tv_usec*1000);
data->sensor = 0;
data->type = SENSOR_TYPE_ACCELEROMETER;
data->acceleration.status = SENSOR_STATUS_ACCURACY_HIGH;
#define DEBUG_SENSOR
#ifdef DEBUG_SENSOR
LOGD("Sensor data: t x,y,x: %f %f, %f, %f\n",
data->timestamp / 1000000000.0,
data->acceleration.x,
data->acceleration.y,
data->acceleration.z);
#endif
return 1;
}
}
return 0;
}