1d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian/*
2d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian * Copyright (C) 2010 The Android Open Source Project
3d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian *
4d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
5d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian * you may not use this file except in compliance with the License.
6d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian * You may obtain a copy of the License at
7d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian *
8d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
9d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian *
10d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian * Unless required by applicable law or agreed to in writing, software
11d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
12d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian * See the License for the specific language governing permissions and
14d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian * limitations under the License.
15d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian */
16d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian
175b06dc00ac143e030292ada48ed8afc0ac079a30Nanik Tolaram#include <android/looper.h>
18d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian#include <gui/DisplayEventReceiver.h>
19d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian#include <utils/Looper.h>
20d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian
21d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopianusing namespace android;
22d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian
23a282f588692a04da05eceafa142a067c038da806Dan Stozaint receiver(int /*fd*/, int /*events*/, void* data)
24d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian{
25d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    DisplayEventReceiver* q = (DisplayEventReceiver*)data;
26d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian
27d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    ssize_t n;
28d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    DisplayEventReceiver::Event buffer[1];
29d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian
30d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    static nsecs_t oldTimeStamp = 0;
31d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian
32d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    while ((n = q->getEvents(buffer, 1)) > 0) {
33d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        for (int i=0 ; i<n ; i++) {
34d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            if (buffer[i].header.type == DisplayEventReceiver::DISPLAY_EVENT_VSYNC) {
35d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                printf("event vsync: count=%d\t", buffer[i].vsync.count);
36d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            }
37d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            if (oldTimeStamp) {
38d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                float t = float(buffer[i].header.timestamp - oldTimeStamp) / s2ns(1);
39d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                printf("%f ms (%f Hz)\n", t*1000, 1.0/t);
40d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            }
41d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            oldTimeStamp = buffer[i].header.timestamp;
42d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        }
43d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    }
44d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    if (n<0) {
45d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        printf("error reading events (%s)\n", strerror(-n));
46d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    }
47d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    return 1;
48d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian}
49d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian
50a282f588692a04da05eceafa142a067c038da806Dan Stozaint main(int /*argc*/, char** /*argv*/)
51d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian{
52d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    DisplayEventReceiver myDisplayEvent;
53d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian
54d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian
55d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    sp<Looper> loop = new Looper(false);
56d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    loop->addFd(myDisplayEvent.getFd(), 0, ALOOPER_EVENT_INPUT, receiver,
57d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            &myDisplayEvent);
58d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian
593cf199aef6250552555344944c3e3a6e4ab05f92Mathias Agopian    myDisplayEvent.setVsyncRate(1);
603cf199aef6250552555344944c3e3a6e4ab05f92Mathias Agopian
61d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    do {
62d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        //printf("about to poll...\n");
63d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        int32_t ret = loop->pollOnce(-1);
64d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        switch (ret) {
65d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            case ALOOPER_POLL_WAKE:
66d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                //("ALOOPER_POLL_WAKE\n");
67d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                break;
68d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            case ALOOPER_POLL_CALLBACK:
69d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                //("ALOOPER_POLL_CALLBACK\n");
70d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                break;
71d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            case ALOOPER_POLL_TIMEOUT:
72d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                printf("ALOOPER_POLL_TIMEOUT\n");
73d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                break;
74d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            case ALOOPER_POLL_ERROR:
75d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                printf("ALOOPER_POLL_TIMEOUT\n");
76d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                break;
77d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian            default:
78d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                printf("ugh? poll returned %d\n", ret);
79d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian                break;
80d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian        }
81d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    } while (1);
82d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian
83d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian    return 0;
84d0566bc26fcf6ca396118701fa11900b627f2c09Mathias Agopian}
85