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