X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=iio-sensors.cpp;h=126cb92a889f7e94b67cf6c5e221b376b38e2927;hb=43c3ffdddb753f8d572a33278080e0f2c3349d1d;hp=157d68c12cf08c6275892464ee0762f54b705e6c;hpb=7107b207f1493401d383a8e3122b4026da647c72;p=android-x86%2Fhardware-libsensors.git diff --git a/iio-sensors.cpp b/iio-sensors.cpp index 157d68c..126cb92 100644 --- a/iio-sensors.cpp +++ b/iio-sensors.cpp @@ -239,11 +239,21 @@ template<> int Sensor::readEvents(sensors_event_t *data, int cn { static float scale = read_sysfs_float((*nodes)[0]); int ret = SensorBase::readEvents(data, cnt); - // TODO: read orientation from the properties + char cm[PROPERTY_VALUE_MAX]; + float m[9]; + int v[3]; + + property_get("hal.sensors.iio.accel.matrix", cm, "-1,0,0,0,1,0,0,0,-1" ); + sscanf(cm, "%f,%f,%f,%f,%f,%f,%f,%f,%f", &m[0], &m[1], &m[2], &m[3], &m[4], &m[5], &m[6], &m[7], &m[8]); + for (int i = 0; i < ret; ++i) { - data[i].acceleration.x = -scale * read_sysfs_int("in_accel_x_raw"); - data[i].acceleration.y = scale * read_sysfs_int("in_accel_y_raw"); - data[i].acceleration.z = -scale * read_sysfs_int("in_accel_z_raw"); + v[0] = read_sysfs_int("in_accel_x_raw"); + v[1] = read_sysfs_int("in_accel_y_raw"); + v[2] = read_sysfs_int("in_accel_z_raw"); + // create matrix * vector product + data[i].acceleration.x = scale * (m[0] * v[0] + m[1] * v[1] + m[2] * v[2]); + data[i].acceleration.y = scale * (m[3] * v[0] + m[4] * v[1] + m[5] * v[2]); + data[i].acceleration.z = scale * (m[6] * v[0] + m[7] * v[1] + m[8] * v[2]); data[i].acceleration.status = SENSOR_STATUS_ACCURACY_HIGH; } return ret;