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); }
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); }
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; }