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