OSDN Git Service

Merge remote-tracking branch 'origin/abt/topic/gmin/kitkat/sensors' into gmin/kitkat...
[android-x86/hardware-intel-libsensors.git] / description.c
1 /*
2  * Copyright (C) 2014 Intel Corporation.
3  */
4
5 #include <stdlib.h>
6 #include <utils/Log.h>
7 #include <cutils/properties.h>
8 #include <hardware/sensors.h>
9 #include "enumeration.h"
10
11 #define IIO_SENSOR_HAL_VERSION  1
12
13
14 static int sensor_get_st_prop (int s, const char* sel, char val[MAX_NAME_SIZE])
15 {
16         char prop_name[PROP_NAME_MAX];
17         char prop_val[PROP_VALUE_MAX];
18         int i                   = sensor_info[s].catalog_index;
19         const char *prefix      = sensor_catalog[i].tag;
20
21         sprintf(prop_name, PROP_BASE, prefix, sel);
22
23         if (property_get(prop_name, prop_val, "")) {
24                 strncpy(val, prop_val, MAX_NAME_SIZE-1);
25                 val[MAX_NAME_SIZE-1] = '\0';
26                 return 0;
27         }
28
29         return -1;
30 }
31
32
33 int sensor_get_fl_prop (int s, const char* sel, float* val)
34 {
35         char buf[MAX_NAME_SIZE];
36
37         if (sensor_get_st_prop(s, sel, buf))
38                 return -1;
39
40         *val = (float) strtod(buf, NULL);
41         return 0;
42 }
43
44
45 char* sensor_get_name (int s)
46 {
47         if (sensor_info[s].friendly_name[0] != '\0' ||
48                 !sensor_get_st_prop(s, "name", sensor_info[s].friendly_name))
49                         return sensor_info[s].friendly_name;
50
51         /* If we got a iio device name from sysfs, use it */
52         if (sensor_info[s].internal_name[0]) {
53                 snprintf(sensor_info[s].friendly_name, MAX_NAME_SIZE, "S%d-%s",
54                          s, sensor_info[s].internal_name);
55         } else {
56                 sprintf(sensor_info[s].friendly_name, "S%d", s);
57         }
58
59         return sensor_info[s].friendly_name;
60 }
61
62
63 char* sensor_get_vendor (int s)
64 {
65         if (sensor_info[s].vendor_name[0] ||
66                 !sensor_get_st_prop(s, "vendor", sensor_info[s].vendor_name))
67                         return sensor_info[s].vendor_name;
68
69         return "";
70 }
71
72
73 int sensor_get_version (int s)
74 {
75         return IIO_SENSOR_HAL_VERSION;
76 }
77
78
79 float sensor_get_max_range (int s)
80 {
81         int catalog_index;
82         int sensor_type;
83
84         if (sensor_info[s].max_range != 0.0 ||
85                 !sensor_get_fl_prop(s, "max_range", &sensor_info[s].max_range))
86                         return sensor_info[s].max_range;
87
88         /* Try returning a sensible value given the sensor type */
89
90         /* We should cap returned samples accordingly... */
91
92         catalog_index = sensor_info[s].catalog_index;
93         sensor_type = sensor_catalog[catalog_index].type;
94
95         switch (sensor_type) {
96                 case SENSOR_TYPE_ACCELEROMETER:         /* m/s^2        */
97                         return 50;
98
99                 case SENSOR_TYPE_MAGNETIC_FIELD:        /* micro-tesla  */
100                         return 500;
101
102                 case SENSOR_TYPE_ORIENTATION:           /* degrees      */
103                         return 360;
104
105                 case SENSOR_TYPE_GYROSCOPE:             /* radians/s    */
106                         return 10;
107
108                 case SENSOR_TYPE_LIGHT:                 /* SI lux units */
109                         return 50000;
110
111                 case SENSOR_TYPE_AMBIENT_TEMPERATURE:   /* °C          */
112                 case SENSOR_TYPE_TEMPERATURE:           /* °C          */
113                 case SENSOR_TYPE_PROXIMITY:             /* centimeters  */
114                 case SENSOR_TYPE_PRESSURE:              /* hecto-pascal */
115                 case SENSOR_TYPE_RELATIVE_HUMIDITY:     /* percent */
116                         return 100;
117
118                 default:
119                         return 0.0;
120                 }
121 }
122
123
124 float sensor_get_resolution (int s)
125 {
126         if (sensor_info[s].resolution != 0.0 ||
127                 !sensor_get_fl_prop(s, "resolution", &sensor_info[s].resolution))
128                         return sensor_info[s].resolution;
129
130         return 0;
131 }
132
133
134 float sensor_get_power (int s)
135 {
136         /* mA used while sensor is in use ; not sure about volts :) */
137         if (sensor_info[s].power != 0.0 ||
138                 !sensor_get_fl_prop(s, "power", &sensor_info[s].power))
139                         return sensor_info[s].power;
140
141         return 0;
142 }
143
144
145 float sensor_get_illumincalib (int s)
146 {
147         /* calibrating the ALS Sensor*/
148         if (sensor_info[s].illumincalib != 0.0 ||
149                 !sensor_get_fl_prop(s, "illumincalib", &sensor_info[s].illumincalib)) {
150                         return sensor_info[s].illumincalib;
151         }
152
153         return 0;
154 }
155
156
157 int sensor_get_order (int s, unsigned char map[MAX_CHANNELS])
158 {
159         char buf[MAX_NAME_SIZE];
160         int i;
161         int count = sensor_catalog[sensor_info[s].catalog_index].num_channels;
162
163         memset(map, 0, MAX_CHANNELS);
164
165         if  (sensor_get_st_prop(s, "order", buf))
166                 return 0; /* No order property */
167
168         /* Assume ASCII characters, in the '0'..'9' range */
169
170         for (i=0; i<count; i++)
171                 map[i] = buf[i] - '0';
172
173         /* Check that our indices are in range */
174         for (i=0; i<count; i++)
175                 if (map[i] >= count) {
176                         ALOGE("Order index out of range for sensor %d\n", s);
177                         return 0;
178                 }
179
180         return 1;       /* OK to use modified ordering map */
181 }