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 <string.h>
21#include <sys/cdefs.h>
22#include <sys/types.h>
23
24#include <cutils/log.h>
25
26#include <hardware/sensors.h>
27#include <utils/Timers.h>
28
29char const* getSensorName(int type) {
30    switch(type) {
31        case SENSOR_TYPE_ACCELEROMETER:
32            return "Acc";
33        case SENSOR_TYPE_MAGNETIC_FIELD:
34            return "Mag";
35        case SENSOR_TYPE_ORIENTATION:
36            return "Ori";
37        case SENSOR_TYPE_GYROSCOPE:
38            return "Gyr";
39        case SENSOR_TYPE_LIGHT:
40            return "Lux";
41        case SENSOR_TYPE_PRESSURE:
42            return "Bar";
43        case SENSOR_TYPE_TEMPERATURE:
44            return "Tmp";
45        case SENSOR_TYPE_PROXIMITY:
46            return "Prx";
47        case SENSOR_TYPE_GRAVITY:
48            return "Grv";
49        case SENSOR_TYPE_LINEAR_ACCELERATION:
50            return "Lac";
51        case SENSOR_TYPE_ROTATION_VECTOR:
52            return "Rot";
53        case SENSOR_TYPE_RELATIVE_HUMIDITY:
54            return "Hum";
55        case SENSOR_TYPE_AMBIENT_TEMPERATURE:
56            return "Tam";
57    }
58    return "ukn";
59}
60
61int main(int /* argc */, char** /* argv */)
62{
63    int err;
64    struct sensors_poll_device_t* device;
65    struct sensors_module_t* module;
66
67    err = hw_get_module(SENSORS_HARDWARE_MODULE_ID, (hw_module_t const**)&module);
68    if (err != 0) {
69        printf("hw_get_module() failed (%s)\n", strerror(-err));
70        return 0;
71    }
72
73    err = sensors_open(&module->common, &device);
74    if (err != 0) {
75        printf("sensors_open() failed (%s)\n", strerror(-err));
76        return 0;
77    }
78
79    struct sensor_t const* list;
80    int count = module->get_sensors_list(module, &list);
81    printf("%d sensors found:\n", count);
82    for (int i=0 ; i<count ; i++) {
83        printf("%s\n"
84                "\tvendor: %s\n"
85                "\tversion: %d\n"
86                "\thandle: %d\n"
87                "\ttype: %d\n"
88                "\tmaxRange: %f\n"
89                "\tresolution: %f\n"
90                "\tpower: %f mA\n",
91                list[i].name,
92                list[i].vendor,
93                list[i].version,
94                list[i].handle,
95                list[i].type,
96                list[i].maxRange,
97                list[i].resolution,
98                list[i].power);
99    }
100
101    static const size_t numEvents = 16;
102    sensors_event_t buffer[numEvents];
103
104    for (int i=0 ; i<count ; i++) {
105        err = device->activate(device, list[i].handle, 0);
106        if (err != 0) {
107            printf("deactivate() for '%s'failed (%s)\n",
108                    list[i].name, strerror(-err));
109            return 0;
110        }
111    }
112
113    for (int i=0 ; i<count ; i++) {
114        err = device->activate(device, list[i].handle, 1);
115        if (err != 0) {
116            printf("activate() for '%s'failed (%s)\n",
117                    list[i].name, strerror(-err));
118            return 0;
119        }
120        device->setDelay(device, list[i].handle, ms2ns(10));
121    }
122
123    do {
124        int n = device->poll(device, buffer, numEvents);
125        if (n < 0) {
126            printf("poll() failed (%s)\n", strerror(-err));
127            break;
128        }
129
130        printf("read %d events:\n", n);
131        for (int i=0 ; i<n ; i++) {
132            const sensors_event_t& data = buffer[i];
133
134            if (data.version != sizeof(sensors_event_t)) {
135                printf("incorrect event version (version=%d, expected=%zu",
136                        data.version, sizeof(sensors_event_t));
137                break;
138            }
139
140            switch(data.type) {
141                case SENSOR_TYPE_ACCELEROMETER:
142                case SENSOR_TYPE_MAGNETIC_FIELD:
143                case SENSOR_TYPE_ORIENTATION:
144                case SENSOR_TYPE_GYROSCOPE:
145                case SENSOR_TYPE_GRAVITY:
146                case SENSOR_TYPE_LINEAR_ACCELERATION:
147                case SENSOR_TYPE_ROTATION_VECTOR:
148                    printf("sensor=%s, time=%" PRId64 ", value=<%5.1f,%5.1f,%5.1f>\n",
149                            getSensorName(data.type),
150                            data.timestamp,
151                            data.data[0],
152                            data.data[1],
153                            data.data[2]);
154                    break;
155
156                case SENSOR_TYPE_LIGHT:
157                case SENSOR_TYPE_PRESSURE:
158                case SENSOR_TYPE_TEMPERATURE:
159                case SENSOR_TYPE_PROXIMITY:
160                case SENSOR_TYPE_RELATIVE_HUMIDITY:
161                case SENSOR_TYPE_AMBIENT_TEMPERATURE:
162                    printf("sensor=%s, time=%" PRId64 ", value=%f\n",
163                            getSensorName(data.type),
164                            data.timestamp,
165                            data.data[0]);
166                    break;
167
168                default:
169                    printf("sensor=%d, time=% " PRId64 ", value=<%f,%f,%f, ...>\n",
170                            data.type,
171                            data.timestamp,
172                            data.data[0],
173                            data.data[1],
174                            data.data[2]);
175                    break;
176            }
177        }
178    } while (1); // fix that
179
180
181    for (int i=0 ; i<count ; i++) {
182        err = device->activate(device, list[i].handle, 0);
183        if (err != 0) {
184            printf("deactivate() for '%s'failed (%s)\n",
185                    list[i].name, strerror(-err));
186            return 0;
187        }
188    }
189
190    err = sensors_close(device);
191    if (err != 0) {
192        printf("sensors_close() failed (%s)\n", strerror(-err));
193    }
194    return 0;
195}
196