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