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 17b0474e78df2a778c42c6746da815f397bb2df374Sasha Levitskiy#include <inttypes.h> 18fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <android/sensor.h> 19fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <gui/Sensor.h> 20fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <gui/SensorManager.h> 21fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian#include <gui/SensorEventQueue.h> 221e0b1e8491e5f6dc59faabe70cbfa942853150e0Jeff Brown#include <utils/Looper.h> 23fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 24fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianusing namespace android; 25fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 2616bcf66afa333f8d3f3b835ed556e4fce8fa35bfMathias Agopianstatic nsecs_t sStartTime = 0; 2716bcf66afa333f8d3f3b835ed556e4fce8fa35bfMathias Agopian 2816bcf66afa333f8d3f3b835ed556e4fce8fa35bfMathias Agopian 29b0474e78df2a778c42c6746da815f397bb2df374Sasha Levitskiyint receiver(__unused int fd, __unused int events, void* data) 30fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 31fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian sp<SensorEventQueue> q((SensorEventQueue*)data); 32fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian ssize_t n; 33fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian ASensorEvent buffer[8]; 3424d72350f321c17b0bfe1ef3fd52d4070a1c02c3Mathias Agopian 3524d72350f321c17b0bfe1ef3fd52d4070a1c02c3Mathias Agopian static nsecs_t oldTimeStamp = 0; 3624d72350f321c17b0bfe1ef3fd52d4070a1c02c3Mathias Agopian 37fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian while ((n = q->read(buffer, 8)) > 0) { 38fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian for (int i=0 ; i<n ; i++) { 39b9e152637a99548fdbab95e8de6a9d70bf9a6a47Mathias Agopian float t; 4024d72350f321c17b0bfe1ef3fd52d4070a1c02c3Mathias Agopian if (oldTimeStamp) { 41b9e152637a99548fdbab95e8de6a9d70bf9a6a47Mathias Agopian t = float(buffer[i].timestamp - oldTimeStamp) / s2ns(1); 4216bcf66afa333f8d3f3b835ed556e4fce8fa35bfMathias Agopian } else { 43b9e152637a99548fdbab95e8de6a9d70bf9a6a47Mathias Agopian t = float(buffer[i].timestamp - sStartTime) / s2ns(1); 4424d72350f321c17b0bfe1ef3fd52d4070a1c02c3Mathias Agopian } 4524d72350f321c17b0bfe1ef3fd52d4070a1c02c3Mathias Agopian oldTimeStamp = buffer[i].timestamp; 46b9e152637a99548fdbab95e8de6a9d70bf9a6a47Mathias Agopian 47b9e152637a99548fdbab95e8de6a9d70bf9a6a47Mathias Agopian if (buffer[i].type == Sensor::TYPE_ACCELEROMETER) { 48b0474e78df2a778c42c6746da815f397bb2df374Sasha Levitskiy printf("%" PRId64 "\t%8f\t%8f\t%8f\t%f\n", 49b9e152637a99548fdbab95e8de6a9d70bf9a6a47Mathias Agopian buffer[i].timestamp, 50b9e152637a99548fdbab95e8de6a9d70bf9a6a47Mathias Agopian buffer[i].data[0], buffer[i].data[1], buffer[i].data[2], 51b9e152637a99548fdbab95e8de6a9d70bf9a6a47Mathias Agopian 1.0/t); 52b9e152637a99548fdbab95e8de6a9d70bf9a6a47Mathias Agopian } 53b9e152637a99548fdbab95e8de6a9d70bf9a6a47Mathias Agopian 54fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 55fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 56fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian if (n<0 && n != -EAGAIN) { 57fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian printf("error reading events (%s)\n", strerror(-n)); 58fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 591e0b1e8491e5f6dc59faabe70cbfa942853150e0Jeff Brown return 1; 60fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 61fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 62fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 63b0474e78df2a778c42c6746da815f397bb2df374Sasha Levitskiyint main() 64fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 65b0474e78df2a778c42c6746da815f397bb2df374Sasha Levitskiy SensorManager mgr(String16("Sensor Service Test")); 66fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 67fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian Sensor const* const* list; 68fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian ssize_t count = mgr.getSensorList(&list); 691e0b1e8491e5f6dc59faabe70cbfa942853150e0Jeff Brown printf("numSensors=%d\n", int(count)); 70fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 71fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian sp<SensorEventQueue> q = mgr.createEventQueue(); 72fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian printf("queue=%p\n", q.get()); 73fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 7416bcf66afa333f8d3f3b835ed556e4fce8fa35bfMathias Agopian Sensor const* accelerometer = mgr.getDefaultSensor(Sensor::TYPE_ACCELEROMETER); 75fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian printf("accelerometer=%p (%s)\n", 76fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian accelerometer, accelerometer->getName().string()); 7716bcf66afa333f8d3f3b835ed556e4fce8fa35bfMathias Agopian 7816bcf66afa333f8d3f3b835ed556e4fce8fa35bfMathias Agopian sStartTime = systemTime(); 7916bcf66afa333f8d3f3b835ed556e4fce8fa35bfMathias Agopian 80fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian q->enableSensor(accelerometer); 81fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 82b9e152637a99548fdbab95e8de6a9d70bf9a6a47Mathias Agopian q->setEventRate(accelerometer, ms2ns(10)); 83fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 841e0b1e8491e5f6dc59faabe70cbfa942853150e0Jeff Brown sp<Looper> loop = new Looper(false); 851e0b1e8491e5f6dc59faabe70cbfa942853150e0Jeff Brown loop->addFd(q->getFd(), 0, ALOOPER_EVENT_INPUT, receiver, q.get()); 86fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 87fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian do { 88fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian //printf("about to poll...\n"); 891e0b1e8491e5f6dc59faabe70cbfa942853150e0Jeff Brown int32_t ret = loop->pollOnce(-1); 90fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian switch (ret) { 911e0b1e8491e5f6dc59faabe70cbfa942853150e0Jeff Brown case ALOOPER_POLL_WAKE: 921e0b1e8491e5f6dc59faabe70cbfa942853150e0Jeff Brown //("ALOOPER_POLL_WAKE\n"); 931e0b1e8491e5f6dc59faabe70cbfa942853150e0Jeff Brown break; 94fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian case ALOOPER_POLL_CALLBACK: 95fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian //("ALOOPER_POLL_CALLBACK\n"); 96fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian break; 97fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian case ALOOPER_POLL_TIMEOUT: 98fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian printf("ALOOPER_POLL_TIMEOUT\n"); 99fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian break; 100fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian case ALOOPER_POLL_ERROR: 101fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian printf("ALOOPER_POLL_TIMEOUT\n"); 102fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian break; 103fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian default: 104fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian printf("ugh? poll returned %d\n", ret); 105fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian break; 106fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 107fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } while (1); 108fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 109fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian 110fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian return 0; 111fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian} 112