$(src_path)/control.c \
$(src_path)/description.c \
$(src_path)/utils.c \
+ $(src_path)/transform.c \
LOCAL_C_INCLUDES += $(LOCAL_PATH) vendor/intel/hardware/iio-sensors-hal
LOCAL_MODULE := iio-sensors-hal
#include <fcntl.h>
#include <sys/epoll.h>
-#include <math.h>
#include <utils/Log.h>
#include <hardware/sensors.h>
#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 */
int num_fields;
int c;
unsigned char* current_sample;
- int sample_size;
- struct datum_info_t* sample_type;
- int64_t s64;
- float val;
memset(data, 0, sizeof(sensors_event_t));
/* Read values through sysfs rather than from a report buffer */
for (c=0; c<num_fields; c++) {
- val = acquire_immediate_value(s, c);
- data->data[c] = transform_sample(sensor_type, c, val);
+ data->data[c] = acquire_immediate_value(s, c);
ALOGV("\tfield %d: %f\n", c, data->data[c]);
}
+
+ finalize_sample(s, data);
return;
}
current_sample = sensor_info[s].report_buffer;
for (c=0; c<num_fields; c++) {
- sample_size = sensor_info[s].channel[c].size;
- sample_type = &sensor_info[s].channel[c].type_info;
-
- s64 = sample_as_int64(current_sample, sample_type);
- val = (sensor_info[s].offset + s64) * sensor_info[s].scale;
-
- data->data[c] = transform_sample(sensor_type, c, val);
+ data->data[c] = transform_sample(s, c, current_sample);
ALOGV("\tfield %d: %f\n", c, data->data[c]);
- current_sample += sample_size;
+ current_sample += sensor_info[s].channel[c].size;
}
+
+ finalize_sample(s, data);
}
--- /dev/null
+/*
+ * Copyright (C) 2014 Intel Corporation.
+ */
+
+#include <stdlib.h>
+#include <math.h>
+#include <utils/Log.h>
+#include <hardware/sensors.h>
+#include "common.h"
+#include "transform.h"
+
+
+int64_t sample_as_int64(unsigned char* sample, struct datum_info_t* type)
+{
+ uint16_t u16;
+ uint32_t u32;
+ uint64_t u64;
+ int i;
+
+ switch (type->storagebits) {
+ case 64:
+ u64 = 0;
+
+ if (type->endianness == 'b')
+ for (i=0; i<8; i++)
+ u64 = (u64 << 8) | sample[i];
+ else
+ for (i=7; i>=0; i--)
+ u64 = (u64 << 8) | sample[i];
+
+ if (type->sign == 'u')
+ return (int64_t) (u64 >> type->shift);
+
+ return ((int64_t) u64) >> type->shift;
+
+ case 32:
+ if (type->endianness == 'b')
+ u32 = (sample[0] << 24) | (sample[1] << 16) |
+ (sample[2] << 8) | sample[3];
+ else
+ u32 = (sample[3] << 24) | (sample[2] << 16) |
+ (sample[1] << 8) | sample[0];
+
+ if (type->sign == 'u')
+ return u32 >> type->shift;
+
+ return ((int32_t) u32) >> type->shift;
+
+ case 16:
+ if (type->endianness == 'b')
+ u16 = (sample[0] << 8) | sample[1];
+ else
+ u16 = (sample[1] << 8) | sample[0];
+
+ if (type->sign == 'u')
+ return u16 >> type->shift;
+
+ return ((int16_t) u16) >> type->shift;
+ }
+
+ ALOGE("Unhandled sample storage size\n");
+ return 0;
+}
+
+
+void finalize_sample(int s, struct sensors_event_t* data)
+{
+ int i = sensor_info[s].catalog_index;
+ int sensor_type = sensor_catalog[i].type;
+
+ switch (sensor_type) {
+ case SENSOR_TYPE_ACCELEROMETER:
+ /*
+ * Invert x axis orientation from SI units - see
+ * /hardware/libhardware/include/hardware/sensors.h
+ * for a discussion of what Android expects
+ */
+ data->data[0] = -data->data[0];
+ break;
+
+ case SENSOR_TYPE_GYROSCOPE:
+ /* Limit drift */
+ if (abs(data->data[0]) < .05 && abs(data->data[1]) < .05
+ && abs(data->data[2]) < .05) {
+ data->data[0] = 0;
+ data->data[1] = 0;
+ data->data[2] = 0;
+ }
+ break;
+ }
+}
+
+
+float transform_sample(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);
+
+ /* Apply default scaling rules */
+ return (sensor_info[s].offset + s64) * sensor_info[s].scale;
+}
--- /dev/null
+/*
+ * Copyright (C) 2014 Intel Corporation.
+ */
+
+#ifndef __TRANSFORM_H__
+#define __TRANSFORM_H__
+
+#include "common.h"
+
+float transform_sample (int sensor, int channel, unsigned char* sample_data);
+
+void finalize_sample (int s, struct sensors_event_t* data);
+
+
+#endif
+
+
+
#include <fcntl.h>
#include <utils/Log.h>
#include <hardware/sensors.h>
+#include "common.h"
#include "utils.h"
}
-int64_t sample_as_int64(unsigned char* sample, struct datum_info_t* type)
-{
- uint16_t u16;
- uint32_t u32;
- uint64_t u64;
- int i;
-
- switch (type->storagebits) {
- case 64:
- u64 = 0;
-
- if (type->endianness == 'b')
- for (i=0; i<8; i++)
- u64 = (u64 << 8) | sample[i];
- else
- for (i=7; i>=0; i--)
- u64 = (u64 << 8) | sample[i];
-
- if (type->sign == 'u')
- return (int64_t) (u64 >> type->shift);
-
- return ((int64_t) u64) >> type->shift;
-
- case 32:
- if (type->endianness == 'b')
- u32 = (sample[0] << 24) | (sample[1] << 16) |
- (sample[2] << 8) | sample[3];
- else
- u32 = (sample[3] << 24) | (sample[2] << 16) |
- (sample[1] << 8) | sample[0];
-
- if (type->sign == 'u')
- return u32 >> type->shift;
-
- return ((int32_t) u32) >> type->shift;
-
- case 16:
- if (type->endianness == 'b')
- u16 = (sample[0] << 8) | sample[1];
- else
- u16 = (sample[1] << 8) | sample[0];
-
- if (type->sign == 'u')
- return u16 >> type->shift;
-
- return ((int16_t) u16) >> type->shift;
- }
-
- ALOGE("Unhandled sample storage size\n");
- return 0;
-}
-
-
-float transform_sample (int sensor_type, int channel, float val)
-{
- /* Last opportunity to alter sample data before it goes to Android */
- switch (sensor_type) {
- case SENSOR_TYPE_ACCELEROMETER:
- /*
- * Invert x axis orientation from SI units - see
- * /hardware/libhardware/include/hardware/sensors.h
- * for a discussion of what Android expects
- */
- if (channel == 0)
- return -val;
- break;
-
- case SENSOR_TYPE_GYROSCOPE:
- /* Limit drift */
- if (val > -0.05 && val < 0.05)
- return 0;
- break;
- }
-
- return val;
-}
-
-
int64_t get_timestamp(void)
{
struct timespec ts = {0};
return 1000000000LL * ts.tv_sec + ts.tv_nsec;
}
-
-
int decode_type_spec(const char type_buf[MAX_TYPE_SPEC_LEN],
struct datum_info_t *type_info);
-int64_t sample_as_int64 (unsigned char* sample, struct datum_info_t* type);
-
-float transform_sample(int sensor_type, int channel, float val);
-
int64_t get_timestamp (void);
#endif