示例#1
0
static void magnetometer_data(struct sensor_api_t *s, struct sensor_data_t *sd)
{
	struct wrapper_desc *d = container_of(s, struct wrapper_desc, api);
	sensors_event_t data;

	data.timestamp = get_current_nano_time();
	data.sensor = d->sensor.handle;
	data.version = d->sensor.version;
	data.type = d->sensor.type;
	data.magnetic.status  = sd->status;
	data.magnetic.x = sd->data[AXIS_X] * sd->scale;
	data.magnetic.y = sd->data[AXIS_Y] * sd->scale;
	data.magnetic.z = sd->data[AXIS_Z] * sd->scale;
	sensors_fifo_put(&data);
}
示例#2
0
static void gyroscope_data(struct sensor_api_t *s, struct sensor_data_t *sd)
{
	struct wrapper_desc *d = container_of(s, struct wrapper_desc, api);
	sensors_event_t data;

	data.timestamp = get_current_nano_time();
	data.sensor = d->sensor.handle;
	data.version = d->sensor.version;
	data.type = d->sensor.type;
	data.gyro.status  = sd->status;
	/* convert to dps with scale, and then to radps for android */
	data.gyro.x = (sd->data[AXIS_X] * sd->scale)/DPS_2_RADPS;
	data.gyro.y = (sd->data[AXIS_Y] * sd->scale)/DPS_2_RADPS;
	data.gyro.z = (sd->data[AXIS_Z] * sd->scale)/DPS_2_RADPS;
	sensors_fifo_put(&data);
}
示例#3
0
static void *ak897x_read(void *arg)
{
	struct input_event evbuf[10];
	struct input_event *event;
	struct ak897x_sensor_composition *sc = arg;
	int fd = sc->select_worker.get_fd(&sc->select_worker);
	sensors_event_t sdata;
	int n;
	int i;

	memset(&sdata, 0, sizeof(sdata));

	pthread_mutex_lock(&sc->lock);
	n = read(fd, evbuf, sizeof(evbuf)) / sizeof(evbuf[0]);
	for (i = 0; i < n; i++) {
		event = evbuf + i;
		if (event->type == EV_SYN) {
			if (sc->magnetic.active) {
				sdata.version = sc->magnetic.sensor.version;
				sdata.sensor = sc->magnetic.sensor.handle;
				sdata.type = sc->magnetic.sensor.type;
				sdata.timestamp = get_current_nano_time();
				scale_and_map(&sdata, &sc->magnetic);

				sensors_fifo_put(&sdata);
			}
			if (sc->orientation_raw.active) {
				sdata.version = sc->orientation_raw.sensor.version;
				sdata.sensor = sc->orientation_raw.sensor.handle;
				sdata.type = sc->orientation_raw.sensor.type;
				sdata.timestamp = get_current_nano_time();
				scale_and_map(&sdata, &sc->orientation_raw);

				sensors_fifo_put(&sdata);
			}
			if (sc->orientation.active) {
				sdata.version = sc->orientation.sensor.version;
				sdata.sensor = sc->orientation.sensor.handle;
				sdata.type = sc->orientation.sensor.type;
				sdata.timestamp = get_current_nano_time();
				sdata.orientation.status = sc->orientation_raw.status;

				memcpy(&sc->orientation.data,
				       &sc->orientation_raw.data,
				       sizeof(sc->orientation.data));
				scale_and_map(&sdata, &sc->orientation);

				sensors_fifo_put(&sdata);
			}
			continue;
		}
		if (event->type != EV_ABS)
			continue;
		switch (event->code) {
			case EVENT_CODE_YAW:
				sc->orientation_raw.data[0] = event->value;
				break;
			case EVENT_CODE_PITCH:
				sc->orientation_raw.data[1] = event->value;
				break;
			case EVENT_CODE_ROLL:
				sc->orientation_raw.data[2] = event->value;
				break;
			case EVENT_CODE_ORIENT_STATUS:
				sc->orientation_raw.status =
						event->value & SENSOR_STATE_MASK;
				break;
			case EVENT_CODE_MAGV_X:
				sc->magnetic.data[0] = event->value;
				break;
			case EVENT_CODE_MAGV_Y:
				sc->magnetic.data[1] = event->value;
				break;
			case EVENT_CODE_MAGV_Z:
				sc->magnetic.data[2] = event->value;
				break;
		}
	}
	pthread_mutex_unlock(&sc->lock);

	return NULL;
}