sensorservicetest.cpp revision 16bcf66afa333f8d3f3b835ed556e4fce8fa35bf
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++) { 3816bcf66afa333f8d3f3b835ed556e4fce8fa35bfMathias Agopian if (buffer[i].type == Sensor::TYPE_ACCELEROMETER) { 39fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian printf("time=%lld, value=<%5.1f,%5.1f,%5.1f>\n", 40fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian buffer[i].timestamp, 41fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian buffer[i].acceleration.x, 42fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian buffer[i].acceleration.y, 43fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian buffer[i].acceleration.z); 44fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian } 4524d72350f321c17b0bfe1ef3fd52d4070a1c02c3Mathias Agopian 4624d72350f321c17b0bfe1ef3fd52d4070a1c02c3Mathias Agopian if (oldTimeStamp) { 4724d72350f321c17b0bfe1ef3fd52d4070a1c02c3Mathias Agopian float t = float(buffer[i].timestamp - oldTimeStamp) / s2ns(1); 4824d72350f321c17b0bfe1ef3fd52d4070a1c02c3Mathias Agopian printf("%f ms (%f Hz)\n", t*1000, 1.0/t); 4916bcf66afa333f8d3f3b835ed556e4fce8fa35bfMathias Agopian } else { 5016bcf66afa333f8d3f3b835ed556e4fce8fa35bfMathias Agopian float t = float(buffer[i].timestamp - sStartTime) / s2ns(1); 5116bcf66afa333f8d3f3b835ed556e4fce8fa35bfMathias Agopian printf("first event: %f ms\n", t*1000); 5224d72350f321c17b0bfe1ef3fd52d4070a1c02c3Mathias Agopian } 5324d72350f321c17b0bfe1ef3fd52d4070a1c02c3Mathias Agopian oldTimeStamp = buffer[i].timestamp; 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 63fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopianint main(int argc, char** argv) 64fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian{ 65fc32881fcc68640d008c7515cdd1bcd866f72cd5Mathias Agopian SensorManager& mgr(SensorManager::getInstance()); 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 8216bcf66afa333f8d3f3b835ed556e4fce8fa35bfMathias Agopian q->setEventRate(accelerometer, ms2ns(200)); 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