X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=gyro-calibration.c;h=dd9570c10be2df8e6a9e79c28a506ffec1399edd;hb=81202ad7aa3bf83b549687151a67486133695af8;hp=307ea89632615595bc5707f224755c3185c2cfa3;hpb=e58ac5ea4b7e578f6ce3ddbb3c17c2b2a81b0f4f;p=android-x86%2Fhardware-intel-libsensors.git diff --git a/gyro-calibration.c b/gyro-calibration.c index 307ea89..dd9570c 100644 --- a/gyro-calibration.c +++ b/gyro-calibration.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014 Intel Corporation. + * Copyright (C) 2014-2015 Intel Corporation. */ #include @@ -10,7 +10,15 @@ #include "common.h" #include "calibration.h" -static void reset (struct gyro_cal* cal_data) + +/* Gyro defines */ +#define GYRO_MAX_ERR 0.05 +#define GYRO_DS_SIZE 100 +#define GYRO_CALIBRATION_PATH "/data/gyro.conf" +#define GYRO_CAL_VERSION 1.0 + + +static void reset (gyro_cal_t* cal_data) { cal_data->count = 0; @@ -21,16 +29,61 @@ static void reset (struct gyro_cal* cal_data) } -void gyro_cal_init (struct sensor_info_t* info) +void gyro_cal_init (int s) { - info->cal_level = 0; + int ret; + gyro_cal_t* cal_data = (gyro_cal_t*) sensor[s].cal_data; + FILE* data_file; + float version; + + sensor[s].cal_level = 0; + + if (cal_data == NULL) + return; + + reset(cal_data); - if (info->cal_data) - reset((struct gyro_cal*) info->cal_data); + data_file = fopen (GYRO_CALIBRATION_PATH, "r"); + if (data_file == NULL) + return; + + ret = fscanf(data_file, "%f %f %f %f", &version, + &cal_data->bias_x, &cal_data->bias_y, &cal_data->bias_z); + + if (ret != 4 || version != GYRO_CAL_VERSION) { + reset(cal_data); + ALOGE("Gyro calibration - init failed!\n"); + } + + fclose(data_file); } -static int gyro_collect (float x, float y, float z, struct gyro_cal* cal_data) +void gyro_store_data (int s) +{ + int ret; + gyro_cal_t* cal_data = (gyro_cal_t*) sensor[s].cal_data; + FILE* data_file; + + if (cal_data == NULL) + return; + + data_file = fopen (GYRO_CALIBRATION_PATH, "w"); + + if (data_file == NULL) + return; + + ret = fprintf(data_file, "%f %f %f %f", GYRO_CAL_VERSION, + cal_data->bias_x, cal_data->bias_y, cal_data->bias_z); + + if (ret < 0) + ALOGE ("Gyro calibration - store data failed!"); + + fclose(data_file); +} + + +static int gyro_collect (float x, float y, float z, gyro_cal_t* cal_data) { /* Analyze gyroscope data */ @@ -80,34 +133,24 @@ static int gyro_collect (float x, float y, float z, struct gyro_cal* cal_data) return 1; /* Calibrated! */ } -void calibrate_gyro(struct sensors_event_t* event, struct sensor_info_t* info) + +void calibrate_gyro (int s, sensors_event_t* event) { - struct gyro_cal* cal_data = (struct gyro_cal*) info->cal_data; + gyro_cal_t* cal_data = (gyro_cal_t*) sensor[s].cal_data; if (cal_data == NULL) return; /* Attempt gyroscope calibration if we have not reached this state */ - if (info->cal_level == 0) - info->cal_level = gyro_collect(event->data[0], event->data[1], + if (sensor[s].cal_level == 0) + sensor[s].cal_level = gyro_collect(event->data[0], event->data[1], event->data[2], cal_data); - switch (event->type) { - case SENSOR_TYPE_GYROSCOPE: - /* For the gyroscope apply the bias */ - event->data[0] = event->data[0] - cal_data->bias_x; - event->data[1] = event->data[1] - cal_data->bias_y; - event->data[2] = event->data[2] - cal_data->bias_z; - break; - - case SENSOR_TYPE_GYROSCOPE_UNCALIBRATED: - /* - * For the uncalibrated gyroscope don't apply the bias, - * but tell he Android framework what we think it is. - */ - event->uncalibrated_gyro.bias[0] = cal_data->bias_x; - event->uncalibrated_gyro.bias[1] = cal_data->bias_y; - event->uncalibrated_gyro.bias[2] = cal_data->bias_z; - break; - } + + event->data[0] = event->data[0] - cal_data->bias_x; + event->data[1] = event->data[1] - cal_data->bias_y; + event->data[2] = event->data[2] - cal_data->bias_z; + + if (sensor[s].cal_level) + event->gyro.status = SENSOR_STATUS_ACCURACY_HIGH; }