1fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian/* 2fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * Copyright (C) 2010 The Android Open Source Project 3fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * 4fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 5fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * you may not use this file except in compliance with the License. 6fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * You may obtain a copy of the License at 7fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * 8fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 9fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * 10fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * Unless required by applicable law or agreed to in writing, software 11fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 12fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * See the License for the specific language governing permissions and 14fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian * limitations under the License. 15fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian */ 16fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 17fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <android/sensor.h> 18fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <gui/Sensor.h> 19fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <gui/SensorManager.h> 20fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <gui/SensorEventQueue.h> 211e0b1e8491e5f6dc59faabe70cbfa942853150e0Jeff Brown#include <utils/Looper.h> 22fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 23fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianusing namespace android; 24fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 2516bcf66afa333f8d3f3b835ed556e4fce8fa35bfMathias Agopianstatic nsecs_t sStartTime = 0; 2616bcf66afa333f8d3f3b835ed556e4fce8fa35bfMathias Agopian 2716bcf66afa333f8d3f3b835ed556e4fce8fa35bfMathias Agopian 281e0b1e8491e5f6dc59faabe70cbfa942853150e0Jeff Brownint receiver(int fd, int events, void* data) 29fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 30fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian sp<SensorEventQueue> q((SensorEventQueue*)data); 31fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian ssize_t n; 32fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian ASensorEvent buffer[8]; 3324d72350f321c17b0bfe1ef3fd52d4070a1c02c3Mathias Agopian 3424d72350f321c17b0bfe1ef3fd52d4070a1c02c3Mathias Agopian static nsecs_t oldTimeStamp = 0; 3524d72350f321c17b0bfe1ef3fd52d4070a1c02c3Mathias Agopian 36fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian while ((n = q->read(buffer, 8)) > 0) { 37fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian for (int i=0 ; i<n ; i++) { 38b9e152637a99548fdbab95e8de6a9d70bf9a6a47Mathias Agopian float t; 3924d72350f321c17b0bfe1ef3fd52d4070a1c02c3Mathias Agopian if (oldTimeStamp) { 40b9e152637a99548fdbab95e8de6a9d70bf9a6a47Mathias Agopian t = float(buffer[i].timestamp - oldTimeStamp) / s2ns(1); 4116bcf66afa333f8d3f3b835ed556e4fce8fa35bfMathias Agopian } else { 42b9e152637a99548fdbab95e8de6a9d70bf9a6a47Mathias Agopian t = float(buffer[i].timestamp - sStartTime) / s2ns(1); 4324d72350f321c17b0bfe1ef3fd52d4070a1c02c3Mathias Agopian } 4424d72350f321c17b0bfe1ef3fd52d4070a1c02c3Mathias Agopian oldTimeStamp = buffer[i].timestamp; 45b9e152637a99548fdbab95e8de6a9d70bf9a6a47Mathias Agopian 46b9e152637a99548fdbab95e8de6a9d70bf9a6a47Mathias Agopian if (buffer[i].type == Sensor::TYPE_ACCELEROMETER) { 47b9e152637a99548fdbab95e8de6a9d70bf9a6a47Mathias Agopian printf("%lld\t%8f\t%8f\t%8f\t%f\n", 48b9e152637a99548fdbab95e8de6a9d70bf9a6a47Mathias Agopian buffer[i].timestamp, 49b9e152637a99548fdbab95e8de6a9d70bf9a6a47Mathias Agopian buffer[i].data[0], buffer[i].data[1], buffer[i].data[2], 50b9e152637a99548fdbab95e8de6a9d70bf9a6a47Mathias Agopian 1.0/t); 51b9e152637a99548fdbab95e8de6a9d70bf9a6a47Mathias Agopian } 52b9e152637a99548fdbab95e8de6a9d70bf9a6a47Mathias Agopian 53fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 54fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 55fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (n<0 && n != -EAGAIN) { 56fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian printf("error reading events (%s)\n", strerror(-n)); 57fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 581e0b1e8491e5f6dc59faabe70cbfa942853150e0Jeff Brown return 1; 59fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 60fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 61fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 62fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianint main(int argc, char** argv) 63fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 64fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian SensorManager& mgr(SensorManager::getInstance()); 65fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 66fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian Sensor const* const* list; 67fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian ssize_t count = mgr.getSensorList(&list); 681e0b1e8491e5f6dc59faabe70cbfa942853150e0Jeff Brown printf("numSensors=%d\n", int(count)); 69fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 70fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian sp<SensorEventQueue> q = mgr.createEventQueue(); 71fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian printf("queue=%p\n", q.get()); 72fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 7316bcf66afa333f8d3f3b835ed556e4fce8fa35bfMathias Agopian Sensor const* accelerometer = mgr.getDefaultSensor(Sensor::TYPE_ACCELEROMETER); 74fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian printf("accelerometer=%p (%s)\n", 75fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian accelerometer, accelerometer->getName().string()); 7616bcf66afa333f8d3f3b835ed556e4fce8fa35bfMathias Agopian 7716bcf66afa333f8d3f3b835ed556e4fce8fa35bfMathias Agopian sStartTime = systemTime(); 7816bcf66afa333f8d3f3b835ed556e4fce8fa35bfMathias Agopian 79fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian q->enableSensor(accelerometer); 80fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 81b9e152637a99548fdbab95e8de6a9d70bf9a6a47Mathias Agopian q->setEventRate(accelerometer, ms2ns(10)); 82fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 831e0b1e8491e5f6dc59faabe70cbfa942853150e0Jeff Brown sp<Looper> loop = new Looper(false); 841e0b1e8491e5f6dc59faabe70cbfa942853150e0Jeff Brown loop->addFd(q->getFd(), 0, ALOOPER_EVENT_INPUT, receiver, q.get()); 85fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 86fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian do { 87fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian //printf("about to poll...\n"); 881e0b1e8491e5f6dc59faabe70cbfa942853150e0Jeff Brown int32_t ret = loop->pollOnce(-1); 89fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian switch (ret) { 901e0b1e8491e5f6dc59faabe70cbfa942853150e0Jeff Brown case ALOOPER_POLL_WAKE: 911e0b1e8491e5f6dc59faabe70cbfa942853150e0Jeff Brown //("ALOOPER_POLL_WAKE\n"); 921e0b1e8491e5f6dc59faabe70cbfa942853150e0Jeff Brown break; 93fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian case ALOOPER_POLL_CALLBACK: 94fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian //("ALOOPER_POLL_CALLBACK\n"); 95fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian break; 96fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian case ALOOPER_POLL_TIMEOUT: 97fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian printf("ALOOPER_POLL_TIMEOUT\n"); 98fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian break; 99fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian case ALOOPER_POLL_ERROR: 100fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian printf("ALOOPER_POLL_TIMEOUT\n"); 101fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian break; 102fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian default: 103fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian printf("ugh? poll returned %d\n", ret); 104fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian break; 105fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 106fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } while (1); 107fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 108fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 109fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return 0; 110fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 111