OSDN Git Service

Min/Max delay for Light and Temperature
[android-x86/hardware-intel-libsensors.git] / enumeration.c
index 6e29f64..eda8845 100644 (file)
@@ -14,6 +14,7 @@
 #include "description.h"
 #include "control.h"
 #include "calibration.h"
+#include "filtering.h"
 
 /*
  * This table maps syfs entries in scan_elements directories to sensor types,
@@ -332,7 +333,17 @@ static void add_sensor (int dev_num, int catalog_index, int use_polling)
        */
        sensor_desc[s].requiredPermission = "";
        sensor_desc[s].flags = sensor_get_flags(s);
+       sensor_desc[s].minDelay = sensor_get_min_delay(s);
        sensor_desc[s].maxDelay = sensor_get_max_delay(s);
+       ALOGI("Sensor %d (%s) type(%d) minD(%ld) maxD(%ld) flags(%2.2x)\n",
+               s, sensor_info[s].friendly_name, sensor_desc[s].type,
+               sensor_desc[s].minDelay, sensor_desc[s].maxDelay, sensor_desc[s].flags);
+
+       /* We currently do not implement batching when we'll so
+        * these should be overriden appropriately
+        */
+       sensor_desc[s].fifoReservedEventCount = 0;
+       sensor_desc[s].fifoMaxEventCount = 0;
 
        if (sensor_info[s].internal_name[0] == '\0') {
                /*
@@ -348,6 +359,17 @@ static void add_sensor (int dev_num, int catalog_index, int use_polling)
                sensor_type == SENSOR_TYPE_GYROSCOPE_UNCALIBRATED) {
                struct gyro_cal* calibration_data = calloc(1, sizeof(struct gyro_cal));
                sensor_info[s].cal_data = calibration_data;
+               struct filter* f_data = (struct filter*) calloc(1, sizeof(struct filter));
+               f_data->x_buff = (struct circ_buff*) calloc(1, sizeof (struct circ_buff));
+               f_data->y_buff = (struct circ_buff*) calloc(1, sizeof (struct circ_buff));
+               f_data->z_buff = (struct circ_buff*) calloc(1, sizeof (struct circ_buff));
+               f_data->x_buff->buff = (float*)calloc(SAMPLE_SIZE, sizeof(float));
+               f_data->y_buff->buff = (float*)calloc(SAMPLE_SIZE, sizeof(float));
+               f_data->z_buff->buff = (float*)calloc(SAMPLE_SIZE, sizeof(float));
+               f_data->x_buff->size = SAMPLE_SIZE;
+               f_data->y_buff->size = SAMPLE_SIZE;
+               f_data->z_buff->size = SAMPLE_SIZE;
+               sensor_info[s].filter = f_data;
        }
 
        if (sensor_type == SENSOR_TYPE_MAGNETIC_FIELD) {
@@ -659,6 +681,7 @@ static void uncalibrated_gyro_check (void)
        unsigned int dev_num;
        int i, c;
        unsigned int is_poll_sensor;
+       char buf[MAX_NAME_SIZE];
 
        int cal_idx = 0;
        int uncal_idx = 0;
@@ -705,6 +728,12 @@ static void uncalibrated_gyro_check (void)
                                strncpy(sensor_info[uncal_idx].motion_trigger_name,
                                        sensor_info[cal_idx].motion_trigger_name,
                                        MAX_NAME_SIZE);
+
+                               /* Add "Uncalibrated " prefix to sensor name */
+                               strcpy(buf, sensor_info[cal_idx].friendly_name);
+                               snprintf(sensor_info[uncal_idx].friendly_name,
+                                        MAX_NAME_SIZE,
+                                        "%s %s", "Uncalibrated", buf);
                                break;
                        }
 }
@@ -767,6 +796,12 @@ void delete_enumeration_data (void)
        for (i = 0; i < sensor_count; i++)
        switch (sensor_catalog[sensor_info[i].catalog_index].type) {
                case SENSOR_TYPE_MAGNETIC_FIELD:
+                       if (sensor_info[i].cal_data != NULL) {
+                               free(sensor_info[i].cal_data);
+                               sensor_info[i].cal_data = NULL;
+                               sensor_info[i].cal_level = 0;
+                       }
+                       break;
                case SENSOR_TYPE_GYROSCOPE_UNCALIBRATED:
                case SENSOR_TYPE_GYROSCOPE:
                        if (sensor_info[i].cal_data != NULL) {
@@ -775,6 +810,16 @@ void delete_enumeration_data (void)
                                sensor_info[i].cal_level = 0;
                        }
                        break;
+                       if (sensor_info[i].filter != NULL) {
+                               free(((struct filter*)sensor_info[i].filter)->x_buff->buff);
+                               free(((struct filter*)sensor_info[i].filter)->y_buff->buff);
+                               free(((struct filter*)sensor_info[i].filter)->z_buff->buff);
+                               free(((struct filter*)sensor_info[i].filter)->x_buff);
+                               free(((struct filter*)sensor_info[i].filter)->y_buff);
+                               free(((struct filter*)sensor_info[i].filter)->z_buff);
+                               free(sensor_info[i].filter);
+                               sensor_info[i].filter = NULL;
+                       }
                default:
                        break;
        }