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