OSDN Git Service

STPK-1429 Select sample transformation depending on a property
authorPatrick Porlan <patrick.porlan@intel.com>
Fri, 11 Apr 2014 08:49:29 +0000 (10:49 +0200)
committersuyyala <sridhar.uyyala@intel.com>
Mon, 28 Apr 2014 02:40:40 +0000 (19:40 -0700)
This introduces a per-sensor "transform" property, with a single
recognized value: ISH for Intel Sensor Hub units and fields.

The per channel transform function is meant for units conversions
such as deg/s to rad/s, and the finalize function is for broader
changes, such as field reordering, which is also required for ISH.

Issue: STPK-1429

Change-Id: I5ed937267e58333a9658882b7c6c4a2636ec08d2
Signed-off-by: Patrick Porlan <patrick.porlan@intel.com>
common.h
control.c
enumeration.c
transform.c
transform.h

index 527fefa..34de105 100644 (file)
--- a/common.h
+++ b/common.h
@@ -67,6 +67,15 @@ struct channel_info_t
        struct datum_info_t type_info;     /* Decoded contents of type spec */
 };
 
+struct sample_ops_t
+{
+       /* Conversion function called once per channel */
+       float (*transform)(int s, int c, unsigned char* sample_data);
+
+       /* Function called once per sample */
+       void (*finalize)(int s, struct sensors_event_t* data);
+};
+
 struct sensor_info_t
 {
        char friendly_name[MAX_NAME_SIZE];      /* ex: Accelerometer */
@@ -110,6 +119,8 @@ struct sensor_info_t
 
        int64_t last_integration_ts; /* Last time an event was reported */
 
+       struct sample_ops_t ops;
+
        /* Note: we may have to explicitely serialize access to some fields */
 };
 
index 1a80096..cb091ed 100644 (file)
--- a/control.c
+++ b/control.c
@@ -10,7 +10,6 @@
 #include "control.h"
 #include "enumeration.h"
 #include "utils.h"
-#include "transform.h"
 
 /* Currently active sensors count, per device */
 static int poll_sensors_per_dev[MAX_DEVICES];  /* poll-mode sensors */
@@ -552,7 +551,7 @@ static void propagate_sensor_report(int s, struct sensors_event_t* data)
                        ALOGV("\tfield %d: %f\n", c, data->data[c]);
                }
 
-               finalize_sample(s, data);
+               sensor_info[s].ops.finalize(s, data);
                return;
        }
 
@@ -562,13 +561,14 @@ static void propagate_sensor_report(int s, struct sensors_event_t* data)
 
        for (c=0; c<num_fields; c++) {
 
-               data->data[c] = transform_sample(s, c, current_sample);
+               data->data[c] = sensor_info[s].ops.transform
+                                                       (s, c, current_sample);
 
                ALOGV("\tfield %d: %f\n", c, data->data[c]);
                current_sample += sensor_info[s].channel[c].size;
        }
 
-       finalize_sample(s, data);
+       sensor_info[s].ops.finalize(s, data);
 }
 
 
index c7b91e9..9e430e8 100644 (file)
@@ -8,6 +8,7 @@
 #include "enumeration.h"
 #include "description.h"
 #include "utils.h"
+#include "transform.h"
 
 /*
  * This table maps syfs entries in scan_elements directories to sensor types,
@@ -105,6 +106,9 @@ static void add_sensor (int dev_num, int catalog_index, int use_polling)
                strcpy(sensor_info[s].internal_name, "(null)");
        }
 
+       /* Select one of the available sensor sample processing styles */
+       select_transform(s);
+
        sensor_count++;
 }
 
index c71e50f..b390635 100644 (file)
@@ -5,12 +5,13 @@
 #include <stdlib.h>
 #include <math.h>
 #include <utils/Log.h>
+#include <cutils/properties.h>
 #include <hardware/sensors.h>
 #include "common.h"
 #include "transform.h"
 
 
-int64_t sample_as_int64(unsigned char* sample, struct datum_info_t* type)
+static int64_t sample_as_int64(unsigned char* sample, struct datum_info_t* type)
 {
        uint16_t u16;
        uint32_t u32;
@@ -63,7 +64,7 @@ int64_t sample_as_int64(unsigned char* sample, struct datum_info_t* type)
 }
 
 
-void finalize_sample(int s, struct sensors_event_t* data)
+static void finalize_sample_default(int s, struct sensors_event_t* data)
 {
        int i           = sensor_info[s].catalog_index;
        int sensor_type = sensor_catalog[i].type;
@@ -91,7 +92,7 @@ void finalize_sample(int s, struct sensors_event_t* data)
 }
 
 
-float transform_sample(int s, int c, unsigned char* sample_data)
+static float transform_sample_default(int s, int c, unsigned char* sample_data)
 {
        struct datum_info_t* sample_type = &sensor_info[s].channel[c].type_info;
        int64_t              s64 = sample_as_int64(sample_data, sample_type);
@@ -99,3 +100,39 @@ float transform_sample(int s, int c, unsigned char* sample_data)
        /* Apply default scaling rules */
        return (sensor_info[s].offset + s64) * sensor_info[s].scale;
 }
+
+
+static void finalize_sample_ISH(int s, struct sensors_event_t* data)
+{
+}
+
+
+static float transform_sample_ISH(int s, int c, unsigned char* sample_data)
+{
+       return 0;
+}
+
+
+void select_transform (int s)
+{
+       char prop_name[PROP_NAME_MAX];
+       char prop_val[PROP_VALUE_MAX];
+       int i                   = sensor_info[s].catalog_index;
+       const char *prefix      = sensor_catalog[i].tag;
+
+       sprintf(prop_name, PROP_BASE, prefix, "transform");
+
+       if (property_get(prop_name, prop_val, "")) {
+               if (!strcmp(prop_val, "ISH")) {
+                       ALOGI(  "Using Intel Sensor Hub semantics on %s\n",
+                               sensor_info[s].friendly_name);
+
+                       sensor_info[s].ops.transform = transform_sample_ISH;
+                       sensor_info[s].ops.finalize = finalize_sample_ISH;
+                       return;
+               }
+       }
+
+       sensor_info[s].ops.transform = transform_sample_default;
+       sensor_info[s].ops.finalize = finalize_sample_default;
+}
index 2a6a03e..bea9f2a 100644 (file)
@@ -7,10 +7,7 @@
 
 #include "common.h"
 
-float transform_sample (int sensor, int channel, unsigned char* sample_data);
-
-void finalize_sample   (int s, struct sensors_event_t* data);
-
+void select_transform (int s);
 
 #endif