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