11bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian/* 21bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian * Copyright (C) 2010 The Android Open Source Project 31bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian * 41bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 51bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian * you may not use this file except in compliance with the License. 61bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian * You may obtain a copy of the License at 71bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian * 81bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 91bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian * 101bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian * Unless required by applicable law or agreed to in writing, software 111bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 121bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian * See the License for the specific language governing permissions and 141bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian * limitations under the License. 151bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian */ 161bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian 171bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian#include <android/sensor.h> 181bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian#include <gui/Sensor.h> 191bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian#include <gui/SensorManager.h> 201bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian#include <gui/SensorEventQueue.h> 214fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown#include <utils/Looper.h> 221bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian 231bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopianusing namespace android; 241bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian 2588b14c5d6d36fa66fac8279492b4f237ffcc4e4cMathias Agopianstatic nsecs_t sStartTime = 0; 2688b14c5d6d36fa66fac8279492b4f237ffcc4e4cMathias Agopian 2788b14c5d6d36fa66fac8279492b4f237ffcc4e4cMathias Agopian 284fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brownint receiver(int fd, int events, void* data) 291bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian{ 301bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian sp<SensorEventQueue> q((SensorEventQueue*)data); 311bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian ssize_t n; 321bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian ASensorEvent buffer[8]; 3394c4f5c1b28344001bae5ac4ad22dd01dc2fd679Mathias Agopian 3494c4f5c1b28344001bae5ac4ad22dd01dc2fd679Mathias Agopian static nsecs_t oldTimeStamp = 0; 3594c4f5c1b28344001bae5ac4ad22dd01dc2fd679Mathias Agopian 361bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian while ((n = q->read(buffer, 8)) > 0) { 371bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian for (int i=0 ; i<n ; i++) { 388c2733527a5649e72437ee5f68e1d097ed69348eMathias Agopian float t; 3994c4f5c1b28344001bae5ac4ad22dd01dc2fd679Mathias Agopian if (oldTimeStamp) { 408c2733527a5649e72437ee5f68e1d097ed69348eMathias Agopian t = float(buffer[i].timestamp - oldTimeStamp) / s2ns(1); 4188b14c5d6d36fa66fac8279492b4f237ffcc4e4cMathias Agopian } else { 428c2733527a5649e72437ee5f68e1d097ed69348eMathias Agopian t = float(buffer[i].timestamp - sStartTime) / s2ns(1); 4394c4f5c1b28344001bae5ac4ad22dd01dc2fd679Mathias Agopian } 4494c4f5c1b28344001bae5ac4ad22dd01dc2fd679Mathias Agopian oldTimeStamp = buffer[i].timestamp; 458c2733527a5649e72437ee5f68e1d097ed69348eMathias Agopian 468c2733527a5649e72437ee5f68e1d097ed69348eMathias Agopian if (buffer[i].type == Sensor::TYPE_ACCELEROMETER) { 478c2733527a5649e72437ee5f68e1d097ed69348eMathias Agopian printf("%lld\t%8f\t%8f\t%8f\t%f\n", 488c2733527a5649e72437ee5f68e1d097ed69348eMathias Agopian buffer[i].timestamp, 498c2733527a5649e72437ee5f68e1d097ed69348eMathias Agopian buffer[i].data[0], buffer[i].data[1], buffer[i].data[2], 508c2733527a5649e72437ee5f68e1d097ed69348eMathias Agopian 1.0/t); 518c2733527a5649e72437ee5f68e1d097ed69348eMathias Agopian } 528c2733527a5649e72437ee5f68e1d097ed69348eMathias Agopian 531bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian } 541bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian } 551bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian if (n<0 && n != -EAGAIN) { 561bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian printf("error reading events (%s)\n", strerror(-n)); 571bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian } 584fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown return 1; 591bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian} 601bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian 611bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian 621bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopianint main(int argc, char** argv) 631bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian{ 641bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian SensorManager& mgr(SensorManager::getInstance()); 651bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian 661bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian Sensor const* const* list; 671bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian ssize_t count = mgr.getSensorList(&list); 684fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown printf("numSensors=%d\n", int(count)); 691bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian 701bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian sp<SensorEventQueue> q = mgr.createEventQueue(); 711bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian printf("queue=%p\n", q.get()); 721bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian 7388b14c5d6d36fa66fac8279492b4f237ffcc4e4cMathias Agopian Sensor const* accelerometer = mgr.getDefaultSensor(Sensor::TYPE_ACCELEROMETER); 741bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian printf("accelerometer=%p (%s)\n", 751bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian accelerometer, accelerometer->getName().string()); 7688b14c5d6d36fa66fac8279492b4f237ffcc4e4cMathias Agopian 7788b14c5d6d36fa66fac8279492b4f237ffcc4e4cMathias Agopian sStartTime = systemTime(); 7888b14c5d6d36fa66fac8279492b4f237ffcc4e4cMathias Agopian 791bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian q->enableSensor(accelerometer); 801bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian 818c2733527a5649e72437ee5f68e1d097ed69348eMathias Agopian q->setEventRate(accelerometer, ms2ns(10)); 821bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian 834fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown sp<Looper> loop = new Looper(false); 844fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown loop->addFd(q->getFd(), 0, ALOOPER_EVENT_INPUT, receiver, q.get()); 851bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian 861bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian do { 871bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian //printf("about to poll...\n"); 884fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown int32_t ret = loop->pollOnce(-1); 891bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian switch (ret) { 904fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown case ALOOPER_POLL_WAKE: 914fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown //("ALOOPER_POLL_WAKE\n"); 924fe6c3e51be77e35f40872cdbca6c80f8f8b7ecbJeff Brown break; 931bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian case ALOOPER_POLL_CALLBACK: 941bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian //("ALOOPER_POLL_CALLBACK\n"); 951bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian break; 961bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian case ALOOPER_POLL_TIMEOUT: 971bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian printf("ALOOPER_POLL_TIMEOUT\n"); 981bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian break; 991bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian case ALOOPER_POLL_ERROR: 1001bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian printf("ALOOPER_POLL_TIMEOUT\n"); 1011bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian break; 1021bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian default: 1031bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian printf("ugh? poll returned %d\n", ret); 1041bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian break; 1051bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian } 1061bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian } while (1); 1071bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian 1081bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian 1091bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian return 0; 1101bf797857e025e8a71db86fb9e79765a767ec1ebMathias Agopian} 111