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