OSDN Git Service

Configurable calibration steps
authorAdriana Reus <adriana.reus@intel.com>
Tue, 11 Nov 2014 10:37:29 +0000 (12:37 +0200)
committerAdriana Reus <adriana.reus@intel.com>
Thu, 13 Nov 2014 12:47:03 +0000 (14:47 +0200)
Tracked-On: https://jira01.devtools.intel.com/browse/GMINL-3783
Change-Id: I90bb09187c5d6fd8002f65c92612c381b4ea4bf5
Signed-off-by: Adriana Reus <adriana.reus@intel.com>
common.h
compass-calibration.c
description.c
description.h
enumeration.c

index b59cbd3..477707c 100644 (file)
--- a/common.h
+++ b/common.h
@@ -184,6 +184,9 @@ struct sensor_info_t
        struct sample_ops_t ops;
 
        int cal_level; /* 0 means not calibrated */
+
+       /* Depending on the sensor calibration may take too much at higher levels */
+       int max_cal_level;
        void* cal_data;
 
        /* Filtering data for noisy sensors */
index 2202dc3..38692fa 100644 (file)
@@ -443,6 +443,14 @@ static int compass_ready (struct sensor_info_t* info)
 
     struct compass_cal* cal_data = (struct compass_cal*) info->cal_data;
 
+    /*
+    *  Some sensors take unrealistically long to calibrate at higher levels.
+    *  We'll use a max_cal_level if we have such a property setup, or go with
+    *  the default settings if not.
+    */
+    int cal_steps = (info->max_cal_level && info->max_cal_level <= CAL_STEPS) ?
+        info->max_cal_level : CAL_STEPS;
+
     if (cal_data->sample_count < DS_SIZE)
         return info->cal_level;
 
@@ -469,7 +477,7 @@ static int compass_ready (struct sensor_info_t* info)
                 memcpy(cal_data->offset, new_cal_data.offset, sizeof(cal_data->offset));
                 memcpy(cal_data->w_invert, new_cal_data.w_invert, sizeof(cal_data->w_invert));
                 cal_data->bfield = new_cal_data.bfield;
-                if (info->cal_level < (CAL_STEPS - 1))
+                if (info->cal_level < (cal_steps - 1))
                     info->cal_level++;
                 ALOGV("CompassCalibration: ready check success, caldata: %f %f %f %f %f %f %f %f %f %f %f %f %f, err %f",
                     cal_data->offset[0][0], cal_data->offset[1][0], cal_data->offset[2][0], cal_data->w_invert[0][0],
index f372df4..ea2ece9 100644 (file)
@@ -222,6 +222,15 @@ float sensor_get_max_freq (int s)
        return 1000;
 }
 
+int sensor_get_cal_steps (int s)
+{
+       int cal_steps;
+       if (!sensor_get_prop(s, "cal_steps", &cal_steps))
+               return cal_steps;
+
+       return 0;
+}
+
 float sensor_get_resolution (int s)
 {
        if (sensor_info[s].resolution != 0.0 ||
index 0bfeab9..3ba6014 100644 (file)
@@ -28,6 +28,7 @@ uint32_t      sensor_get_quirks       (int s);
 int            sensor_get_prop         (int s, const char* sel, int* val);
 int            sensor_get_fl_prop      (int s, const char* sel, float* val);
 int            sensor_get_order        (int s,unsigned char map[MAX_CHANNELS]);
+int    sensor_get_cal_steps (int s);
 char*          sensor_get_string_type  (int s);
 
 #endif
index 80cdb51..fdf9038 100644 (file)
@@ -386,7 +386,7 @@ static void add_sensor (int dev_num, int catalog_index, int use_polling)
                struct compass_cal* calibration_data = calloc(1, sizeof(struct compass_cal));
                sensor_info[s].cal_data = calibration_data;
        }
-
+       sensor_info[s].max_cal_level = sensor_get_cal_steps(s);
        /* Select one of the available sensor sample processing styles */
        select_transform(s);