X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=transform.c;h=1b688d3385fe4c4ee518304f4305eecee76c20ec;hb=d16b0eeb147394e4acc6f335edc08691ae440466;hp=eaf0faf9cda2577e5a7aa72c736a882c2b1b6cc9;hpb=69ead50f640d0694ca6d2571c4b6fba93322da05;p=android-x86%2Fhardware-intel-libsensors.git diff --git a/transform.c b/transform.c index eaf0faf..1b688d3 100644 --- a/transform.c +++ b/transform.c @@ -1,6 +1,18 @@ /* - * Copyright (C) 2014-2015 Intel Corporation. - */ +// Copyright (c) 2015 Intel Corporation +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +*/ #include #include @@ -41,8 +53,6 @@ #define CONVERT_M_Y (-CONVERT_M) #define CONVERT_M_Z (CONVERT_M) -#define CONVERT_GAUSS_TO_MICROTESLA(x) ((x) * 100) - /* Conversion of orientation data to degree units */ #define CONVERT_O (1.0 / 64) #define CONVERT_O_A (CONVERT_O) @@ -187,6 +197,17 @@ static void reorder_fields (float* data, unsigned char map[MAX_CHANNELS]) data[i] = temp[i]; } +static void mount_correction (float* data, float mm[9]) +{ + int i; + float temp[3]; + + for (i=0; i<3; i++) + temp[i] = data[0] * mm[i * 3] + data[1] * mm[i * 3 + 1] + data[2] * mm[i * 3 + 2]; + + for (i=0; i<3; i++) + data[i] = temp[i]; +} static void clamp_gyro_readings_to_zero (int s, sensors_event_t* data) { @@ -295,6 +316,8 @@ static int finalize_sample_default (int s, sensors_event_t* data) /* Swap fields if we have a custom channel ordering on this sensor */ if (sensor[s].quirks & QUIRK_FIELD_ORDERING) reorder_fields(data->data, sensor[s].order); + if (sensor[s].quirks & QUIRK_MOUNTING_MATRIX) + mount_correction(data->data, sensor[s].mounting_matrix); sensor[s].event_count++; @@ -391,10 +414,14 @@ static float transform_sample_default (int s, int c, unsigned char* sample_data) float scale = sensor[s].scale ? sensor[s].scale : sensor[s].channel[c].scale; /* In case correction has been requested using properties, apply it */ - scale *= sensor[s].channel[c].opt_scale; + float correction = sensor[s].channel[c].opt_scale; + + /* Correlated with "acquire_immediate_value" method */ + if (sensor[s].type == SENSOR_TYPE_MAGNETIC_FIELD) + return CONVERT_GAUSS_TO_MICROTESLA((sensor[s].offset + s64) * scale) * correction; /* Apply default scaling rules */ - return (sensor[s].offset + s64) * scale; + return (sensor[s].offset + s64) * scale * correction; } @@ -523,7 +550,6 @@ float acquire_immediate_float_value (int s, int c) const char* input_path = sensor_catalog[i].channel[c].input_path; float scale = sensor[s].scale ? sensor[s].scale : sensor[s].channel[c].scale; float offset = sensor[s].offset; - int sensor_type = sensor_catalog[i].type; float correction; /* In case correction has been requested using properties, apply it */ @@ -535,8 +561,11 @@ float acquire_immediate_float_value (int s, int c) sprintf(sysfs_path, BASE_PATH "%s", dev_num, input_path); ret = sysfs_read_float(sysfs_path, &val); - if (!ret) + if (!ret) { + if (sensor[s].type == SENSOR_TYPE_MAGNETIC_FIELD) + return CONVERT_GAUSS_TO_MICROTESLA (val * correction); return val * correction; + } } if (!sensor[s].channel[c].raw_path_present) @@ -552,7 +581,7 @@ float acquire_immediate_float_value (int s, int c) * There is no transform ops defined yet for raw sysfs values. * Use this function to perform transformation as well. */ - if (sensor_type == SENSOR_TYPE_MAGNETIC_FIELD) + if (sensor[s].type == SENSOR_TYPE_MAGNETIC_FIELD) return CONVERT_GAUSS_TO_MICROTESLA ((val + offset) * scale) * correction; return (val + offset) * scale * correction; @@ -569,7 +598,6 @@ uint64_t acquire_immediate_uint64_value (int s, int c) const char* input_path = sensor_catalog[i].channel[c].input_path; float scale = sensor[s].scale ? sensor[s].scale : sensor[s].channel[c].scale; float offset = sensor[s].offset; - int sensor_type = sensor_catalog[i].type; float correction; /* In case correction has been requested using properties, apply it */