xref: /aosp_15_r20/hardware/libhardware/tests/nusensors/nusensors.cpp (revision e01b6f769022e40d0923dee176e8dc7cd1d52984)
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