当前位置: 首页 > 工具软件 > size-sensor > 使用案例 >

G-Sensor 的调整

隆飞驰
2023-12-01
app-->jni-->c++ native-->HAL(sensors.cpp)




SensorManager.java 


增加个native方法:
	// values: the offset of the original values 
	// reset: reset the values
	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 是个SensorService实例,其内部有个SensorEventConnection内部类
	mSensorServer->createSensorEventConnection()->gsensorCalibrate(g, reset);
}


SensorService.cpp 


SensorService::SensorEventConnection


status_t SensorService::SensorEventConnection::gsensorCalibrate(float g[], int reset)
{
	//调用了SensorService的方法
	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());
	//调用SensorDevice中注册pollg的方法
	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;
    //mSensorDevice是个sensors_poll_device_t结构体
    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


// 在/data/gsensor.txt 中保存app传过来的数据
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;
}


// 每个HAL 都不一样
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)
			{
//				LOGD("poll_poll:open %s error. \n",file_name);
			}
			else
			{
				//轮询获取数据前,先读取/data/gsensor.txt数据(为校准后的数据)
				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;
}

 类似资料: