1/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <inttypes.h>
18#include <string.h>
19#include <stdint.h>
20#include <stdio.h>
21#include <string.h>
22#include <sys/cdefs.h>
23#include <sys/types.h>
24
25#include <log/log.h>
26#include <utils/Timers.h>
27
28#include <hardware/sensors.h>
29
30char const* getSensorName(int type) {
31    switch(type) {
32        case SENSOR_TYPE_ACCELEROMETER:
33            return "Acc";
34        case SENSOR_TYPE_MAGNETIC_FIELD:
35            return "Mag";
36        case SENSOR_TYPE_ORIENTATION:
37            return "Ori";
38        case SENSOR_TYPE_GYROSCOPE:
39            return "Gyr";
40        case SENSOR_TYPE_LIGHT:
41            return "Lux";
42        case SENSOR_TYPE_PRESSURE:
43            return "Bar";
44        case SENSOR_TYPE_TEMPERATURE:
45            return "Tmp";
46        case SENSOR_TYPE_PROXIMITY:
47            return "Prx";
48        case SENSOR_TYPE_GRAVITY:
49            return "Grv";
50        case SENSOR_TYPE_LINEAR_ACCELERATION:
51            return "Lac";
52        case SENSOR_TYPE_ROTATION_VECTOR:
53            return "Rot";
54        case SENSOR_TYPE_RELATIVE_HUMIDITY:
55            return "Hum";
56        case SENSOR_TYPE_AMBIENT_TEMPERATURE:
57            return "Tam";
58    }
59    return "ukn";
60}
61
62int main(int /* argc */, char** /* argv */)
63{
64    int err;
65    struct sensors_poll_device_t* device;
66    struct sensors_module_t* module;
67
68    err = hw_get_module(SENSORS_HARDWARE_MODULE_ID, (hw_module_t const**)&module);
69    if (err != 0) {
70        printf("hw_get_module() failed (%s)\n", strerror(-err));
71        return 0;
72    }
73
74    err = sensors_open(&module->common, &device);
75    if (err != 0) {
76        printf("sensors_open() failed (%s)\n", strerror(-err));
77        return 0;
78    }
79
80    struct sensor_t const* list;
81    int count = module->get_sensors_list(module, &list);
82    printf("%d sensors found:\n", count);
83    for (int i=0 ; i<count ; i++) {
84        printf("%s\n"
85                "\tvendor: %s\n"
86                "\tversion: %d\n"
87                "\thandle: %d\n"
88                "\ttype: %d\n"
89                "\tmaxRange: %f\n"
90                "\tresolution: %f\n"
91                "\tpower: %f mA\n",
92                list[i].name,
93                list[i].vendor,
94                list[i].version,
95                list[i].handle,
96                list[i].type,
97                list[i].maxRange,
98                list[i].resolution,
99                list[i].power);
100    }
101
102    static const size_t numEvents = 16;
103    sensors_event_t buffer[numEvents];
104
105    for (int i=0 ; i<count ; i++) {
106        err = device->activate(device, list[i].handle, 0);
107        if (err != 0) {
108            printf("deactivate() for '%s'failed (%s)\n",
109                    list[i].name, strerror(-err));
110            return 0;
111        }
112    }
113
114    for (int i=0 ; i<count ; i++) {
115        err = device->activate(device, list[i].handle, 1);
116        if (err != 0) {
117            printf("activate() for '%s'failed (%s)\n",
118                    list[i].name, strerror(-err));
119            return 0;
120        }
121        device->setDelay(device, list[i].handle, ms2ns(10));
122    }
123
124    do {
125        int n = device->poll(device, buffer, numEvents);
126        if (n < 0) {
127            printf("poll() failed (%s)\n", strerror(-err));
128            break;
129        }
130
131        printf("read %d events:\n", n);
132        for (int i=0 ; i<n ; i++) {
133            const sensors_event_t& data = buffer[i];
134
135            if (data.version != sizeof(sensors_event_t)) {
136                printf("incorrect event version (version=%d, expected=%zu",
137                        data.version, sizeof(sensors_event_t));
138                break;
139            }
140
141            switch(data.type) {
142                case SENSOR_TYPE_ACCELEROMETER:
143                case SENSOR_TYPE_MAGNETIC_FIELD:
144                case SENSOR_TYPE_ORIENTATION:
145                case SENSOR_TYPE_GYROSCOPE:
146                case SENSOR_TYPE_GRAVITY:
147                case SENSOR_TYPE_LINEAR_ACCELERATION:
148                case SENSOR_TYPE_ROTATION_VECTOR:
149                    printf("sensor=%s, time=%" PRId64 ", value=<%5.1f,%5.1f,%5.1f>\n",
150                            getSensorName(data.type),
151                            data.timestamp,
152                            data.data[0],
153                            data.data[1],
154                            data.data[2]);
155                    break;
156
157                case SENSOR_TYPE_LIGHT:
158                case SENSOR_TYPE_PRESSURE:
159                case SENSOR_TYPE_TEMPERATURE:
160                case SENSOR_TYPE_PROXIMITY:
161                case SENSOR_TYPE_RELATIVE_HUMIDITY:
162                case SENSOR_TYPE_AMBIENT_TEMPERATURE:
163                    printf("sensor=%s, time=%" PRId64 ", value=%f\n",
164                            getSensorName(data.type),
165                            data.timestamp,
166                            data.data[0]);
167                    break;
168
169                default:
170                    printf("sensor=%d, time=% " PRId64 ", value=<%f,%f,%f, ...>\n",
171                            data.type,
172                            data.timestamp,
173                            data.data[0],
174                            data.data[1],
175                            data.data[2]);
176                    break;
177            }
178        }
179    } while (1); // fix that
180
181
182    for (int i=0 ; i<count ; i++) {
183        err = device->activate(device, list[i].handle, 0);
184        if (err != 0) {
185            printf("deactivate() for '%s'failed (%s)\n",
186                    list[i].name, strerror(-err));
187            return 0;
188        }
189    }
190
191    err = sensors_close(device);
192    if (err != 0) {
193        printf("sensors_close() failed (%s)\n", strerror(-err));
194    }
195    return 0;
196}
197